# Backlog (prioritized) Object model + control flow are mapped concurrently. Priority favors targets that unblock the most other work. Groomed by **re-quartermaster**. ## Now 1. **Data readers first (reimpl lever)** — implement the Mars brace-block parser + flat-KV + CSV readers. Unlocks tech tree, weapons (207), ship sections (875), races, AI tables, scenarios, tuning — nearly free. Also becomes the first `verify/parsers/`. See `findings/subsystems/data-model.md`. 1. **RTTI class inventory** — pull the full class/vftable list from ReVa; this seeds the real object-model target names (currently placeholders on the board). 2. **empire/player object** — the root of the game state; cross-ref the save-editor structs. 3. **entry → main loop** — establish the control-flow spine in parallel with the object model. ## Next 4. star system / fleet / ship / tech-tree objects (fan-out once class names are known). 5. D3D9 device init → present loop (renderer anchor). 6. save load/write path (ties object model to on-disk format; feeds verify/ parsers). ## Later 7. battle-load path (primary bug) — needs the object model + main loop mapped first. 8. .gob/DDS/model asset parsers (interop tools). ## Breadth queue (next rounds, one Ghidra user at a time; non-Ghidra items can run in parallel) - Combat sim: `GameCombatSim`/`Mars::CombatSim` tick, `CombatCommand*` dispatch (31 types), weapon flight per `weaponclass` (Ghidra) - Renderer: D3D9 init → `Mars::DrawDevice`/`Camera` → present loop; `.fx` shader usage (Ghidra) - Networking: `SNM*`/`FNM*` protocol from the 82 `NetMsgReg_*` factories; lockstep sync + host migration (Ghidra) - AI: `AIPlayer`, fuzzy `IAIRule`, `TacAISquad*`; how the AI CSV tables are consumed (Ghidra) - `Mars::Buffer::gobio` VFS + NativeFileSystem override order (Ghidra, small) - Ship design rules: section sockets/banks → `ShipDesignDef` validation (data + small Ghidra) - Reader/verify: fold strategic-internals formulas into harness checks against the 3 real saves (Python) ## Parked (not on the critical path — resume only with a clear reason) - **Battle-load bug** — one cheap Ghidra question when convenient: does the combat loader use the job API (`0x8fc160`/`0x8fa5b0`) whose completion poll is `TryEnterCriticalSection → Sleep(1000)` @`0x0071ea60`? Dynamic resume: add HDA audio (`qm set 140 -audio0 device=ich9-intel-hda,driver=none`), build Tankers + Extended-Range DEs, move to Markab/Junction, then `verify/harness/profiling/battle-run.sh`. ## From the RE how-to (guides/re-windows-2000s-howto.md) — adopt - **Replay + per-turn state-checksum regression harness** (OpenRCT2 model): record multi-turn input scripts, checksum sim state each turn, run in CI; decide the float-parity policy now (x87 vs SSE: i686 shim vs future x64 standalone) — `-mfpmath`/strict or tolerant compare. Extends our single-step End-Turn hash oracle. (verify lane) - **Automated class recovery**: run Ghidra `RecoverClassesFromRTTIScript` (with Decompiler Parameter ID) and/or CMU OOAnalyzer on the 1,924 RTTI classes to build class structs + method-to-class assignment; import VS2010 FID databases for CRT/STL triage. (Ghidra lane, after tech-effects) - **apitrace whole-run D3D9 capture** of the original as the golden trace for the eventual `Mars::DrawDevice` reimpl (RenderDoc can't capture D3D9); **WinDbg TTD** (x86 supported) for data-flow questions like 'who writes ServerPlayer+0x164'. (VM lane)