<!-- SOLID CITY · part 1792 -->
loor(wt.length * 0.95)] || 0, fps: fpsVal, avgMs: avg, p95Ms: ft[Math.floor(ft.length * 0.95)] || 0, calls: renderer.info.render.calls, tris: renderer.info.render.triangles, terrain: terrainStats(), solids: solids.length, mem: renderer.info.memory }; },
  resetFrames: function () { frameTimes.length = 0; workTimes.length = 0; },
  fly: function (x, y, z, heading, pitch) { S.mode = 'fly'; avatar.visible = false; S.ship.x = x; S.ship.y = y; S.ship.z = z; S.ship.q.setFromAxisAngle(UP, heading || 0); rotLocal(AX, -(pitch || 0)); S.ship.speed = 300; S.ship.throttle = 0.6; setFlightUI(true); shipCam = null; },
  walk: function (x, z, yaw) { S.mode = 'walk'; avatar.visible = true; S.p.x = x; S.p.z = z; S.p.y = groundAt(x, z); if (yaw != null) S.camYaw = yaw; setFlightUI(false); },
  board: board, launch: startCountdown, talk: openTalk, soul: openSoul, rtc: returnToCity, heightAt: heightAt
};
window.SC.api = {
  T: T, S: S, D: D, PAD: PAD, SABLE_POS: SABLE_POS, VOLCANOES: VOLCANOES, ISLANDS: ISLANDS, CITY_Y: CITY_Y, IS_TOUCH: IS_TOUCH, MOBILE: MOBILE,
  world: world, scene: scene, camera: camera, renderer: renderer, origin: origin, curve: curve, labelTex: labelTex, groundAt: groundAt, heightAt: heightAt, whereName: whereName,
  solids: solids, portals: portals, RADIO_MASTS: RADIO_MASTS, input: input, help: help, openPortal: openPortal, openTalk: openTalk,
  startAuto: startAuto, shipVectors: shipVectors, maxSpeed: maxSpeed, setFlightUI: setFlightUI, avatar: avatar,
  resetShipCam: function () { shipCam = null; }, supportClass: supportClass, solidsTopSupport: solidsTopSupport, standingAt: standingAt, solidsTop: function (x, z, pad) { var t = -1e9; for (var k = 0; k < solids.length; k++) { var q = solids[k]; if (x > q.x0 - pad && x < q.x1 + pad && z > q.z0 - pad && z < q.z1 + pad && q.y1 > t) t = q.y1; } return t; },
  rotLocal: rotLocal, levelShip: levelShip, startCountdown: startCountdown, board: board, R_PLANET: R_PLANET, ship: ship,
  isBuilt: function () { return cityBuilt; }, openSoul: openSoul, SOUL: SOUL, soulTab: spTab
};
})();


===== FILE: public/city/colosseum-imperial-place.js =====
/* Solid City — places THE IMPERIAL COLOSSEUM (public/city/colosseum-imperial.js)
   far south beyond the Ancestral Roads.
   Lazy: imported after the city is built; any import/build error is caught and the city carries on.
   The terrace height adapts to the terrain at runtime. Permanent at load.
   Adds: collision (userData.footprint), a radar marker 'IMPERIAL', a Hyper Controller
   stop, and a Watch (GRAND TOUR) caption. */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var POS = { x: 0, z: -3200 }, NAME = 'The Imperial Colosseum';
var M = { state: 'idle', group: null, wait: 4.0, said: false, gy: 22 };
function sampleGround() {
  var g = (typeof groundAt === 'function') ? groundAt : null;
  if (!g) return 22;
  var max = -1000, x, z, h;
  for (var i = -2; i <= 2; i++) for (var j = -2; j <= 2; j++) {
    x = POS.x + i * 150; z = POS.z + j * 150;
    try { h = g(x, z); } catch (e) { h = 22; }
    if (h > max) max = h;
  }
  return max;
}
function addBox(cx, cz, w, d, rot, y0, y1) {
  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 + ox * c + oz * s, lz = cz - ox * s + oz * c;
    A.solids.push({ x0: POS.x + lx - hx, x1: POS.x + lx + hx, z0: POS.z + lz - hz, z1: POS.z + lz + hz, y0: M.gy + y0, y1: M.gy + y1, colosseum: true });
  }
}
function collide(ud) { (ud.footprint || []).forEach(function (b) { addBox(b[0], b[1], b[2], b[3], b[6] || 0, b[4], b[5]); }); }
function hyperStop() {
  var H = window.CityHyper; if (!H || !H.pois || H.pois.some(function (p) { return p.id === 'colosseum-imperial'; })) return;
  H.pois.push({ id: 'colosseum-imperial', name: NAME, short: 'IMPERIAL', x: POS.x, z: POS.z, stand: { x: POS.x, z: POS.z + 340 },
    alias: 'imperial colosseum empire arena grand crown',
    text: 'The Imperial Colosseum: the Empire\u2019s grand arena, far south beyond the Ancestral Roads. Four gates, six tiers, and the imperial crown turning above the sand. What is proven here echoes across the provinces.' });
  if (H.regrid) H.regrid();
}
function watchStop() {
  var W = window.CityWatch, r = W && W.routes && W.routes.grand; if (!r || r._imperial) return;
  var orig = r.build; r._imperial = true;
  r.build = function () {
    var w = orig.apply(this, arguments);
    w.push({ x: POS.x - 420, z: POS.z + 260, y: M.gy + 200, v: 200, cap: { cap: 'THE IMPERIAL COLOSSEUM', sub: 'The Empire\u2019s grand arena \u00b7 far south', say: 'The Imperial Colosseum, far south beyond the Ancestral Roads: four gates, six tiers, the 