<!-- SOLID CITY · part 1976 -->
oldTrim);
  apronLip.position.set(0, deckY + 0.1, 25.6); root.add(apronLip);
  zones.push({ kind: 'flat', x0: APRON.x0, x1: APRON.x1, z0: APRON.z0, z1: APRON.z1, y: deckY });

  // ---------- THE LOT LEVEL (measured from the shelf itself) ----------
  var LOT = { x0: -140, x1: 140, z0: 72, z1: 172 };
  var lotMax = -1000;
  for (var sx = LOT.x0; sx <= LOT.x1; sx += 20) for (var sz = LOT.z0; sz <= LOT.z1; sz += 20) {
    var h = groundAt(-1300 + sx, -620 + sz); if (h > lotMax) lotMax = h;
  }
  var lotY = lotMax + 0.4;
  var lot = new T.Mesh(new T.BoxGeometry(280, 56, 100), asphalt);
  lot.position.set(0, lotY - 28, 122); root.add(lot);
  var lotTrim = new T.Mesh(new T.BoxGeometry(282, 0.5, 102), goldTrim);
  lotTrim.position.set(0, lotY - 0.28, 122); root.add(lotTrim);
  zones.push({ kind: 'flat', x0: LOT.x0, x1: LOT.x1, z0: LOT.z0, z1: LOT.z1, y: lotY });
  // gold light strips down the lot's west face — the mesa reads built, not bare
  [88, 122, 156].forEach(function (lz2) {
    var strip = new T.Mesh(new T.BoxGeometry(0.4, 30, 1.1), goldTrim);
    strip.position.set(-140.2, lotY - 15, lz2); root.add(strip);
  });
  // stall lines: two rows facing the central lane (lane centre z = 122)
  function stallLines(zEdge, dir) {
    for (var x = -126; x <= 126; x += 12) {
      var ln = new T.Mesh(new T.BoxGeometry(0.35, 0.06, 17), lineWhite);
      ln.position.set(x, lotY + 0.05, zEdge + dir * 8.5); root.add(ln);
    }
    var stop = new T.Mesh(new T.BoxGeometry(252, 0.5, 0.8), gold);
    stop.position.set(0, lotY + 0.25, zEdge); root.add(stop);
  }
  stallLines(80, 1);    // north row: stalls z 80..97
  stallLines(164, -1);  // south row: stalls z 147..164
  // lane dashes down the middle
  for (var dx = -132; dx <= 132; dx += 16) {
    var dash = new T.Mesh(new T.BoxGeometry(7, 0.06, 0.7), goldTrim);
    dash.position.set(dx, lotY + 0.05, 122); root.add(dash);
  }
  // lamps
  var lampPoleG = new T.CylinderGeometry(0.22, 0.3, 7.5, 6);
  [[-120, 100], [-40, 100], [40, 100], [120, 100], [-120, 144], [-40, 144], [40, 144], [120, 144]].forEach(function (lp) {
    var pole = new T.Mesh(lampPoleG, steel); pole.position.set(lp[0], lotY + 3.75, lp[1]); root.add(pole);
    var bulb = new T.Mesh(new T.SphereGeometry(0.55, 8, 6), new T.MeshBasicMaterial({ color: 0xffe8a0 }));
    bulb.position.set(lp[0], lotY + 7.6, lp[1]); root.add(bulb);
    foot.push([lp[0], lp[1], 1, 1, lotY, lotY + 7.5, 0]);
  });

  // ---------- THE RAMP (apron -> lot, walkable + rollable) ----------
  var RAMP = { x0: -8, x1: 8, z0: 26, z1: 72 };
  var run = RAMP.z1 - RAMP.z0, drop = deckY - lotY;
  var rampLen = Math.hypot(run, drop) + 2;
  var ramp = new T.Mesh(new T.BoxGeometry(16, 1.1, rampLen), asphalt2);
  ramp.position.set(0, (deckY + lotY) / 2 - 0.55, (RAMP.z0 + RAMP.z1) / 2);
  ramp.rotation.x = Math.atan2(drop, run); root.add(ramp);
  var wedge = new T.Mesh(new T.BoxGeometry(17, 7.5, rampLen), concrete);
  wedge.position.set(0, (deckY + lotY) / 2 - 4.3, (RAMP.z0 + RAMP.z1) / 2);
  wedge.rotation.x = Math.atan2(drop, run); root.add(wedge);
  [-8.4, 8.4].forEach(function (cx) {
    var curb = new T.Mesh(new T.BoxGeometry(0.8, 0.7, rampLen), gold);
    curb.position.set(cx, (deckY + lotY) / 2 + 0.1, (RAMP.z0 + RAMP.z1) / 2);
    curb.rotation.x = Math.atan2(drop, run); root.add(curb);
  });
  zones.push({ kind: 'ramp', x0: RAMP.x0, x1: RAMP.x1, z0: RAMP.z0, z1: RAMP.z1, y0: deckY, y1: lotY });

  // signs
  function standingPlate(text, x, z, yBase, ry, fs) {
    var grp = new T.Group(); grp.position.set(x, yBase, z); grp.rotation.y = ry || 0;
    var post = new T.Mesh(new T.BoxGeometry(0.35, 3.4, 0.35), steel); post.position.y = 1.7; grp.add(post);
    var face = plateMesh(text, 7.6, 1.9, fs); face.position.set(0, 3.6, 0.25); grp.add(face);
    root.add(grp); foot.push([x, z, 1, 1, yBase, yBase + 4, 0]);
    return grp;
  }
  standingPlate('THE SOUTH LOT', -14, 18, deckY, Math.PI, 44);           // on the apron, beside the ramp head
  standingPlate('FIRST CITY — SOUTH LOT', -128, 100, lotY, 0.5, 30);     // the lot's west end
  standingPlate('RIDES ROLL: WALK TO A CAR, TAP ACTION', 24, 101, lotY, Math.PI, 26);  // the lane's edge

  // ---------- THE RIDES ----------
  var glowMats = [];
  function paint(hex) { return new T.MeshLambertMaterial({ color: hex, emissive: hex, emissiveIntensity: 0.12 }); }
  function wheels(g, r, w, xs, zs, y) {
    var wg = new T.CylinderGeometry(r, r, w, 12);
    var hg = new T.CylinderGeometry(r * 0.45, r * 0.45, w + 0.06, 8);
    xs.forEach(function (x) { zs.forEach(function (z) {
      var wh = new T.Mesh(wg, tyreM); wh.rotation.z = Math.PI / 2; wh.position.set(x, y, z); g.add(wh);
      var hub = new T.Mesh(hg, gold); hub.rotation.z = Math.PI / 2; hub.position.set(x, y, z); g.add(hub);
    }); });
  }
  function seats(g, z1, z2) {
    [-0.48, 0.48].forEach(function (x) {
      var s = new T.Mesh(new T.BoxGeometry(0.62, 0.75, 0.6), seatM); s.position.set(x, 0.78, z1); g.add