8.2 KiB
8.2 KiB
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_32datatypes (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=0vs=1diff 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 %dindicates 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::ZipFileSystemwith aNativeFileSystemloose-file override; this is how./Modswins 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 3CreateThreadsites (FUN_00902350,FUN_00736e30, startupFUN_008a0e50), the streaming-sound thread, and lockstep sync waits. (from ghidra-recon) - Save-struct contradictions (R1 vs R2) — field widths (
Abdn/Dstyd/ltisInt16 vs Int32;Bats2), R2'sOID = PID*16owner-handle claim, species id 4 (_NPCvs 'AI Rebellion'). Resolve against the binary's Streamable read code. (from save-editor-structs) - Unlabeled save blocks —
CdPlayer(unknown1..35), emptySimSystemDetailSpy, 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.scriptbut none ship in the gobs or loose; likely dev-only overrides via the gobio native-FS fallback. Confirm viaCombatScreenload path. Also:.scriptfiles are display configs, not widget layouts (corrects round-one note). (from ui-screen-map) - Tech
allowsdefault per-race % —tech_tree.jsonedges only carry races written in theallowsstring; 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..effectis its ownTXT/BEGIN-ENDformat, not brace-block (corrects round one). (from data-parsers) - Struct recovery leftovers —
PlayerColorIDexact on-disk width (writerFUN_008b9cb0undecompiled);ServerSystem+0x10owner type;TechTreeper-tech body;CdPlayerblock. R2'sOID = PID*16is an id-allocation pattern, not in this code. (from struct-recovery) - Resolved (R1/R2 contradictions) —
Bats2/rcexare int64 (R2 wrong);Abdn/Dstydbools,ltisint;TRM/CstR/E/T/shrm/RefCap/RepCap/PlayerViewInfraare floats;pswdstring;TShn/ETS/diplomacy counters int16 in memory, int32 on disk;Nexpcarriesxid/xmin/xmax/xper;FtOrigis 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 —
StrategyServerstruct partial (41 fields); static-initialiser region 0x009be000–0x009c1400 undisassembled;Mars::Streamvftable 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) - Strict-parse gaps vs real save (verifier output, round 3) — (1)
ServerSystem: 7/28 systems carryVFlagswhereName/vnhwere expected — a conditional layout (uncolonized/special systems?); (2)halt[].haltvis a 31/35-byte struct, not a bool; (3) optionalindi(IndependenceInfo?) precedesNVE/PIDin some systems; (4)PrisonerHold.prisoners[]entries lackPrNSp; (5)/createParams/keyis int; (6)turnstats.hist.stats.tchis int; (7) optional trailingzdsi/zdst. Padding = joint (settled). 7 resyncs / 2728 raw bytes ≈ RNG blob. (from turn2-strict-issues) - RESOLVED: strict-parse gaps — 5/8 were reader bugs (ASCII plausibility test applied to string values; empty string == int 0), 3 real:
PrNSponly whenPrMax>0;indiunconditional inNVOnodes (system-level gated byhindi);zdsi/zdstpairs underzdsc.Keyis an empty string;tchint. Summary/CreateParams tag lists confirmed. Reader patch in flight. (from schema-gaps-resolved) - RESOLVED: save framing — padding is joint;
"."= NULL tag (VectorHelper count+elements, Vector3 bodies); empty strings are 4 zero bytes;CDTis a tagged frame + opaqueCDframes. All three real saves parse--strictclean. Note:SvSctObIS present in all saves (patch doc §7 was wrong). (from SAVE_FORMAT) - (parked) Combat loader job API — does tactical-battle loading go through the job helpers
0x8fc160/0x8fa5b0with theTryEnterCriticalSection→Sleep(1000)completion poll (0x0071ea60)? If yes, that is a plausible many-core stall (lost try-lock = +1 s per poll). End Turn also has a deliberateSleep(computed)≈0.85 s at0x00838da9. (from battle-load-profile) - Ship-design code rules (Ghidra, from SHIP_DESIGN_RULES.md §8) — hidden default rider designs are built WITHOUT tech gating (where?); is section class-equality enforced or merely unoffered; confirm the turret class-accept table (
standard ← {standard,missile,grapple},strafe ← {standard}; grapple weakest); hull-class tech injection (IND_CruisCon/IND_DreadCon) + station exemption; option defaults/auto-upgrade and whatoption_costmultiplies; weapon cost per bank vs per mount; mass/speed formulas;faiDes/dWepmeaning. (from SHIP_DESIGN_RULES) - Corrections from turn internals —
ServerPlayer+0xf9is the AI flag (not bTurnDone);FUN_007d7f70is encounter detection; ProcessTurn phase 2 is trade, not diplomacy; the spine'sFUN_00840fe0'income' is special projects — income isFUN_00863030ComputeBudget.TECHBEN_*data blocks are inert (effects hard-coded via the 116-entry tech-name table @0x00a19718). Open: TRA/TRP producers,FPsp2derivation,PERGATETRAFFIC_*readers, exact BnkEl/BnkPr expression. (from strategic-turn-internals) Mars::Application::Initializesignature (P2-M0 finding) — a C++__thiscalldetour that called the original crashed inside Initialize; the trace hook now uses a convention-agnostic asm stub. Verify the real signature (stack args? EDX use? return value?) before anycompare/replacehook on it. Same caution for every[unverified]entry inghidra/addresses.json. (from m0)- Formula gaps surfaced by the game/sim port (feed back to Ghidra) — which bankruptcy limit carries the 3.3 factor and when the bankruptcy start turn is stamped; the suitability→carrying-capacity hazard curve shape; the trade-points→money system-income tail; the
POPBONUS_INCpopulation increment; the expense-slider request term; which running total the tech-income bonus / savings aid read; node-line speed clamp at the influence radius; whetherDecayAllResearchalso hits the current target. (from game-sim)