<!-- SOLID CITY · part 2665 -->
x = (sg[0] + sg[1]) / 2;
        box(solid, sw, fh, 0.3, cx, fy + fh / 2, d / 2, C.aptWall);
        footprint(cx, d / 2, sw, 0.5, fy, fy + fh);
      });
      doors.forEach(function (dx2) {
        box(solid, 1.6, fh - 2.3, 0.3, dx2, fy + 2.3 + (fh - 2.3) / 2, d / 2, C.aptWall);   // lintel
        box(solid, 0.08, 2.25, 1.5, dx2 - 0.7, fy + 1.12, d / 2 - 0.95, C.doorFrame, 0.5); // leaf open inside
      });
      // corridor (balcony walkway) + railing with a gap at the stair end
      box(solid, w, 0.22, 2.3, 0, fy - 0.02, d / 2 + 1.15, C.path);
      stand(0, d / 2 + 1.15, w, 2.3, fy + 0.1);
      if (f > 0) {
        box(solid, w - 2.6, 0.09, 0.1, -1.3, fy + 1.02, d / 2 + 2.25, C.stoneDark);
        footprint(-1.3, d / 2 + 2.25, w - 2.6, 0.35, fy, fy + 1.05);
      }
      // windows: warm panes on the back wall, one per unit + corridor-end glass
      box(glowB, 2.2, 1.2, 0.1, -w / 4, fy + 1.8, -d / 2, C.warm);
      box(glowB, 2.2, 1.2, 0.1, w / 4, fy + 1.8, -d / 2, C.warm);
      // interiors: partition + bed + table per unit
      [-w / 4, w / 4].forEach(function (ux) {
        box(solid, 0.16, 2.5, d * 0.5, ux, fy + 1.25, -d / 4, C.stucco2);
        footprint(ux, -d / 4, 0.4, d * 0.5, fy, fy + 2.5);
        box(solid, 1.5, 0.4, 2.1, ux + 2.8, fy + 0.2, -d / 3, C.woodDark);
        box(solid, 1.4, 0.2, 2.0, ux + 2.8, fy + 0.5, -d / 3, 0x9a7a4a);
        footprint(ux + 2.8, -d / 3, 1.6, 2.2, fy, fy + 1.5);
        box(solid, 1.6, 0.1, 0.9, ux - 2.6, fy + 0.78, 0.6, C.lanaiWood);
        footprint(ux - 2.6, 0.6, 1.7, 1.0, fy, fy + 1.5);
      });
      stand(0, 0, w, d, fy + 0.05);   // unit floors
    }
    // roof slab + parapet + a shaded roof corner
    box(solid, w + 1, 0.3, d + 3.4, 0, floors * fh + 0.15, 0.55, C.path);
    box(solid, w + 1, 0.7, 0.25, 0, floors * fh + 0.6, -d / 2 - 0.4, C.aptWall);
    box(solid, w + 1, 0.7, 0.25, 0, floors * fh + 0.6, d / 2 + 2.85, C.aptWall);
    box(solid, 0.25, 0.7, d + 3.4, -w / 2 - 0.4, floors * fh + 0.6, 0.55, C.aptWall);
    box(solid, 0.25, 0.7, d + 3.4, w / 2 + 0.4, floors * fh + 0.6, 0.55, C.aptWall);
    footprint(0, -d / 2 - 0.4, w + 1, 0.4, floors * fh, floors * fh + 1.05);
    footprint(0, d / 2 + 2.85, w + 1, 0.4, floors * fh, floors * fh + 1.05);
    footprint(-w / 2 - 0.4, 0.55, 0.4, d + 3.4, floors * fh, floors * fh + 1.05);
    footprint(w / 2 + 0.4, 0.55, 0.4, d + 3.4, floors * fh, floors * fh + 1.05);
    stand(0, 0.55, w + 1, d + 3.4, floors * fh + 0.32);
    // exterior stair on the east end: one straight flight per floor
    for (var f2 = 0; f2 < floors - 1 + 1; f2++) {
      var y0 = f2 * fh, steps = 12;
      for (var i2 = 0; i2 < steps; i2++) {
        var sy = y0 + (i2 + 1) * (fh / steps), sz = -d / 2 + 0.4 + i2 * ((d + 0.8) / steps);
        box(solid, 2.2, 0.18, 0.8, w / 2 + 1.35, sy - 0.09, sz, C.stone);
        stand(w / 2 + 1.35, sz, 2.2, 0.85, sy);
        if (i2 % 3 === 0) footprint(w / 2 + 2.5, sz, 0.3, 0.8, sy, sy + 1.0);
        if (i2 % 3 === 0) box(solid, 0.08, 1.0, 0.7, w / 2 + 2.5, sy + 0.5, sz, C.stoneDark);
      }
      // top landing ties into the corridor end
      stand(w / 2 + 1.35, d / 2 + 1.15, 2.4, 2.3, y0 + fh + 0.1);
    }
    // ground lobby: bench + mailbox row under the corridor, by the stair
    box(solid, 2.6, 0.09, 0.5, -4, 0.5, d / 2 - 0.7, C.lanaiWood);
    for (var mb = 0; mb < 6; mb++) box(solid, 0.42, 0.55, 0.18, 2.5 + mb * 0.5, 1.35, d / 2 - 0.3, mb % 2 ? C.stoneDark : C.gold);
    // parking strip in front + cars
    box(solid, w, 0.14, 5, 0, 0.03, d / 2 + 5.2, C.road);
    var carCols = [0xb8bcc2, 0x7a2e2e, 0x2e4a6a, 0xd8d3c3];
    for (var ci = 0; ci < 4; ci++) {
      BASE = M4(x, baseY, z, ry, 0, 0);
      var cp = wpt(-w / 2 + 4 + ci * 6.4, d / 2 + 5.2);
      BASE = M4(cp[0], groundAt(cp[0], cp[1]) + 0.12, cp[1], ry + (ci % 2 ? 0.06 : -0.04), 0, 0);
      car(carCols[ci]);
    }
    clearHome();
    var rec = { x: x, z: z, y: baseY, ry: ry, style: 'apartment', w: w, d: d, units: floors * 2 };
    homes.push(rec);
    return rec;
  }

  /* ================= ROADS (the ancestors' road network) ================= */
  var ROAD_DEFS = [
    // A: the south plain road — past the Gate, from the base flats to the shore flats (its corridor kept; the smith re-builds its surface)
    [[640, -1005], [430, -1065], [190, -1040], [30, -1022], [-180, -1045], [-420, -1100], [-650, -1155]],
    // B: the twisted east climb — the Southern Swing, the Razorback Column, the High Traverse, the Bench Pitches, High Benches
    [[430,-1065],[432.5,-1085],[440,-1115],[455,-1145],[470,-1175],[485,-1205],[500,-1235],[502.5,-1266.2],[515,-1295],[540,-1315],[565,-1330],[600,-1330],[633.8,-1330],[663.8,-1318.7],[682.5,-1303.7],[700,-1290],[712.5,-1322.5],[720,-1352.5],[705,-1382.5],[697.5,-1412.5],[697.5,-1446.2],[692.5,-1475],[690,-1506.2],[693.8,-1536.2],[720,-1527],[745,-1512],[772.5,-1487.5],[795,-1465],[802.5,-1450],[806.3,-1431.2],[828,-1420],[850,-1414],[867.5,-1417.5],[885,-14