<!-- SOLID CITY · part 2190 -->
eturn; var nm = 'Isle ' + (ROMAN[k - 1] || k);
  FLY.push({ id: 'isle' + k, name: nm + ' (' + bearing(isl.x, isl.z) + ')', short: nm.toUpperCase(), x: isl.x, z: isl.z, alt: Math.max(0, A.heightAt(isl.x, isl.z)) + 700, alias: fold(nm) + ' island isle ' + k, text: 'An outer island of the chain, about ' + (isl.r / 1000).toFixed(1) + ' km across.' });
});
var GLOSS = [
  ['Forum Plaza', 'The city centre. SABLE stands here; the Forum gate leads to the real boards.'],
  ['SABLE', 'The AI guide. Talking to her needs an epistles login.'],
  ['Music Studio Tower', 'Home of Studio Radio (the King\u2019s 333 songs). Its gate opens /ss.'],
  ['Radio masts', 'Stand near one and the music gets louder.'],
  ['Orbital Spaceport', 'Board a ship, LAUNCH, fly. RETURN TO CITY brings you home.'],
  ['Warp Speed', 'The arcade run through the spaceport gate.'],
  ['Solidivism', 'Everything visible is solid: you can\u2019t walk or fly through it.'],
  ['AI DRIVE', 'The controller walks or flies you there. Touch the stick to take over.']
];

/* ---------------- state ---------------- */
var H = { mode: 'WALK', focus: null, hist: [], fhist: [], nav: null, tour: null, armed: false, flyDrive: null, scan: null, scanT: 0, lastDrag: 0, beaconT: 0, prevMode: 'WALK', wasFly: false };

/* ---------------- UI (same markup / ids / order as sw-hyper.js) ---------------- */
var root = $('sc'), hud = $('sc-hud');
var hc = document.createElement('div'); hc.id = 'hyper-controller';
function B(id, icon, title, cls, walkOnly, mode) { return '<button type="button" class="' + (mode ? 'hc-mode-btn' : 'hc-btn') + (cls ? ' ' + cls : '') + '"' + (id ? ' id="' + id + '"' : '') + (mode ? ' data-mode="' + mode + '"' : '') + (walkOnly ? ' data-walk' : '') + ' title="' + title + '" aria-label="' + title + '">' + icon + '</button>'; }
hc.innerHTML = '<div id="hc-mode-indicator">WALK</div><div id="hc-buttons">' +
  B('', '🚶', 'Walk (manual)', 'active', true, 'WALK') + B('', '👁️', 'Look around', '', true, 'LOOK') +
  B('hc-aidrive', '🤖', 'AI Drive', 'hc-ai') + B('hc-tour', '🗺️', 'Guided tour', '', true) +
  B('hc-focus', '🎯', 'Focus nearest') + B('hc-scan', '📡', 'Scan area') + B('hc-go', '🧭', 'Navigate to focused') +
  B('hc-return', '↩️', 'Return') + B('hc-stop', '⏹️', 'Stop AI', 'hc-stop') +
  B('hc-guide', '👋', 'Show me Solid City (meet SABLE)', '', true) + B('hc-glossary', '📖', 'Shared language', '', true) + B('hc-watch', '🎬', 'WATCH: cinematic autopilot', 'hc-ai') + B('hc-build', '🔨', 'BUILD: the Forge', 'hc-ai', true) +
  '</div><div id="hc-command"><input type="text" id="hc-input" enterkeyhint="go" autocomplete="off" placeholder="Try: &quot;drive me to studio&quot;"></div>';
hud.appendChild(hc);
/* collapsible column: one gold toggle folds the buttons away (Walk/Look + Stop stay); remembered in localStorage */
(function () {
  var KEY = 'sc-hc-folded', fb = document.createElement('button'), saved = null;
  try { saved = localStorage.getItem(KEY); } catch (e) {}
  fb.type = 'button'; fb.id = 'hc-fold'; hc.appendChild(fb);
  var gone = 0;
  function set(f, save) {
    clearTimeout(gone);
    fb.textContent = f ? '\u276E' : '\u276F'; fb.setAttribute('aria-expanded', String(!f));
    fb.title = fb.ariaLabel = f ? 'Show all controls' : 'Hide controls';
    fb.setAttribute('aria-label', fb.title);
    if (f) { hc.classList.add('hc-folded'); gone = setTimeout(function () { hc.classList.add('hc-gone'); }, 260); }
    else { hc.classList.remove('hc-gone'); void hc.offsetWidth; hc.classList.remove('hc-folded'); }
    if (save) try { localStorage.setItem(KEY, f ? '1' : '0'); } catch (e) {}
  }
  set(saved === null ? matchMedia('(max-width:430px)').matches : saved === '1', false);
  fb.addEventListener('click', function () { set(!hc.classList.contains('hc-folded'), true); });
  window.CityHyperFold = { set: function (f) { set(!!f, true); }, folded: function () { return hc.classList.contains('hc-folded'); } };
})();
var narr = document.createElement('div'); narr.id = 'hc-narration'; narr.setAttribute('aria-live', 'polite'); hud.appendChild(narr);
var card = document.createElement('div'); card.id = 'hc-card'; card.hidden = true; hud.appendChild(card);
var inp = $('hc-input'), PH = inp.placeholder;

function narrate(html, sec) {
  narr.innerHTML = '<span class="ai-badge">🤖 AI DRIVE</span> ' + html;
  narr.classList.add('visible'); root.classList.add('hc-narr');
  clearTimeout(narr._h); narr._h = setTimeout(clearNarration, (sec || 8) * 1000);
}
function clearNarration() { narr.classList.remove('visible'); root.classList.remove('hc-narr'); }
function hint(t) { inp.placeholder = t; clearTimeout(inp._h); inp._h = setTimeout(function () { inp.placeholder = flying() ? 'Try: "fly me to Mauna Kea"' : PH; }, 3500); }

function setMode(m) {
  if (H.mode === 'LOOK' && m !== 'LOOK') { S.camDist = 7.5; S.camPitch = 0.28; }
  H.mode = m;
  hc.querySelectorAll('.hc-mode-btn').forEach(function (b) { b.classList.toggle('active', b.getAttribute