4.5 KiB
4.5 KiB
Backlog (prioritized)
Object model + control flow are mapped concurrently. Priority favors targets that unblock the most other work. Groomed by re-quartermaster.
Now
- 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/. Seefindings/subsystems/data-model.md. - RTTI class inventory — pull the full class/vftable list from ReVa; this seeds the real object-model target names (currently placeholders on the board).
- empire/player object — the root of the game state; cross-ref the save-editor structs.
- entry → main loop — establish the control-flow spine in parallel with the object model.
Next
- star system / fleet / ship / tech-tree objects (fan-out once class names are known).
- D3D9 device init → present loop (renderer anchor).
- save load/write path (ties object model to on-disk format; feeds verify/ parsers).
Later
- battle-load path (primary bug) — needs the object model + main loop mapped first.
- .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::CombatSimtick,CombatCommand*dispatch (31 types), weapon flight perweaponclass(Ghidra) - Renderer: D3D9 init →
Mars::DrawDevice/Camera→ present loop;.fxshader usage (Ghidra) - Networking:
SNM*/FNM*protocol from the 82NetMsgReg_*factories; lockstep sync + host migration (Ghidra) - AI:
AIPlayer, fuzzyIAIRule,TacAISquad*; how the AI CSV tables are consumed (Ghidra) Mars::Buffer::gobioVFS + NativeFileSystem override order (Ghidra, small)- Ship design rules: section sockets/banks →
ShipDesignDefvalidation (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 isTryEnterCriticalSection → 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, thenverify/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::DrawDevicereimpl (RenderDoc can't capture D3D9); WinDbg TTD (x86 supported) for data-flow questions like 'who writes ServerPlayer+0x164'. (VM lane) - Pin game/sim low-confidence formulas from
findings/subsystems/formula-gaps.md(bankruptcy limits/stamping, linear hazard curve, money tail, pbon, slider request, [6] net, no speed clamp, decay incl. current) and wire the code-defined tech effects (findings/subsystems/tech-effects.md) into game/sim + game/data. (engine lane, next slot)
Behavioral slice (the pivot from data to logic — user directive 2026-09-08)
Data loaders are done/underway; game/sim has never been compared against the original. Verify behavior
function-by-function on the End-Turn workload (ref-turn2.sav, deterministic, 8 players x 28 systems):
- B1 ComputeBudget (pure, no RNG) — the cleanest first brick.
- B2 OnTechResearched (tech effects) — needs sim-pin's effects layer.
- B3 ProcessResearch (RNG) — snapshot MT19937 pre-call, run ours from a copy; validates RNG+odds+Zuul at once.
- Then, once signatures are verified: ServerSystem::ProcessTurn (colony growth), MoveFleet, and finally
StrategyServer::ProcessTurn as a whole-turn compare.
Gate: RNG_* and StrategyServer::ProcessTurn signatures are
unverified— Ghidra pass first.