<!-- SOLID CITY · part 3096 -->
lidsanct) return;
  var orig = r.build; r._solidsanct = true;
  r.build = function () {
    var w = orig.apply(this, arguments), at = Math.min(2, w.length);
    w.splice(at, 0, { x: POS.x - 90, z: POS.z + 50, y: Y0 + 100, v: 150, cap: { cap: 'SOLID\u2019S SANCTUARY', sub: 'The commander\u2019s shrine \u00b7 north of the hangar \u00b7 the Order of Solid City', say: 'Solid\u2019s Sanctuary, north of the hangar: seven gold pillars for seven games, and her badge turning at the centre.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  var p; try { p = import('/city/sanctuary-solid.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createSolidSanctuary || mod.default;
    var g = make({ THREE: A.T, position: { x: POS.x, y: Y0, z: POS.z }, badgeUrl: '/city/solid-badge.jpg?v=20261011a' });
    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] Solid sanctuary 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 < 6000;
  if (d < 1500 && 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 < 44 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>Solid\u2019s Sanctuary</b>: seven gold pillars for the seven games, and the Order of Solid City turning at the centre. Never leave a wingmate.', 8); }
    else if (pd > 150) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#d8aa48', fl ? 3 : 5, fl ? '' : 'SOLID'); }
function talkHere(x, z) { return M.state === 'ready' && Math.hypot(x - POS.x, z - POS.z) < TALK_R; }
window.CitySolidSanctuary = { update: update, radar: radar, talkHere: talkHere, pos: POS, state: function () { return M.state; }, group: function () { return M.group; } };
})();


===== FILE: public/city/sanctuary-solid.js =====
/* SOLID CITY — SOLID'S SANCTUARY (2026-10-11, by order of the King)
 * The commander's sanctuary, north of the Double Strike hangar on its axis.
 * Seven gold pillars for the seven games; the Order of Solid City at the centre.
 * Self-contained ES module, no downloads except the badge texture.
 * Local frame: ground at y = 0, the gate faces +Z (the hangar, south).
 *
 *   import { createSolidSanctuary } from '/city/sanctuary-solid.js';
 *   const g = createSolidSanctuary({ THREE, position: {x, y, z}, badgeUrl: '/city/solid-badge.jpg' });
 *   // g.userData: footprint, update(t)
 */
export function createSolidSanctuary(o) {
  var T = o.THREE, P = o.position || { x: 0, y: 0, z: 0 };
  var badgeUrl = o.badgeUrl || '/city/solid-badge.jpg';
  var root = new T.Group(); root.name = 'solid-sanctuary'; root.position.set(P.x, P.y, P.z);
  var foot = [];

  var C = { gold: 0xd8aa48, goldDeep: 0x8a6a20, teal: 0x3de0e8, basalt: 0x141114, stone: 0x1e1a20 };

  // Dais: dark stone disc with gold inlay rings
  var dais = new T.Mesh(new T.CylinderGeometry(18, 18.6, 0.15, 48), new T.MeshLambertMaterial({ color: C.stone }));
  dais.position.y = 0.075; root.add(dais);
  var inlay1 = new T.Mesh(new T.TorusGeometry(6, 0.12, 4, 64), new T.MeshBasicMaterial({ color: C.gold }));
  inlay1.rotation.x = Math.PI / 2; inlay1.position.y = 0.17; root.add(inlay1);
  var inlay2 = new T.Mesh(new T.TorusGeometry(13.5, 0.12, 4, 72), new T.MeshBasicMaterial({ color: C.gold }));
  inlay2.rotation.x = Math.PI / 2; inlay2.position.y = 0.17; root.add(inlay2);

  // Seven gold pillars — one for each game of the fleet
  var R = 12, i, a, x, z;
  var pillarGeo = new T.CylinderGeometry(0.9, 1.1, 9, 8);
  var capGeo = new T.BoxGeometry(2.2, 0.5, 2.2);
  var gemGeo = new T.OctahedronGeometry(0.4, 0);
  var goldMat = new T.MeshLambertMaterial({ color: C.gold, emissive: 0x2a1a04 });
  var tealMat = new T.MeshBasicMaterial({ color: C.teal });
  for (i = 0; i < 7; i++) {
    a = (i / 7) * Math.PI * 2 + Math.PI / 2; x = Math.cos(a) * R; z = Math.sin(a) * R;
    var pil = new T.Mesh(pillarGeo, goldMat); pil.position.set(x, 5, z); root.add(pil);
    var cap = new T.Mesh(capGeo, goldMat); cap.position.set(x, 9.7, z); root.add(cap);
    var gem = new T.Mesh(gemGeo, tealMat); gem.position.set(x, 10.6, z); root.add(gem);
    gem.userData.spin = true;
    foot.push([x, z, 2.2, 2.2, 0, 10, 0]);
  }

  // Centre pedestal: dark basalt with gold trim
  var ped = new T.Mesh(new T.CylinderGeometry(2.2, 2.8, 2.4, 24), new T.MeshLambertMaterial({ color: C.basalt }));
  ped.position.y = 1.7; root.add(ped);
  var t