<!-- SOLID CITY · part 2879 -->
7 PROVOLTA</b> \u00b7 the Oracle: <i>\u201c' + esc(st.line.text) + '\u201d</i>', 9); }
    }
  }
  if (bubUntil < S.t && st.mood !== 'listening') st.mood = 'listening';
  // beacon: brighter while someone stands with her, a flare on arrival, decays smoothly
  st.spike = Math.max(0, st.spike - dt * 0.35);
  var want = Math.max(st.inside ? 0.55 : tgt ? 0.3 : 0, st.spike); st.glow += (want - st.glow) * Math.min(1, dt * 1.6);
  var grp = CitySanctuary.group && CitySanctuary.group(); if (grp && grp.userData) grp.userData.glow = st.glow;
  // breathing + sway (after the citizens' own animate, so this is the last word on her pose)
  if (c.g.visible) {
    var t = S.t, b = Math.sin(t * 1.25) * 0.014, base = c.sc || 1, onStep = Math.hypot(c.x - HOME.x, c.z - HOME.z) < 4.4;
    c.g.scale.set(base * (1 + b * 0.4), base * (1 + b), base * (1 + b * 0.4));
    c.g.position.y = c.y + (onStep ? STEP_Y : 0) + Math.sin(t * 0.9) * 0.025;
    c.g.rotation.set(Math.sin(t * 0.45) * 0.012, c.face + Math.sin(t * 0.33) * 0.04, Math.sin(t * 0.55) * 0.03);
    if (c.limbs && !c.idleK) { c.limbs[0].rotation.z = 0.08 + Math.sin(t * 1.25) * 0.03; c.limbs[2].rotation.z = -0.08 - Math.sin(t * 1.25) * 0.03; }
    if (bub) { bub.visible = bubUntil > S.t; if (bub.visible && c.bub) c.bub.visible = false; }
  }
}
function esc(s) { return String(s).replace(/[&<>"']/g, function (ch) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[ch]; }); }

var orig = CitySanctuary.update;
CitySanctuary.update = function (dt) {
  orig.apply(this, arguments);
  if (CitySanctuary.state() !== 'ready') return;
  try { tick(Math.min(dt || 0, 0.1)); } catch (e) { if (!st.err) { st.err = 1; console.warn('[city] Provolta alive paused:', e && e.message); } }
};
load(); setInterval(load, 10 * 60000);

window.CityProvolta = {
  state: function () {
    var me = S.mode === 'walk' ? S.p : S.ship, line = st.line || lineFor(slotNow());
    return { name: 'Provolta', title: 'the Oracle', where: 'Provolta\u2019s Sanctuary, east cliff', x: HOME.x, z: HOME.z, d: Math.round(Math.hypot(me.x - HOME.x, me.z - HOME.z)),
      mood: st.mood, facing: st.faceName, prophecy: line.text, ai: !!line.ai, saidAgo: st.saidAt ? Math.round((Date.now() - st.saidAt) / 1000) : null,
      next: Math.max(0, Math.round(((slotNow() + 1) * st.period * 1000 - (Date.now() + st.off)) / 1000)), glow: +st.glow.toFixed(2), pool: st.pool.length, page: PAGE };
  },
  speak: function () { st.slot = -1; }, pool: function () { return st.pool.slice(); }
};
})();


===== FILE: public/city/quadrant-crown-place.js =====
/* Solid City — places QUADRANT CROWN (public/city/quadrant-crown.js) northeast of the Hyper City.
   The King's lightweight directive: four enterable towers, maximum sophistication, minimum weight.
   Fresh ground at (-700,-700) — the 36 Hyper City towers, the Annex, and the skyline are untouched.
   Lazy: imported after the city is built; any import/build error is caught and the city carries on.
   Adds: collision (userData.footprint), radar 'QUADRANT CROWN', a Hyper Controller stop,
   and a Watch (GRAND TOUR) caption. Shop config from quadrant-crown-shops.json (demo only). */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var POS = { x: -700, z: -700 };
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 = -3; ix <= 3; ix++) for (iz = -3; iz <= 3; iz++) {
    try { h = g(POS.x + ix * 40, POS.z + iz * 40); } 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);
  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, quadrantcrown: 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 === 'quadrant-crown'; })) return;
  H.pois.push({ id: 'quadrant-crown', name: 'Quadrant Crown', short: 'QUADRANT', x: POS.x, z: POS.z, stand: { x: POS.x, z: POS.z + 90 },
    alias: 'quadrant crown four towers command intelligence living frontier',
    text: 'Quadrant Crown: four enterable towers — Command, Intelligence, Living, Frontier — with lobbies, stairs, elevators, bridges, and 