Files
BT411/scratchpad/night12/close60.py
T
2026-08-06 11:12:20 -05:00

28 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import sys
sys.path.insert(0, r'C:\git\bt411\scratchpad\night7')
import gitea
gitea.close(60, """**BOTH HALVES DONE — closing** (census e69c0d7, re-export f44be87).
Installed Ghidra 12.1.2 + JDK 21 locally and rebuilt the export with a new `ExportGaps.java` that keeps the old output contract exactly (shard format, index columns — every tool, grep and `@ADDR` citation still works) and adds a gap-fill pass first: force disassembly + `createFunction` at E8 call targets landing outside any function, data→code pointers at a plausible prologue, and the 332 starts the census discovered — iterated to a fixpoint.
| | before | after |
|---|---|---|
| index coverage of .text | 87.3% | **93.5%** |
| dark REAL code | 90.4 KB | **40.8 KB** (54.8%) |
| game-side dark (bt/ + bt_l4/) | 53.1 KB | **21.1 KB** |
| functions / pseudocode | 6,267 | **6,472** (+205, 0 decompile failures) |
**`BTPlayer::VehicleDeadMessageHandler @0x4c05c4` — the function whose absence opened this issue — now has pseudocode**, along with every other address that historically burned us (ToggleLamp @4b838c, the TakeDamage death tail, the master-perf region, the myomer integrator, the btplayer hole @4c0904).
Two things worth flagging beyond the numbers:
1. **The re-export independently CONFIRMED this week's hand-decoded crouch reconstruction, field for field** (mapPosture/duckState/squatCapable/myomerEffectiveness, the novice gate, SetLegAnimation(2/3), ForceUpdate(8)+(1), the stability alarm). Good news for every raw-disasm reconstruction we've shipped.
2. **It also caught a branch the raw pass missed** — an airborne auto-rise (`mode 3|4 && legState 1 → forced rise`) that the hand disassembly stopped just short of. Implemented and re-benched the same day. That is exactly the failure mode this issue was about, now caught by tooling instead of by a player.
**Process:** `reference/decomp/GAP_CENSUS.md` maps what is still dark; per reconstruction-gotchas §20 the rule is now cheap — look the address up, and only if it is in a dark region does "absent from the export" need byte-scan backup.
⚠ **Note for anyone citing the decomp:** the old export is preserved at `reference/decomp/archive_2025export/`. Addresses are stable across both, but line numbers and shard membership are NOT — cite `@ADDR`, not `part_0NN.c:LINE`.
Pipeline for future re-exports: `tools/ghidra_reexport.sh` → `tools/gapcensus.py` → `tools/gapdiff.py`. Remaining 40.8 KB dark (mostly engine TUs we compile from source) plus the new `@0x4c0904` master-Performance lead are tracked in `phases/phase-04-gap-census.md`.""")
print('closed')