<!-- SOLID CITY · part 1795 -->
(); watchStop();
  }).catch(function (e) { M.state = 'failed'; try { console.warn('[city] 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 < 7000;
  if (d < 1800 && 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 < 110 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>The Colosseum of Wingmates</b>: trials of trust, not battles to the death. Enter by the gold gate or the teal — but no one trials alone.', 9); }
    else if (pd > 220) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#d8aa48', fl ? 3 : 5, fl ? '' : 'COLOSSEUM'); }
window.CityColosseum = { update: update, radar: radar, pos: POS, state: function () { return M.state; }, group: function () { return M.group; } };
})();


===== FILE: public/city/colosseum-wingmates.js =====
/* SOLID CITY — THE COLOSSEUM OF WINGMATES (2026-10-11, by order of the King)
 * "Design a colosseum for it and get what you love done."
 * For Solid's story: never leave a wingmate. An arena where pairs prove the bond —
 * not combat to the death, but trials of trust. Two gates: gold and teal.
 * The twin lightnings stand at the centre.
 * Self-contained ES module. Local frame: ground at y = 0, gold gate faces +Z (south, the city).
 *
 *   import { createWingmateColosseum } from '/city/colosseum-wingmates.js';
 *   const g = createWingmateColosseum({ THREE, position: {x, y, z} });
 *   // g.userData: footprint, update(t)
 */
export function createWingmateColosseum(o) {
  var T = o.THREE, P = o.position || { x: 0, y: 0, z: 0 };
  var root = new T.Group(); root.name = 'colosseum-wingmates'; root.position.set(P.x, P.y, P.z);
  var foot = [];
  var C = { gold: 0xd8aa48, teal: 0x3de0e8, stone: 0x2e2a30, sand: 0x8a7355, dark: 0x141114 };
  var stoneMat = new T.MeshLambertMaterial({ color: C.stone });
  var goldMat = new T.MeshLambertMaterial({ color: C.gold, emissive: 0x2a1a04 });
  var tealMat = new T.MeshBasicMaterial({ color: C.teal });
  // Arena floor
  var floor = new T.Mesh(new T.CylinderGeometry(38, 38, 1, 48), new T.MeshLambertMaterial({ color: C.sand }));
  floor.position.y = 0.5; root.add(floor);
  // Tiered seating: 4 concentric stepped rings
  var r, tier;
  for (r = 0; r < 4; r++) {
    var rad = 44 + r * 7;
    tier = new T.Mesh(new T.CylinderGeometry(rad + 7, rad + 7, 3, 48, 1, false), stoneMat);
    tier.position.y = 2 + r * 3; root.add(tier);
    var seatTop = new T.Mesh(new T.TorusGeometry(rad + 3.5, 0.4, 4, 64), new T.MeshLambertMaterial({ color: 0x3a343c }));
    seatTop.rotation.x = Math.PI / 2; seatTop.position.y = 3.6 + r * 3; root.add(seatTop);
  }
  // Outer wall with battlements
  var wall = new T.Mesh(new T.CylinderGeometry(72, 74, 16, 48, 1, true), stoneMat);
  wall.position.y = 8; wall.material.side = T.DoubleSide; root.add(wall);
  for (var b = 0; b < 24; b++) {
    var ba = (b / 24) * Math.PI * 2;
    // leave gaps at the two gates (south gold, north teal)
    if (Math.abs(Math.sin(ba)) < 0.12) continue;
    var merlon = new T.Mesh(new T.BoxGeometry(4, 3, 2), stoneMat);
    merlon.position.set(Math.cos(ba) * 73, 17.5, Math.sin(ba) * 73);
    merlon.rotation.y = -ba; root.add(merlon);
  }
  foot.push([0, 0, 148, 20, 0, 16, 0]);   // south wall segment (approx)
  foot.push([0, 0, 20, 148, 0, 16, 0]);   // crude cross — refined below
  foot.pop(); foot.pop();
  // wall collision: 8 arc segments
  for (var w = 0; w < 8; w++) {
    var wa = (w / 8) * Math.PI * 2 + Math.PI / 8, wx = Math.cos(wa) * 73, wz = Math.sin(wa) * 73;
    if (Math.abs(Math.sin(wa)) < 0.14) continue;  // gate gaps
    foot.push([wx, wz, 20, 20, 0, 16, -wa]);
  }
  // Gold gate (south, toward the city) and teal gate (north)
  function gate(color, zside, mat) {
    var gz = 73 * zside;
    var arch1 = new T.Mesh(new T.BoxGeometry(3, 14, 3), mat); arch1.position.set(-6, 7, gz); root.add(arch1);
    var arch2 = new T.Mesh(new T.BoxGeometry(3, 14, 3), mat); arch2.position.set(6, 7, gz); root.add(arch2);
    var lintel = new T.Mesh(new T.BoxGeometry(15, 3, 3), mat); lintel.position.set(0, 15.5, gz); root.add(lintel);
    foot.push([-6, gz, 3, 3, 0, 14, 0]); foot.push([6, gz, 3, 3, 0, 14, 0]);
  }
  gate(0xd8aa48, 1, goldMat); gate(0x3de0e8, -1, new T.MeshLambertMaterial({ color: 0x2a8a90, emissive: 0x0a3a3d }));
  // Centre: the twin lightnings on a pedestal
  var ped = new T.Mesh(new T.CylinderGeometry(4, 5, 3, 16), new T.MeshLambertMaterial({ color: C.dark }));
  ped.position.y = 2.5; root.add(ped);
  var bolt1 = new T.Mesh(new T.BoxG