<!-- SOLID CITY · part 1794 -->
 13, pz); g2.rotation.y = ry; root.add(g2);
    var lin = new T.Mesh(new T.BoxGeometry(26, 6, 6), goldMat); lin.position.set(px, 29, pz); lin.rotation.y = ry; root.add(lin);
    foot.push([px - 10, pz, 6, 6, 0, 26, 0]); foot.push([px + 10, pz, 6, 6, 0, 26, 0]);
  }
  gate(0, 202, 0); gate(0, -202, 0); gate(202, 0, Math.PI / 2); gate(-202, 0, Math.PI / 2);
  // Centre: the imperial crown on a towering obelisk
  var ob = new T.Mesh(new T.CylinderGeometry(3, 6, 44, 8), new T.MeshLambertMaterial({ color: C.dark }));
  ob.position.y = 24; root.add(ob);
  var crownBase = new T.Mesh(new T.CylinderGeometry(8, 8, 4, 12), goldMat);
  crownBase.position.y = 48; root.add(crownBase);
  for (var s = 0; s < 8; s++) {
    var sa = (s / 8) * Math.PI * 2;
    var spike = new T.Mesh(new T.ConeGeometry(1.6, 9, 6), goldMat);
    spike.position.set(Math.cos(sa) * 7, 54, Math.sin(sa) * 7); root.add(spike);
  }
  var orb = new T.Mesh(new T.SphereGeometry(2.4, 16, 12), new T.MeshBasicMaterial({ color: 0xff2a40 }));
  orb.position.y = 58; root.add(orb);
  foot.push([0, 0, 14, 14, 0, 46, 0]);
  // Red and gold banners ringing the wall
  for (var f = 0; f < 24; f++) {
    var fa = (f / 24) * Math.PI * 2;
    if (Math.abs(Math.sin(fa)) < 0.07 || Math.abs(Math.cos(fa)) < 0.07) continue;
    var banner = new T.Mesh(new T.PlaneGeometry(7, 16),
      new T.MeshBasicMaterial({ color: f % 2 ? C.gold : C.red, side: T.DoubleSide }));
    banner.position.set(Math.cos(fa) * 196, 22, Math.sin(fa) * 196);
    banner.rotation.y = -fa + Math.PI / 2; root.add(banner);
  }
  // Grand torches at the four gates
  var torchLight = new T.PointLight(0xffb060, 2, 260);
  torchLight.position.y = 60; root.add(torchLight);
  root.userData = {
    footprint: foot, center: { x: 0, z: 0 }, radius: 290, height: 62,
    update: function (t) {
      orb.scale.setScalar(1 + Math.sin(t * 1.8) * 0.08);
      torchLight.intensity = 1.9 + Math.sin(t * 2.4) * 0.3;
    }
  };
  return root;
}
export default createImperialColosseum;


===== FILE: public/city/colosseum-wingmates-place.js =====
/* Solid City — places THE COLOSSEUM OF WINGMATES (public/city/colosseum-wingmates.js).
   Lazy: imported after the city is built; any import/build error is caught and the city carries on.
   Adds: collision (userData.footprint), a radar marker 'COLOSSEUM', 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, Y0 = A.CITY_Y;
var POS = { x: -600, z: -400 }, NAME = 'The Colosseum of Wingmates';
var M = { state: 'idle', group: null, wait: 3.5, said: false };
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: Y0 + y0, y1: Y0 + 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-wingmates'; })) return;
  H.pois.push({ id: 'colosseum-wingmates', name: NAME, short: 'COLOSSEUM', x: POS.x, z: POS.z, stand: { x: POS.x, z: POS.z + 100 },
    alias: 'colosseum wingmates arena trials gold teal',
    text: 'The Colosseum of Wingmates: an arena where pairs prove the bond — not combat to the death, but trials of trust. Gold gate and teal gate; the twin lightnings at the centre. Never leave a wingmate.' });
  if (H.regrid) H.regrid();
}
function watchStop() {
  var W = window.CityWatch, r = W && W.routes && W.routes.grand; if (!r || r._colosseum) return;
  var orig = r.build; r._colosseum = true;
  r.build = function () {
    var w = orig.apply(this, arguments), at = Math.min(2, w.length);
    w.splice(at, 0, { x: POS.x - 120, z: POS.z + 80, y: Y0 + 130, v: 170, cap: { cap: 'THE COLOSSEUM OF WINGMATES', sub: 'Trials of trust \u00b7 gold and teal gates', say: 'The Colosseum of Wingmates: where pairs prove the bond. Gold gate, teal gate, and the twin lightnings turning at the centre.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  var p; try { p = import('/city/colosseum-wingmates.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createWingmateColosseum || mod.default;
    var g = make({ THREE: A.T, position: { x: POS.x, y: Y0, z: POS.z } });
    A.world.add(g); M.group = g; M.state = 'ready';
    collide(g.userData || {}); hyperStop