Vault

zappatic — Reverse Engineering Master of Orion (stream digest)

A 9-VOD, ~36-hour Twitch series (Sep–Oct 2026) reverse-engineering MOO1 v1.x data-first: save file → live RAM → struct JSON, with Ghidra used only twice and largely abandoned. Its durable output is a published struct library (zapdebugger-moo.json). It yields almost no exact formulas — its value to us is the method for a DOS target, the savegame/RAM layout, and new behavioural facts (hard caps, diplomacy meters, random events).

Source: raw/videos/moo1-re/ (playlist index + local transcripts) — https://www.youtube.com/playlist?list=PLZVzPYU15yts Source: raw/videos/moo1-re/zappatic-site/ (struct/symbol JSON) — https://zappatic.net/moo

Links: Data-First RE (the thesis this is a specimen of) · MOO1 Optimal Strategy · MOO1 Opening Optimizer · The Rosetta Stone Method · The Anchor Method

Three-way cross-checks (stream × OSG × 1oom): diplomacy · random events

Per-part notes: 1 · 2 · 3 · 4 · 5 · 6 · 7a+7b · 8

Timeline

Part Focus
1 Planet struct (0xB8 × 108) from save-name stride; ship-design struct (0x44); per-planet orbit ships (24 B)
2 Build accumulators, planet flags/enums; researched-tech lists (6 × 60 u8, count-gated); research is probabilistic
3 Diplomacy block via save before/after diffs + file splicing; mood (−100..+100), treaty enum, diplomat meters; players[6] absorbs “game state”; year
4 Save-file analyzer; RAM↔disk block reorderings; Ghidra: turn logic is in STARMAP.EXE (ORION.EXE “a loader” per stream — too strong: it holds new-game data, e.g. the race-relations table at 0x22D6A); 32-bit fields detected by paired 16-bit writes
5 Fleets en route (260 × 28 B), transports (100 × 18 B); hard caps; failed DOSBox↔Ghidra address join (manual delta 0x7DD0)
6 Game settings, 4 trailing per-planet arrays; random-events block decoded by forcing one event at a time
7 Spy reports (year-made + per-field highest-tech watermark); terraforming/refit not stored; “player unknown” = global game state
8 Save tail, breakthrough + info-panel queues, Guardian/win fields; Borland 1991 copyright string

Method worth stealing (tooling not — we won’t rebuild his debugger)

The DOS-specific wall

Real-mode segment relocation means a runtime seg:off doesn’t equal the Ghidra address of the same code/data; his symbols even drift between segments (3813/6813/8813) across runs. He bridged it once by byte-pattern search (delta 0x7DD0) and Ghidra’s auto-analysis left the target undisassembled. He then mostly stopped using code at all. See Data-First RE for what this implies for us.

Findings new to the vault (behavioural, from his pokes)

Cross-checked against independent sources (2026-10-11)

Known v1.3 bugs — read measurements through them

The stream measures the binary; the OSG describes intent; 1oom catalogues the gap (doc/list_gamediff.txt, doc/list_pbxnum.txt, doc/pbxin_fixbugs.txt, ~94 WASBUG comments in src/). Chris knows the lore and can arbitrate: e.g. ship stacks display-capped at 32,000 from a signed-16 wrap (1oom clamps game_num_limit_ships = 32000), research % displayed at half. Before recording any stream or OSG number as a mechanic, check it against this list.

Open Questions

Tags

games · reverse-engineering · methodology