<!-- SOLID CITY · part 593 -->
he STEP_UP gate — transcribed, not reinterpreted, so the
 * fleet's world adapter (and any future instrument) reads the fabric from one source.
 * py is the asker's current height (the walker's P.y); it defaults to the ground
 * itself. LAW OF THE TWO LISTS: a hook added to the walk chain below is added here
 * in the same breath, or the two laws drift and craft and walker disagree.
 * THE GATE SPLIT (2026-10-14, from the study of how the published controllers
 * ground a body — Unreal's MaxStepHeight 0.45 m, Unity's step offset 0.1–0.4 m,
 * Godot's floor snap 0.1 m, grounded only): the old single gate of 1.6 m was
 * three numbers wearing one coat. (1) STEP-UP: a walker may climb onto a
 * surface at most STEP_UP above his feet — 0.45 m; a chest-high top is a wall
 * to step onto, however flat it lies. (2) SNAP: going down needs no gate at
 * all — the grounded lerp in updateWalk follows the surface down, as it
 * always has. (3) The gate is a CEILING ONLY: surfaces below the feet are
 * always eligible, so landing from the air and spawn probes stay unbounded
 * below. Vehicles keep the proven 1.6 through the mountain placer's own law
 * (SC.api.S.drive) — a car at speed on a steep grade outruns a tight gate;
 * feet do not. The mountain walk census under 0.45 reads clean: worst riser
 * 0.44 m on every centreline. */
var STEP_UP = 0.45;
function standingAt(x, z, py) {
  var gy = groundAt(x, z); if (gy < 0.5) { gy = 0.5; }
  if (py == null) py = gy;
  if (window.CityForge) { var fy = CityForge.standY(x, z, py); if (fy > gy) gy = fy; }
  if (window.CityAncestorRoads && CityAncestorRoads.topY) { var ap = CityAncestorRoads.pos; if (Math.hypot(x - ap.x, z - ap.z) < 560) { var ay = CityAncestorRoads.topY(); if (ay > gy) gy = ay; } }
  if (window.CityVillageMauna && CityVillageMauna.standY) { var vy = CityVillageMauna.standY(x, z); if (vy > gy) gy = vy; }
  if (window.CityMountainHomes && CityMountainHomes.standY) { var mhy = CityMountainHomes.standY(x, z, py); if (mhy > gy) gy = mhy; }
  if (window.CitySkyTrain && CitySkyTrain.standY) { var sky1 = CitySkyTrain.standY(x, z, py); if (sky1 > gy) gy = sky1; }
  if (window.CityRingCity && CityRingCity.standY) { var rc1 = CityRingCity.standY(x, z, py); if (rc1 > gy) gy = rc1; }
  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 = 