<!-- SOLID CITY · part 3620 -->
, P7 = [-36, -85, 0], P8 = [-20, -120, 2], P9 = [8, -150, 6], P10 = [24, -175, 10];
  var path = [P1, P2, P3, P4, P5, P6, P7, P8, P9, P10];
  for (var sgi = 0; sgi < path.length - 1; sgi++) {
    var A0 = path[sgi], B0 = path[sgi + 1];
    roadSeg(A0[0], A0[1], A0[2], B0[0], B0[1], B0[2]);
  }
  // torches along the road
  var torches = [];
  path.forEach(function (p, idx) {
    if (idx % 2) return;
    [6.5, -6.5].forEach(function (off) {
      var pole = new T.Mesh(new T.CylinderGeometry(0.22, 0.3, 4.6, 6), woodDarkMat);
      pole.position.set(p[0] + off, p[2] + 2.3, p[1]); root.add(pole);
      var fl = new T.Mesh(new T.ConeGeometry(0.55, 1.7, 8),
        new T.MeshBasicMaterial({ color: C.fire, transparent: true, opacity: 0.92 }));
      fl.position.set(p[0] + off, p[2] + 5.3, p[1]); fl.name = 'flame'; root.add(fl);
      var pl = new T.PointLight(0xff9a40, 1.0, 34);
      pl.position.set(p[0] + off, p[2] + 5.6, p[1]); root.add(pl);
      torches.push({ fl: fl, pl: pl, seed: R() * 10 });
      foot.push([p[0] + off, p[1], 0.9, 0.9, p[2], p[2] + 4.6, 0]);
    });
  });

  // ---------- NEW HUTS: two clusters off the road ----------
  hut(-56, 14, -18, 2.6, 1); hut(-62, -16, -18, 1.2, 0.95);
  hut(56, 12, -18, -0.8, 1.05); hut(62, -18, -18, 2.2, 0.9);
  hut(52, 132, -36, -2.4, 1); hut(64, 108, -36, 0.8, 0.95);
  hut(-52, 134, -36, 2.4, 1.05); hut(-64, 110, -36, -0.6, 0.9);

  // ---------- WATERFALL: upper slope above Terrace A ----------
  var falls = [];
  (function () {
    var fx = 24, fz = -196;
    var cliff = new T.Mesh(new T.BoxGeometry(46, 52, 10), basaltMat);
    cliff.position.set(fx, 22, fz - 8); root.add(cliff);
    foot.push([fx, fz - 8, 46, 10, -4, 48, 0]);
    var sheet = new T.Mesh(new T.PlaneGeometry(9, 44),
      new T.MeshBasicMaterial({ color: 0xbfe8ff, transparent: true, opacity: 0.8 }));
    sheet.position.set(fx, 22, fz - 2.4); sheet.rotation.x = 0.06; root.add(sheet);
    falls.push(sheet);
    var pool = new T.Mesh(new T.CylinderGeometry(7, 7, 1, 18),
      new T.MeshBasicMaterial({ color: 0x3a6a8a, transparent: true, opacity: 0.9 }));
    pool.position.set(fx, 0.8, fz + 6); root.add(pool);
    var mist = new T.Mesh(new T.SphereGeometry(4.5, 10, 8),
      new T.MeshBasicMaterial({ color: 0xdff2ff, transparent: true, opacity: 0.35 }));
    mist.position.set(fx, 4, fz + 4); mist.scale.y = 0.6; root.add(mist);
    falls.push(mist);
    var sMat = new T.MeshBasicMaterial({ color: 0x5a9ac8, transparent: true, opacity: 0.85 });
    [[16, -168], [6, -152], [-4, -136], [-12, -120], [-16, -104]].forEach(function (sp) {
      var segm = new T.Mesh(new T.PlaneGeometry(3.2, 20), sMat);
      segm.rotation.x = -Math.PI / 2; segm.rotation.z = 0.35;
      segm.position.set(sp[0], 1.35, sp[1]); root.add(segm);
    });
    foot.push([fx, fz + 6, 14, 14, 0, 2, 0]);
  })();

  // ---------- SECOND FIRE: gathering circle on Terrace C ----------
  var fires = [];
  function firePit(x, z, ty) {
    var pit = new T.Mesh(new T.CylinderGeometry(2.2, 2.6, 1.1, 12), basaltMat);
    pit.position.set(x, ty + 0.55, z); root.add(pit);
    var flame = new T.Mesh(new T.ConeGeometry(1.4, 3.8, 10),
      new T.MeshBasicMaterial({ color: C.fire, transparent: true, opacity: 0.9 }));
    flame.position.set(x, ty + 3.1, z); root.add(flame);
    var light = new T.PointLight(0xff9a40, 2.0, 60);
    light.position.set(x, ty + 4.5, z); root.add(light);
    fires.push({ flame: flame, light: light, seed: R() * 10 });
    foot.push([x, z, 4.6, 4.6, ty, ty + 1.8, 0]);
  }
  (function () {
    var cx = -2, cz = 120, ty = -36, i, a;
    for (i = 0; i < 12; i++) {
      a = (i / 12) * Math.PI * 2;
      var sx = cx + Math.cos(a) * 7.5, sz = cz + Math.sin(a) * 7.5;
      var st = new T.Mesh(new T.BoxGeometry(1.3, 1.5, 1.3), basaltMat);
      st.position.set(sx, ty + 0.75, sz); st.rotation.y = a; root.add(st);
      foot.push([sx, sz, 1.3, 1.3, ty, ty + 1.5, 0]);
    }
    firePit(cx, cz, ty);
    for (i = 0; i < 5; i++) {
      var ba = (i / 5) * Math.PI * 2 + 0.5;
      var bench = new T.Mesh(new T.CylinderGeometry(0.45, 0.45, 3.8, 8), woodDarkMat);
      bench.rotation.z = Math.PI / 2; bench.rotation.y = -ba;
      bench.position.set(cx + Math.cos(ba) * 11, ty + 0.8, cz + Math.sin(ba) * 11); root.add(bench);
    }
  })();


  // ================= EXPONENTIAL INFILL (2026-10-11) =================
  // The King's words: "fill every little nook and cranny of this mountain."
  // COLLISION LAW: every mesh below pushes a footprint. No pass-through.
  var walkRects = [];
  var goldMat = new T.MeshLambertMaterial({ color: C.gold });

  // ---------- hut variants ----------
  function familyHale(x, z, ty, ry) { hut(x, z, ty, ry, 1.45); }           // large family hale
  function hermitHut(x, z, ty, ry) {                                       // tiny hermit hut
    var s = 0.62, g = new T.Group();
    var w = 5 * s, d = 4.4 * s, h = 2.6 * s;
    var walls = new T.Mesh(new T.BoxGeometry(w, h, d), woodMat