<!-- SOLID CITY · part 2072 -->
dBox(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, annex: 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 === 'the-annex'; })) return;
  H.pois.push({ id: 'the-annex', name: 'The Annex', short: 'ANNEX', x: POS.x, z: POS.z, stand: { x: POS.x, z: POS.z + 34 },
    alias: 'annex showcase building interiors lobby offices',
    text: 'The Annex: one building, built inside and out — a grand lobby, offices, a roof deck, and a crowned tower with portholes.' });
  if (H.regrid) H.regrid();
}
function watchStop() {
  var W = window.CityWatch, r = W && W.routes && W.routes.grand; if (!r || r._annex) return;
  var orig = r.build; r._annex = true;
  r.build = function () {
    var w = orig.apply(this, arguments);
    w.push({ x: POS.x, z: POS.z, y: M.gy + 130, v: 200, cap: { cap: 'THE ANNEX', sub: 'Built inside and out', say: 'The Annex: the first building in the Hyper City with real insides — a lobby, offices, and a roof deck under its crown.' }, agl: false });
    return w;
  };
}
function load() {
  M.state = 'loading';
  M.gy = sampleGround();
  var p; try { p = import('/city/hyper-city-annex.js?v=20261011a'); } catch (e) { p = Promise.reject(e); }
  p.then(function (mod) {
    var make = mod.createAnnex || 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] Annex 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 < 8000;
  if (d < 2500 && M.group.userData.update) try { M.group.userData.update(S.t, dt, A); } catch (e) {}
  if (S.mode === 'walk') {
    var pd = Math.hypot(S.p.x - POS.x, S.p.z - POS.z);
    if (pd < 120 && !M.said) { M.said = true; if (window.CityHyper && CityHyper.narrate) CityHyper.narrate('<b>The Annex</b>: built inside and out. Walk through the gold doors — the lobby, the offices, the roof.', 9); }
    else if (pd > 300) M.said = false;
  }
}
function radar(g, blip, fl) { if (M.state === 'ready') blip(POS.x, POS.z, '#e8c86a', fl ? 3 : 6, fl ? '' : 'ANNEX'); }
function standY(x, z) {
  if (M.state !== 'ready' || !M.group) return -1000;
  var fl = M.group.userData.standFloors; if (!fl) return -1000;
  var best = -1000;
  for (var i = 0; i < fl.length; i++) {
    var f = fl[i];
    var inside = x > POS.x + f.x0 && x < POS.x + f.x1 && z > POS.z + f.z0 && z < POS.z + f.z1;
    if (inside && S.p.y > M.gy + f.y - 3 && M.gy + f.y > best) best = M.gy + f.y;
  }
  return best;
}
function actHere(x, z) {
  if (M.state !== 'ready' || !M.group) return null;
  try { return M.group.userData.actHere(x, z); } catch (e) { return null; }
}
function boardElevator() {
  if (M.state !== 'ready' || !M.group) return;
  try { M.group.userData.boardElevator(S.p.x, S.p.z); } catch (e) {}
}
window.CityAnnex = { update: update, radar: radar, pos: POS, standY: standY, actHere: actHere, boardElevator: boardElevator, state: function () { return M.state; } };
})();


===== FILE: public/city/hyper-city-annex.js =====
/* SOLID CITY — THE ANNEX, REFINED (2026-10-12, by order of the King)
 * "It is a building the player wants to explore."
 * The Annex is now the VISUAL REFERENCE for all future towers.
 * Same skeleton, same working systems (doors, elevator, collision, standY,
 * radar, Hyper POI) — all new architecture.
 * Palette (strict): dark titanium, brushed silver, architectural glass,
 * restrained gold. True name: THE ANNEX.
 * Self-contained ES module. Lightweight: shared materials, modular components.
 */
function mulberry(a){return function(){a|=0;a=a+0x6D2B79F5|0;var t=Math.imul(a^a>>>15,1|a);t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)/4294967296;};}
function textPlate(T, text){
  var c=document.createElement('canvas');c.width=512;c.height=128;
  var g=c.getContext('2d');g.fillStyle='#101418';g.fillRect(0,0,512,128);
