forked from Ports/goldeneye-pc-port
D132: fix propDef union-index slots for LINK/SWITCH/LOCK_DOOR/SAFE_ITEM
Types 14/19/38/44 declare their Index{1,2,3} fields as a union with a
pointer, so on PC each is an 8B/8-aligned slot (Index1@8, Index2@16,
...) and the record ends in a *next the proplvreset2 walk writes. The
converter was laying the N64 tight-4-byte index words at PC bytes 4/8/12,
putting Index1 where the compiler reads Index2 and leaving Index2 zero.
Non-crashing but silently broke switch-doors, dual weapons, padlocked
doors, and safe/safe-item links.
- tools_pc/d88_propdefs.py: PROPDEF_PC_BYTES 14/19->32, 44->40; handler
emits Index{k} into low 4B of the 8-aligned slot at PC 8+8*k.
- loadobjectmodel.c sizepropdef() PORT: LINK/SWITCH/LOCK_DOOR->8,
SAFE_ITEM->10, TAG stays 6.
Verified: -level_09 framediff 3/3 PASS; -level_20 identical to a
freshly-built pre-D132 baseline (frame_000320 delta is pre-existing
stale-golden/Silo slowdown, not a regression); Archives/Streets/Dam
load+render+no-crash.
This commit is contained in:
1 parent
e5f4290bc6
commit
5e9ea50add
3 files changed
+36
-11
No files matched your search
+17
-1
@@ -4817,7 +4817,23 @@ Depot, sevb, sevx.
|
||||
`PROPDEF_PC_BYTES == real compiler sizeof`. D122's totality note flagged
|
||||
`[u16|u16]` half-swap but not the `union{ptr; s32}` index-slot case.
|
||||
|
||||
### Proposed fix (NOT applied — ABI/layout only, `#ifdef PORT`)
|
||||
### APPLIED (M-20, commit pending) — ABI/layout only, `#ifdef PORT`
|
||||
|
||||
Fix below applied verbatim. `tools_pc/d88_propdefs.py`: `PROPDEF_PC_BYTES`
|
||||
`14/19 -> 32`, `44 -> 40`; the `(14,19,38,44)` handler now emits each
|
||||
`Index{k}` into the low 4 B of the 8-aligned slot at PC `8 + 8*k`
|
||||
(`nidx = {14:2,19:2,38:2,44:3}`). `loadobjectmodel.c sizepropdef()` PORT
|
||||
switch: `LINK/SWITCH/LOCK_DOOR -> return 8`, `SAFE_ITEM -> return 10`,
|
||||
`TAG` stays `6`. Regen chain run. Verified: `-level_09` framediff 3/3
|
||||
PASS; `-level_20` behaviour byte-identical to a freshly-built pre-D132
|
||||
baseline (the `frame_000320` phash delta is pre-existing stale-golden /
|
||||
Silo slowdown, NOT a regression — confirmed by building the baseline);
|
||||
Archives (`-level_25`, SWITCH+SAFE_ITEM), Streets (`-level_29`, 20x
|
||||
LOCK_DOOR), Dam (`-level_33`, SWITCH+LOCK_DOOR) all load + render +
|
||||
no-crash. Sweep runs this pass were heavily flaky (level_09 itself
|
||||
0-framed on a loaded machine) — pure D117/watchdog noise, no crashes.
|
||||
|
||||
### Original proposed fix (as written pre-apply)
|
||||
|
||||
`tools_pc/d88_propdefs.py` — `PROPDEF_PC_BYTES`: `14: 24 -> 32`,
|
||||
`19: 24 -> 32`, `44: 24 -> 40` (38 stays 32). Replace the
|
||||
|
||||
Reference in new issue
Block a user