<!-- SOLID CITY · part 2513 -->
n buildMansion(name, ax, az) {
    var spot = findGrand(ax, az); if (!spot) return null;
    var x = spot[0], z = spot[1], ry = R() * Math.PI * 2;
    var floorY = lotHeight(x, z, 12) + 0.3;
    BASE = M4(x, floorY, z, ry, 0, 0);
    box(solid, 30, 0.6, 21, 0, -0.3, 0, C.stone, 0);
    for (var f = 0; f < 2; f++) {
      var fy = f * 3.2;
      box(solid, 24, 3.2, 15, 0, fy + 1.6, 0, C.cream, 0);
      box(solid, 24.8, 0.16, 4.0, 0, fy + 0.08, 9.4, C.conc, 0);
      for (var px = -11; px <= 11; px += 2.75) box(solid, 0.3, 3.1, 0.3, px, fy + 1.55, 11.2, C.cream2, 0);
      box(glassB, 22, 1.2, 0.1, 0, fy + 1.9, 7.56, C.glass, 0);
    }
    box(solid, 25, 0.3, 16, 0, 6.55, 0, C.slate, 0);
    box(glowB, 25.4, 0.14, 16.4, 0, 6.42, 0, C.gold, 0);
    box(solid, 10, 0.25, 6, 0, 0.13, 15.5, C.pool, 0);
    box(solid, 3.6, 2.6, 0.3, 0, 1.3, 7.65, C.door, 0);
    BASE = new T.Matrix4();
    foot.push([x, z, 30, 21, floorY - 0.6, floorY + 6.9, ry]);
    placed.push([x, z, 34]);
    dressHome({ x: x, z: z, ry: ry, w: 30, d: 21, lanaiDepth: 4 }, { palm: true, plumeria: true, shrub: true });
    var rec = { name: name, x: x, z: z, y: floorY };
    mansions.push(rec);
    return rec;
  }
  singles(1150, -1420, 'THE SUMMIT MEADOWS', 5, ['waa', 'noa', 'dickey', 'plantation']);
  buildPrivatePort('SUMMIT MEADOWS PORT', 1150, -1420, 20);
  singles(840, -2330, 'THE FAR SHOULDER', 4, ['plantation', 'waa', 'noa'], 100);
  buildPrivatePort('FAR SHOULDER PORT', 840, -2330, 24);
  var hg;
  hg = buildHotel('THE CLOUD BENCH HOTEL', 1150, -1760); if (hg) buildPrivatePort('CLOUD BENCH PORT', hg.x, hg.z, 30);
  hg = buildHotel('THE HIGH MEADOW HOTEL', 1260, -2180); if (hg) buildPrivatePort('HIGH MEADOW PORT', hg.x, hg.z, 30);
  hg = buildMansion('THE EASTERN MANSION', 1500, -2220); if (hg) buildPrivatePort('EASTERN MANSION PORT', hg.x, hg.z, 32);
  hg = buildMansion('THE NORTH SHOULDER MANSION', 820, -2420); if (hg) buildPrivatePort('NORTH SHOULDER PORT', hg.x, hg.z, 32);
  hg = buildMansion('THE SUMMIT MANSION', 1330, -1700); if (hg) buildPrivatePort('SUMMIT MANSION PORT', hg.x, hg.z, 32);
  buildPlates();

  /* THE REJECTION: no road bodies, no bridge. The ports rise
   * instead — the way between places is the sky now. */
  if (!ROADS_REJECTED) { roadBodies(); buildSolidBridge(); }
  buildPorts();

  /* ================= ASSEMBLY ================= */
  var group = new T.Group();
  group.add(solid.build(new T.MeshLambertMaterial({ vertexColors: true })));
  group.add(glassB.build(new T.MeshLambertMaterial({ vertexColors: true, transparent: true, opacity: 0.55 })));
  group.add(glowB.build(new T.MeshBasicMaterial({ vertexColors: true })));
  extras.forEach(function (m) { group.add(m); });

  var houseCount = 0, unitCount = 0;
  homes.forEach(function (h) { if (h.style === 'apartment') unitCount += (h.units || 6); else houseCount++; });
  function standYAt(x, z) {
    var best = -Infinity;
    for (var i = 0; i < standRects.length; i++) {
      var r = standRects[i], dx = x - r.cx, dz = z - r.cz;
      var lx = dx * r.cos - dz * r.sin, lz = dx * r.sin + dz * r.cos;
      if (Math.abs(lx - r.lx) <= r.hw && Math.abs(lz - r.lz) <= r.hd && r.y > best) best = r.y;
    }
    return best;
  }
  group.userData = {
    footprint: foot,
    standRects: standRects,
    standTris: standTris,
    homes: homes,
    ports: ports,
    hotels: hotels,
    mansions: mansions,
    counts: { houses: houseCount, apartmentUnits: unitCount, dwellings: houseCount + unitCount, trees: treeCount, styles: STYLE_COUNT },
    center: { x: 300, z: -1500 },
    standYAt: standYAt,
    update: null
  };
  return group;
}


===== FILE: public/city/mountain-homes.js.bak-allmtn-20261014 =====
/* SOLID CITY — NĀ HALE O NĀ KŪPUNA: THE ANCESTORS' HOMES (2026-10-12, by order of the King)
 * "We need to build homes for hawaiians." — homes woven into the green coastal
 * benches around THE ANCESTRAL ROADS (0,-1600), on the ancestors' own land:
 * 'ohana compounds (a main hale, a kupuna hale, a keiki hale around a shared yard),
 * plantation homes, Dickey-roof residences, traditional hale, small apartment
 * blocks at the base — following the verified historic style guide (hale →
 * plantation → Dickey → mission).
 *
 * Design sources (the King's method): three AI reference images (compound / plantation
 * home / mountainside pattern) + his real Hilo ground photos (steep roofs, A-frame gables,
 * earth-tone stucco, lawn-and-path layout, yellow path stones).
 *
 * PLACEMENT LAW (the King's word): homes sit on gentle slopes and valley floors ONLY —
 * never on ledges, ridge crests, or cliff edges. Ledges keep their natural form.
 * Every home has a driveway and a parking pad. Every home is WALK-IN: a real door
 * opening, a real little interior, walls solid, door gap passable.
 *
 * Performance: ALL static geometry is merged into a few vertex-colored batches
 * (opaque / glow / glass) — the whole mountainside is a handful of draw calls.
 * Self-