<!-- SOLID CITY · part 3642 -->
esh(new T.CylinderGeometry(0.22, 0.28, 2.6, 6), woodDarkMat);
      post.position.set(px, py + 1.3, pz); root.add(post);
      foot.push([px, pz, 0.7, 0.7, py, py + 2.6, 0]);
      tops.push([px, py + 2.4, pz]);
    }
    for (var j = 0; j < tops.length - 1; j++) {
      var A1 = tops[j], B1 = tops[j + 1];
      var rl2 = Math.hypot(B1[0] - A1[0], B1[2] - A1[2]);
      var rope = new T.Mesh(new T.CylinderGeometry(0.09, 0.09, rl2, 5), new T.MeshLambertMaterial({ color: 0x9a7a4a }));
      rope.rotation.z = Math.PI / 2; rope.rotation.y = -Math.atan2(B1[2] - A1[2], B1[0] - A1[0]);
      rope.position.set((A1[0] + B1[0]) / 2, (A1[1] + B1[1]) / 2 - 0.35, (A1[2] + B1[2]) / 2);
      root.add(rope);
    }
    // linear blocking along the fence line
    var mx = (x1 + x2) / 2, mz = (z1 + z2) / 2, ang2 = Math.atan2(z2 - z1, x2 - x1);
    foot.push([mx, mz, len, 1.1, Math.min(y1, y2), Math.min(y1, y2) + 2.6, -ang2]);
  }
  ropeFence(-58, -85, 0, -58, -30, 0);        // A west edge
  ropeFence(58, -85, 0, 58, -30, 0);          // A east edge
  ropeFence(-60, 0, -18, -60, 55, -18);       // B west edge
  ropeFence(60, 0, -18, 60, 55, -18);         // B east edge
  ropeFence(-58, 85, -36, -58, 135, -36);     // C west edge
  ropeFence(58, 85, -36, 58, 135, -36);       // C east edge

  // ---------- hanging lanterns (16) ----------
  var lanterns = [];
  function lantern(x, y, z) {
    var arm = new T.Mesh(new T.CylinderGeometry(0.16, 0.16, 3.4, 6), woodDarkMat);
    arm.position.set(x, y + 3.2, z); root.add(arm);
    var orb = new T.Mesh(new T.SphereGeometry(0.65, 10, 8),
      new T.MeshBasicMaterial({ color: 0xffc060, transparent: true, opacity: 0.95 }));
    orb.position.set(x, y + 1.4, z); root.add(orb);
    var pl = new T.PointLight(0xffb050, 0.9, 26); pl.position.set(x, y + 1.6, z); root.add(pl);
    lanterns.push({ orb: orb, pl: pl, seed: R() * 10 });
    foot.push([x, z, 0.8, 0.8, y, y + 4.9, 0]);
  }
  lantern(-40, 0, -88); lantern(40, 0, -88); lantern(0, 0, -60);
  lantern(-28, -18, -5); lantern(8, -18, -15); lantern(34, -18, 10);
  lantern(-52, -18, 20); lantern(52, -18, 18);
  lantern(-30, -36, 78); lantern(6, -36, 72); lantern(36, -36, 98);
  lantern(-45, -36, 100); lantern(20, -36, 80);
  lantern(-95, -14, -14); lantern(90, -20, 26); lantern(10, -40, 146);

  // ---------- shrines (3): stone, small, glowing heart ----------
  function shrine(x, z, ty, ry) {
    var g = new T.Group();
    var base = new T.Mesh(new T.BoxGeometry(3.4, 1.2, 3.4), basaltMat); base.position.y = 0.6; g.add(base);
    var pillar = new T.Mesh(new T.BoxGeometry(1.6, 3.2, 1.6), basaltMat); pillar.position.y = 2.8; g.add(pillar);
    var cap = new T.Mesh(new T.BoxGeometry(2.6, 0.7, 2.6), basaltMat); cap.position.y = 4.7; g.add(cap);
    var heart = new T.Mesh(new T.SphereGeometry(0.55, 10, 8),
      new T.MeshBasicMaterial({ color: 0x7ae0ff, transparent: true, opacity: 0.95 }));
    heart.position.y = 2.8; heart.name = 'shrineHeart'; g.add(heart);
    var pl = new T.PointLight(0x7ae0ff, 0.8, 22); pl.position.y = 2.8; g.add(pl);
    g.position.set(x, ty, z); g.rotation.y = ry; root.add(g);
    lanterns.push({ orb: heart, pl: pl, seed: R() * 10 });
    foot.push([x, z, 3.6, 3.6, ty, ty + 5.1, ry]);
  }
  shrine(-14, -100, 0, 0.4); shrine(48, 30, -18, -0.8); shrine(-58, 118, -36, 1.9);

  // ---------- THE TARO TERRACES: stepped water patches (Terrace B south) ----------
  (function () {
    var wMat = new T.MeshBasicMaterial({ color: 0x2a5a3a, transparent: true, opacity: 0.92 });
    var mMat = new T.MeshLambertMaterial({ color: 0x3a2e22 });
    for (var r = 0; r < 3; r++) for (var c = 0; c < 4; c++) {
      var px = -24 + c * 9, pz = 44 + r * 8, py = -18;
      var bed = new T.Mesh(new T.BoxGeometry(7.6, 0.9, 6.6), mMat);
      bed.position.set(px, py + 0.45, pz); root.add(bed);
      var water = new T.Mesh(new T.PlaneGeometry(6.8, 5.8), wMat);
      water.rotation.x = -Math.PI / 2; water.position.set(px, py + 0.95, pz); root.add(water);
      for (var t2 = 0; t2 < 4; t2++) {
        var sprout = new T.Mesh(new T.ConeGeometry(0.5, 1.6, 6), leafMat);
        sprout.position.set(px + (R() - 0.5) * 5.5, py + 1.6, pz + (R() - 0.5) * 4.5); root.add(sprout);
      }
    }
    foot.push([-24 + 13.5, 44 + 8, 38, 26, -18, -16.9, 0]);   // one low solid for the beds
  })();

  // ---------- THE CRAG LOOKOUT: high rock perch east ----------
  (function () {
    var cx = 78, cz = -108, cy = 6;
    var crag = new T.Mesh(new T.DodecahedronGeometry(9, 0), basaltMat);
    crag.position.set(cx, cy - 2, cz); crag.scale.y = 1.5; root.add(crag);
    var deck = new T.Mesh(new T.BoxGeometry(10, 1, 8), woodMat);
    deck.position.set(cx, cy + 9.5, cz); root.add(deck);
    for (var i = -1; i <= 1; i++) {
      var pr = new T.Mesh(new T.CylinderGeometry(0.2, 0.2, 2.4, 6), woodDarkMat);
      pr.position.set(cx + i * 4.4, cy + 11.2, cz - 3.6); root.add(pr);
    }
    var rail = new T.Mesh(new T.BoxGeometry(10, 0.22, 0.22), wood