<!-- SOLID CITY · part 2070 -->
 short flights).', localKey: 'hyper' + Date.now().toString(36) });
  }).catch(function () {});
}
addEventListener('city-arrived', function (e) {
  var n = e && e.detail && e.detail.name; if (!n) return;
  st.arr = { name: n, t: Date.now() };
  if (st.on && !st.paused) { st.status = 'ARRIVED: ' + n; }
  paint();
});
function activate(kind, name) {
  if (st.on) return;
  st.on = true; st.kind = kind; st.name = name || (kind === 'guest' ? 'AI guest' : 'bot'); st.status = 'picking a first goal';
  addHop(); ui(); paint();
  st.next = Date.now() + 2500; setInterval(tick, 1000);
  addEventListener('keydown', function (e) { if (e.target && /INPUT|TEXTAREA|SELECT/.test(e.target.tagName)) return; if (/^(Key[WASDQE]|Arrow|Space|ShiftLeft)/.test(e.code)) pause('keys'); }, true);
  var cv = document.querySelector('canvas:not(#sc-radar)'), stick = $('sc-stick');
  if (stick) stick.addEventListener('pointerdown', function () { pause('stick'); }, true);
  if (cv) cv.addEventListener('pointerdown', function (e) { if (e.pointerType === 'touch' && e.isTrusted) pause('touch'); }, true);
  var hc = $('hyper-controller'); if (hc) hc.addEventListener('click', function (e) { if (e.isTrusted && e.target.closest('button') && e.target.id !== 'hc-fold') pause('hyper'); }, true);
  setTimeout(fillLists, 4000);   // the monument / sanctuary stops arrive with their lazy modules
  checkin();
}
/* entry: allow-listed accounts and opted-in guests enter by themselves once the world is ready */
function autoEnter(then) {
  (function wait() {
    var boot = $('sc-boot'), btn = $('sc-enter');
    if (boot && !boot.hidden) { if (btn && !btn.disabled) btn.click(); return setTimeout(wait, 600); }
    then();
  })();
}
function entryChoice() {   // a small "LET AI DRIVE" choice on the entry screen
  var btn = $('sc-enter'); if (!btn || $('sc-pilot-ai')) return;
  var b = document.createElement('button'); b.type = 'button'; b.id = 'sc-pilot-ai'; b.textContent = '\uD83E\uDD16 LET AI DRIVE';
  b.title = 'Enter with the Hyper Controller driving (scripted, for AI visitors)';
  b.setAttribute('style', 'display:block;margin:10px auto 0;min-height:40px;padding:0 16px;border-radius:20px;border:1px solid #5ff4ff;background:rgba(0,32,44,.85);color:#bff8ff;font:700 13px system-ui,sans-serif;letter-spacing:.08em;cursor:pointer');
  btn.insertAdjacentElement('afterend', b);
  b.addEventListener('click', function () { try { sessionStorage.setItem('sc-pilot', 'ai'); } catch (e) {} b.disabled = true; startGuest(); });
}
var guestStarted = false;
function startGuest() { if (guestStarted || st.on) return; guestStarted = true; autoEnter(function () { activate('guest', 'AI guest'); }); }
function start() {
  entryChoice();
  fetch('/api/city/hyper-auto', { credentials: 'same-origin', cache: 'no-store' }).then(function (r) { return r.ok ? r.json() : { on: false }; }).catch(function () { return { on: false }; }).then(function (j) {
    if (j && j.on) { autoEnter(function () { activate('account', j.name); }); return; }
    if (guestOptIn()) startGuest();
  });
}
entryChoice();
if (A.isBuilt && A.isBuilt()) start(); else addEventListener('sc-city-built', start);
window.CityHyperAuto = {
  state: function () { return { on: st.on, kind: st.kind, paused: st.paused, status: st.status, goal: st.goal, act: st.act, picks: st.picks }; },
  pause: pause, resume: function () { st.paused = false; st.status = 'resumed'; st.next = Date.now() + 500; paint(); }, text: function () { paint(); return statusEl ? statusEl.textContent : ''; }
};
})();


===== FILE: public/city/hyper-city-annex-place.js =====
/* Solid City — places THE ANNEX (public/city/hyper-city-annex.js) east of the Hyper City.
   The King's "start fresh next to it": ONE showcase building, inside and out —
   2 real interior floors, fully fitted, with a crowned tower and portholes above.
   The 36 Hyper City towers are untouched; this is new construction on fresh ground.
   Lazy: imported after the city is built; any import/build error is caught and the city carries on.
   Adds: collision (userData.footprint), radar 'ANNEX', 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: -900, z: -180 };
var M = { state: 'idle', group: null, wait: 8.0, gy: 20, said: false };
function sampleGround() {
  var g = (typeof groundAt === 'function') ? groundAt : null;
  if (!g) return 20;
  var max = -1000, h, ix, iz;
  for (ix = -2; ix <= 2; ix++) for (iz = -2; iz <= 2; iz++) {
    try { h = g(POS.x + ix * 30, POS.z + iz * 30); } catch (e) { h = 20; }
    if (h > max) max = h;
  }
  return max + 1.0;
}
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);