<!-- SOLID CITY · part 761 -->
rystalCrown && CityCrystalCrown.standY) { var cc1 = CityCrystalCrown.standY(x, z, py); if (cc1 > gy) gy = cc1; }
  if (window.CityStairOfLight && CityStairOfLight.standY) { var sl1 = CityStairOfLight.standY(x, z, py); if (sl1 > gy) gy = sl1; }
  if (window.CityServitude && CityServitude.standY) { var sv1 = CityServitude.standY(x, z, py); if (sv1 > gy) gy = sv1; }
  if (window.CityTunnelBore && CityTunnelBore.standY) { var ty = CityTunnelBore.standY(x, z); if (ty > gy) gy = ty; }
  if (window.CityStarwell && CityStarwell.standY) { var wy = CityStarwell.standY(x, z); if (wy > gy) gy = wy; }
  if (window.CityHyperTrain && CityHyperTrain.standY) { var hy = CityHyperTrain.standY(x, z); if (hy > gy) gy = hy; }
  if (window.CityHyperCity && CityHyperCity.standY) { var hcy = CityHyperCity.standY(x, z); if (hcy > gy) gy = hcy; }
  if (window.CityAnnex && CityAnnex.standY) { var any = CityAnnex.standY(x, z); if (any > gy) gy = any; }
  if (window.CityQuadrantCrown && CityQuadrantCrown.standY) { var qcy = CityQuadrantCrown.standY(x, z); if (qcy > gy) gy = qcy; }
  if (window.CitySpaceport && CitySpaceport.standY) { var spy = CitySpaceport.standY(x, z); if (spy > gy) gy = spy; }
  if (window.CityLostWings && CityLostWings.standY) { var lwy = CityLostWings.standY(x, z, py); if (lwy > gy) gy = lwy; }
  if (window.CityOctaPool && CityOctaPool.standY) { var opy = CityOctaPool.standY(x, z, py); if (opy > gy) gy = opy; }
  if (window.CitySkyward && CitySkyward.standY) { var sky = CitySkyward.standY(x, z, py); if (sky > gy) gy = sky; }
  if (window.CityJubilee && CityJubilee.standY) { var jub = CityJubilee.standY(x, z, py); if (jub > gy) gy = jub; }
  if (window.CitySouthGate && CitySouthGate.standY) { var sgt = CitySouthGate.standY(x, z, py); if (sgt > gy) gy = sgt; }
  if (window.CityWardHouses && CityWardHouses.standY) { var wh = CityWardHouses.standY(x, z, py); if (wh > gy) gy = wh; }
  if (window.CityBetweenStones && CityBetweenStones.standY) { var bsy = CityBetweenStones.standY(x, z, py); if (bsy > gy) gy = bsy; }
  if (window.CityFirstParking && CityFirstParking.standY) { var pky = CityFirstParking.standY(x, z, py); if (pky > gy) gy = pky; }
  if (window.CityImperialColosseum && CityImperialColosseum.pos) { var cp = CityImperialColosseum.pos; if (Math.hypot(x - cp.x, z - cp.z) < 290) { var cy = (function () { try { return CityImperialColosseum.group().position.y + 2; } catch (e) { return -1000; } })(); if (cy > gy) gy = cy; } }
  var sty = solidsTopSupport(x, z, 0); if (sty > gy && sty <= py + STEP_UP) gy = sty;
  return gy;
}
function updateWalk(dt) {
  var k = input.keys, mx = input.sx, my = input.sy;
  if (k.KeyW || k.ArrowUp) my -= 1; if (k.KeyS || k.ArrowDown) my += 1; if (k.KeyA || k.ArrowLeft) mx -= 1; if (k.KeyD || k.ArrowRight) mx += 1;
  var mag = Math.min(1, Math.hypot(mx, my)), P = S.p;
  var DRV = S.drive || null;
  if (DRV) { DRV._thr = clamp(-my, -1, 1); DRV._str = clamp(mx, -1, 1); mx = 0; my = 0; mag = 0; }
  if (window.CityFleet && CityFleet.active()) { mx = 0; my = 0; mag = 0; }
  if (mag > 0.08) {
    var sp = (k.ShiftLeft || k.ShiftRight || mag > 0.95 && IS_TOUCH ? 22 : 12) * mag;
    if (S.rfly) sp *= 2.2; // royal flight: the superhero covers ground
    var fx = -Math.sin(S.camYaw), fz = -Math.cos(S.camYaw), rx = Math.cos(S.camYaw), rz = -Math.sin(S.camYaw);
    var vx = (fx * -my + rx * mx) / (Math.hypot(mx, my) || 1), vz = (fz * -my + rz * mx) / (Math.hypot(mx, my) || 1);
    P.x += vx * sp * dt; P.z += vz * sp * dt;
    var want = Math.atan2(vx, vz), dA = ((want - P.face + Math.PI * 3) % (Math.PI * 2)) - Math.PI; P.face += dA * Math.min(1, dt * 10);
    P.walk = (P.walk || 0) + dt * sp * 1.4;
  }
  if (S.ai && !DRV) { // Hyper Controller AI walk: user input always wins
    if (mag > 0.08) S.ai(null);
    else { var st = S.ai(dt); if (st) { P.x += st.vx * dt; P.z += st.vz * dt; var wa = Math.atan2(st.vx, st.vz), da = ((wa - P.face + Math.PI * 3) % (Math.PI * 2)) - Math.PI; P.face += da * Math.min(1, dt * 8); P.walk = (P.walk || 0) + dt * st.sp * 1.1; mag = 1; } }
  }
  if (DRV) driveStep(dt);
  else if (window.CityFleet && CityFleet.active()) CityFleet.stepDrive(dt);
  // everything visible is solid
  collideXZ(P, DRV ? 1.15 : 0.45, P.y + 1);
  var sx = SABLE_POS.x - P.x, sz = SABLE_POS.z - P.z, sd = Math.hypot(sx, sz); if (sd < 1.3 && sd > 0) { P.x = SABLE_POS.x - sx / sd * 1.3; P.z = SABLE_POS.z - sz / sd * 1.3; }
  var RF = !!S.rfly;
  if (RF) {
    var rise = S.rflyRise || 0;
    if (k.KeyR || k.Space) rise = 1; if (k.KeyF) rise = -1;
    S.rflyT = (S.rflyT || 0) + dt;
    if (S.rflyLand) rise = -1; else if (rise === 0 && S.rflyT < 1.1) rise = 1; // the lift-off
    S.rflyV = (S.rflyV || 0) + (rise * 14 - (S.rflyV || 0)) * Math.min(1, dt * 6);
    P.y += S.rflyV * dt;
    if (P.y > 1500) P.y = 1500;   // the King's ceiling, raised by his word 2026-10-14: 420 barely reached the Deep Hollow's floor (440) and could not touch the First (520) or the eastern giant