<!-- SOLID CITY · part 3643 -->
DarkMat);
    rail.position.set(cx, cy + 12.3, cz - 3.6); root.add(rail);
    var lant = new T.Mesh(new T.SphereGeometry(0.5, 8, 6), winMat);
    lant.position.set(cx, cy + 13, cz - 3.6); root.add(lant);
    foot.push([cx, cz, 13, 12, cy - 9, cy + 9, 0]);       // the crag: solid rock
    foot.push([cx, cz, 10, 8, cy + 9, cy + 10.2, 0]);     // deck blocks from below
    walkRects.push({ x1: cx - 5, z1: cz - 4, x2: cx + 5, z2: cz + 4, y: cy + 10.1 });
  })();

  // ---------- THE HIDDEN GLOW: small cave with light inside (west) ----------
  (function () {
    var hx = -88, hz = 62, hy = -30;
    // three big rocks forming an overhang
    [[0, 0, 0], [-7, 2, 3], [7, 2, -3]].forEach(function (o, i) {
      var rk = new T.Mesh(new T.DodecahedronGeometry(6 - i, 0), basaltMat);
      rk.position.set(hx + o[0], hy + 4 + o[1], hz + o[2]); rk.rotation.set(i, i * 2, i * 0.5); root.add(rk);
    });
    var glowOrb = new T.Mesh(new T.SphereGeometry(1.4, 12, 10),
      new T.MeshBasicMaterial({ color: 0x9ae0ff, transparent: true, opacity: 0.9 }));
    glowOrb.position.set(hx, hy + 2.2, hz); glowOrb.name = 'caveGlow'; root.add(glowOrb);
    var cpl = new T.PointLight(0x9ae0ff, 1.6, 30); cpl.position.set(hx, hy + 2.5, hz); root.add(cpl);
    lanterns.push({ orb: glowOrb, pl: cpl, seed: R() * 10 });
    // mouth faces east: block the rocks, leave the mouth walkable-in
    foot.push([hx - 4, hz, 8, 14, hy, hy + 10, 0]);
    foot.push([hx + 6, hz - 6, 8, 6, hy, hy + 10, 0]);
    foot.push([hx + 6, hz + 6, 8, 6, hy, hy + 10, 0]);
    foot.push([hx, hz, 16, 16, hy + 8, hy + 14, 0]);   // cap: can't drop in from above
  })();

  // ---------- wind chimes (6): hang from posts ----------
  for (var chi = 0; chi < 6; chi++) {
    var chx = [-70, 70, -20, 30, -40, 55][chi], chz = [-50, -45, 55, 120, 130, -100][chi];
    var chy = [0, 0, -18, -36, -36, 0][chi];
    var cpost = new T.Mesh(new T.CylinderGeometry(0.18, 0.24, 4.4, 6), woodDarkMat);
    cpost.position.set(chx, chy + 2.2, chz); root.add(cpost);
    for (var cb = 0; cb < 3; cb++) {
      var bar = new T.Mesh(new T.CylinderGeometry(0.09, 0.09, 1.4 - cb * 0.25, 5), goldMat);
      bar.position.set(chx + (cb - 1) * 0.55, chy + 3.6, chz); root.add(bar);
    }
    foot.push([chx, chz, 0.7, 0.7, chy, chy + 4.4, 0]);
  }

  // ---------- ROPE BRIDGE: over the stream gully near the falls ----------
  (function () {
    var x1 = -2, z1 = -128, x2 = -30, z2 = -128, y = 2.5;
    var len = Math.hypot(x2 - x1, z2 - z1), n = 12;
    for (var i = 0; i <= n; i++) {
      var px = x1 + (x2 - x1) * i / n, pz = z1 + (z2 - z1) * i / n;
      var sag = Math.sin((i / n) * Math.PI) * -1.1;
      var plank = new T.Mesh(new T.BoxGeometry(2.6, 0.35, 2.2), woodMat);
      plank.position.set(px, y + sag, pz);
      plank.rotation.z = (i % 2 ? 0.06 : -0.06); root.add(plank);
    }
    [-1.3, 1.3].forEach(function (off) {
      for (var j = 0; j <= n; j += 3) {
        var qx = x1 + (x2 - x1) * j / n, qz = z1 + (z2 - z1) * j / n + off;
        var qy = y + Math.sin((j / n) * Math.PI) * -1.1;
        var post = new T.Mesh(new T.CylinderGeometry(0.14, 0.14, 2.2, 5), woodDarkMat);
        post.position.set(qx, qy + 1.1, qz); root.add(post);
      }
      var rope = new T.Mesh(new T.CylinderGeometry(0.08, 0.08, len, 5),
        new T.MeshLambertMaterial({ color: 0x9a7a4a }));
      rope.rotation.z = Math.PI / 2; rope.rotation.y = -Math.atan2(z2 - z1, x2 - x1);
      rope.position.set((x1 + x2) / 2, y + 1.9, (z1 + z2) / 2 + off); root.add(rope);
      // side ropes block falling off: thin solids along each side
      foot.push([(x1 + x2) / 2, (z1 + z2) / 2 + off, len, 0.5, y - 0.5, y + 2.6, 0]);
    });
    // anchor posts at both ends
    [[x1, z1], [x2, z2]].forEach(function (p) {
      var ap = new T.Mesh(new T.CylinderGeometry(0.3, 0.35, 4.5, 6), woodDarkMat);
      ap.position.set(p[0], y + 1.5, p[1]); root.add(ap);
      foot.push([p[0], p[1], 1, 1, y - 1, y + 3.8, 0]);
    });
    walkRects.push({ x1: Math.min(x1, x2) - 1, z1: z1 - 1.4, x2: Math.max(x1, x2) + 1, z2: z1 + 1.4, y: y + 0.2 });
  })();

  // ---------- steps between terraces (stone stairs) ----------
  function stoneSteps(x, z, yTop, yBot, dir) {
    var steps = Math.round((yTop - yBot) / 1.1);
    for (var i = 0; i < steps; i++) {
      var st = new T.Mesh(new T.BoxGeometry(4.5, 1.1, 2.2), basaltMat);
      st.position.set(x, yBot + 0.55 + i * 1.1, z + dir * i * 2.0); root.add(st);
    }
    foot.push([x, z + dir * steps, 4.5, steps * 2.2, yBot, yTop + 0.6, 0]);
  }
  stoneSteps(-44, 52, -18, -36, 1);    // B down to C, west
  stoneSteps(44, -32, 0, -18, 1);      // A down to B, east
  stoneSteps(0, 140, -36, -40, 1);     // C to southern slope

  // ---------- new true-name plates ----------
  plate('THE HIGH LEDGES', -44, 3.4, -82, 0.2);
  plate("THE HERMIT'S NOOK", -98, -10.6, -8, 1.57);
  plate('THE STILT ROW', -24, -14.6, 48, 3.1);
  plate('THE EASTERN GROVE', 92, -16.6, 34, -1.57);
  plate('THE SO