mirror of
https://github.com/jkdansereau/goldeneye-pc-port.git
synced 2026-10-23 15:52:42 +02:00
MoveBond gates the entire ladder-collision path on stanGetLocusCount(&curLocus), which was pinned at 0 on PC. Three compounding pointer-width bugs in the stan navigation layer (same class as D79/D90), no game logic touched: 1. stanCheckLinkedSpecialTile receives the caller's struct StandTileLocusCallbackRecord typed as `s32 *outFlags` and writes the LADDER signal with raw `outFlags[1] = 1`. The record's first member is `s32 *rooms` — 8 bytes on PC — so `[1]` is its high half and `count` (moved +4 -> +8) is never written. stanGetLocusCount() reads ->count, stays 0, ladder path never runs. (FORCECROUCH survived by luck: LE low half of rooms is at +0.) Fix: #ifdef PORT cast to the real struct, write ->rooms / ->count by name. 2. curLocus was declared `struct move_bond_temp_struct` — an 8-byte "placeholder while matching" that equals the N64 record size but is too small for the widened PC record, so stan's field writes overflowed the local. Fix: #ifdef PORT declare it as the real struct StandTileLocusCallbackRecord. 3. stanGetMoveBondCollisionTiles would AV on the first climb: `(coord3d *)((s32)coords + off)` truncates the 64-bit &bondCollision stack pointer. Fix: PORT_PTRADD (uintptr_t arithmetic) added to stan.c. All #ifdef PORT; N64 path kept verbatim under #else. Candidate root-cause from an M-36 subagent (parts 1/3); part 2 found on review. Verified: build links clean; -level_09 framediff 3/3 (frame_200 run variance only); -level_36 (Surface, mandatory ladders) boots crash-free; interactive climb confirmed working in-game by the owner. findings.md D177 (§F + §H), porting-notes.md §A.