sots-re/campaign/open-questions.md

4.5 KiB
Raw Blame History

Open questions

Each links to the finding that raised it. Promoted to backlog or closed by re-quartermaster.

  • Compiler archive mismatch — imports say MSVCR100/MSVCP100 (VS2010), but Ghidra applied windows_vs12_32 datatypes (closest available). Confirm the exact toolchain from the PE Rich header; decide which datatype archive best fits. (from 01-fingerprint)
  • Battle-load root cause — inferred as single-threaded engine + core-count-sensitive code; must be confirmed by a ForceSingleCore=0 vs =1 diff once the main loop is mapped. (from 00-strategy)
  • Save-editor struct coverage — community editors cover players/tech/systems; fleet/combat state coverage may be partial. Treat as strong hints, verify each field against real saves.
  • Lockstep determinism — @SYNC ERROR DETECTED: Frame %d indicates a deterministic lockstep sim. Big for reimplementation + old-vs-new differential (determinism makes equivalence checkable frame-by-frame). Confirm scope. (from strings-and-config)
  • Mods override mechanism — .gob = gobio::ZipFileSystem with a NativeFileSystem loose-file override; this is how ./Mods wins over archived files. Verify load order. (from strings-and-config)
  • Battle-load root cause — the shipped fix is a blunt process-affinity pin (FUN_0089ee70) with NO CPU-topology detection, so there is no adaptive branch. The real cause is emergent multi-core contention: which thread(s)? Investigate the 3 CreateThread sites (FUN_00902350, FUN_00736e30, startup FUN_008a0e50), the streaming-sound thread, and lockstep sync waits. (from ghidra-recon)
  • Save-struct contradictions (R1 vs R2) — field widths (Abdn/Dstyd/ltis Int16 vs Int32; Bats2), R2's OID = PID*16 owner-handle claim, species id 4 (_NPC vs 'AI Rebellion'). Resolve against the binary's Streamable read code. (from save-editor-structs)
  • Unlabeled save blocks — CdPlayer (unknown1..35), empty SimSystemDetailSpy, opaque ~2500 B RNG blob. Analyst targets once the Streamable readers are located. (from save-editor-structs)
  • Missing HUD scripts — exe references GUI/Combat/CombatHUD.script, SensorHUD.script, NoHUD.script but none ship in the gobs or loose; likely dev-only overrides via the gobio native-FS fallback. Confirm via CombatScreen load path. Also: .script files are display configs, not widget layouts (corrects round-one note). (from ui-screen-map)
  • Tech allows default per-race % — tech_tree.json edges only carry races written in the allows string; the default for an unlisted race (believed 100%) is engine code. Ghidra target in the tech loader. (from data-parsers)
  • Engine parser leniency — 12 shipped shipsections are syntactically broken (unclosed {, extra }) yet load; keys and identifiers are case-insensitive. Reimplementation must match this leniency. .effect is its own TXT/BEGIN-END format, not brace-block (corrects round one). (from data-parsers)
  • Struct recovery leftovers — PlayerColorID exact on-disk width (writer FUN_008b9cb0 undecompiled); ServerSystem+0x10 owner type; TechTree per-tech body; CdPlayer block. R2's OID = PID*16 is an id-allocation pattern, not in this code. (from struct-recovery)
  • Resolved (R1/R2 contradictions) — Bats2/rcex are int64 (R2 wrong); Abdn/Dstyd bools, ltis int; TRM/CstR/E/T/shrm/RefCap/RepCap/PlayerView Infra are floats; pswd string; TShn/ETS/diplomacy counters int16 in memory, int32 on disk; Nexp carries xid/xmin/xmax/xper; FtOrig is Vector3. (from struct-recovery)
  • Battle-load, narrowed — sim/combat load run on the main thread; the only other threads are net watchdog, TIME_CRITICAL audio streaming (g_musicCS), and a star-map mesh builder. Hypothesis: audio-thread critical-section contention or D3D9 runtime/driver threads on many cores. Needs a dynamic profile (x32dbg / ETW) under the software-GPU stack. (from turn-spine)
  • Spine leftovers — StrategyServer struct partial (41 fields); static-initialiser region 0x009be000–0x009c1400 undisassembled; Mars::Stream vftable not located; several small ProcessTurn phase fns unnamed. (from turn-spine)
  • Save framing ambiguities (settle on first real save) — padding joint [len][name][value][pad] vs split; bool vs int for names with len%4==0 (no type byte); on-disk tags for Summary/CreateParameters and count/element tags inside framed arrays unknown (positional for now). A real 3-char bool tag (NPC,Dep,hsp) settles padding. (from SAVE_FORMAT)