diff --git a/campaign/DASHBOARD.md b/campaign/DASHBOARD.md index b2912a4..d5a3aff 100644 --- a/campaign/DASHBOARD.md +++ b/campaign/DASHBOARD.md @@ -1,17 +1,17 @@ # SotS RE campaign — coverage dashboard -Generated 2026-09-08 02:34 UTC · `sots-re` @ fa47bcd,2026-09-07 · `sots-engine` @ de779ad,2026-09-07 (43 commits) · regenerate with `tools/dashboard.py` +Generated 2026-09-08 02:43 UTC · `sots-re` @ 01c3217,2026-09-07 · `sots-engine` @ 81218c7,2026-09-07 (45 commits) · regenerate with `tools/dashboard.py` > **North star:** A functional reimplementation of the engine — behavior-equivalent, NOT byte-for-byte ## 1. Map coverage (campaign/board.md) -53 targets · mapped-or-better **42/53** `[████████░░] 79%` · verified **25/53** `[█████░░░░░] 47%` +54 targets · mapped-or-better **43/54** `[████████░░] 80%` · verified **26/54** `[█████░░░░░] 48%` | Status | Count | % | |---|---:|---:| -| verified | 25 | 47% | -| mapped | 17 | 32% | +| verified | 26 | 48% | +| mapped | 17 | 31% | | in-progress | 3 | 6% | | backlog | 7 | 13% | | blocked | 1 | 2% | @@ -24,7 +24,7 @@ Generated 2026-09-08 02:34 UTC · `sots-re` @ fa47bcd,2026-09-07 · `sots-engine | engine | 10 | 0 | 0 | 0 | 0 | 10 | | verify | 4 | 2 | 0 | 0 | 0 | 6 | | phase2 | 2 | 0 | 2 | 4 | 0 | 8 | -| meta | 2 | 5 | 0 | 0 | 0 | 7 | +| meta | 3 | 5 | 0 | 0 | 0 | 8 | ## 2. Binary understanding @@ -44,7 +44,7 @@ Generated 2026-09-08 02:34 UTC · `sots-re` @ fa47bcd,2026-09-07 · `sots-engine | Module | LOC | Test files | Checks | Wired | Doc | |---|---:|---:|---:|---|---| -| `game/config` | 315 | 3 | 89 | yes | M1.md | +| `game/config` | 558 | 4 | 131 | yes | M1.md | | `game/data` | 2,053 | 12 | 462 | yes | game-data.md | | `game/design` | 1,024 | 17 | 250 | yes | game-design.md | | `game/effects` | 811 | 3 | 160 | yes | game-effects.md | @@ -54,10 +54,10 @@ Generated 2026-09-08 02:34 UTC · `sots-re` @ fa47bcd,2026-09-07 · `sots-engine | `mars/stream` | 3,703 | 6 | 195 | yes | mars-stream.md | | `mars/text` | 899 | 8 | 245 | yes | mars-text.md | | `mars/vfs` | 788 | 9 | 140 | yes | mars-vfs.md | -| `shim` | 2,452 | 0 | 0 | direct (WIN32) | M0.md | -| `shim/hooks` | 368 | 0 | 0 | direct (WIN32) | M0.md | -| `shim/trace` | 1,824 | 8 | 248 | direct (WIN32) | shim-trace.md | -| **total** | **16,896** | **87** | **2532** | | | +| `shim` | 2,981 | 0 | 0 | direct (WIN32) | M0.md | +| `shim/hooks` | 875 | 0 | 0 | direct (WIN32) | M0.md | +| `shim/trace` | 1,836 | 8 | 248 | direct (WIN32) | shim-trace.md | +| **total** | **18,187** | **88** | **2574** | | | Board `engine:` rows: verified **10**, mapped 0, in flight 0 (of 10) — verified & merged `[██████████] 100%` @@ -67,7 +67,7 @@ Board `engine:` rows: verified **10**, mapped 0, in flight 0 (of 10) — verifie |---|---|---:|---| | P2-M0 shim bootstrap | ✅ verified | 100% | sots-engine 5f5bc41: proxy binkw32.dll (66 exports identical), MinHook, asm-stub trace hoo | | P2-M1 flat-KV config loader | ✅ verified | 100% | LIVE: GlobalConsts::LoadFile hooked; trace 19 calls/1088 regions (tracecmp 0); compare 19/ | -| P2-M2 manifest/id registry | 🔄 in-progress | 0% | no registry object: WeaponDictionary::Init 0x0059a4c0 / SectionDictionary ctor 0x00576f40 | +| P2-M2 manifest/id registry | 🔄 in-progress | 70% | CODE-COMPLETE (engine 81218c7): hooks on WeaponDictionary::Init + SectionDictionary ctor ( | | P2-M3 Mars brace-block parser | ⬜ backlog | 0% | Mars::Script pull tokenizer (Open 0x008cd7d0, ReadToken 0x008cd2f0, Next 0x008cd3e0, SkipB | | P2-M4 gobio VFS read | ⬜ backlog | 0% | choke point: bool __cdecl gobio::ReadFile(const char*, IBuffer**) 0x008d5140; FileSystemSe | @@ -82,22 +82,22 @@ Board `engine:` rows: verified **10**, mapped 0, in flight 0 (of 10) — verifie ## 7. Open questions -Open **24** · resolved/parked 10 · backlog items: Now 4, Next 3, Later 2, Breadth queue 7, Parked 1, From the RE how-to 4, Behavioral slice 4 +Open **25** · resolved/parked 10 · backlog items: Now 4, Next 3, Later 2, Breadth queue 7, Parked 1, From the RE how-to 4, Behavioral slice 4 Most recent open: +- Struct-modelling hazard (found by M2) — an MSVC-2010 `std::vector` member is three words, so a… - Notes disagree on MSVC-2010 `std::string` layout — `struct-recovery.md` §0 vs `turn-spine.md` §1.1… - SAVE_FORMAT tag corrections (fix Python reader + spec) — real on-disk tags: `otnF` (not `ontF`) in… - Not traced end-to-end — `Species/_NPC/weapons/*.weapon` loading and the `.effect` dictionary entry… - PARITY BUG (fix in mars/text + Python flat_kv): duplicate config keys are FIRST-occurrence-wins in t… -- Formula gaps surfaced by the game/sim port (feed back to Ghidra) — which bankruptcy limit carries … ## 8. Delta since previous dashboard -- verified targets: 23 → 25 (+2) · mapped-or-better: 40 → 42 (+2) -- engine LOC: 15,809 → 16,896 (+1,087) · test files: 84 → 87 (+3) · checks: 2,262 → 2,532 (+270) -- addresses verified: 123 → 126 (+3) · recovered layouts: 21 → 21 (+0) · open questions: 24 → 24 (+0) +- verified targets: 25 → 26 (+1) · mapped-or-better: 42 → 43 (+1) +- engine LOC: 16,896 → 18,187 (+1,291) · test files: 87 → 88 (+1) · checks: 2,532 → 2,574 (+42) +- addresses verified: 126 → 126 (+0) · recovered layouts: 21 → 21 (+0) · open questions: 24 → 25 (+1) --- warnings: mars-rng.md: no oracle total row parsed; mars-stream.md: no oracle total row parsed; mars-vfs.md: no oracle total row parsed - + diff --git a/campaign/board.md b/campaign/board.md index 2bf9771..86b7e2d 100644 --- a/campaign/board.md +++ b/campaign/board.md @@ -35,7 +35,7 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). | strategic turn internals (economy/research/colony/movement/diplomacy) | subsystem | mapped | high | 90% | 2026-09-07 | findings/subsystems/strategic-turn-internals.md: budget/RP/trade/bankruptcy formulas, research rolls (unlisted race=1.0, Zuul x2), colony growth, movement, RNG=MT19937; ~600 g_KEY labels in Ghidra | | P2-M0 shim bootstrap | phase2 | verified | high | 100% | 2026-09-07 | sots-engine 5f5bc41: proxy binkw32.dll (66 exports identical), MinHook, asm-stub trace hook on Application::Initialize; menu reached; evidence verify/results/shim/. Initialize signature unverified -> asm stubs only | | P2-M1 flat-KV config loader | phase2 | verified | high | 100% | 2026-09-08 | LIVE: GlobalConsts::LoadFile hooked; trace 19 calls/1088 regions (tracecmp 0); compare 19/19, 0 divergences; REPLACE loaded all 19 files and End-Turn autosaves hashed exactly to the oracle; offline replay 0. 3 extra parsers found (string/vec3/rect), pi/180 is a double. sots-engine 8b231c0, docs/M1.md; traces verify/traces/m1-* | -| P2-M2 manifest/id registry | phase2 | in-progress | — | 0% | 2026-09-08 | no registry object: WeaponDictionary::Init 0x0059a4c0 / SectionDictionary ctor 0x00576f40 read 'id file' pairs via Script::ReadToken; id stored on def (+4), sorted vector at dict+8; DELETED lines are comments; call site DemoApp::LoadGameData 0x00899280 (deferred to first OnTick) | +| P2-M2 manifest/id registry | phase2 | in-progress | med | 70% | 2026-09-08 | CODE-COMPLETE (engine 81218c7): hooks on WeaponDictionary::Init + SectionDictionary ctor (verified thiscall; added CallConv::Thiscall to the Hook template), manifest_loader + MSVC sort replica; ctest 26/26, cross-build staged /srv/re-lab/shim/dist-m2. Scout trace on the live game proved 123 weapon ids exact, dict sorted by _stricmp on name, 885 sections, 10 dangling ids absent. NEEDS ~20min VM window for golden/compare/replace | | P2-M3 Mars brace-block parser | phase2 | backlog | — | 0% | 2026-09-07 | Mars::Script pull tokenizer (Open 0x008cd7d0, ReadToken 0x008cd2f0, Next 0x008cd3e0, SkipBlock 0x008cd4b0); whitespace-only delimiting, quotes " ' ` no escapes, EOF ends, stray } ignored, LAST PAIR W/O TRAILING NEWLINE DROPPED; consumers = _stricmp if/else chains (WeaponDef::ParseScript 0x00599070, SectionDef::ParseScript 0x005744e0, MasterTechTree::ParseTech 0x0058b050). .effect = Mars::TextFileStream (Open 0x008cfb90) | | P2-M4 gobio VFS read | phase2 | backlog | — | 0% | 2026-09-07 | choke point: bool __cdecl gobio::ReadFile(const char*, IBuffer**) 0x008d5140; FileSystemSet ctor 0x008d6d60 pushes NativeFileSystem(".") FIRST then sots.ini [Modules] Mount (fallback sots.gob, sots_local_en.gob); zip lookup case+slash-insensitive 0x008d4a50 -> matches mars/vfs NativeFirst | | loader prototypes (Ghidra) | meta | verified | high | 100% | 2026-09-07 | findings/subsystems/loader-prototypes.md: 80 entries (79 verified) in ghidra/addresses.json; Initialize = bool(this, AppStartup*) RET 4 (M0 crash explained); 93 fns renamed + 9 structs in Ghidra | @@ -58,4 +58,4 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). | P2-B3 ProcessResearch (behavioral, RNG) | phase2 | backlog | — | 0% | 2026-09-08 | hook TechTree::ProcessResearch 0x005876c0 (verified); snapshot MT19937 state pre-call and drive ours from a copy -> validates RNG + odds + Zuul double roll together | | RNG signatures (Ghidra) | meta | mapped | high | 75% | 2026-09-08 | Seed/Twist/NextFloat verified (own pass): lazy twist, left@+0x9c4, NextFloat via x87 = float-parity risk. NextInt still unverified | | engine: game/effects | engine | verified | high | 100% | 2026-09-08 | merged: TechId enum (196 slots @10000+i), 44 ids with typed strategic effects, species flag bits, ApplyTechEffect; 254 checks | -| VM140 exclusivity (lab rule) | meta | verified | high | 100% | 2026-09-08 | only ONE agent may deploy a shim DLL / stop-start the game at a time; interleaved deploys silently corrupt compare results. Holder is recorded here. Current holder: B1. Queued: M2 (code+build ready, needs a VM window). Non-holders use their own build dir (/srv/re-lab/build/sots-engine-) | +| VM140 exclusivity (lab rule) | meta | verified | high | 100% | 2026-09-08 | only ONE agent may deploy a shim DLL / stop-start the game at a time; interleaved deploys silently corrupt compare results. Current holder: B1. Queued: M2 (code merged, dist-m2 staged, needs ~20min window). Non-holders build in /srv/re-lab/build/sots-engine- | diff --git a/campaign/open-questions.md b/campaign/open-questions.md index a8f12b8..7da02c1 100644 --- a/campaign/open-questions.md +++ b/campaign/open-questions.md @@ -41,3 +41,4 @@ Each links to the finding that raised it. Promoted to backlog or closed by **re- - **Notes disagree on MSVC-2010 `std::string` layout** — `struct-recovery.md` §0 vs `turn-spine.md` §1.1 give different offsets; pin both from the `_Myres >= 16` SSO branch in `Stream::WriteString` and correct the loser. (from [[re-windows-2000s-howto]]) - **RESOLVED: formula gaps (all 8)** — see [[formula-gaps]]; game/sim's low-confidence functions can now be pinned. **RESOLVED: std::string** = `_Bx@0,_Mysize@0x10,_Myres@0x14,_Alval@0x18`, sizeof 0x1c (struct-recovery §0 right; turn-spine §1.1 WRONG — annotated). **CORRECTION:** the 116-entry table @0x00a19718 is a name-membership list, not the effects table; use `g_TechIdNames` (196) + `OnTechResearched`. Open: values of the 6-entry AI-tech bonus table (0x00a17888); producer of ServerPlayer +0x224/+0x228/+0x22c beyond the setup-record copy (0x0077b620). (from [[tech-effects]]) - **RESOLVED: RNG semantics** — `Seed` is `thiscall(this, uint32)` RET 4 (MT19937 init + immediate twist); `Twist` takes `this` in ECX only; **twist is LAZY** (`if (left==0) Twist()` inside the draw), `left` lives at `+0x9c4`, confirming the save blob layout. **float mapping, needs a targeted check (not a red flag):** `NextFloat` decompiles as returning `float10`, but that is simply how x86 float returns look (value in `ST(0)`), so it is weak evidence of extended-precision *computation*; a single `y * 2^-32` multiply rounds once either way. B3 should still compare the mapping explicitly (exact constant and whether the draw is `y*2^-32`, `(y>>8)*2^-24`, or divided by 2^32-1), and the x87-vs-SSE float-parity policy from the RE how-to is still needed before the x64 standalone. `RNG_NextInt` signature still unverified. (own Ghidra pass) +- **Struct-modelling hazard (found by M2)** — an MSVC-2010 `std::vector` member is **three words**, so a naive C translation put the next pointer at `+0x18` when it is really at `+0x14`; the hook silently reported the unmodelled word (string bytes `"TION"`) as a real field. Any hand-modelled game struct must pin its size with `static_assert` and account for 3-word vectors. (from [[M2]]) diff --git a/verify/results/shim/m2-scout-shim.log b/verify/results/shim/m2-scout-shim.log new file mode 100644 index 0000000..d9f4f43 --- /dev/null +++ b/verify/results/shim/m2-scout-shim.log @@ -0,0 +1,320 @@ +17:17:38.944 [tid 4396] ==== sots-engine shim (binkw32 proxy) build 4a15301-20260907T2115Z ==== +17:17:38.944 [tid 4396] exe: C:\SOTS\Sword of the Stars.exe +17:17:38.944 [tid 4396] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=6396 shim=730c0000 +17:17:38.944 [tid 4396] addresses: Source: sots-re ghidra/addresses.json @ daea98f, generated 2026-09-07 by tools/gen_addresses.py +17:17:38.944 [tid 4396] config: hooks=off +17:17:38.944 [tid 4396] hook: disabled by config +17:18:55.309 [tid 7380] ==== sots-engine shim (binkw32 proxy) build 4a15301-20260907T2118Z ==== +17:18:55.309 [tid 7380] exe: C:\SOTS\Sword of the Stars.exe +17:18:55.309 [tid 7380] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=3808 shim=730c0000 +17:18:55.309 [tid 7380] addresses: Source: sots-re ghidra/addresses.json @ daea98f, generated 2026-09-07 by tools/gen_addresses.py +17:18:55.309 [tid 7380] config: hooks=trace +17:18:55.309 [tid 7380] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +17:18:55.309 [tid 7380] hook: MH_Initialize -> MH_OK +17:18:55.309 [tid 7380] hook: MH_CreateHook -> MH_OK (trampoline=00e50fe0) +17:18:55.324 [tid 7380] hook: MH_EnableHook -> MH_OK +17:18:55.340 [tid 7380] Application::Initialize called (this=035c8128) +17:31:45.177 [tid 7380] shutdown: MH_Uninitialize -> MH_OK +17:31:45.177 [tid 7380] ==== shim detach ==== +17:32:04.990 [tid 5440] ==== sots-engine shim (binkw32 proxy) build 4a15301-20260907T2118Z ==== +17:32:04.990 [tid 5440] exe: C:\SOTS\Sword of the Stars.exe +17:32:04.990 [tid 5440] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=4384 shim=730c0000 +17:32:04.990 [tid 5440] addresses: Source: sots-re ghidra/addresses.json @ daea98f, generated 2026-09-07 by tools/gen_addresses.py +17:32:04.990 [tid 5440] config: hooks=trace +17:32:04.990 [tid 5440] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +17:32:04.990 [tid 5440] hook: MH_Initialize -> MH_OK +17:32:04.990 [tid 5440] hook: MH_CreateHook -> MH_OK (trampoline=00b10fe0) +17:32:05.005 [tid 5440] hook: MH_EnableHook -> MH_OK +17:32:05.021 [tid 5440] Application::Initialize called (this=03268128) +18:09:43.229 [tid 5960] ==== sots-engine shim (binkw32 proxy) build 750ad59-dirty-20260907T2208Z ==== +18:09:43.229 [tid 5960] exe: C:\SOTS\Sword of the Stars.exe +18:09:43.229 [tid 5960] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=2636 shim=69fc0000 +18:09:43.229 [tid 5960] addresses: Source: sots-re ghidra/addresses.json @ 254a077, generated 2026-09-07 by tools/gen_addresses.py +18:09:43.229 [tid 5960] config: hooks=trace +18:09:43.276 [tid 5960] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always) +18:09:43.276 [tid 5960] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +18:09:43.276 [tid 5960] hook: MH_Initialize -> MH_OK +18:09:43.276 [tid 5960] hook: MH_CreateHook -> MH_OK (trampoline=00e70fe0) +18:09:43.292 [tid 5960] hook: MH_EnableHook -> MH_OK +18:09:43.292 [tid 5960] cfg: GlobalConsts hook ready (scale constant -2.854354e-18) +18:09:43.292 [tid 5960] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 -> va=013373c0 MH_CreateHook -> MH_OK (trampoline=00e70fc0) +18:09:43.307 [tid 5960] hook: Mars::GlobalConsts::LoadFile MH_EnableHook -> MH_OK mode=trace +18:09:43.307 [tid 5960] selftest: Shim::SelfTest::Fill mode=trace checksum=075ef0c3 records=1 +18:09:43.323 [tid 5960] Application::Initialize called (this=034d8128) +18:09:43.682 [tid 5960] cfg: ACTOR_ASTEROID_COLLIDE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: ACTOR_MOON_COLLIDE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: ASSAULTSHUTTLE_STRAFE_EXPLOSION_PSYS_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: ASSAULTSHUTTLE_STRAFE_EXPLOSION_SOUND_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_CAMERA_PATH_ANIM_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_CAMERA_PATH_BASE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_CAMERA_PATH_EXT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_CAMERA_PATH_ANIM_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_CAMERA_PATH_BASE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_CAMERA_PATH_EXT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: LIIR_CAMERA_PATH_ANIM_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: LIIR_CAMERA_PATH_BASE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: LIIR_CAMERA_PATH_EXT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: MORRIGI_CAMERA_PATH_ANIM_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: MORRIGI_CAMERA_PATH_BASE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: MORRIGI_CAMERA_PATH_EXT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: TARKAS_CAMERA_PATH_ANIM_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: TARKAS_CAMERA_PATH_BASE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: TARKAS_CAMERA_PATH_EXT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: ZUUL_CAMERA_PATH_ANIM_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: ZUUL_CAMERA_PATH_BASE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: ZUUL_CAMERA_PATH_EXT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: PLANET_BEAM_IMPACT_DECALNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: PLANET_BOLT_IMPACT_DECALNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: PLANET_HEAVYBEAM_IMPACT_DECALNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: PLANET_MISSILE_IMPACT_DECALNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_FARCAST_SPAWN_CRUS_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_FARCAST_SPAWN_DEST_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_FARCAST_SPAWN_DRED_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_CRUS_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_CRUS_GATE_HEIGHT has a parser this build does not model (01337080) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_CRUS_SHIP_OFFSET has a parser this build does not model (01337080) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_DEST_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_DEST_GATE_HEIGHT has a parser this build does not model (01337080) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_DEST_SHIP_OFFSET has a parser this build does not model (01337080) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_DRED_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HIVER_SPAWN_DRED_SHIP_OFFSET has a parser this build does not model (01337080) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_CRUS_ENTRYEFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_CRUS_TUBEMODELNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_DEST_ENTRYEFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_DEST_TUBEMODELNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_DRED_ENTRYEFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_DRED_TUBEMODELNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: HUMAN_SPAWN_DRIVEFILENAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: MORRIGI_SPAWN_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_ALLY_CLOAK_EFFECT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CLOAK_BADGE_EFFECT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_COLL_PARTICLES has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_COLL_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_CMD_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_COMBATREADY_SOUND1 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_COMBATREADY_SOUND2 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_COMBATREADY_SOUND3 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_COMBATREST_SOUND1 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_COMBATREST_SOUND2 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_COMBATREST_SOUND3 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_ENG_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_EXPLODE_FIREBALL_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CR_MIS_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_CRUS_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_CMD_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_COMBATREADY_SOUND1 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_COMBATREADY_SOUND2 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_COMBATREADY_SOUND3 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_COMBATREST_SOUND1 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_COMBATREST_SOUND2 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_COMBATREST_SOUND3 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_ENG_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_EXPLODE_FIREBALL_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DE_MIS_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DEBRIS_COLLIDE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DEBRIS_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DEBRIS_SHOWOFF_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DEST_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_CMD_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_COMBATREADY_SOUND1 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_COMBATREADY_SOUND2 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_COMBATREADY_SOUND3 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_COMBATREST_SOUND1 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_COMBATREST_SOUND2 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_COMBATREST_SOUND3 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_ENG_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_EXPLODE_FIREBALL_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DN_MIS_EXPLODE_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_DRED_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_EMP_SURFACE_EFFECT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_HIVER_CREW_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_HUMAN_CREW_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_INTANG_EFFECT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_LIIR_CREW_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_MORRIGI_CREW_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_SECTION_CRUS_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_SECTION_DEST_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_SECTION_DRED_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_TARKAS_CREW_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_TURRET_EXPLODE_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SHIP_ZUUL_CREW_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: TARKAS_SPAWN_EFFECTNAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SPYSHIP_TENDER_DOCK_FRAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: COMBAT_NODEPOINT_EFFECT has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: COMBAT_NODEPOINT_PSYS has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: COMBAT_NODEPOINT_RINGMODEL has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: COMBAT_NODEPOINT_TEXTURENAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: BLASTEROIDS_COLLIDE_PSYS_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: BLASTEROIDS_COLLIDE_SOUND_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: DERELICT_SECTION_01 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: DERELICT_SECTION_02 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: DERELICT_SECTION_03 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: DERELICT_SECTION_04 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: DERELICT_SECTION_05 has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SLAVERSREFUEL_ASSAULT_COMMAND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SLAVERSREFUEL_ASSAULT_ENGINE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SLAVERSREFUEL_ASSAULT_MISSION has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SLAVERSREFUEL_TANKER_COMMAND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SLAVERSREFUEL_TANKER_ENGINE has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: SLAVERSREFUEL_TANKER_MISSION has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_DISINTEGRATE_EFFECT_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_DISINTEGRATE_PLANETEFFECT_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_DISINTEGRATE_TARGET_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_EMIT_EFFECT_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_GLOW_EFFECT_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_INTEGRATE_CHILD_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_INTEGRATE_EFFECT_NAME has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_INTEGRATE_MOM_SOUND has a parser this build does not model (01337670) +18:09:43.682 [tid 5960] cfg: VNEUMANN_TRANSFER_TO_MOM_SOUND has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_ENEMY has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_EXPLICITTARGET has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_MOUSENAVPOINT has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_MOUSETARGETPOINT has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_SELECTION has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_WAYPOINT has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_MODEL_WAYPOINTSPRINT has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_PARTICLES_CLICKTARGETFEEDBACK has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATHUD_SHIPOVERLAY_SPRITENAME has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: COMBATSETUP_CARD_AVATAR_RECT has a parser this build does not model (01337040) +18:09:43.698 [tid 5960] cfg: COMBATSETUP_CARD_IMAGE_RECT has a parser this build does not model (01337040) +18:09:43.698 [tid 5960] cfg: MINISHIPTEXTURE has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: SOUND_COUNTDOWN_FILE has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: SOUND_ZEROTIME_FILE has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: TEST_GUI_SOUND has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: TEST_SFX_SOUND has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: TEST_VOICE_SOUND has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: REBELAI_AVATAR has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: REBELAI_BADGE has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_BLANK_TEXTURENAME has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_MESHNAME has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_MESHNAME_LOD1 has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_MESHNAME_LOD2 has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_NOISE_TEXTURENAME has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_NULL_TEXTURENAME has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_RING_TEXTURENAME has a parser this build does not model (01337670) +18:09:43.698 [tid 5960] cfg: STARMAP_PLANET_RINGMESHNAME has a parser this build does not model (01337670) +22:06:28.119 [tid 572] ==== sots-engine shim (binkw32 proxy) build 4f0a9db-dirty-20260908T0205Z ==== +22:06:28.119 [tid 572] exe: C:\SOTS\Sword of the Stars.exe +22:06:28.119 [tid 572] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=1808 shim=69f60000 +22:06:28.119 [tid 572] addresses: Source: sots-re ghidra/addresses.json @ b24f13c, generated 2026-09-07 by tools/gen_addresses.py +22:06:28.119 [tid 572] config: hooks=trace +22:06:28.228 [tid 572] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always) +22:06:28.228 [tid 572] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +22:06:28.228 [tid 572] hook: MH_Initialize -> MH_OK +22:06:28.228 [tid 572] hook: MH_CreateHook -> MH_OK (trampoline=007d0fe0) +22:06:28.244 [tid 572] hook: MH_EnableHook -> MH_OK +22:06:28.244 [tid 572] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +22:06:28.244 [tid 572] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 -> va=013373c0 MH_CreateHook -> MH_OK (trampoline=007d0fc0) +22:06:28.260 [tid 572] hook: Mars::GlobalConsts::LoadFile MH_EnableHook -> MH_OK mode=trace +22:06:28.260 [tid 572] selftest: Shim::SelfTest::Fill mode=trace checksum=075ef0c3 records=1 +22:06:28.291 [tid 572] Application::Initialize called (this=03338128) +22:07:49.644 [tid 4440] ==== sots-engine shim (binkw32 proxy) build 4f0a9db-dirty-20260908T0205Z ==== +22:07:49.644 [tid 4440] exe: C:\SOTS\Sword of the Stars.exe +22:07:49.644 [tid 4440] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=5256 shim=6a890000 +22:07:49.644 [tid 4440] addresses: Source: sots-re ghidra/addresses.json @ b24f13c, generated 2026-09-07 by tools/gen_addresses.py +22:07:49.644 [tid 4440] config: hooks=trace +22:07:49.644 [tid 4440] config: hook.Mars::GlobalConsts::LoadFile=compare +22:07:49.706 [tid 4440] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always) +22:07:49.706 [tid 4440] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +22:07:49.706 [tid 4440] hook: MH_Initialize -> MH_OK +22:07:49.706 [tid 4440] hook: MH_CreateHook -> MH_OK (trampoline=017f0fe0) +22:07:49.722 [tid 4440] hook: MH_EnableHook -> MH_OK +22:07:49.722 [tid 4440] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +22:07:49.722 [tid 4440] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 -> va=013373c0 MH_CreateHook -> MH_OK (trampoline=017f0fc0) +22:07:49.737 [tid 4440] hook: Mars::GlobalConsts::LoadFile MH_EnableHook -> MH_OK mode=compare +22:07:49.737 [tid 4440] selftest: Shim::SelfTest::Fill mode=trace checksum=075ef0c3 records=1 +22:07:49.753 [tid 4440] Application::Initialize called (this=03928128) +22:07:50.097 [tid 4440] cfg: [Data/Combat/actor.txt] 5 keys: applied 5, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/assaultshuttle.txt] 12 keys: applied 12, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/camera.txt] 34 keys: applied 34, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/drone.txt] 20 keys: applied 20, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/gravboat.txt] 5 keys: applied 5, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/ortgay.txt] 19 keys: applied 19, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [data/Combat/planet.txt] 25 keys: applied 25, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/sensors.txt] 9 keys: applied 9, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/ship.txt] 196 keys: applied 196, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/spyship.txt] 8 keys: applied 8, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/terrain.txt] 19 keys: applied 19, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/Combat/vnhomeworld.txt] 4 keys: applied 4, unknown 0, duplicate 0, missing 0 +22:07:50.097 [tid 4440] cfg: [Data/encounters.txt] HERALD_SPEECH_MAX_INVERVAL expected but not found. +22:07:50.097 [tid 4440] cfg: [Data/encounters.txt] 195 keys: applied 194, unknown 0, duplicate 0, missing 1 +22:07:50.112 [tid 4440] cfg: [Data/globals.txt] 364 keys: applied 364, unknown 0, duplicate 0, missing 0 +22:07:50.112 [tid 4440] cfg: [Data/options.txt] 3 keys: applied 3, unknown 0, duplicate 0, missing 0 +22:07:50.112 [tid 4440] cfg: [Data/Species.txt] 12 keys: applied 12, unknown 0, duplicate 0, missing 0 +22:07:50.112 [tid 4440] cfg: [Data/Strategy/AI/AIRebellion.txt] 5 keys: applied 5, unknown 0, duplicate 0, missing 0 +22:07:50.112 [tid 4440] cfg: [Data/Strategy/starmap.txt] 56 keys: applied 56, unknown 0, duplicate 0, missing 0 +22:07:50.112 [tid 4440] cfg: [Data/Strategy/StrategyVars.txt] CIVILIAN_BURDEN_RATIO expected but not found. +22:07:50.112 [tid 4440] cfg: [Data/Strategy/StrategyVars.txt] 97 keys: applied 96, unknown 0, duplicate 0, missing 1 +22:09:46.225 [tid 4404] ==== sots-engine shim (binkw32 proxy) build 4f0a9db-dirty-20260908T0205Z ==== +22:09:46.225 [tid 4404] exe: C:\SOTS\Sword of the Stars.exe +22:09:46.225 [tid 4404] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=8236 shim=6a890000 +22:09:46.225 [tid 4404] addresses: Source: sots-re ghidra/addresses.json @ b24f13c, generated 2026-09-07 by tools/gen_addresses.py +22:09:46.225 [tid 4404] config: hooks=trace +22:09:46.225 [tid 4404] config: hook.Mars::GlobalConsts::LoadFile=replace +22:09:46.287 [tid 4404] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always) +22:09:46.287 [tid 4404] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +22:09:46.287 [tid 4404] hook: MH_Initialize -> MH_OK +22:09:46.287 [tid 4404] hook: MH_CreateHook -> MH_OK (trampoline=00a50fe0) +22:09:46.303 [tid 4404] hook: MH_EnableHook -> MH_OK +22:09:46.303 [tid 4404] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +22:09:46.303 [tid 4404] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 -> va=013373c0 MH_CreateHook -> MH_OK (trampoline=00a50fc0) +22:09:46.303 [tid 4404] hook: Mars::GlobalConsts::LoadFile MH_EnableHook -> MH_OK mode=replace +22:09:46.303 [tid 4404] selftest: Shim::SelfTest::Fill mode=trace checksum=075ef0c3 records=1 +22:09:46.319 [tid 4404] Application::Initialize called (this=03238128) +22:09:46.663 [tid 4404] cfg: [Data/Combat/actor.txt] 5 keys: applied 5, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/assaultshuttle.txt] 12 keys: applied 12, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/camera.txt] 34 keys: applied 34, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/drone.txt] 20 keys: applied 20, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/gravboat.txt] 5 keys: applied 5, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/ortgay.txt] 19 keys: applied 19, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [data/Combat/planet.txt] 25 keys: applied 25, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/sensors.txt] 9 keys: applied 9, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/ship.txt] 196 keys: applied 196, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/spyship.txt] 8 keys: applied 8, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/terrain.txt] 19 keys: applied 19, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Combat/vnhomeworld.txt] 4 keys: applied 4, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/encounters.txt] HERALD_SPEECH_MAX_INVERVAL expected but not found. +22:09:46.663 [tid 4404] cfg: [Data/encounters.txt] 195 keys: applied 194, unknown 0, duplicate 0, missing 1 +22:09:46.663 [tid 4404] cfg: [Data/globals.txt] 364 keys: applied 364, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/options.txt] 3 keys: applied 3, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Species.txt] 12 keys: applied 12, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Strategy/AI/AIRebellion.txt] 5 keys: applied 5, unknown 0, duplicate 0, missing 0 +22:09:46.663 [tid 4404] cfg: [Data/Strategy/starmap.txt] 56 keys: applied 56, unknown 0, duplicate 0, missing 0 +22:09:46.678 [tid 4404] cfg: [Data/Strategy/StrategyVars.txt] CIVILIAN_BURDEN_RATIO expected but not found. +22:09:46.678 [tid 4404] cfg: [Data/Strategy/StrategyVars.txt] 97 keys: applied 96, unknown 0, duplicate 0, missing 1 +22:14:08.241 [tid 8484] ==== sots-engine shim (binkw32 proxy) build 4f0a9db-dirty-20260908T0205Z ==== +22:14:08.241 [tid 8484] exe: C:\SOTS\Sword of the Stars.exe +22:14:08.241 [tid 8484] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=1320 shim=6a890000 +22:14:08.241 [tid 8484] addresses: Source: sots-re ghidra/addresses.json @ b24f13c, generated 2026-09-07 by tools/gen_addresses.py +22:14:08.241 [tid 8484] config: hooks=trace +22:14:08.304 [tid 8484] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always) +22:14:08.304 [tid 8484] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +22:14:08.304 [tid 8484] hook: MH_Initialize -> MH_OK +22:14:08.304 [tid 8484] hook: MH_CreateHook -> MH_OK (trampoline=00660fe0) +22:14:08.319 [tid 8484] hook: MH_EnableHook -> MH_OK +22:14:08.319 [tid 8484] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +22:14:08.319 [tid 8484] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 -> va=013373c0 MH_CreateHook -> MH_OK (trampoline=00660fc0) +22:14:08.335 [tid 8484] hook: Mars::GlobalConsts::LoadFile MH_EnableHook -> MH_OK mode=trace +22:14:08.335 [tid 8484] selftest: Shim::SelfTest::Fill mode=trace checksum=075ef0c3 records=1 +22:14:08.351 [tid 8484] Application::Initialize called (this=02e58128) +22:34:23.792 [tid 6712] ==== sots-engine shim (binkw32 proxy) build 8b231c0-dirty-20260908T0233Z ==== +22:34:23.792 [tid 6712] exe: C:\SOTS\Sword of the Stars.exe +22:34:23.792 [tid 6712] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=4736 shim=69e20000 +22:34:23.792 [tid 6712] addresses: Source: sots-re ghidra/addresses.json @ b24f13c, generated 2026-09-07 by tools/gen_addresses.py +22:34:23.792 [tid 6712] config: hooks=trace +22:34:23.855 [tid 6712] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always) +22:34:23.855 [tid 6712] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50 +22:34:23.855 [tid 6712] hook: MH_Initialize -> MH_OK +22:34:23.855 [tid 6712] hook: MH_CreateHook -> MH_OK (trampoline=00e00fe0) +22:34:23.870 [tid 6712] hook: MH_EnableHook -> MH_OK +22:34:23.870 [tid 6712] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +22:34:23.870 [tid 6712] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 -> va=013373c0 MH_CreateHook -> MH_OK (trampoline=00e00fc0) +22:34:23.886 [tid 6712] hook: Mars::GlobalConsts::LoadFile MH_EnableHook -> MH_OK mode=trace +22:34:23.886 [tid 6712] dict: dictionaries hook ready (crt new=6adc232b delete=6adc0174) +22:34:23.886 [tid 6712] hook: Game::WeaponDictionary::Init rva=0x0019a4c0 -> va=0101a4c0 MH_CreateHook -> MH_OK (trampoline=00e00fa0) +22:34:23.886 [tid 6712] hook: Game::WeaponDictionary::Init MH_EnableHook -> MH_OK mode=trace +22:34:23.886 [tid 6712] hook: Game::SectionDictionary::SectionDictionary rva=0x00176f40 -> va=00ff6f40 MH_CreateHook -> MH_OK (trampoline=00e00f80) +22:34:23.902 [tid 6712] hook: Game::SectionDictionary::SectionDictionary MH_EnableHook -> MH_OK mode=trace +22:34:23.902 [tid 6712] selftest: Shim::SelfTest::Fill mode=trace checksum=075ef0c3 records=1 +22:34:23.917 [tid 6712] Application::Initialize called (this=036f8128)