<!-- SOLID CITY · part 1793 -->
crown above the sand.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  M.gy = sampleGround() + 4;
  var p; try { p = import('/city/colosseum-imperial.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createImperialColosseum || mod.default;
    var g = make({ THREE: A.T, position: { x: POS.x, y: M.gy, z: POS.z } });
    A.world.add(g); M.group = g; M.state = 'ready';
    collide(g.userData || {}); hyperStop(); watchStop();
  }).catch(function (e) { M.state = 'failed'; try { console.warn('[city] Imperial colosseum skipped:', e && e.message); } catch (x) {} });
}
function update(dt) {
  if (M.state === 'idle') { if (A.isBuilt && !A.isBuilt()) return; M.wait -= dt; if (M.wait <= 0) load(); return; }
  if (M.state !== 'ready' || document.hidden) return;
  var c = A.camera.position, d = Math.hypot(c.x + A.origin.x - POS.x, c.z + A.origin.z - POS.z);
  M.group.visible = d < 10000;
  if (d < 3000 && M.group.userData.update) try { M.group.userData.update(S.t); } catch (e) {}
  if (S.mode === 'walk') {
    var pd = Math.hypot(S.p.x - POS.x, S.p.z - POS.z);
    if (pd < 380 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>The Imperial Colosseum</b>: the Empire\u2019s grand arena. Four gates stand open. What is proven here echoes across the provinces.', 10); }
    else if (pd > 700) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#d8aa48', fl ? 3 : 7, fl ? '' : 'IMPERIAL'); }
window.CityImperialColosseum = { update: update, radar: radar, pos: POS, state: function () { return M.state; }, group: function () { return M.group; } };
})();


===== FILE: public/city/colosseum-imperial.js =====
/* SOLID CITY — THE IMPERIAL COLOSSEUM (2026-10-11, by order of the King)
 * "Make a huge one way far on the other side of the road."
 * The Empire's grand arena, far south beyond the Ancestral Roads.
 * Four gates, six tiers, the imperial crown at the centre.
 * Self-contained ES module. Local frame: terrace top at y = 0.
 *
 *   import { createImperialColosseum } from '/city/colosseum-imperial.js';
 *   const g = createImperialColosseum({ THREE, position: {x, y, z} });
 *   // g.userData: footprint, update(t)
 */
export function createImperialColosseum(o) {
  var T = o.THREE, P = o.position || { x: 0, y: 0, z: 0 };
  var root = new T.Group(); root.name = 'colosseum-imperial'; root.position.set(P.x, P.y, P.z);
  var foot = [];
  var C = { gold: 0xd8aa48, red: 0x8a1a2a, stone: 0x2e2a30, sand: 0x9a8060, dark: 0x141114 };
  var stoneMat = new T.MeshLambertMaterial({ color: C.stone });
  var goldMat = new T.MeshLambertMaterial({ color: C.gold, emissive: 0x3a2408 });
  // Terrace platform (the ground here is wild terrain; the arena stands on its own mesa)
  var terrace = new T.Mesh(new T.CylinderGeometry(280, 300, 120, 64), new T.MeshLambertMaterial({ color: 0x3a3230 }));
  terrace.position.y = -60; root.add(terrace);
  var terraceTop = new T.Mesh(new T.CylinderGeometry(280, 280, 2, 64), new T.MeshLambertMaterial({ color: 0x403830 }));
  terraceTop.position.y = 1; root.add(terraceTop);
  // Arena floor
  var floor = new T.Mesh(new T.CylinderGeometry(90, 90, 1, 64), new T.MeshLambertMaterial({ color: C.sand }));
  floor.position.y = 2.5; root.add(floor);
  // Six tiers of seating
  for (var r = 0; r < 6; r++) {
    var rad = 100 + r * 14;
    var tier = new T.Mesh(new T.CylinderGeometry(rad + 14, rad + 14, 5, 64, 1, false), stoneMat);
    tier.position.y = 4 + r * 5; root.add(tier);
  }
  // Outer wall — massive, with battlements
  var wall = new T.Mesh(new T.CylinderGeometry(200, 204, 34, 64, 1, true), stoneMat);
  wall.position.y = 17; wall.material.side = T.DoubleSide; root.add(wall);
  var goldTrim = new T.Mesh(new T.TorusGeometry(200, 1.2, 6, 96), new T.MeshBasicMaterial({ color: C.gold }));
  goldTrim.rotation.x = Math.PI / 2; goldTrim.position.y = 34; root.add(goldTrim);
  for (var b = 0; b < 40; b++) {
    var ba = (b / 40) * Math.PI * 2;
    if (Math.abs(Math.sin(ba)) < 0.07 || Math.abs(Math.cos(ba)) < 0.07) continue;  // four gate gaps
    var merlon = new T.Mesh(new T.BoxGeometry(8, 6, 4), stoneMat);
    merlon.position.set(Math.cos(ba) * 202, 37, Math.sin(ba) * 202);
    merlon.rotation.y = -ba; root.add(merlon);
  }
  // Wall collision: 12 arc segments (skip the four gates)
  for (var w = 0; w < 12; w++) {
    var wa = (w / 12) * Math.PI * 2 + Math.PI / 12, wx = Math.cos(wa) * 202, wz = Math.sin(wa) * 202;
    if (Math.abs(Math.sin(wa)) < 0.09 || Math.abs(Math.cos(wa)) < 0.09) continue;
    foot.push([wx, wz, 40, 40, 0, 34, -wa]);
  }
  // Four gates: north, south, east, west
  function gate(px, pz, ry) {
    var g1 = new T.Mesh(new T.BoxGeometry(6, 26, 6), goldMat); g1.position.set(px - 10, 13, pz); g1.rotation.y = ry; root.add(g1);
    var g2 = new T.Mesh(new T.BoxGeometry(6, 26, 6), goldMat); g2.position.set(px + 10,