<!-- SOLID CITY · part 2768 -->
   var len = Math.hypot(x1 - x0, z1 - z0), n = Math.max(1, Math.round(len / stepLen)), ang = Math.atan2(x1 - x0, z1 - z0), run = len / n;
    for (var j = 0; j < n; j++) {
      var t = (j + 0.5) / n, px = x0 + (x1 - x0) * t, pz = z0 + (z1 - z0) * t;
      // THE ONE ROAD reaches the driveways too: each stone pitches between
      // the same sampled ends its neighbours use — a path of ramps that
      // follow the land, not a staircase dropped on it.
      var ga = groundAt(x0 + (x1 - x0) * (j / n), z0 + (z1 - z0) * (j / n));
      var gb = groundAt(x0 + (x1 - x0) * ((j + 1) / n), z0 + (z1 - z0) * ((j + 1) / n));
      var rx = -Math.atan2(gb - ga, run);   // pitch truth (2026-10-13): atan2, as above
      BASE = M4(px, (ga + gb) / 2 + 0.08, pz, ang, rx, 0);
      box(solid, wdt, 0.18, stepLen + 0.7, 0, 0, 0, col);
      BASE = new T.Matrix4();
    }
  }

  /* ================= SITING — the placement law, enforced ================= */
  var EXCLUDE = [   // [x, z, radius] — structures and ground that stay untouched
    [0, -1600, 578],      // THE ANCESTRAL ROADS terrace (platform r=560)
    [0, -3200, 430],      // Imperial Colosseum
    [0, 0, 1060],         // the capital
    [0, -950, 205],       // Gate of Ancestors
    [450, -1150, 205],    // Compass Meridian
    [750, -1600, 255],    // Overlook Mira
    [-750, -1600, 255],   // Roost Keel
    [-700, -700, 290]     // Quadrant Crown
  ];
  var placed = [];
  function clearOf(x, z, r) {
    for (var i = 0; i < EXCLUDE.length; i++) {
      var e = EXCLUDE[i];
      if (Math.hypot(x - e[0], z - e[1]) < e[2] + r) return false;
    }
    for (var j = 0; j < placed.length; j++) {
      if (Math.hypot(x - placed[j][0], z - placed[j][1]) < placed[j][2] + r) return false;
    }
    return true;
  }
  function findSpot(cx, cz, rad, lotR) {
    for (var ring = 0; ring < 5; ring++) {
      var rr = rad * ring / 4;
      for (var k = 0; k < 10; k++) {
        var a = (k / 10) * Math.PI * 2 + ring * 0.7 + R() * 0.3;
        var x = cx + Math.cos(a) * rr, z = cz + Math.sin(a) * rr;
        if (benchAt(x, z, lotR) >= 0 && clearOf(x, z, lotR + 4)) return [x, z];
      }
    }
    return null;
  }
  function faceAngle(x, z, tx, tz) { return Math.atan2(tx - x, tz - z); }
  function plantAt(x, z, fn) {
    BASE = M4(x, groundAt(x, z) - 0.15, z, R() * Math.PI * 2, 0, 0); fn(); BASE = new T.Matrix4();
  }

  // drive + parking + path for one home (the placement law: every house has a driveway)
  function serveHome(rec, roadPt) {
    var fx = Math.sin(rec.ry), fz = Math.cos(rec.ry);            // front dir
    var rx = Math.cos(rec.ry), rz = -Math.sin(rec.ry);           // right dir
    var frontL = rec.padCz + rec.padD / 2;
    var doorX = rec.x + fx * (frontL + 0.9), doorZ = rec.z + fz * (frontL + 0.9);
    // parking pad on the home's right-front side, at terrain height
    var pkX = rec.x + rx * (rec.padW / 2 + 3.6) + fx * (frontL - 3), pkZ = rec.z + rz * (rec.padW / 2 + 3.6) + fz * (frontL - 3);
    var pkY = groundAt(pkX, pkZ);
    BASE = M4(pkX, pkY + 0.06, pkZ, rec.ry, 0, 0);
    box(solid, 5.6, 0.16, 5.6, 0, 0, 0, C.path);
    BASE = new T.Matrix4();
    if (R() < 0.55) { BASE = M4(pkX, pkY + 0.14, pkZ, rec.ry + (R() - 0.5) * 0.2, 0, 0); car(CAR_COLS[Math.floor(R() * CAR_COLS.length)]); BASE = new T.Matrix4(); }
    // driveway: parking pad -> nearest road (shared/short spurs are fine)
    if (roadPt.dist < 85) steppedPath(pkX, pkZ, roadPt.x, roadPt.z, 3.4, C.drive, 3.6);
    // walking path: parking pad -> front steps, lined with small yellow stones (the King's photos)
    steppedPath(pkX, pkZ, doorX, doorZ, 1.7, C.path, 2.6);
    var plen = Math.hypot(doorX - pkX, doorZ - pkZ), pn = Math.max(2, Math.floor(plen / 2.2));
    for (var i = 0; i <= pn; i++) {
      var t = i / pn, sx2 = pkX + (doorX - pkX) * t, sz2 = pkZ + (doorZ - pkZ) * t;
      var ox = -(doorZ - pkZ) / (plen || 1) * 1.25, oz = (doorX - pkX) / (plen || 1) * 1.25;
      BASE = M4(sx2 + ox, groundAt(sx2 + ox, sz2 + oz) + 0.02, sz2 + oz, 0, 0, 0);
      rock(solid, 0.3, 0, 0.1, 0, C.yellowStone);
      BASE = new T.Matrix4();
    }
    // a mailbox where the path meets the drive
    BASE = M4(pkX - rx * 2.2, groundAt(pkX - rx * 2.2, pkZ - rz * 2.2), pkZ - rz * 2.2, rec.ry, 0, 0);
    box(solid, 0.14, 1.05, 0.14, 0, 0.52, 0, C.woodDark);
    box(solid, 0.75, 0.4, 0.45, 0, 1.2, 0, R() < 0.5 ? 0x8a3030 : C.stoneDark);
    BASE = new T.Matrix4();
    rec.door = [doorX, doorZ]; rec.park = [pkX, pkZ];
  }
  var CAR_COLS = [0xb8bcc2, 0x7a2e2e, 0x2e4a6a, 0xd8d3c3, 0x3a3a3e, 0x6a7a4a];

  /* ================= CLUSTERS — homes for Hawaiian families ================= */
  var plates = [];   // {x, z, ry, name}
  function plateFor(name, x, z) {
    var rp = nearestRoad(x, z);
    plates.push({ x: x, z: z, ry: faceAngle(x, z, rp.x, rp.z), name: name });
  }
  function compound(cx, cz, name, mainStyle, satStyles, opts) {
    opts = opts || {};
    var main = findSpot(cx, cz, 45,