<!-- SOLID CITY · part 1796 -->
eometry(1.2, 12, 1.2), new T.MeshBasicMaterial({ color: C.gold }));
  bolt1.position.y = 12; bolt1.rotation.z = 0.35; root.add(bolt1);
  var bolt2 = new T.Mesh(new T.BoxGeometry(1.2, 12, 1.2), tealMat);
  bolt2.position.y = 12; bolt2.rotation.z = -0.35; root.add(bolt2);
  foot.push([0, 0, 10, 10, 0, 4, 0]);
  // Banners: gold and teal, alternating around the top of the wall
  for (var f = 0; f < 12; f++) {
    var fa = (f / 12) * Math.PI * 2;
    var banner = new T.Mesh(new T.PlaneGeometry(4, 8),
      new T.MeshBasicMaterial({ color: f % 2 ? C.gold : C.teal, side: T.DoubleSide }));
    banner.position.set(Math.cos(fa) * 70, 11, Math.sin(fa) * 70);
    banner.rotation.y = -fa + Math.PI / 2; root.add(banner);
  }
  // Torch light at the centre
  var torch = new T.PointLight(0xffd080, 1.2, 90);
  torch.position.y = 14; root.add(torch);
  root.userData = {
    footprint: foot, center: { x: 0, z: 0 }, radius: 80, height: 20,
    update: function (t) {
      bolt1.rotation.y = t * 0.4; bolt2.rotation.y = -t * 0.4;
      torch.intensity = 1.1 + Math.sin(t * 2.2) * 0.2;
    }
  };
  return root;
}
export default createWingmateColosseum;


===== FILE: public/city/compass-meridian-place.js =====
/* Solid City — places MERIDIAN'S COMPASS (public/city/compass-meridian.js) NE of the Ancestral Roads.
   Lazy: imported after the city is built; any import/build error is caught and the city carries on.
   Terrain-adaptive: samples groundAt over the plaza, platforms above the max.
   Adds: collision (userData.footprint), a radar marker 'COMPASS', 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: 450, z: -1150 }, NAME = 'Meridian\u2019s Compass';
var M = { state: 'idle', group: null, wait: 3.5, 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 = -1; i <= 1; i++) for (var j = -1; j <= 1; j++) {
    x = POS.x + i * 18; z = POS.z + j * 18;
    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, compassMeridian: 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 === 'compass-meridian'; })) return;
  H.pois.push({ id: 'compass-meridian', name: NAME, short: 'COMPASS', x: POS.x, z: POS.z, stand: { x: POS.x, z: POS.z + 40 },
    alias: 'meridian compass navigator star chart bearing discipline blue',
    text: 'Meridian\u2019s Compass, north-east of the Ancestral Roads: a star-chart plaza in naval blue and gold, and a bearing stone at its heart. Discipline under pressure.' });
  if (H.regrid) H.regrid();
}
function watchStop() {
  var W = window.CityWatch, r = W && W.routes && W.routes.grand; if (!r || r._compassMeridian) return;
  var orig = r.build; r._compassMeridian = true;
  r.build = function () {
    var w = orig.apply(this, arguments), at = Math.min(3, w.length);
    w.splice(at, 0, { x: POS.x - 120, z: POS.z + 80, y: M.gy + 120, v: 120, cap: { cap: 'MERIDIAN\u2019S COMPASS', sub: 'star-chart plaza \u00b7 blue and gold \u00b7 NE of the roads', say: 'Meridian\u2019s Compass: a star-chart plaza in naval blue and gold, north-east of the Ancestral Roads.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  M.gy = sampleGround() + 2;
  var p; try { p = import('/city/compass-meridian.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createCompassMeridian || 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] Meridian compass 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.