<!-- SOLID CITY · part 2976 -->
-- */
  var STYLES = [
    { wall: C.cream, roof: C.slate, trim: C.woodDark, form: 'pitched' },
    { wall: C.cream2, roof: C.roofRed, trim: C.wood, form: 'dickey' },
    { wall: C.titanium, roof: C.silver, trim: C.gold, form: 'flat' },
    { wall: C.cream, roof: C.wood, trim: C.woodDark, form: 'pitched' },
    { wall: C.cream2, roof: C.slate, trim: C.gold, form: 'dickey' }
  ];
  function buildHouse(f, district, styleIdx, floors) {
    var st = STYLES[styleIdx % STYLES.length];
    var w = 13 + R() * 4, d = 10.5 + R() * 2.5, wallH = floors === 2 ? 6.4 : 3.4;
    box(solid, f, w + 3.4, 0.35, d + 4.6, 0, 0.18, -0.6, C.conc);
    standRect(f, w + 3.4, d + 4.6, BASE + 0.35, 0, -0.6);
    box(solid, f, w, wallH, d, 0, 0.35 + wallH / 2, 0, st.wall);
    box(solid, f, w + 1.2, 0.16, 3.0, 0, 0.43, -d / 2 - 1.5, C.conc);            // the lanai floor, toward the ring road
    for (var px = -1; px <= 1; px += 2) box(solid, f, 0.26, 2.6, 0.26, px * (w / 2 - 0.4), 1.7, -d / 2 - 2.7, st.trim);
    box(solid, f, 1.9, 2.3, 0.24, 0, 1.5, -d / 2 - 0.13, C.woodDark);           // the door, facing the road
    box(glassB, f, w * 0.62, 1.0, 0.12, 0, 2.2, -d / 2 - 0.07, C.glass);
    box(glow, f, 0.5, 0.5, 0.12, w / 4, 2.3, -d / 2 - 0.1, C.gold);              // a lamp of welcome beside the door
    if (floors === 2) {
      box(solid, f, w * 0.8, 0.14, d * 0.8, 0, 3.55, 0, st.trim);
      box(glassB, f, w * 0.55, 0.9, 0.12, 0, 5.2, -d / 2 - 0.07, C.glass);
    }
    var topY = 0.35 + wallH;
    if (st.form === 'pitched') {
      box(solid, f, w + 1.6, 0.18, d / 2 + 1.1, 0, topY + 1.05, -d / 4 - 0.2, st.roof, 0.5, 0, 0);
      box(solid, f, w + 1.6, 0.18, d / 2 + 1.1, 0, topY + 1.05, d / 4 + 0.2, st.roof, -0.5, 0, 0);
      box(solid, f, w + 1.2, 0.22, 0.5, 0, topY + 1.95, 0, st.trim);
    } else if (st.form === 'dickey') {
      box(solid, f, w + 2.2, 0.16, d + 2.2, 0, topY + 0.35, 0, st.roof, 0, 0, 0);
      box(solid, f, w * 0.62, 0.16, d * 0.55, 0, topY + 1.15, -d * 0.14, st.roof, 0.48, 0, 0);
      box(solid, f, w * 0.62, 0.16, d * 0.55, 0, topY + 1.15, d * 0.14, st.roof, -0.48, 0, 0);
    } else {
      box(solid, f, w + 1.0, 0.28, d + 1.0, 0, topY + 0.14, 0, st.roof);
      box(glow, f, w + 1.04, 0.1, d + 1.04, 0, topY + 0.3, 0, C.gold);
    }
    footprint(f, w, d, BASE, BASE + topY + 2.1);
    return record('', 'house', f, district);
  }
  function buildPavilion(f, district, big) {
    var w = big ? 17 : 12, d = big ? 13 : 9.5;
    box(solid, f, w + 2, 0.3, d + 2, 0, 0.15, 0, C.stone);
    standRect(f, w + 2, d + 2, BASE + 0.3, 0, 0);
    for (var px = -1; px <= 1; px += 2) for (var pz = -1; pz <= 1; pz += 2) {
      box(solid, f, 0.42, 3.1, 0.42, px * (w / 2 - 0.5), 1.85, pz * (d / 2 - 0.5), C.woodDark);
      footprints.push({ x: f.x + f.tx * px * (w / 2 - 0.5) + f.rx * pz * (d / 2 - 0.5), z: f.z + f.tz * px * (w / 2 - 0.5) + f.rz * pz * (d / 2 - 0.5), w: 0.6, d: 0.6, a: f.a, y0: BASE, y1: BASE + 3.4 });
    }
    cyl(solid, f, 0.4, Math.max(w, d) * 0.78, 2.6, 4, 0, 4.9, 0, C.slate, 0, Math.PI / 4, 0);
    box(glow, f, 0.7, 0.7, 0.7, 0, 6.35, 0, C.gold);
    box(solid, f, w * 0.55, 0.45, 0.6, 0, 0.55, 0, C.wood);
    return record('', 'pavilion', f, district);
  }
  function buildGrand(f, district, kind, name) {
    var isHotel = kind === 'hotel';
    var w = isHotel ? 40 : 30, d = isHotel ? 17 : 19, floors = isHotel ? 3 : 2, fh = 3.1;
    var platD = isHotel ? d + 6 : d + 12, platZ = isHotel ? -0.8 : 1.5;
    box(solid, f, w + 5, 0.4, platD, 0, 0.2, platZ, C.stone);
    standRect(f, w + 5, platD, BASE + 0.4, 0, platZ);
    for (var fl = 0; fl < floors; fl++) {
      var fy = 0.4 + fl * fh;
      box(solid, f, w, fh, d, 0, fy + fh / 2, 0, fl === floors - 1 ? C.cream2 : C.cream);
      box(solid, f, w + 1.4, 0.16, 3.4, 0, fy + 0.08, -d / 2 - 1.7, C.conc);
      for (var px = -w / 2 + 2; px <= w / 2 - 2; px += 4) box(solid, f, 0.26, fh - 0.3, 0.26, px, fy + fh / 2, -d / 2 - 3.2, C.woodDark);
      box(glassB, f, w * 0.86, 1.05, 0.12, 0, fy + 1.85, -d / 2 - 0.07, C.glass);
    }
    var topY = 0.4 + floors * fh;
    box(solid, f, w + 1.4, 0.3, d + 1.4, 0, topY + 0.15, 0, C.slate);
    box(glow, f, w + 1.44, 0.12, d + 1.44, 0, topY + 0.02, 0, C.gold);
    box(solid, f, 3.4, 2.5, 0.3, 0, 1.65, -d / 2 - 0.16, C.woodDark);
    if (!isHotel) box(solid, f, 11, 0.22, 6.5, 0, 0.51, d / 2 + 4.1, C.pool);
    footprint(f, w, d, BASE, BASE + topY + 0.3);
    var rec = record(name, kind, f, district);
    return rec;
  }
  function buildStall(f) {
    box(solid, f, 5.6, 1.05, 2.4, 0, 0.72, 0, C.wood);
    for (var px = -1; px <= 1; px += 2) for (var pz = -1; pz <= 1; pz += 2)
      box(solid, f, 0.2, 2.5, 0.2, px * 2.7, 1.25, pz * 1.5, C.woodDark);
    box(solid, f, 6.6, 0.14, 4.2, 0, 2.62, 0, C.roofRed, 0.1, 0, 0);
    box(glow, f, 1.3, 0.3, 0.3, 0, 1.35, -1.25, [C.flower1, C.flower3, C.gold][Math.floor(R() * 3)]);
    footprint(f, 5.6, 2.4, BASE, BASE + 1.25);
  }
  function buildTree(f, palm) {
