fix #137 (window climb): the player's collision capsule topped out at 1.2m — head sphere 0.63m too low

The 'run into the last corridor window and pop up through its roof'
report: the live callers passed sphereHeight: 1.2f into
SpherePath.InitPath, whose head-sphere formula (height - radius) put the
head sphere center at 0.72 - the capsule top at 1.2m. The top 0.63m of a
1.83m character had NO collision, so at the corridor-end window alcove
(0x8A020179 -> 0x8A02017E: 0.70m sill face, 1.3m opening, sloped funnel
behind) the step-up's placement never saw the head overlapping the
lintel solids and let the player climb in head-through-roof.

Dat truth (HumanSetup_CollisionSpheres_DatTruth): Setup 0x02000001
spheres = (0,0,0.475) r=0.48 and (0,0,1.350) r=0.48 - capsule top 1.83 =
Setup.Height 1.835. Retail collides with that sphere list verbatim
(CPhysicsObj::transition 0x00512dc0 -> init_sphere(GetNumSphere,
GetSphere, m_scale)).

Fix: PlayerMovementController + the GameWindow remote resolve now pass
sphereHeight: 1.835f (capsule top; head center 1.355 vs dat 1.350).
InitPath unchanged - captured-input replay fixtures (recorded 1.2
inputs) stay byte-identical. Register TS-46: the (radius, capsule-top)
scalar approximation of the Setup sphere list (5mm foot/head offsets;
remotes use human dims) with the retire path (plumb the sphere list).

Pins: WindowOpening_HeadCannotFit_EntryBlocked (22-frame walked approach
wall-slides at the sill, never enters 0x8A02017E) +
WindowAlcove_RaisedPlacement_HeadInLintelSolid_Collides (Path-1
placement rejects the raised head in the lintel solids) + the
WindowShaft_FullPolyDump / HumanSetup dat inspections.

Suites: Core 2562 / App 713 / UI 425 / Net 385, 0 failures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-05 19:57:11 +02:00
parent 1494f10cb5
commit aa96d7ad77
6 changed files with 285 additions and 13 deletions

View file

@ -1245,15 +1245,26 @@ matching the door's open/closed state.)
**✅ CORRIDOR GATE PASSED 2026-07-06 evening (user: "not collision anymore.
Good.")** — the corridor phantom arc (mechanisms 13) is user-verified
FIXED. REMAINING #137 scope from the same gate session:
- **Window/opening climb (NEW repro, this is #137's "openings in walls"
half):** running into the last corridor window, the player STEPS UP into
the opening — head (and camera) pop through the opening's roof. Retail
blocks this. Log anchor (`launch-137-gate2.log`): transit
`0x8A020179 → 0x8A02017E at (90.209,-41.774,-5.209)` and back — the
south-wall opening at y≈41.7, sill ≈0.8 m (world z 5.2) — climbed
despite stepUpHeight 0.6. Investigate the step-up acceptance (sill
height vs budget; suspect the step-up's walkable probe accepting the
sill top or the opening's floor from the neighbor cell).
- **Window/opening climb FIXED same day (pending gate): the player's
collision capsule TOPPED OUT AT 1.2 m.** The callers passed
`sphereHeight: 1.2f` and `InitPath` places the head sphere center at
`height radius` = 0.72 — the top 0.63 m of a 1.83 m character had NO
collision. The dat human Setup 0x02000001 (dumped in
`HumanSetup_CollisionSpheres_DatTruth`): spheres `(0,0,0.475) r=0.48` +
`(0,0,1.350) r=0.48` (top 1.83 = Setup.Height 1.835); retail collides
with that list verbatim (`CPhysicsObj::transition` 0x00512dc0 →
`init_sphere(GetNumSphere, GetSphere, scale)`). At the corridor-end
window alcove (0x8A020179 → 0x8A02017E: sill face 0.70 m, opening 1.3 m
tall, sloped funnel behind — full-vertex dump in
`WindowShaft_FullPolyDump`), the missing head let the step-up's
placement pass and the player climbed in head-through-lintel. Fix: both
live callers now pass 1.835 (capsule top; head center 1.355 ≈ dat
1.350); register TS-46 documents the residual 5 mm scalar
approximation. Pins: `WindowOpening_HeadCannotFit_EntryBlocked` (walked
approach wall-slides and never enters 0x8A02017E) +
`WindowAlcove_RaisedPlacement_HeadInLintelSolid_Collides` (the raised
placement rejects on the head-vs-lintel). Captured-input replay
fixtures keep their recorded 1.2 inputs — InitPath unchanged.
- Doors half (block/pass per open state) — unchanged.
Two RENDER issues also observed at the gate (filed separately below as
#176/#177): the purple floor flashing at seams is angle/camera-dependent