<!-- SOLID CITY · part 3624 -->
y + 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 SOUTHERN SLOPE', 8, -36.6, 152, 0);
  plate('THE TARO TERRACES', -10, -14.6, 56, 0);
  plate('THE CRAG LOOKOUT', 78, 18.4, -100, 3.1);
  plate('THE HIDDEN GLOW', -80, -26.6, 52, 1.57);



  // ---------- TRUE-NAME PLATES ----------
  function plate(txt, x, y, z, ry) {
    var c = document.createElement('canvas'); c.width = 256; c.height = 64;
    var g = c.getContext('2d');
    g.fillStyle = '#1c1a20'; g.fillRect(0, 0, 256, 64);
    g.strokeStyle = '#d8aa48'; g.lineWidth = 4; g.strokeRect(3, 3, 250, 58);
    g.fillStyle = '#d8aa48'; g.textAlign = 'center'; g.textBaseline = 'middle';
    g.font = 'bold 25px Georgia, serif'; g.fillText(txt, 128, 34);
    var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding;
    var m = new T.Mesh(new T.PlaneGeometry(7, 1.75), new T.MeshBasicMaterial({ map: t, side: T.DoubleSide }));
    m.position.set(x, y, z); m.rotation.y = ry || 0; root.add(m);
    var post = new T.Mesh(new T.BoxGeometry(0.8, 2.2, 0.8), basaltMat);
    post.position.set(x, y - 1.9, z); root.add(post);
    foot.push([x, z, 1, 1, y - 3, y - 0.8, 0]);
  }
  plate('THE FALL', 32, 3.4, -158, -0.5);
  plate('THE SECOND FIRE', -2, -32.6, 130, 0.1);
  plate('THE UPPER HUTS', -59, -14.6, 30, 1.57);
  plate('THE LOWER HUTS', 58, -32.6, 122, -1.57);
  plate("THE ROAD'S END", 24, 12.4, -170, 3.1);

  // ---------- fireflies of warm light: village glow ----------
  var glow = new T.PointLight(0xffb0