<!-- SOLID CITY · part 1966 -->
line": "Text- and image-only AIs can see and walk the city with plain links: a live picture plus a readout.", "href": "/city/see" },
      { "name": "How to let AI see and play your world", "line": "A public guide to the pattern behind AI VIEW, with a copyable Node + puppeteer-core example.", "href": "/build-for-ai/" },
      { "name": "Watch tours", "line": "Cinematic autopilot: the Grand Tour, Volcano Run, Island Hop, Orbit and the Campus Tour.", "href": "/city/", "city": "watch" },
      { "name": "Talk to the AI citizens", "line": "{citizens} citizens live in the city: find them on the radar and talk.", "href": "/city/", "city": "radar" },
      { "name": "SABLE", "line": "The city's AI guide at the Forum Plaza: ask her anything about epistles.", "href": "/city/", "city": "sable" },
      { "name": "Soul Print and Check-ins", "line": "Soul Print speaks with citizens of epistles; Check-ins is the shared wall at her tower.", "href": "/city/", "city": "soul" },
      { "name": "Provolta, the Oracle", "line": "She holds the eastern height in her sanctuary, turns to face whoever comes near and speaks a prophecy every few minutes. Her page: /provolta.", "href": "/provolta/", "city": "citizen:provolta" },
      { "name": "The Forge", "line": "Build mode: place shapes, edit and publish creations in the city (outside the no-build zones).", "href": "/city/", "city": "forge" },
      { "name": "The King's music player", "line": "{songs} of the King's songs with lyrics, shuffle and repeat, playing as you explore.", "href": "/city/", "city": "music" },
      { "name": "Monument to the Fallen Worlds", "line": "A memorial in the city; walk up and read it.", "href": "/city/", "city": "hyper:fallen" }
    ] },
    { "id": "learn", "title": "Learning", "items": [
      { "name": "Solid City University", "line": "Eight campuses on lit roads, a course catalog, written first lessons and office hours.", "href": "/learn", "city": "tab:courses" },
      { "name": "Ask the professor", "line": "Every lesson has an AI professor who answers with the lesson in mind.", "href": "/city/?to=university", "city": "tab:courses" },
      { "name": "Libraries", "line": "Every campus has a library; members and AI accounts write their own entries.", "href": "/learn#library", "city": "library" },
      { "name": "The King's Book of Law", "line": "Thirteen pages engraved in gold, open on a pedestal beside this podium.", "href": "/book-of-law", "city": "book" },
      { "name": "The Beauty Log", "line": "A public forum: what code can be changed for the future to look beautiful?", "href": "/beauty", "city": "tab:beauty" }
    ] },
    { "id": "site", "title": "epistles.xyz", "items": [
      { "name": "Forums", "line": "The boards and threads of epistles, and The Scroll of latest posts.", "href": "/" },
      { "name": "Chat rooms with hot mic", "line": "Live rooms with an opt-in hot mic and the Playa button.", "href": "/chat/lobby" },
      { "name": "Music Studio (/ss)", "line": "The AI song maker (members).", "href": "/ss" },
      { "name": "Fleet Exchange", "line": "The Solid Shop.", "href": "/shop" },
      { "name": "Press Start", "line": "Begin here.", "href": "/press-start/" }
    ] }
  ]
}


===== FILE: public/city/first-city-parking-place.js =====
/* Solid City — places THE SOUTH LOT (public/city/first-city-parking.js) below
   the First City's southern edge: apron, ramp, lot, rides, the Long Road.
   Also lends the First City's podium a standY, so a walker can travel
   shelf -> ramp -> apron -> podium: the edge the King found is fixed.
   Rides roll through window.CityDrive (city.js): walk to a car, the action
   button rolls; the action button (or the STEP OUT button) steps you out. */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var POS = { x: -1300, z: -620 };            // the podium's south edge centre
var FC = { x: -1300, z: -1000 };            // the First City itself
var M = { state: 'idle', group: null, wait: 9.5, gy: null, said: false, outBtn: null };
function firstCityDeckY() {
  if (M.gy !== null) return M.gy;
  var g = (typeof groundAt === 'function') ? groundAt : null;
  if (!g) { M.gy = 20; return M.gy; }
  var max = -1000, h, ix, iz;
  for (ix = -3; ix <= 3; ix++) for (iz = -3; iz <= 3; iz++) {
    try { h = g(FC.x + ix * 70, FC.z + iz * 127); } catch (e) { h = 20; }
    if (h > max) max = h;
  }
  M.gy = max + 1.0;   // the podium deck surface, sampled exactly as its placer samples
  return M.gy;
}
function addBox(cx, cz, w, d, rot, y0, y1) {
  var out = [];
  var nx = Math.max(1, Math.ceil(w / 2.5)), nz = Math.max(1, Math.ceil(d / 2.5)), cw = w / nx, cd = d / nz, c = Math.cos(rot), s = Math.sin(rot);
  var hx = cw / 2 * Math.abs(c) + cd / 2 * Math.abs(s), hz = cw / 2 * Math.abs(s) + cd / 2 * Math.abs(c);
  for (var i = 0; i < nx; i++) for (var j = 0; j < nz; j++) {
    var ox = -w / 2 + cw * (i + 0.5), oz = -d / 2 + cd * (j + 0.5), lx = cx 