diff --git a/findings/control-flow/raid-target-pick-verdict.md b/findings/control-flow/raid-target-pick-verdict.md index 076da74..efb2ab8 100644 --- a/findings/control-flow/raid-target-pick-verdict.md +++ b/findings/control-flow/raid-target-pick-verdict.md @@ -196,3 +196,496 @@ from its usual direction. --- *Results, and the verdict, follow below. Nothing above this line is edited after the run.* + +--- + +## 2. The verdict + +> ### `TradeManager+0x0c` is the **per-system containing-trade-sector table**. Lane AG's §3.3 reading is **correct**; the sector-indexed-vector-of-six reading is **dead**. +> +> Two independent instruments agree, and they are the two rule 3 names. +> +> **Static.** The writer AG's §7 lists as not found is `FUN_00841700`. It resizes the `+0x0c` vector +> to the length of the *systems* vector — the same container `FUN_00841cd0` indexes with `rt->trfr` — +> and fills it with `containingSector[system.Idx] = sector`. `G_B1a` cannot reject a valid `trfr`. +> +> **Behavioural.** On turn 42 of the instrumented run, with a raider parked on sector `TradeID 816` +> and `Pos` bit-equal, `TradeManager::Slot13RngCalleeB` was entered once and the return-address ledger +> priced it: **`NextInt` at call `0x0088b613`, calls = 1, words = 1.** `OnAllCombatDone_Tail` cost +> **5** words on that turn against **4** on every other turn of the same run. Bracket residual **0**. +> +> **And the same run carries its own control.** On turns 38 and 40 `Slot13RngCalleeB` was entered +> once each — by a cruiser parked on sector `TradeID 832` — and cost **0 words**, exactly as lane AC +> and lane AD measured. **Same process, same build, same instrument, same function, same turn +> structure; the only difference is which sector the raider stands on.** That is the cleanest +> available demonstration that AC's and AD's proof-carrying zero is a fact about the *sector*, and +> that the code path itself is live. + +`0x0088b613` had never fired in this campaign. It has now. + +--- + +## 3. What was run + +Four fresh processes on VM141, all on the same guest with the same dist +(`C:\SOTS\shimdist-ar`, `BUILD_ID ar-989c692-20260909T0313Z`, built in +`/srv/re-lab/build/sots-engine-ar` after `ssh spicy 'rm -rf …'` of the whole tree, from a lane-private +`git worktree` at `~/sots-engine-ar` with no local `build*` shipped — rules 21 and 24) and the same +input save. + +| run | config | End Turns | purpose | +|---|---|---|---| +| play-forward | `shim.cfg.hoff` | 10 (turn 27 → 37) | build the workload | +| **R1** | `shim.cfg.hp8` (`probes=8`) | 6 (turn 37 → 43) | the measurement | +| **OA** | `shim.cfg.hoff` | 1 (turn 37 → 38) | control | +| **OB** | `shim.cfg.hoff` | 1 (turn 37 → 38) | control, second fresh process | + +**Instrument armed and verified from `shim.log`, not assumed** (rule 1): all seven `drawsite:` +detours `create=MH_OK enable=MH_OK`; `config: probes=8 -> 8 lane-H entry probes` and all eight +`create=MH_OK enable=MH_OK`; **zero** `config: ignoring unknown key` lines. Probe indices 8–11 report +**NOT INSTALLED**, never 0 — index 8 is `GenerateTradeRaidEncounters`, the detour lane H bisected as +*not* byte-neutral, excluded by construction. `shim.cfg.hp8` was used **unmodified**. + +### 3.1 The workload, and what it cost + +From `ad-turn27-two-raiders.sav`: five stock `Extended Range` destroyers queued at Epsilon Eridani +(Build screen confirms `Range 27.0`, `Construction Cost 2,252`, `Speed (Node Speed) 0.2 (4.0)` — +lane AD's costing is exact), completed over turns 28–31, then **split into four separate fleets** and +each ordered to sector 5's node. They arrived on turn 35; the state was saved on turn 37 as +`verify/results/saves/ar-turn37-816raiders.sav` +(sha256 `b6f4e05ff226eabd1695003b36293553642553cea96ef417364393e2332a7094`). + +**Three UI facts the next lane should have, because each cost this lane time.** + +1. **A new ship joins an existing fleet at the colony, and a fleet's `Range` is the minimum over its + ships.** The five 27-ly destroyers landed in `Gamma Fleet` alongside AD's 9-ly `Repair and Salvage` + cruiser and the fleet read `Range: 9.0 (9.0)` — sector 816 is 15.66 ly away and was not a legal + destination until the cruiser was split out. **Split the cruiser off first, then read the range.** +2. **Splitting is a right-click context menu on a *ship row* in the map's fleet panel**, not the + Manage Fleets screen (which offers only `Rename Fleet` and "Fleet Layout Not Available" here). The + menu is `Add To New Fleet` / `Split Ships` / `Add Note`, and its first item sits **+15 px** below + the click. The click helper has no right-click verb, but **`rdrag x y x y` — a right-drag of zero + length — works as one**, and that is how every split in this run was made. +3. **A trade-sector node is a legal move target even when its cube is not drawn.** Lane AD reported + that only sector 6's cube renders at any zoom, and that is still true. It does **not** mean the + other nodes are unreachable: in Move mode the hover readout names them + (`Sector 5 / Range: 15.7 / ETA: 4 Turns`) and a plain click commits. Two known screen points are + enough to fit `screen = (A·wx + B·wz + C, D·wx + E·wz + F)` from the save's world coordinates and + land the cursor on any node first try; this run fitted it from Epsilon Eridani and sector 800 and + hit sector 816 at (825, 444) on the first probe. **Hovering near a sector also makes its cube + appear**, which is the confirmation that the aim was right. + +### 3.2 The gate, read from the save for the measured turns (rule 28) + +`ar-turn37-816raiders.sav`, player 0 = `PlyrIdx 0` = `PID 16`, `CnRad true`: + +| fleet | id | `LocID` | `Pos` vs sector `Pos` | rolls `A`? | +|---|---|---|---|---| +| `Alpha Fleet` (1 CR) | 3744 | **832** | `[0, 0, 8.0]` — **bit-identical** | yes | +| `Beta Fleet` (1 CR) | 6544 | **832** | `[0, 0, 8.0]` — **bit-identical** | yes | +| `Epsilon Fleet` (1 DE) | 49 | **816** | `[8.307682991027832, 0.05633879080414772, 0.4591276943683624]` — **bit-identical** | yes | +| `Eta Fleet` (1 DE) | 81 | **816** | same three floats — **bit-identical** | yes | +| `Zeta Fleet` (1 DE) | 65 | 816 | `[9.2771635055542, 0.03959554061293602, 1.8529905080795288]` — **not** the node | **no** (G4 fails) | +| `Delta Fleet` (1 CR) | 33 | 48 | home | no | + +`Trade[816]`: `tsct 2`, `tscr 253`, `tsnumflt 5`, `tsflt 49, 65, 81, 8752, 8768` — my three plus the +AI's. `tsct = 2` is the AI's bit, so `TradeSector_PlayerTradesHere` is false for player 0 and **no +`FtFlg & 0x800` is required**, exactly as lane AD read it; every fleet above carries `FtFlg 4`. + +**Four qualifying fleets, and `Slot13RngCalleeA` was entered exactly four times on every turn** — +which is both the confirmation of lane AD's per-fleet result on a new sector and a new hull, and the +proof that the two 816 destroyers clear G0–G4. + +**`trfr` re-read on the state actually built, as instructed.** `trdmgr` at turn 37 holds **eight** +`rt` records — not lane AG's four at turn 22 and not lane AD's three at turn 27 — with +`trfr = 18, 16, 14, 20, 14, 20, 14, 25`, `tro = 32` and `trfrs = trtos = 0` on all eight. Mapping +each through the sector membership lists: **sector 816 sources two of them (`trfr` 18 and 16)**, +768 sources three, 752 two, 784 one, and 832 still sources none. So the candidate list on 816 has +`n = 2`, `bound = n − 1 = 1`, the mask is 1 and **no rejection is possible** — the site costs exactly +one word, which is what it cost. + +**Correction to lane AD (rule 11).** `raid-gate-multiplicity.md` §4 reports *"three route records, +`trfr = 18, 14, 14"* in `ad-turn27-two-raiders.sav`. That save holds **five**, `trfr = 18, 16, 14, +20, 14`. Read directly with `save_reader.py --dump` before this lane touched the guest. The +consequence matters: **sector 816 already sourced two routes at turn 27**, not one. + +--- + +## 4. The numbers + +### 4.1 Per turn, all three instruments side by side + +`A` = `TradeManager::Slot13RngCalleeA` (probe 5) · `B` = `Slot13RngCalleeB` (probe 6) · +"tail" = `OnAllCombatDone_Tail`'s word delta from the boundary ledger · +`0x0088b613` = the raid target pick, from `draw_sites` return-address attribution. + +| turn | `A` entries | `0x00820e18` calls/words | `B` entries | **`0x0088b613`** | **tail words** | bracket residual | +|---|---|---|---|---|---|---| +| 38 | 4 | 4 / 4 | **1** | — | 4 | 0 | +| 39 | 4 | 4 / 4 | 0 | — | 4 | 0 | +| 40 | 4 | 4 / 4 | **1** | — | 4 | 0 | +| 41 | 4 | 4 / 4 | 0 | — | 4 | 0 | +| **42** | 4 | 4 / 4 | **1** | **calls = 1, words = 1** | **5** | 0 | +| 43 | 3 | 3 / 3 | 0 | — | 3 | 0 | + +**Read the two rows that matter together.** Turns 38 and 40: `B` entered, tail 4 — `B` cost **0**. +Turn 42: `B` entered, tail **5** — `B` cost **1**, and the ledger names the site. The difference is +which sector the successful raider stood on, and nothing else moved: `A`'s row is `calls = words = 4` +on all five of those turns and the bracket residual is 0 on every one. + +Turn 43's `A = 3` is not a defect: `Epsilon Fleet` had been displaced off the node by its own +successful raid on turn 42 (§4.3), so only three fleets satisfied G4. + +### 4.2 `B` costs **one** word on a success, not two — and why + +**No `0x00820c1b` row appears on turn 42.** `FUN_00820af0` was called (it always is, immediately +after the pick) and returned without drawing. That is the species short-circuit, and this lane pinned +which disjunct fires, from the image: + +``` +FUN_00820af0: + if (routeOwner->Species == 1) frac = 1.0 ; AI here is Species 2 -- no + if (StarFleet_GetCrewSpeciesForIntercept(fleet) == 1) frac = 1.0 ; raider is Species 0 -- no + if (SpeciesDef_HasInterceptFlag(Get(that same species))) frac = 1.0 ; <-- THIS ONE + else frac = NextFloat() ; 0x00820c1b, 1 word +``` + +`Get` `0x00545cc0` returns `0x00b10a00 + k*0x184`; `InitTable` `0x005453a0` fills element `k` at that +same address and, at `0x0054562f`/`0x00545638`, sets `elem->+0x144 |= 1` when `k == 0` and `|= 2` +when `k == 5` — **and for no other species**. (Both of those addresses were **already named** in +`ghidra/addresses.json` as `SpeciesDef_Get` and `g_SpeciesDefTable`, from `handoff/tech-effects.md`. +This lane derived them independently from the `FUN_00820af0` call chain and the generator's +duplicate-name check is what surfaced the agreement — rule 14 working as designed. Only the `+0x144` +flag word is new, and it is the fragment's one data entry.) `SpeciesDef_HasInterceptFlag` `0x0053baf0` is twelve +bytes: `xor eax,eax; cmp [ecx+0x144],eax; setne al; ret`. So the flag is set for **Human (0) and Zuul +(5)** and clear for the other five. + +> **A Human or Zuul raider intercepts at `frac = 1.0` and draws nothing; every other species draws a +> `NextFloat` at `0x00820c1b`.** + +**This corrects two committed numbers, and the corrections point the same way** (rule 11): + +- lane AG §5.2, *"`B`'s cost on success is `1 (NextInt) + 1 (NextFloat)`"* — true for five of the + seven species, false for the two whose flag is set, and the player in this lineage is one of them; +- lane AG §3.3's committed prediction, *"**3 words** on a turn it succeeds (`A` 1 + `B`'s `NextInt` 1 + + `FUN_00820af0`'s `NextFloat` 1)"* — the measured figure for one raider is **2**. My own P3/P4 + carried the same error with a hedge on it; the hedge was the right half. + +The general model, then, and it is a model of the *state*, not a constant (rule 20): + +> **`OnAllCombatDone_Tail` costs `k + s + z` words**, where `k` is the number of permitted raiders +> parked on a trade-sector node with `Pos` bit-equal, `s` is how many of their raid rolls succeeded +> **on a sector that sources at least one raidable route**, and `z` is `s` again for a raider whose +> species does not set `SpeciesDef+0x144`. Measured here at `k + s` with `k` = 4, 4, 4, 4, 4, 3 and +> `s` = 0, 0, 0, 0, 1, 0. + +### 4.3 A success moves the raider off the node — so a fleet raids at most once per parking + +`Slot13RngCalleeB` writes `fleet->Pos = out` at `0x0088b672`, *after* the pick. G4 then fails for that +fleet on the following turn, because `Pos` is no longer bit-equal to the sector's. This is visible in +the saves and it explains turn 43's `A = 3`: + +| fleet | `Pos` at turn 37 | `Pos` at turn 43 | +|---|---|---| +| `Eta Fleet` (81) | the node, bit-equal | the node, **still bit-equal** | +| `Epsilon Fleet` (49) | the node, bit-equal | `[7.13520622253418, 5.090692520141602, -2.1875174045562744]` — **displaced**, `LocID` still 816 | +| `Alpha`/`Beta` (832) | the node, bit-equal | the node, **still bit-equal** | + +The 832 raiders are **never** displaced, because on 832 `B` returns at `G_B4` *before* the `Pos` +write. So the within-run control is durable by construction and the 816 arm exhausts itself — which +is a real constraint on this workload and the reason the run has one firing of the pick and not six. + +### 4.4 Two more of lane AG's unread gates opened, on turn 43 + +``` +turn 43 * STRAT NextInt call 0x008939ee FUN_008938a0+0x14e calls= 1 words= 1 + * STRAT NextFloat call 0x00820c1b FUN_00820af0+0x12b calls= 1 words= 1 + probe: ServerTradeManager::CreateRaidEncounter calls=3 +``` + +- **`0x008939ee` fired.** That is the site behind `CreateRaidEncounter`'s empty-candidate-list gate — + lane H's measurement of it (*entered 2× on Zuul turn 24, 1× on turn 25, 0 words every time*) is the + campaign's case study for rule 20, and `tail-rng-ledger.md` has carried it as a zero ever since. + **The candidate list is not always empty**, and the first non-zero reading of that site is in this + trace. +- **`0x00820c1b` fired**, and **not** through `Slot13RngCalleeB` — `B` was entered 0 times on turn 43. + It came through the other caller, `0x0082cf65` inside the `CreateRaidEncounter` subtree, i.e. lane + AG's §5.1 chain `CreateRaidEncounter → 0x00892640 → 0x0082ce00 → FUN_00820af0`. Both of AG's §5.1 + and §5.2 readings of that function's two call sites are therefore confirmed live, from opposite + directions. + +### 4.5 The odds arithmetic — consistency, not validation (rule 15) + +| arm | hull | odds per fleet-turn | rolls | expected | observed | +|---|---|---|---|---|---| +| sector 832 | 1 CR | `(double)0.2f + (double)0.01f` = 0.21000000275671482, no freighter | 12 | 2.52 | **2** | +| sector 816 | 1 DE | `(double)0.05f + (double)0.01f` = 0.06, **doubled to 0.12** if the AI's `Freighters` fleet (id 7072, `LocID 816`) satisfies `param_2` | 11 | 0.66 / 1.32 | **1** | + +**The freighter doubling is still not decided and I said in advance it would not be.** One success in +eleven rolls sits comfortably inside both hypotheses; separating 0.06 from 0.12 needs on the order of +a hundred rolls, and a fleet retires itself from the 816 arm the moment it succeeds (§4.3), which is +the structural reason this workload cannot cheaply accumulate them. The honest statement is that the +observed rate is consistent with the read constants and validates neither. + +### 4.6 The news event `B` posts, named + +`Slot13RngCalleeB`'s tail loop formats two strings held at `ds:0x00af0b5c` and `ds:0x00af0b64`. +Resolving their `GlobalConst` registrations in `FUN_009bf960` (`0x009bfcf0`, `0x009bfd10`) names them +**`EVENTSUM_SECTOR_RAIDERS_DETECTED`** and **`EVENTMSG_SECTOR_RAIDERS_DETECTED`**, and **each of those +two globals is referenced from exactly one function in the whole image — `0x0088b440`, `B` itself.** +So that event pair is a signature of the raid target pick having fired, visible in the news feed +without any instrument at all. It is posted to every player whose bit is in `sector->tssec`, which is +why the *raider* does not see it. + +--- + +## 5. Verdicts on the committed predictions + +| # | prediction | verdict | +|---|---|---| +| **P0** | `+0x0c` is the per-system containing-sector table; AG's reading right, sector-indexed reading dead | **CONFIRMED**, by the writer statically and by `0x0088b613` firing live | +| **P1** | `A` entered once per parked permitted fleet, 1 word each | **CONFIRMED** — 4/4 on five turns and 3/3 on the sixth, `0x00820e18` `calls == words` every turn | +| **P2** | `B` reaches `0x0088b613` and costs ≥ 1 word on an 816 success | **CONFIRMED** — calls = 1, words = 1 | +| **P3** | `B` costs 2 words (`NextInt` + `NextFloat`), *unless the species short-circuit fires* | **HALF WRONG, and the hedge was the right half.** It costs **1**. The short-circuit fires, and §4.2 names the disjunct: `SpeciesDef[Human]+0x144` bit 0, set by `InitTable` for species 0 and 5 only | +| **P4** | tail = `k + 2s`; 1 word on a failing turn and 3 on a succeeding one for one raider | **CORRECTED to `k + s`** — 4, 4, 4, 4, **5**, 3 against `k` = 4, 4, 4, 4, 4, 3. Lane AG's committed "3 words on a success" is **2** for this species | +| **P5** | a `draw_sites` row at `0x0088b613` with `calls == words == s`, and one at `0x00820c1b` | **CONFIRMED for `0x0088b613`** (calls = words = 1). **FALSIFIED for `0x00820c1b` via `B`** — no such row on turn 42; the site did fire on turn 43 but through `CreateRaidEncounter`, not through `B` | +| **P6** | `0x00820e18` shows `calls == words == k`, reproducing AD's per-fleet pricing on a new hull and sector | **CONFIRMED** on all six turns | +| **P7** | the `hooks=off` control will not agree with itself; the variation will be the AI's decisions; `/Sim/RNG` and `/Sim/trdmgr` bit-identical | §6 | +| **P8** | if `A` fires but `B` never does, report the binomial probability rather than "unremarkable" | **not triggered** — `B` fired three times and the pick once | + +**The prediction that was wrong is the useful one.** P3/P4 were written from lane AG's §5.2 and they +are wrong for exactly the reason rule 23 exists: the deciding value is a **flag word set by a +constructor for two species out of seven**, and no amount of reading `FUN_00820af0` alone reveals it. +The measurement found it because the word count came out one short. + +--- + +## 6. The control — and it is an oracle pair (rules 19 and 26) + +**P7 predicted the `hooks=off` control would fail to agree with itself, as lane AD's did on +`ad-turn27-two-raiders.sav`. P7 is FALSIFIED. The control agrees, byte for byte.** + +Two fresh processes, same guest, same build, same `shim.cfg.hoff`, the same input save and the same +procedure — load, End Turn, resolve the one encounter query with `Auto Resolve Peacefully`, End Turn: + +``` +input ar-turn37-816raiders.sav b6f4e05ff226eabd1695003b36293553642553cea96ef417364393e2332a7094 + +OA (Autosave EndTurn).sav Frame 38 15b99255e1f03dab3e35ab8c1ac64f221cb5aa9321f113c7a6e3d1263c3f34ca + (Autosave).sav Frame 39 7a8b3d5eb3a60ebac9f40646d3e4b15768a24a0af047a439ce090c7cf38e8b38 + +OB (Autosave EndTurn).sav Frame 38 15b99255e1f03dab3e35ab8c1ac64f221cb5aa9321f113c7a6e3d1263c3f34ca + (Autosave).sav Frame 39 7a8b3d5eb3a60ebac9f40646d3e4b15768a24a0af047a439ce090c7cf38e8b38 +``` + +`state_checksum.py --floats bits --mask none` on the two post-turn saves prints **`IDENTICAL`**, root +`237020deca931f5a180289592cece7ae`, `coverage: PROVED` (1,173,884 bytes rebuilt == inflated; 67,239 +leaves), `0 error, 0 warn`. + +> **This is a rung-A oracle pair, from a lineage that did not have one.** Lane AD ran the same check +> on `ad-turn27-two-raiders.sav` and got 94 differing leaves — all of them the AI empire's designs, +> build queues and fleet ids — and correctly refused to call that state calibration data. Ten turns +> later on the same lineage, the same check comes out byte-identical. + +**I do not have an explanation for the difference and I am not going to invent one.** What can be +said precisely: AD's variation was confined to `Player[32]`'s decision sub-tree, and on this state +that sub-tree does not vary across processes. Whether that is because the AI's choices are forced +here, or because the per-process seed AD pinned enters somewhere this workload does not reach, is +**not settled by anything I measured**. The load-bearing consequence for the campaign is narrower and +solid: **AD's rule-26 result is a fact about that state, not about the lineage or the engine**, and a +lane that treats "the AI varies per process" as a general property of this game will be wrong at +least once. + +Two honest limits on this pair, stated rather than glossed: + +* **Two processes, not three.** Rule 26's bar is "reproduced in two fresh processes and agrees with + itself", which this clears; lane AD's `turn1-state` episode needed three to expose the variation, + and a third run here would be cheap for whoever wants it. +* **One workload.** Both runs took the same two End Turns and resolved the same encounter query the + same way. A pair is a statement about that procedure. + +### 6.1 Rule 19 — the same two turns with the instrument installed + +Run **R2**: a fourth fresh process, `shim.cfg.hp8` (`probes=8` + the seven `draw_sites` detours + the +boundary-ledger template hooks), same save, same two End Turns, same encounter resolution. + +``` +input ar-turn37-816raiders.sav b6f4e05ff226eabd1695003b36293553642553cea96ef417364393e2332a7094 + +OA hooks=off Frame 38 15b99255e1f03dab3e35ab8c1ac64f221cb5aa9321f113c7a6e3d1263c3f34ca + Frame 39 7a8b3d5eb3a60ebac9f40646d3e4b15768a24a0af047a439ce090c7cf38e8b38 +OB hooks=off Frame 38 15b99255e1f03dab3e35ab8c1ac64f221cb5aa9321f113c7a6e3d1263c3f34ca + Frame 39 7a8b3d5eb3a60ebac9f40646d3e4b15768a24a0af047a439ce090c7cf38e8b38 +R2 probes=8 Frame 38 15b99255e1f03dab3e35ab8c1ac64f221cb5aa9321f113c7a6e3d1263c3f34ca + Frame 39 7a8b3d5eb3a60ebac9f40646d3e4b15768a24a0af047a439ce090c7cf38e8b38 +``` + +> **All three processes are byte-identical at both snapshot points, instrumented and not.** The +> `probes=8` + `draw_sites` + boundary-ledger instrument is **behaviour-neutral on this state, at +> whole-save byte granularity** — not "neutral on the sub-tree the measurement reads", which is the +> weaker statement lane AD could make, but neutral outright. + +Rule 26's coincidence caveat does not apply here and it is worth saying why. AD warns that one +instrumented run agreeing with one control is a `1/k` coincidence when the control has an outcome set +of size `k`. **Here `k = 1`: the control was reproduced first and shown to be a single outcome, and +only then did the instrumented run match it.** That is the order the rule requires. + +R2's own counters reproduce R1's turn 38 line for line — `A` `calls = words = 4`, `B` entered once at +**0 words**, `OnAllCombatDone_Tail` **4**, bracket total 24, **residual 0**, all seven `drawsite:` and +all eight `probe:` detours `create=MH_OK enable=MH_OK`, zero `ignoring unknown key`. So the +measurement is reproducible across processes as well as neutral. + +**What this licenses, and what it does not.** It licenses treating +`ar-turn37-816raiders.sav` + two End Turns as a **rung-A calibration pair** for the standalone, which +is the first one this lineage has produced. It does **not** license the six-turn R1 sequence as one: +R1 resolved encounter queries on turns its own play produced, and that path was exercised once here, +not twice. + +--- + +## 7. Coverage, and what was not done (rule 15) + +* **Six instrumented turns, one process, four qualifying fleets, two sectors, two hull classes, one + species.** The pick fired **once**. One firing is enough to decide reachability — that was the + question — and it is **not** enough to price the site as a constant. The word count 1 is + corroborated by the static read of `RNG_NextInt` (mask smear, `bound = 1` ⇒ mask 1 ⇒ no rejection + possible), which is why I am willing to state it; if the candidate list on 816 ever exceeds two, + the rejection loop becomes live and the cost stops being 1 (rule 20 — do not fit a constant to one + observation). +* **The `k + s + z` model is fitted to `s ∈ {0, 1}` and `z = 0`.** `z` — the `FUN_00820af0` `NextFloat` + charged to `B` — has **never been observed through `B`**, in this lane or any other, because the + only species that has ever raided in this campaign is one of the two whose short-circuit flag is + set. **A non-Human, non-Zuul raider is now the cheapest unexercised state in the trade half**, and + it is one save away: the same workload played as Tarka, Liir, Hiver or Morrigi. +* **The freighter doubling is still untested** (§4.5), and the structure of the workload is why: a + successful raider leaves the node (§4.3), so the 816 arm cannot accumulate rolls without re-issuing + move orders every time. +* **`bestScale` was not read.** `0x009f8d48 = 0.33f` applies when `ship+0x18 & 0x100000`; that flag is + not obviously on the wire and this lane did not chase it. `A` cost exactly one word per fleet on + every turn regardless, which is independent of the scale. +* **The `design+0x12c > 1` short-circuit is still unpriced**, as it was for lane AD — the Dreadnought + category is empty in this game. +* **The spy half is untouched.** +* **No probe wanted `probes=11`.** Indices 8–11 are reported as NOT INSTALLED, never as zeros. +* **One accidental loss, disclosed.** `Gamma Fleet` (2 destroyers) and later `Zeta Fleet` (1) were + destroyed resolving encounters during the play-forward and the measured run. Both losses are inside + the workload, not the measurement: the input save is on disk and every number in §4 is read off the + trace of a run that loaded it. +* **What no lane has yet done on this state: a Rung B capture.** `--turn-commands` replay runs no AI, + and this state now has an *unconditional* rung-A pair, which makes it the obvious candidate for the + standalone's first trade-raid comparison. + +--- + +## 8. Corrections to earlier findings (rule 11) + +1. **Lane AG `gate-indexed-rng-audit.md` §7** — *"`ServerTradeManager+0x0c`'s writer was not found. + This is the one load-bearing inference in the document and it is flagged as one."* **Found: + `FUN_00841700`** (§1.0). AG's §3.3 reading is upheld and the alternative it offered is dead. The + flagging discipline is what made this a one-lane job, and it is worth saying so. +2. **Lane AG §3.3's committed prediction** — *"**3 words** on a turn `A` succeeds"* — is **2** for a + Human or Zuul raider, because `FUN_00820af0`'s third short-circuit fires + (`SpeciesDef[k]+0x144`, set by `InitTable` only for species 0 and 5). §4.2. +3. **Lane AG §5.2** — *"`B`'s cost on success is `1 (NextInt) + 1 (NextFloat)`, minus the species + short-circuit"* — right about the code, and the subtraction applies to the only species that has + ever raided in this campaign. `B` costs **1**. +4. **Lane AG's row-186 correction and `tail-rng-ledger.md` §11.1** — *"a success costs 0 or 1 further + word"* was corrected by AG to "at least six draws". Both sentences are now measured on the same + turn: `CreateRaidEncounter` entered 3× on turn 43 and drew **two** words in its subtree + (`0x008939ee` and `0x00820c1b`, one each). The correct statement is that the cost is **unbounded + above and state-dependent**, and the first non-zero observation is 2. +5. **Lane AD `raid-gate-multiplicity.md` §4** — *"three route records, `trfr = 18, 14, 14"* in + `ad-turn27-two-raiders.sav`. It is **five**, `trfr = 18, 16, 14, 20, 14`. §3.2. +6. **Lane AD §5 and its board row** — *"there is no oracle pair for this state"*. True of + `ad-turn27-two-raiders.sav`; **not** true of the same lineage ten turns later. §6. +7. **Lane H's `CreateRaidEncounter` zero** (`tail-rng-ledger.md`, rule 20's case study) — the + candidate list is **not** always empty. First non-zero reading of `0x008939ee` is in + `verify/traces/ar-r1-turn38-turn43.jsonl`. + +--- + +## 9. Artefacts + +| what | where | +|---|---| +| this document | `findings/control-flow/raid-target-pick-verdict.md` | +| **input state — 4 raiders on two sectors, turn 37** | `verify/results/saves/ar-turn37-816raiders.sav` (`b6f4e05f…`) | +| `probes=8` trace, six instrumented End Turns (the pick fires on turn 42) | `verify/traces/ar-r1-turn38-turn43.jsonl` | +| `probes=8` trace, the two control turns | `verify/traces/ar-r2-control-turn38-turn39.jsonl` | +| site / ledger / probe reports for R1 | `verify/results/shim/ar/ar-r1-{sites,ledger,probes}.txt` | +| shim logs (detour + probe install status) | `verify/results/shim/ar/ar-r{1,2}-shim.log` | +| **oracle pair**, two fresh `hooks=off` processes | `verify/results/saves/ar-oracle-{A,B}-post.sav` (both `7a8b3d5e…`) | +| pre-turn half of the pair | `verify/results/saves/ar-oracle-A-pre.sav` (`15b99255…`) | +| the instrumented run's post-turn autosave, byte-identical to both | `verify/results/saves/ar-r2-probes8-post.sav` (`7a8b3d5e…`) | +| R1's final state, turn 43 | `verify/results/saves/ar-r1-turn43-post.sav` | +| new addresses (7 entries, no name collides) | `ghidra/addresses.d/ar.json` | +| instrument | `sots-engine` `src/shim/shim.cfg.hp8`, **unchanged**; build `ar-989c692-20260909T0313Z` | +| build tree | lane worktree `~/sots-engine-ar` (branch `wip/ar`) → CT111 `/srv/re-lab/build/sots-engine-ar`, `rm -rf`'d before the build; dist `/srv/re-lab/shim/dist-ar` | + +**New content for the coverage ratchet (rule 27):** `ar-turn37-816raiders.sav` carries a +`TradeSector` with **`tsnumflt 5`** and five `tsflt` entries mixing both empires' fleets; a `trdmgr` +with **eight** `rt` records where the corpus maximum was four; and — the first in the corpus — a +`StarFleet` whose `LocID` is a `TradeSector` id **while its `Pos` is not the sector node's**, which is +the serialised signature of a raider displaced to an interception point. Nothing here is a new *kind* +of item, so the ratchet should hold. + +--- + +## 10. VM141 as left + +Guest **restored**, hold **released**. Game stopped; `C:\SOTS\shim.cfg` is `shim.cfg.hoff`; +`C:\SOTS\binkw32.dll` is this lane's build (`ar-989c692-20260909T0313Z`), with the original still at +`binkw32_real.dll`. `C:\SOTS\SavedGames` is lane AD's set **plus `ar-turn37-816raiders.sav`**, so +**Load-dialog row positions have moved again — screenshot the dialog.** With the three autosaves +deleted the list is 12 rows from y = 260 at 29 px pitch, and `ar-turn37-816raiders` is **row 3 at +(400, 318)**. + +Left in place, all additive: `C:\SOTS\shimdist-ar` (4 files) and `C:\SOTS\ui\ar-*.ps1` +(`ar-go.ps1` takes `-Cfg`, `ar-ui.ps1` writes `cmd.txt` and runs the helper once, plus three +one-shot copy helpers). **`click_helper.ps1` is unmodified** from lane AC's version. + +**Four things that cost this lane time, for the next holder.** + +* **Startup is faster than the board says if you drive it.** `fg` + `key {ESC}` three times spaced + ~2.5 s, then ~90 s, put the main menu up in about **two minutes**, not four and a half. Loading a + turn-37 save is a further **3–4 minutes** and that part is not compressible. Verify both from a + screendump. +* **`rdrag x y x y` is a right-click.** The click helper has no right-click verb and the fleet panel's + `Add To New Fleet` / `Split Ships` menu is right-click-only. A zero-length right-drag opens it. +* **A trade-sector node is a legal move target even when its cube is not drawn** (§3.1), and its + screen position is computable from the save. Do not conclude a sector is unreachable because you + cannot see it. +* **The encounter query blocks the End Turn**, so a scripted turn loop must detect it. This lane + detected it by sampling **one pixel**: the `Done` button at (233, 673) reads ≈ `(183, 18, 0)` when a + query is up and ≈ `(8, 8, 8)` on the map. `Auto Resolve Peacefully` is the fourth icon at + (667, 641) and `Done` at (233, 673). + +--- + +## Proposed board rows + +New rows: + +``` +| VERDICT: `TradeManager+0x0c` IS the per-system containing-sector table - the writer is found and the raid target pick FIRES | control-flow | verified | high | 100% | 2026-09-09 | **Lane AR**, VM141, `findings/control-flow/raid-target-pick-verdict.md`. Decides lane AG's §3.3 final paragraph, the one load-bearing inference AG flagged as unproven, and lane AD correctly reported it could not separate on sector 832. **BOTH INSTRUMENTS AGREE (rule 3).** STATIC: the writer AG's §7 lists as NOT FOUND is **`FUN_00841700`** (214 B, 0x00841700-0x008417d5) - it clears the +0x0c vector, RESIZES it to `count(([this+4])+0x40..+0x44)` (the SYSTEMS vector, the very container `FUN_00841cd0` indexes with `rt->trfr` at 0x00841d36), then walks the SECTOR vector x each sector's MEMBER SYSTEM vector executing `mov [this->+0x0c + m->+0x5c * 4], sector` at 0x008417a8. `ServerSystem+0x5c` is the serialised **`Idx`** field (objects/layouts.md, grade verified), so this is literally `containingSector[system.Idx] = sector` and **G_B1a cannot reject a valid trfr, BY CONSTRUCTION**. It is called from the DESERIALISER `FUN_00858a10` at 0x00858f07, so a loaded save has the table populated. LIVE: with 4 raiders parked (2 CR on sector 832, 2 DE on sector **816**, all `Pos` bit-equal), `Slot13RngCalleeA` is entered **4x/turn, 4 words**, every turn - and on turn 42 `Slot13RngCalleeB` reached its target pick: **`NextInt` at call `0x0088b613`, calls=1 words=1**, the FIRST firing of that site in the campaign. `OnAllCombatDone_Tail` cost **5** words that turn against **4** on every other turn; bracket residual **0** on all six turns. **THE SAME RUN CARRIES ITS OWN CONTROL**: on turns 38 and 40 `B` was entered by a cruiser on sector 832 and cost **0 words** - same process, same build, same instrument, same function, only the sector differs. AC's and AD's proof-carrying zero is a fact about the SECTOR, not the code path. Instrument `probes=8` (NOT 11), shim `ar-989c692-20260909T0313Z`, cfg `shim.cfg.hp8` unmodified, lane worktree + own build dir `/srv/re-lab/build/sots-engine-ar` rm -rf'd first (rules 21, 24) | +``` + +``` +| `B` costs ONE word on a success, not two - and the deciding value is a SPECIES FLAG set by a constructor for exactly two species | control-flow | verified | high | 100% | 2026-09-09 | Lane AR. Lane AG's committed §3.3 prediction was **3 words on a succeeding turn** (`A` 1 + `B`'s NextInt 1 + `FUN_00820af0`'s NextFloat 1) and §5.2 says `B` costs 2 on success. **MEASURED: the tail cost 5 with k=4 raiders and one success, i.e. `B` cost 1, and there is NO `0x00820c1b` row on that turn.** Why: `FUN_00820af0`'s third short-circuit is `SpeciesDef_HasInterceptFlag 0x0053baf0` - twelve bytes, `cmp [ecx+0x144],0; setne al` - and `InitTable 0x005453a0` sets that flag word at 0x0054562f/0x00545638 for **species 0 (HUMAN) bit 0 and species 5 (ZUUL) bit 1 ONLY**. `Get 0x00545cc0` returns `0x00b10a00 + k*0x184`, the same table InitTable fills. So **a Human or Zuul raider intercepts at frac=1.0 and draws nothing; the other five species draw a NextFloat at 0x00820c1b**. The general tail model is **`k + s + z`** words: k = permitted raiders parked with `Pos` bit-equal, s = their successes ON A SECTOR THAT SOURCES A ROUTE, z = s again unless the raider's species sets the flag. Measured at k+s with k = 4,4,4,4,4,3 and s = 0,0,0,0,1,0. THE CHEAPEST UNEXERCISED STATE IN THE TRADE HALF IS NOW A NON-HUMAN, NON-ZUUL RAIDER - z has never been observed through `B` by anyone. Rule 23's lesson pointing a new way: the deciding value was not a float literal but a FLAG WORD SET BY A CONSTRUCTOR, invisible to any amount of reading `FUN_00820af0` alone | +``` + +``` +| ORACLE PAIR on the turn-37 raider state - and the probes=8 instrument is BYTE-NEUTRAL, whole-save | meta | verified | high | 100% | 2026-09-09 | Lane AR (rules 19, 26). Two fresh `hooks=off` processes loading `ar-turn37-816raiders.sav` and running the same two End Turns produced **BYTE-IDENTICAL** autosaves at both snapshot points: Frame 38 `15b99255e1f03dab…` and Frame 39 `7a8b3d5eb3a60eba…`; `state_checksum --floats bits --mask none` prints **IDENTICAL**, root `237020deca931f5a180289592cece7ae`, coverage PROVED (1,173,884 B rebuilt, 67,239 leaves), 0 error 0 warn. **THEN** a fourth process with `shim.cfg.hp8` installed produced the SAME TWO HASHES. So the instrument is behaviour-neutral **at whole-save byte granularity**, not merely on the sub-tree the measurement reads - the stronger form of what lane AD could show. Order matters and it was the right order: the control was reproduced FIRST and shown to be a single outcome, so rule 26's `1/k` coincidence caveat does not apply (k=1). **THIS CORRECTS THE SCOPE OF LANE AD'S ROW**: "no oracle pair for this state / the AI varies per process" is true of `ad-turn27-two-raiders.sav` and NOT true of the same lineage ten turns later, so it is a fact about that state, not about the engine. No explanation for the difference is offered and none should be inferred. `ar-turn37-816raiders.sav` + 2 End Turns is the first RUNG-A CALIBRATION PAIR from this lineage and the obvious candidate for the standalone's first trade-raid comparison | +``` + +``` +| `CreateRaidEncounter`'s candidate list is NOT always empty - 0x008939ee fires, and rule 20's case study gets its positive | control-flow | verified | high | 100% | 2026-09-09 | Lane AR, turn 43 of `verify/traces/ar-r1-turn38-turn43.jsonl`. `ServerTradeManager::CreateRaidEncounter` entered **3x** and its subtree drew **two** words: `NextInt 0x008939ee calls=1 words=1` - the site lane H measured at 0 on every turn and that `tail-rng-ledger.md` has carried as a zero ever since, the campaign's own case study for rule 20 - and `NextFloat 0x00820c1b calls=1 words=1` through the OTHER caller `0x0082cf65`, i.e. lane AG §5.1's chain `CreateRaidEncounter -> 0x00892640 -> 0x0082ce00 -> FUN_00820af0`. `Slot13RngCalleeB` was entered **0** times that turn, so neither word is `B`'s. **Two of AG's §5.1/§5.2 unread gates are now read from opposite directions.** The honest form of the cost claim is neither "0 or 1 further word" nor "at least six draws" but **unbounded above and state-dependent**; the first non-zero observation is 2 | +``` + +Edits to existing rows: + +- **Row 62** (guest holders) — `VM141 = FREE (lane AR released 2026-09-09; guest restored, `shim.cfg.hoff`, this lane's binkw32.dll, SavedGames = lane AD's set PLUS `ar-turn37-816raiders.sav`, so Load-dialog rows have MOVED AGAIN - with the autosaves deleted the list is 12 rows from y=260 at 29 px pitch and `ar-turn37-816raiders` is row 3 at (400,318)).` Lane AR left `C:\SOTS\shimdist-ar` + `C:\SOTS\ui\ar-*.ps1`; `click_helper.ps1` unmodified. **GOTCHA (corrects the startup figure): `fg` + `key {ESC}` x3 spaced ~2.5 s then ~90 s puts the main menu up in about TWO minutes, not 4.5** - the 4.5 figure is what you get by waiting the movies out. Loading a turn-37 save is a further 3-4 min and that part is not compressible. **GOTCHA: `rdrag x y x y` (a zero-length right-drag) IS A RIGHT-CLICK** - the fleet panel's `Add To New Fleet` / `Split Ships` menu is right-click-only and the helper has no right-click verb. **GOTCHA: a trade-sector node is a legal move target EVEN WHEN ITS CUBE IS NOT DRAWN** - in Move mode the hover readout names it (`Sector 5 / Range: 15.7 / ETA: 4 Turns`); fit `screen = (A*wx + B*wz + C, D*wx + E*wz + F)` from two known points in the save and you land on any node first try. **GOTCHA: the encounter query BLOCKS the End Turn** - detect it by sampling the `Done` button pixel at (233,673): ~(183,18,0) when a query is up, ~(8,8,8) on the map; `Auto Resolve Peacefully` is (667,641), `Done` (233,673).` +- **Row 399 / the AC-AD raid rows** — append: `RESOLVED 2026-09-09 (lane AR): AD's "my data does NOT distinguish AG's per-system vs sector-indexed reading" is now decided BOTH WAYS - `FUN_00841700` is the writer and the pick fired live at 0x0088b613 with the raider on sector 816. AD's zero on 832 stands and is reproduced inside lane AR's own run as the within-run control.` +- **Row 207** — append: `0x0088b613 IS NO LONGER UNFIRED (lane AR 2026-09-09): calls=1 words=1 on turn 42 of ar-r1-turn38-turn43.jsonl, with the raider on sector 816. 0x00820c1b also fired, but through CreateRaidEncounter's caller, never through B - the species short-circuit blocks B's second draw for Human and Zuul raiders.` +- **Row 186** (`RNG LEDGER CLOSED`) — append: `Lane AR 2026-09-09: the tail's cost is `k + s + z` - one word per parked permitted raider, PLUS one per success on a route-sourcing sector, PLUS one more per success unless the raider's species sets SpeciesDef+0x144 (Human and Zuul only). Measured 4,4,4,4,5,3 over six turns with k = 4,4,4,4,4,3.` +- **Lane AD's "Sector 816 is UNREACHABLE" row** — append: `REACHED 2026-09-09 (lane AR) exactly as costed: five stock Extended Range destroyers (Range 27.0, 2,252 each) built at Epsilon Eridani over turns 28-31, split into four fleets, ETA 4 turns, parked on sector 5's node turn 35. AD's geometry table and its build costing are exact. TWO THINGS AD's recipe did not say: a new ship JOINS an existing fleet and a fleet's Range is the MINIMUM over its ships, so the 9-ly cruiser has to be split off before the node is a legal target; and the sector node is clickable even though its cube is not drawn.` diff --git a/ghidra/addresses.d/ar.json b/ghidra/addresses.d/ar.json new file mode 100644 index 0000000..7ab7ca4 --- /dev/null +++ b/ghidra/addresses.d/ar.json @@ -0,0 +1,52 @@ +{ + "entries": [ + { + "name": "TradeManager_RebuildSystemToSectorTable", + "addr": "0x00841700", + "convention": "thiscall", + "prototype": "void __thiscall (TradeManager* this) // 214 B, 0x00841700-0x008417d5, decoded to the next function start. THE WRITER OF TradeManager+0x0c that lane AG's gate-indexed audit section 7 lists as NOT FOUND, and it settles AG section 3.3: (1) `lea ecx,[this+0x0c]; push 0; call 0x00459f70` clears the vector; (2) resizes it to `count(([this+4])+0x40 .. +0x44)` -- the SYSTEMS vector, the very container FUN_00841cd0 indexes with rt->trfr at 0x00841d36 -- growing with vector::_Insert_n 0x0050e6a0 (fill value NULL) or shrinking with erase 0x004ddfc0; (3) walks this->+0x1c (the SECTOR vector) x sector->+0x78 (that sector's MEMBER SYSTEM vector) and executes `mov [this->+0x0c + m->+0x5c * 4], sector` at 0x008417a8. ServerSystem+0x5c is the serialised `Idx` field (objects/layouts.md, grade verified), so this is literally `containingSector[system.Idx] = sector`. CONSEQUENCE: TradeManager+0x0c is a PER-SYSTEM table whose length is BY CONSTRUCTION the length of the container trfr indexes, so Slot13RngCalleeB's bounds check G_B1a can never reject a valid trfr and 0x0088b613 is reachable. Five callers; FUN_00858a10 is the DESERIALISER (ReadInt/ReadFloat throughout, calls this at 0x00858f07), so the table is rebuilt on load", + "status": "verified", + "source": "findings/control-flow/raid-target-pick-verdict.md (lane AR 2026-09-08); disassembled from dumps/sots.exe to the next function start" + }, + { + "name": "TradeManager_GetSectorForSystem", + "addr": "0x00841c70", + "convention": "thiscall", + "prototype": "void __thiscall (TradeManager* this, ServerSystem* sys) // 83 B, RET 4. Reads TradeManager+0x0c back the same way the writer fills it: bounds-checks `sys->+0x5c` (= the `Idx` tag) against `(this->+0x10 - this->+0x0c)/4` and indexes `((TradeSector**)this->+0x0c)[sys->Idx]`, then passes `sector + 0x78` -- the sector's MEMBER SYSTEM vector, the same vector the writer iterates -- to FUN_0059ec00 with the system. Independent confirmation that +0x5c on the indexing object and +0x78 on the table element are the two halves of one relation. Tail-calls TradeManager_RebuildSystemToSectorTable 0x00841700", + "status": "verified", + "source": "findings/control-flow/raid-target-pick-verdict.md (lane AR 2026-09-08)" + }, + { + "name": "Vector_ResizePtr", + "addr": "0x00459f70", + "convention": "thiscall", + "prototype": "void __thiscall (std::vector* this, size_t n) // RET 4. resize(n): when size > n it moves _Mylast down to _Myfirst + n (the shrink arm the trade manager uses with n = 0, i.e. clear); when size < n it calls 0x00538180 to grow", + "status": "verified", + "source": "findings/control-flow/raid-target-pick-verdict.md (lane AR 2026-09-08)" + }, + { + "name": "SpeciesDef_InterceptFlagWord", + "addr": "0x00b10b44", + "convention": "data", + "prototype": "int, at g_SpeciesDefTable + 0*0x184 + 0x144 -- i.e. the +0x144 slot of SpeciesDef[0]. The SAME slot in every element is written ONLY by SpeciesDef_InitTable 0x005453a0 at 0x0054562f (`or [ebx+0x144],2` when the element's species index is 5) and 0x00545638 (`or [ebx+0x144],1` when it is 0). So the word is 1 for HUMAN, 2 for ZUUL and 0 for the other five species, and SpeciesDef_HasInterceptFlag 0x0053baf0 tests it. This is the value that decides whether TradeManager's raid interception draws a NextFloat at 0x00820c1b; the table base g_SpeciesDefTable 0x00b10a00 and accessor SpeciesDef_Get 0x00545cc0 were already named in addresses.json and this lane's independent derivation reproduced both", + "status": "verified", + "source": "findings/control-flow/raid-target-pick-verdict.md (lane AR 2026-09-09)" + }, + { + "name": "SpeciesDef_HasInterceptFlag", + "addr": "0x0053baf0", + "convention": "thiscall", + "prototype": "bool __thiscall (SpeciesDef* this) // 12 B: `xor eax,eax; cmp [ecx+0x144],eax; setne al; ret`. TRUE for HUMAN (species 0) and ZUUL (species 5) only. This is the third disjunct of FUN_00820af0's short-circuit, so a HUMAN raider intercepts at frac = 1.0 and the NextFloat at 0x00820c1b IS NOT DRAWN -- correcting lane AG section 3.3's committed `3 words on a success` and section 5.2's `B costs 2 on a success`, both of which hold only for a raider whose species does not set this flag", + "status": "verified", + "source": "findings/control-flow/raid-target-pick-verdict.md (lane AR 2026-09-08)" + }, + { + "name": "StarFleet_GetCrewSpeciesForIntercept", + "addr": "0x0081a2d0", + "convention": "cdecl", + "prototype": "int __cdecl (StarFleet* fleet) // returns the fleet owner's species (FUN_0071e280(fleet)->+0x5c) on the default path; only when that species is 4 does it scan the fleet's ship vector (+0xa4..+0xa8) for a ship whose design->+0x14->+0xac..+0xb4 slot is non-null and return THAT record's +0x4 instead. Called TWICE from FUN_00820af0 (0x00820bcf, 0x00820bdd) -- once compared against 1, once used as the index into SpeciesDef_Table", + "status": "verified", + "source": "findings/control-flow/raid-target-pick-verdict.md (lane AR 2026-09-08)" + } + ] +} diff --git a/ghidra/generated/sots_addresses.h b/ghidra/generated/sots_addresses.h index 217553d..cf48a86 100644 --- a/ghidra/generated/sots_addresses.h +++ b/ghidra/generated/sots_addresses.h @@ -1,5 +1,5 @@ // GENERATED — do not edit. Facts about Sword of the Stars.exe (GOG 1.8.1). -// Source: sots-re ghidra/addresses.json @ 712d184, generated 2026-09-08 by tools/gen_addresses.py +// Source: sots-re ghidra/addresses.json @ f8ff1b6, generated 2026-09-09 by tools/gen_addresses.py // Runtime address = (uintptr_t)GetModuleHandle(NULL) + RVA (the exe is ASLR-relocated). #pragma once #include @@ -1281,6 +1281,18 @@ constexpr uint32_t RaidEncounter_Helper848e50 = 0x00448e50; constexpr uint32_t RaidEncounter_Helper848e50_DrawSite = 0x00448fd9; // thiscall Called only from TradeManager_BuildRaidEncounter at 0x00892700; calls TradeManager_ComputeRaidInterceptPoint at 0x0082cf65, which is where the NextFloat at 0x00820c1b is spent on this path. Body not read [mapped] constexpr uint32_t RaidEncounter_Helper82ce00 = 0x0042ce00; +// thiscall void __thiscall (TradeManager* this) // 214 B, 0x00841700-0x008417d5, decoded to the next function start. THE WRITER OF TradeManager+0x0c that lane AG's gate-indexed audit section 7 lists as NOT FOUND, and it settles AG section 3.3: (1) `lea ecx,[this+0x0c]; push 0; call 0x00459f70` clears the vector; (2) resizes it to `count(([this+4])+0x40 .. +0x44)` -- the SYSTEMS vector, the very container FUN_00841cd0 indexes with rt->trfr at 0x00841d36 -- growing with vector::_Insert_n 0x0050e6a0 (fill value NULL) or shrinking with erase 0x004ddfc0; (3) walks this->+0x1c (the SECTOR vector) x sector->+0x78 (that sector's MEMBER SYSTEM vector) and executes `mov [this->+0x0c + m->+0x5c * 4], sector` at 0x008417a8. ServerSystem+0x5c is the serialised `Idx` field (objects/layouts.md, grade verified), so this is literally `containingSector[system.Idx] = sector`. CONSEQUENCE: TradeManager+0x0c is a PER-SYSTEM table whose length is BY CONSTRUCTION the length of the container trfr indexes, so Slot13RngCalleeB's bounds check G_B1a can never reject a valid trfr and 0x0088b613 is reachable. Five callers; FUN_00858a10 is the DESERIALISER (ReadInt/ReadFloat throughout, calls this at 0x00858f07), so the table is rebuilt on load [verified] +constexpr uint32_t TradeManager_RebuildSystemToSectorTable = 0x00441700; +// thiscall void __thiscall (TradeManager* this, ServerSystem* sys) // 83 B, RET 4. Reads TradeManager+0x0c back the same way the writer fills it: bounds-checks `sys->+0x5c` (= the `Idx` tag) against `(this->+0x10 - this->+0x0c)/4` and indexes `((TradeSector**)this->+0x0c)[sys->Idx]`, then passes `sector + 0x78` -- the sector's MEMBER SYSTEM vector, the same vector the writer iterates -- to FUN_0059ec00 with the system. Independent confirmation that +0x5c on the indexing object and +0x78 on the table element are the two halves of one relation. Tail-calls TradeManager_RebuildSystemToSectorTable 0x00841700 [verified] +constexpr uint32_t TradeManager_GetSectorForSystem = 0x00441c70; +// thiscall void __thiscall (std::vector* this, size_t n) // RET 4. resize(n): when size > n it moves _Mylast down to _Myfirst + n (the shrink arm the trade manager uses with n = 0, i.e. clear); when size < n it calls 0x00538180 to grow [verified] +constexpr uint32_t Vector_ResizePtr = 0x00059f70; +// data int, at g_SpeciesDefTable + 0*0x184 + 0x144 -- i.e. the +0x144 slot of SpeciesDef[0]. The SAME slot in every element is written ONLY by SpeciesDef_InitTable 0x005453a0 at 0x0054562f (`or [ebx+0x144],2` when the element's species index is 5) and 0x00545638 (`or [ebx+0x144],1` when it is 0). So the word is 1 for HUMAN, 2 for ZUUL and 0 for the other five species, and SpeciesDef_HasInterceptFlag 0x0053baf0 tests it. This is the value that decides whether TradeManager's raid interception draws a NextFloat at 0x00820c1b; the table base g_SpeciesDefTable 0x00b10a00 and accessor SpeciesDef_Get 0x00545cc0 were already named in addresses.json and this lane's independent derivation reproduced both [verified] +constexpr uint32_t SpeciesDef_InterceptFlagWord = 0x00710b44; +// thiscall bool __thiscall (SpeciesDef* this) // 12 B: `xor eax,eax; cmp [ecx+0x144],eax; setne al; ret`. TRUE for HUMAN (species 0) and ZUUL (species 5) only. This is the third disjunct of FUN_00820af0's short-circuit, so a HUMAN raider intercepts at frac = 1.0 and the NextFloat at 0x00820c1b IS NOT DRAWN -- correcting lane AG section 3.3's committed `3 words on a success` and section 5.2's `B costs 2 on a success`, both of which hold only for a raider whose species does not set this flag [verified] +constexpr uint32_t SpeciesDef_HasInterceptFlag = 0x0013baf0; +// cdecl int __cdecl (StarFleet* fleet) // returns the fleet owner's species (FUN_0071e280(fleet)->+0x5c) on the default path; only when that species is 4 does it scan the fleet's ship vector (+0xa4..+0xa8) for a ship whose design->+0x14->+0xac..+0xb4 slot is non-null and return THAT record's +0x4 instead. Called TWICE from FUN_00820af0 (0x00820bcf, 0x00820bdd) -- once compared against 1, once used as the index into SpeciesDef_Table [verified] +constexpr uint32_t StarFleet_GetCrewSpeciesForIntercept = 0x0041a2d0; // __thiscall void (Game::ServerSystem* this, Game::SpyCraft* spy) /* 48 B, complete: `if (!spy) return; spy->deat(+0x10) = this ? this->[+4] : 0; push_back(&this->spies2(+0x1cc), &spy->sid(+0x4))` via lane AI3's 0x0059f1a0. THE ONLY WRITER THAT EVER MAKES `deat` NON-ZERO AT RUNTIME (the other stores to SpyCraft+0x10 are the zero-init in CreateSpyCraft, the deserializer, and three field copies). Exactly one caller, 0x008874d4 inside ServerSpyManager_DeploySpy, and no vtable slot. THIS SETTLES `spies2`: ServerSystem+0x1cc is the per-system vector of DEPLOYED spy ids, written in the same two instructions as `deat`, which is why it is 0 in every save whose only spy is docked to its tender */ [verified] constexpr uint32_t ServerSystem_AddSpy = 0x003514c0; // __thiscall void (Game::ServerSystem* this, Game::SpyCraft* spy) /* 48 B, complete: `if (!spy) return; spy->deat(+0x10) = 0; erase(&this->spies2(+0x1cc), &spy->sid(+0x4))` via 0x0059ec00. The exact mirror of ServerSystem_AddSpy; the two together are the whole life cycle of `deat` and of `spies2` */ [verified] diff --git a/verify/results/saves/ar-oracle-A-post.sav b/verify/results/saves/ar-oracle-A-post.sav new file mode 100644 index 0000000..74a1aec Binary files /dev/null and b/verify/results/saves/ar-oracle-A-post.sav differ diff --git a/verify/results/saves/ar-oracle-A-pre.sav b/verify/results/saves/ar-oracle-A-pre.sav new file mode 100644 index 0000000..d8ab7ae Binary files /dev/null and b/verify/results/saves/ar-oracle-A-pre.sav differ diff --git a/verify/results/saves/ar-oracle-B-post.sav b/verify/results/saves/ar-oracle-B-post.sav new file mode 100644 index 0000000..74a1aec Binary files /dev/null and b/verify/results/saves/ar-oracle-B-post.sav differ diff --git a/verify/results/saves/ar-r1-turn43-post.sav b/verify/results/saves/ar-r1-turn43-post.sav new file mode 100644 index 0000000..711a6db Binary files /dev/null and b/verify/results/saves/ar-r1-turn43-post.sav differ diff --git a/verify/results/saves/ar-r2-probes8-post.sav b/verify/results/saves/ar-r2-probes8-post.sav new file mode 100644 index 0000000..74a1aec Binary files /dev/null and b/verify/results/saves/ar-r2-probes8-post.sav differ diff --git a/verify/results/saves/ar-turn37-816raiders.sav b/verify/results/saves/ar-turn37-816raiders.sav new file mode 100644 index 0000000..f85ff04 Binary files /dev/null and b/verify/results/saves/ar-turn37-816raiders.sav differ diff --git a/verify/results/shim/ar/ar-r1-ledger.txt b/verify/results/shim/ar/ar-r1-ledger.txt new file mode 100644 index 0000000..302b11a --- /dev/null +++ b/verify/results/shim/ar/ar-r1-ledger.txt @@ -0,0 +1,163 @@ + cid d hook turn S+8 enc paths pred w_in w_out WORDS left +------------------------------------------------------------------------------------------------- + 0 0 Seed None None None None None None None None None->None + 1 0 Seed None None None None None None None None None->None + 3 1 Seed None None None None None None None None None->None + 2 0 RunAI None None None None None None None None None->None + 5 1 Seed None None None None None None None None None->None + 4 0 RunAI None None None None None None None None None->None + 7 1 Seed None None None None None None None None None->None + 6 0 RunAI None None None None None None None None None->None + 8 0 Autosave None None None None None None None None None->None + 11 2 RegisterHives None None None None None 190 190 0 434->434 + 12 2 TickHives None None None None 0 190 190 0 434->434 + 10 1 OnTurnBegin None None None None None 190 190 0 434->434 + 9 0 BeginProcessTurn 37 2057 -1 None None 190 190 0 434->434 + 14 1 ProcessNodeSpaceTravel 38 2106 -1 None None 190 190 0 434->434 + 15 1 ProcessTeamRecord None None None None None 207 207 0 417->417 + 13 0 ProcessTurn 38 2105 -1 None None 190 207 17 434->417 + 17 1 ApplyEncounterResult 38 2107 1 None None 207 207 0 417->417 + 18 1 ProcessNodeSpaceTravel 38 2108 0 None None 207 207 0 417->417 + 19 1 NodeLineDecay 38 2108 0 51 0 207 207 0 417->417 + 20 1 UpdateDifficultyTier None None None None 0 207 207 0 417->417 + 16 0 OnAllCombatDone_Tail 38 2106 1 51 0 207 211 4 417->413 + 21 0 Autosave None None None None None 211 211 0 413->413 + 22 0 Autosave None None None None None 211 211 0 413->413 + 25 2 RegisterHives None None None None None 211 211 0 413->413 + 26 2 TickHives None None None None 0 211 211 0 413->413 + 24 1 OnTurnBegin None None None None None 211 211 0 413->413 + 23 0 BeginProcessTurn 38 2108 0 None None 211 211 0 413->413 + 28 1 ProcessNodeSpaceTravel 39 2146 0 None None 211 211 0 413->413 + 27 0 ProcessTurn 39 2145 0 None None 211 231 20 413->393 + 30 1 ApplyEncounterResult 39 2147 1 None None 231 231 0 393->393 + 31 1 ProcessNodeSpaceTravel 39 2147 0 None None 231 231 0 393->393 + 32 1 NodeLineDecay 39 2147 0 51 0 231 231 0 393->393 + 33 1 UpdateDifficultyTier None None None None 0 231 231 0 393->393 + 29 0 OnAllCombatDone_Tail 39 2146 1 51 0 231 235 4 393->389 + 34 0 Autosave None None None None None 235 235 0 389->389 + 35 0 Autosave None None None None None 235 235 0 389->389 + 38 2 RegisterHives None None None None None 235 235 0 389->389 + 39 2 TickHives None None None None 0 235 235 0 389->389 + 37 1 OnTurnBegin None None None None None 235 235 0 389->389 + 36 0 BeginProcessTurn 39 2147 0 None None 235 235 0 389->389 + 41 1 ProcessNodeSpaceTravel 40 2185 0 None None 235 235 0 389->389 + 42 1 ProcessTeamRecord None None None None None 252 252 0 372->372 + 40 0 ProcessTurn 40 2184 0 None None 235 252 17 389->372 + 44 1 ApplyEncounterResult 40 2186 1 None None 252 252 0 372->372 + 45 1 ProcessNodeSpaceTravel 40 2186 0 None None 252 252 0 372->372 + 46 1 NodeLineDecay 40 2186 0 51 0 252 252 0 372->372 + 47 1 UpdateDifficultyTier None None None None 0 252 252 0 372->372 + 43 0 OnAllCombatDone_Tail 40 2185 1 51 0 252 256 4 372->368 + 48 0 Autosave None None None None None 256 256 0 368->368 + 49 0 Autosave None None None None None 256 256 0 368->368 + 52 2 RegisterHives None None None None None 256 256 0 368->368 + 53 2 TickHives None None None None 0 256 256 0 368->368 + 51 1 OnTurnBegin None None None None None 256 256 0 368->368 + 50 0 BeginProcessTurn 40 2186 0 None None 256 256 0 368->368 + 55 1 ProcessNodeSpaceTravel 41 2247 0 None None 256 256 0 368->368 + 56 1 ProcessTeamRecord None None None None None 273 273 0 351->351 + 54 0 ProcessTurn 41 2246 0 None None 256 273 17 368->351 + 58 1 ApplyEncounterResult 41 2250 1 None None 273 273 0 351->351 + 59 1 ProcessNodeSpaceTravel 41 2251 0 None None 273 273 0 351->351 + 60 1 NodeLineDecay 41 2251 0 51 0 273 273 0 351->351 + 61 1 UpdateDifficultyTier None None None None 0 273 273 0 351->351 + 57 0 OnAllCombatDone_Tail 41 2249 1 51 0 273 277 4 351->347 + 62 0 Autosave None None None None None 277 277 0 347->347 + 63 0 Autosave None None None None None 277 277 0 347->347 + 66 2 RegisterHives None None None None None 277 277 0 347->347 + 67 2 TickHives None None None None 0 277 277 0 347->347 + 65 1 OnTurnBegin None None None None None 277 277 0 347->347 + 64 0 BeginProcessTurn 41 2251 0 None None 277 277 0 347->347 + 69 1 ProcessNodeSpaceTravel 42 2302 0 None None 277 277 0 347->347 + 68 0 ProcessTurn 42 2301 0 None None 277 297 20 347->327 + 71 1 ApplyEncounterResult 42 2303 1 None None 297 297 0 327->327 + 72 1 ProcessNodeSpaceTravel 42 2303 0 None None 297 297 0 327->327 + 73 1 NodeLineDecay 42 2303 0 51 0 297 297 0 327->327 + 74 1 UpdateDifficultyTier None None None None 0 297 297 0 327->327 + 70 0 OnAllCombatDone_Tail 42 2302 1 51 0 297 301 4 327->323 + 75 0 Autosave None None None None None 301 301 0 323->323 + 76 0 Autosave None None None None None 301 301 0 323->323 + 79 2 RegisterHives None None None None None 301 301 0 323->323 + 80 2 TickHives None None None None 0 301 301 0 323->323 + 78 1 OnTurnBegin None None None None None 301 301 0 323->323 + 77 0 BeginProcessTurn 42 2303 0 None None 301 301 0 323->323 + 82 1 ProcessNodeSpaceTravel 43 2378 0 None None 301 301 0 323->323 + 81 0 ProcessTurn 43 2377 0 None None 301 320 19 323->304 + 84 1 ApplyEncounterResult 43 2379 1 None None 320 320 0 304->304 + 85 1 ProcessNodeSpaceTravel 43 2379 0 None None 320 320 0 304->304 + 86 1 NodeLineDecay 43 2379 0 51 0 320 320 0 304->304 + 87 1 UpdateDifficultyTier None None None None 0 320 320 0 304->304 + 83 0 OnAllCombatDone_Tail 43 2378 1 51 0 320 325 5 304->299 + 88 0 Autosave None None None None None 325 325 0 299->299 + 89 0 Autosave None None None None None 325 325 0 299->299 + 92 2 RegisterHives None None None None None 325 325 0 299->299 + 93 2 TickHives None None None None 0 325 325 0 299->299 + 91 1 OnTurnBegin None None None None None 325 325 0 299->299 + 90 0 BeginProcessTurn 43 2379 0 None None 325 325 0 299->299 + 95 1 ProcessNodeSpaceTravel 44 2434 0 None None 325 325 0 299->299 + 96 1 ProcessTeamRecord None None None None None 352 352 0 272->272 + 97 1 ProcessTeamRecord None None None None None 352 352 0 272->272 + 94 0 ProcessTurn 44 2433 0 None None 325 352 27 299->272 + 99 1 ApplyEncounterResult 44 2437 2 None None 352 352 0 272->272 + 100 1 ApplyEncounterResult 44 2437 2 None None 352 352 0 272->272 + 101 1 ProcessNodeSpaceTravel 44 2437 0 None None 352 352 0 272->272 + 102 1 NodeLineDecay 44 2437 0 51 0 352 352 0 272->272 + 103 1 UpdateDifficultyTier None None None None 0 352 352 0 272->272 + 98 0 OnAllCombatDone_Tail 44 2436 2 51 0 352 355 3 272->269 + 104 0 Autosave None None None None None 355 355 0 269->269 + 105 0 Autosave None None None None None 355 355 0 269->269 + 108 2 RegisterHives None None None None None 355 355 0 269->269 + 109 2 TickHives None None None None 0 355 355 0 269->269 + 107 1 OnTurnBegin None None None None None 355 355 0 269->269 + 106 0 BeginProcessTurn 44 2437 0 None None 355 355 0 269->269 + 111 1 ProcessNodeSpaceTravel 45 2502 0 None None 355 355 0 269->269 + 112 1 ProcessTeamRecord None None None None None 372 372 0 252->252 + 113 1 ProcessTeamRecord None None None None None 372 372 0 252->252 + 110 0 ProcessTurn 45 2501 0 None None 355 372 17 269->252 + 114 0 Seed None None None None None None None None None->None + 115 0 Seed None None None None None None None None None->None + +node-line population (phase 11's draw is one word per EXPIRED line): + turn paths permanent immortal mortal min_life <=5 expired words + 38 51 51 0 0 -1 0 0 0 + 39 51 51 0 0 -1 0 0 0 + 40 51 51 0 0 -1 0 0 0 + 41 51 51 0 0 -1 0 0 0 + 42 51 51 0 0 -1 0 0 0 + 43 51 51 0 0 -1 0 0 0 + 44 51 51 0 0 -1 0 0 0 + +tail invocations (P1: does it run on every End Turn?): + turn 38: encounters=1 words=4 + turn 39: encounters=1 words=4 + turn 40: encounters=1 words=4 + turn 41: encounters=1 words=4 + turn 42: encounters=1 words=4 + turn 43: encounters=1 words=5 + turn 44: encounters=2 words=3 + +bracket 0: INCOMPLETE (pre-turn marker has no ledger position) +BRACKET turn 38: total=24 words attributed=24 residual=0 + BeginProcessTurn 0 + ProcessTurn 20 + OnAllCombatDone_Tail 4 +BRACKET turn 39: total=21 words attributed=21 residual=0 + BeginProcessTurn 0 + ProcessTurn 17 + OnAllCombatDone_Tail 4 +BRACKET turn 40: total=21 words attributed=21 residual=0 + BeginProcessTurn 0 + ProcessTurn 17 + OnAllCombatDone_Tail 4 +BRACKET turn 41: total=24 words attributed=24 residual=0 + BeginProcessTurn 0 + ProcessTurn 20 + OnAllCombatDone_Tail 4 +BRACKET turn 42: total=24 words attributed=24 residual=0 + BeginProcessTurn 0 + ProcessTurn 19 + OnAllCombatDone_Tail 5 +BRACKET turn 43: total=30 words attributed=30 residual=0 + BeginProcessTurn 0 + ProcessTurn 27 + OnAllCombatDone_Tail 3 diff --git a/verify/results/shim/ar/ar-r1-probes.txt b/verify/results/shim/ar/ar-r1-probes.txt new file mode 100644 index 0000000..c3f0c5d --- /dev/null +++ b/verify/results/shim/ar/ar-r1-probes.txt @@ -0,0 +1,112 @@ + [ProcessTeamRecord] call 15 depth 1: entries=2 gate=False contacts=0 detectors=2 neither=0 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (0,0,0x1010100) + +=== post-turn autosave #1 (call 21) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=1 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=1 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=1 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=1 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=4 since_launch=4 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=0 since_launch=0 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=0 since_launch=0 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + +=== post-turn autosave #2 (call 34) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=2 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=2 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=2 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=2 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=4 since_launch=8 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=1 since_launch=1 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=0 since_launch=0 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + [ProcessTeamRecord] call 42 depth 1: entries=2 gate=False contacts=0 detectors=2 neither=0 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (0,0,0x1010100) + +=== post-turn autosave #3 (call 48) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=3 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=3 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=3 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=3 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=4 since_launch=12 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=0 since_launch=1 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=0 since_launch=0 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + [ProcessTeamRecord] call 56 depth 1: entries=2 gate=False contacts=0 detectors=2 neither=0 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (0,0,0x1010100) + +=== post-turn autosave #4 (call 62) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=4 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=4 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=4 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=4 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=4 since_launch=16 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=1 since_launch=2 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=1 since_launch=1 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + +=== post-turn autosave #5 (call 75) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=5 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=5 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=5 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=5 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=4 since_launch=20 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=0 since_launch=2 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=0 since_launch=1 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + +=== post-turn autosave #6 (call 88) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=6 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=6 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=6 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=6 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=4 since_launch=24 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=1 since_launch=3 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=0 since_launch=1 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + [ProcessTeamRecord] call 96 depth 1: entries=2 gate=False contacts=0 detectors=2 neither=0 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (0,0,0x1010100) + [ProcessTeamRecord] call 97 depth 1: entries=2 gate=False contacts=0 detectors=1 neither=1 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (1,0,0x1010000) + +=== post-turn autosave #7 (call 104) === + 0x008877b0 Game::ServerSpyManager::vslot13 calls=1 since_launch=7 + 0x0088db80 Game::ServerSpyManager::vslot14 calls=1 since_launch=7 + 0x0088ef80 Game::ServerTradeManagerImpl::vslot13 calls=1 since_launch=7 + 0x0082cca0 Game::ServerTradeManagerImpl::vslot15 calls=1 since_launch=7 + 0x008408e0 Game::SpyManager::Slot13RngCallee calls=0 since_launch=0 + 0x00820ca0 Game::TradeManager::Slot13RngCalleeA calls=3 since_launch=27 + 0x0088b440 Game::TradeManager::Slot13RngCalleeB calls=0 since_launch=3 + 0x008938a0 Game::ServerTradeManager::CreateRaidEncounter calls=3 since_launch=4 + 0x00893290 Game::ServerTradeManager::GenerateTradeRaidEncounters **NOT INSTALLED** + 0x00887f30 Game::ServerSpyManager::vslot15 [control] **NOT INSTALLED** + 0x008590d0 Game::ServerTradeManagerImpl::vslot14 [control] **NOT INSTALLED** + 0x007cb080 Game::EncounterDetect::Run [control] **NOT INSTALLED** + [ProcessTeamRecord] call 112 depth 1: entries=2 gate=False contacts=0 detectors=2 neither=0 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (0,0,0x1010100) + [ProcessTeamRecord] call 113 depth 1: entries=2 gate=False contacts=0 detectors=2 neither=0 max_trials=-1 fc_byte_vs_dword_disagreements=2 WORDS=0 + entry flags (fb, fc, fc_dword): (0,0,0x1010100), (0,0,0x1010100) diff --git a/verify/results/shim/ar/ar-r1-shim.log b/verify/results/shim/ar/ar-r1-shim.log new file mode 100644 index 0000000..81fd3a5 --- /dev/null +++ b/verify/results/shim/ar/ar-r1-shim.log @@ -0,0 +1,143 @@ +23:47:48.211 [tid 5640] ==== sots-engine shim (binkw32 proxy) build ar-989c692-20260909T0313Z ==== +23:47:48.211 [tid 5640] exe: C:\SOTS\Sword of the Stars.exe +23:47:48.211 [tid 5640] exe base=0x00210000 (link-time image base 0x00400000, ASLR delta -2031616) pid=8632 shim=72a50000 +23:47:48.211 [tid 5640] addresses: Source: sots-re ghidra/addresses.json @ 48db3cc, generated 2026-09-08 by tools/gen_addresses.py +23:47:48.211 [tid 5640] config: hooks=trace +23:47:48.211 [tid 5640] config: hook.Shim::SelfTest::Fill=off +23:47:48.211 [tid 5640] config: hook.Mars::GlobalConsts::LoadFile=off +23:47:48.211 [tid 5640] config: hook.Game::WeaponDictionary::Init=off +23:47:48.211 [tid 5640] config: hook.Game::SectionDictionary::SectionDictionary=off +23:47:48.211 [tid 5640] config: hook.Game::ServerPlayer::ComputeBudget=off +23:47:48.211 [tid 5640] config: hook.Game::TechTree::ProcessResearch=off +23:47:48.211 [tid 5640] config: hook.Game::ServerPlayer::OnTechResearched=off +23:47:48.211 [tid 5640] config: hook.Game::ServerSystem::ProcessTurn=off +23:47:48.211 [tid 5640] config: hook.Game::ServerPlayer::ProcessTurn=off +23:47:48.211 [tid 5640] config: hook.Game::ServerSystem::GroupOutput=off +23:47:48.211 [tid 5640] config: hook.Game::ServerSystem::ComputeTotalOutput=off +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::MoveFleet=off +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::ProcessFleetMovement=off +23:47:48.211 [tid 5640] config: hook.Game::StrategyHost::Autosave=trace +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::ProcessTurn=trace +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::OnAllCombatDone_Tail=trace +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::ApplyEncounterResult=trace +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::NodeLineDecay=trace +23:47:48.211 [tid 5640] config: hook.Game::StrategyServer::ProcessNodeSpaceTravel=trace +23:47:48.211 [tid 5640] config: hook.Game::EncounterDetect::AssignContacts=trace +23:47:48.211 [tid 5640] config: hook.Game::EncounterDetect::ProcessTeamRecord=trace +23:47:48.211 [tid 5640] config: fpu.sample_turn=off +23:47:48.211 [tid 5640] config: fpu.sample_ticks=off +23:47:48.211 [tid 5640] config: trace.inline_max=64 +23:47:48.211 [tid 5640] config: trace.path=C:\SOTS\shim.trace.jsonl +23:47:48.211 [tid 5640] config: trace.flush=always +23:47:48.211 [tid 5640] config: probes=8 -> 8 lane-H entry probes +23:47:48.273 [tid 5640] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 64, flush always) +23:47:48.273 [tid 5640] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=006b0e50 +23:47:48.273 [tid 5640] hook: MH_Initialize -> MH_OK +23:47:48.273 [tid 5640] hook: MH_CreateHook -> MH_OK (trampoline=00f00fe0) +23:47:48.289 [tid 5640] hook: MH_EnableHook -> MH_OK +23:47:48.289 [tid 5640] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +23:47:48.289 [tid 5640] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 mode=off (not installed) +23:47:48.289 [tid 5640] dict: dictionaries hook ready (crt new=74b3232b delete=74b30174) +23:47:48.289 [tid 5640] hook: Game::WeaponDictionary::Init rva=0x0019a4c0 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::SectionDictionary::SectionDictionary rva=0x00176f40 mode=off (not installed) +23:47:48.289 [tid 5640] research: ProcessResearch hook ready (Cost=0038da00, node=0x34, rng=0x9cc, fpu_cw=0x027f) +23:47:48.289 [tid 5640] hook: Game::TechTree::ProcessResearch rva=0x001876c0 mode=off (not installed) +23:47:48.289 [tid 5640] techfx: OnTechResearched hook ready (regions=15, gate=0/0, fpu_cw=0x027f) +23:47:48.289 [tid 5640] hook: Game::ServerPlayer::OnTechResearched rva=0x00491790 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::ServerPlayer::ComputeBudget rva=0x00463030 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::ServerSystem::ProcessTurn rva=0x003598e0 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::ServerSystem::GroupOutput rva=0x0034b7a0 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::ServerSystem::ComputeTotalOutput rva=0x00350480 mode=off (not installed) +23:47:48.289 [tid 5640] player_turn: ServerPlayer::ProcessTurn hook armed (ratio helper at 0038e950) +23:47:48.289 [tid 5640] hook: Game::ServerPlayer::ProcessTurn rva=0x00491340 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::StrategyServer::MoveFleet rva=0x003d9ee0 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::StrategyServer::ProcessFleetMovement rva=0x003da9a0 mode=off (not installed) +23:47:48.289 [tid 5640] hook: Game::StrategyHost::Autosave rva=0x00495210 -> va=006a5210 MH_CreateHook -> MH_OK (trampoline=00f00fc0) +23:47:48.305 [tid 5640] hook: Game::StrategyHost::Autosave MH_EnableHook -> MH_OK mode=trace +23:47:48.305 [tid 5640] hook: Game::StrategyServer::ProcessTurn rva=0x003dc6c0 -> va=005ec6c0 MH_CreateHook -> MH_OK (trampoline=00f00fa0) +23:47:48.336 [tid 5640] hook: Game::StrategyServer::ProcessTurn MH_EnableHook -> MH_OK mode=trace +23:47:48.336 [tid 5640] hook: Game::StrategyServer::OnAllCombatDone_Tail rva=0x003d92a0 -> va=005e92a0 MH_CreateHook -> MH_OK (trampoline=00f00f80) +23:47:48.351 [tid 5640] hook: Game::StrategyServer::OnAllCombatDone_Tail MH_EnableHook -> MH_OK mode=trace +23:47:48.351 [tid 5640] hook: Game::StrategyServer::ApplyEncounterResult rva=0x003d8920 -> va=005e8920 MH_CreateHook -> MH_OK (trampoline=00f00f60) +23:47:48.367 [tid 5640] hook: Game::StrategyServer::ApplyEncounterResult MH_EnableHook -> MH_OK mode=trace +23:47:48.367 [tid 5640] hook: Game::StrategyServer::NodeLineDecay rva=0x003ae010 -> va=005be010 MH_CreateHook -> MH_OK (trampoline=00f00f40) +23:47:48.383 [tid 5640] hook: Game::StrategyServer::NodeLineDecay MH_EnableHook -> MH_OK mode=trace +23:47:48.383 [tid 5640] hook: Game::StrategyServer::ProcessNodeSpaceTravel rva=0x003a0e20 -> va=005b0e20 MH_CreateHook -> MH_OK (trampoline=00f00f20) +23:47:48.398 [tid 5640] hook: Game::StrategyServer::ProcessNodeSpaceTravel MH_EnableHook -> MH_OK mode=trace +23:47:48.398 [tid 5640] hook: Game::EncounterDetect::AssignContacts rva=0x003aa240 -> va=005ba240 MH_CreateHook -> MH_OK (trampoline=00f00f00) +23:47:48.414 [tid 5640] hook: Game::EncounterDetect::AssignContacts MH_EnableHook -> MH_OK mode=trace +23:47:48.414 [tid 5640] hook: Game::EncounterDetect::ProcessTeamRecord rva=0x003ca640 -> va=005da640 MH_CreateHook -> MH_OK (trampoline=00f00ee0) +23:47:48.430 [tid 5640] hook: Game::EncounterDetect::ProcessTeamRecord MH_EnableHook -> MH_OK mode=trace +23:47:48.430 [tid 5640] hook: Game::StrategyServer::BeginProcessTurn rva=0x003d98e0 -> va=005e98e0 MH_CreateHook -> MH_OK (trampoline=00f00ec0) +23:47:48.445 [tid 5640] hook: Game::StrategyServer::BeginProcessTurn MH_EnableHook -> MH_OK mode=trace +23:47:48.445 [tid 5640] hook: Game::SVSOSwarmQueen::OnTurnBegin rva=0x00129930 -> va=00339930 MH_CreateHook -> MH_OK (trampoline=00f00ea0) +23:47:48.461 [tid 5640] hook: Game::SVSOSwarmQueen::OnTurnBegin MH_EnableHook -> MH_OK mode=trace +23:47:48.461 [tid 5640] hook: Game::SVSOSwarmQueen::RegisterHives rva=0x00127630 -> va=00337630 MH_CreateHook -> MH_OK (trampoline=00f00e80) +23:47:48.476 [tid 5640] hook: Game::SVSOSwarmQueen::RegisterHives MH_EnableHook -> MH_OK mode=trace +23:47:48.476 [tid 5640] hook: Game::SVSOSwarmQueen::TickHives rva=0x00127770 -> va=00337770 MH_CreateHook -> MH_OK (trampoline=00f00e60) +23:47:48.492 [tid 5640] hook: Game::SVSOSwarmQueen::TickHives MH_EnableHook -> MH_OK mode=trace +23:47:48.492 [tid 5640] hook: Game::SVSOSlaversRefuel::UpdateDifficultyTier rva=0x00115820 -> va=00325820 MH_CreateHook -> MH_OK (trampoline=00f00e40) +23:47:48.508 [tid 5640] hook: Game::SVSOSlaversRefuel::UpdateDifficultyTier MH_EnableHook -> MH_OK mode=trace +23:47:48.508 [tid 5640] hook: Mars::RNG::Seed rva=0x0009fdf0 -> va=002afdf0 MH_CreateHook -> MH_OK (trampoline=00f00e20) +23:47:48.523 [tid 5640] hook: Mars::RNG::Seed MH_EnableHook -> MH_OK mode=trace +23:47:48.523 [tid 5640] hook: Game::StrategyApp::RunAI rva=0x004706f0 -> va=006806f0 MH_CreateHook -> MH_OK (trampoline=00f00e00) +23:47:48.539 [tid 5640] hook: Game::StrategyApp::RunAI MH_EnableHook -> MH_OK mode=trace +23:47:48.555 [tid 5640] drawsite: Mars::RNG::NextFloat rva=0x0007d830 -> va=0028d830 create=MH_OK enable=MH_OK +23:47:48.570 [tid 5640] drawsite: Mars::RNG::NextInt rva=0x000271c0 -> va=002371c0 create=MH_OK enable=MH_OK +23:47:48.586 [tid 5640] drawsite: Mars::RNG::Chance rva=0x004e6dd0 -> va=006f6dd0 create=MH_OK enable=MH_OK +23:47:48.601 [tid 5640] drawsite: Mars::RNG::NextUInt rva=0x000f7670 -> va=00307670 create=MH_OK enable=MH_OK +23:47:48.617 [tid 5640] drawsite: Mars::RNG::FloatRange rva=0x0007d8a0 -> va=0028d8a0 create=MH_OK enable=MH_OK +23:47:48.648 [tid 5640] drawsite: Mars::RNG::IntRangeBell rva=0x004e6d80 -> va=006f6d80 create=MH_OK enable=MH_OK +23:47:48.664 [tid 5640] drawsite: Mars::RNG::GaussianRange rva=0x004e6e30 -> va=006f6e30 create=MH_OK enable=MH_OK +23:47:48.664 [tid 5640] probe: installing 8 of 12 (probes= in shim.cfg) +23:47:48.680 [tid 5640] probe: Game::ServerSpyManager::vslot13 rva=0x004877b0 -> va=006977b0 create=MH_OK enable=MH_OK +23:47:48.695 [tid 5640] probe: Game::ServerSpyManager::vslot14 rva=0x0048db80 -> va=0069db80 create=MH_OK enable=MH_OK +23:47:48.711 [tid 5640] probe: Game::ServerTradeManagerImpl::vslot13 rva=0x0048ef80 -> va=0069ef80 create=MH_OK enable=MH_OK +23:47:48.726 [tid 5640] probe: Game::ServerTradeManagerImpl::vslot15 rva=0x0042cca0 -> va=0063cca0 create=MH_OK enable=MH_OK +23:47:48.742 [tid 5640] probe: Game::SpyManager::Slot13RngCallee rva=0x004408e0 -> va=006508e0 create=MH_OK enable=MH_OK +23:47:48.758 [tid 5640] probe: Game::TradeManager::Slot13RngCalleeA rva=0x00420ca0 -> va=00630ca0 create=MH_OK enable=MH_OK +23:47:48.789 [tid 5640] probe: Game::TradeManager::Slot13RngCalleeB rva=0x0048b440 -> va=0069b440 create=MH_OK enable=MH_OK +23:47:48.805 [tid 5640] probe: Game::ServerTradeManager::CreateRaidEncounter rva=0x004938a0 -> va=006a38a0 create=MH_OK enable=MH_OK +23:47:48.805 [tid 5640] watch: disabled (watch=off) +23:47:48.805 [tid 5640] aiorders: disabled (aiorders=off) +23:47:48.805 [tid 5640] fpu: module init, entry cw=0x027f 53bit-double/nearest; force=off value=0x0000 sample_ticks=off +23:47:48.805 [tid 5640] fpu: sample_turn=off (off releases StrategyServer::ProcessTurn for another hook) +23:47:48.805 [tid 5640] fpu: StrategyClient::EndTurn rva=0x00383be0 -> va=00593be0 MH_CreateHook -> MH_OK (trampoline=00f00c00) +23:47:48.820 [tid 5640] fpu: StrategyClient::EndTurn MH_EnableHook -> MH_OK +23:47:48.820 [tid 5640] fpu: StrategyServer::BeginProcessTurn rva=0x003d98e0 -> va=005e98e0 MH_CreateHook -> MH_ERROR_ALREADY_CREATED (trampoline=00000000) +23:47:48.820 [tid 5640] fpu: StrategyServer::ProcessTurn rva=0x003dc6c0 not installed (sampler off) +23:47:48.820 [tid 5640] fpu: DemoApp::OnTick rva=0x0049a640 not installed (sampler off) +23:47:48.820 [tid 5640] selftest: Shim::SelfTest::Fill mode=off checksum=075ef0c3 records=0 +23:47:48.836 [tid 5640] Application::Initialize called (this=02fb8128) +23:53:02.045 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:53:05.171 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:53:05.186 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:53:05.233 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:01.702 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:04.842 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:04.874 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:04.920 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:46.827 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:49.952 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:49.999 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:56:50.045 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:57:51.061 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:57:54.217 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:57:54.233 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:57:54.295 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:04.858 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:08.014 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:08.030 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:08.077 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:50.061 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:53.233 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:53.249 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +23:59:53.295 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:00:35.264 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:00:38.452 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:00:38.467 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:00:38.530 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:01:39.780 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=1f876370): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:01:42.889 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a69610): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:01:42.905 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6dee0): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:01:42.952 [tid 5640] fpu: sample at StrategyClient::EndTurn (this=33a6a4a0): cw=0x127f 53bit-double/nearest [no fpu.force configured] diff --git a/verify/results/shim/ar/ar-r1-sites.txt b/verify/results/shim/ar/ar-r1-sites.txt new file mode 100644 index 0000000..4382a99 --- /dev/null +++ b/verify/results/shim/ar/ar-r1-sites.txt @@ -0,0 +1,118 @@ +turn: strategic 37 words / 52 calls; other generators 174 words / 172 calls; overflow 0 + * STRAT NextFloat call 0x00587888 ProcessResearch+0x1c8 calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 15 words= 0 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 4 words= 4 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 8 words= 8 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 8 words= 8 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 16 words= 16 [internal to Chance: already counted on that row] + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 5 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextInt call 0x006f3512 FUN_006f3450+0xc2 calls= 2 words= 2 + other Chance call 0x006fb69c FUN_006fb1a0+0x4fc calls= 80 words= 80 + other NextInt call 0x008622a5 FUN_00861ca0+0x605 calls= 2 words= 2 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 81 words= 81 [internal to Chance: already counted on that row] + => attributed strategic words: 21 +turn: strategic 40 words / 53 calls; other generators 17 words / 8 calls; overflow 0 + * STRAT NextFloat call 0x0050329d FUN_00503200+0x9d calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 15 words= 0 + * STRAT NextInt call 0x007929a4 FUN_00792750+0x254 calls= 1 words= 3 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 4 words= 4 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 8 words= 8 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 8 words= 8 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 16 words= 16 [internal to Chance: already counted on that row] + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 12 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 1 words= 1 [internal to Chance: already counted on that row] + => attributed strategic words: 24 +turn: strategic 37 words / 52 calls; other generators 522 words / 509 calls; overflow 0 + * STRAT NextFloat call 0x00587888 ProcessResearch+0x1c8 calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 15 words= 0 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 4 words= 4 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 8 words= 8 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 8 words= 8 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 16 words= 16 [internal to Chance: already counted on that row] + other Chance call 0x00536a60 FUN_00536a10+0x50 calls= 1 words= 1 + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 9 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextFloat call 0x006e9753 FUN_006e96e0+0x73 calls=113 words=113 + other NextInt call 0x006f3512 FUN_006f3450+0xc2 calls= 7 words= 13 + other Chance call 0x006fb69c FUN_006fb1a0+0x4fc calls=186 words=186 + other NextInt call 0x008622a5 FUN_00861ca0+0x605 calls= 7 words= 8 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls=188 words=188 [internal to Chance: already counted on that row] + => attributed strategic words: 21 +turn: strategic 37 words / 53 calls; other generators 1159 words / 1150 calls; overflow 0 + * STRAT NextFloat call 0x00587888 ProcessResearch+0x1c8 calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 16 words= 0 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 4 words= 4 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 8 words= 8 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 8 words= 8 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 16 words= 16 [internal to Chance: already counted on that row] + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 6 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextFloat call 0x006e9753 FUN_006e96e0+0x73 calls=259 words=259 + other NextInt call 0x006f3512 FUN_006f3450+0xc2 calls= 15 words= 21 + other Chance call 0x006fb69c FUN_006fb1a0+0x4fc calls=434 words=434 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls=435 words=435 [internal to Chance: already counted on that row] + => attributed strategic words: 21 +turn: strategic 40 words / 55 calls; other generators 10 words / 8 calls; overflow 0 + * STRAT NextFloat call 0x0050329d FUN_00503200+0x9d calls= 1 words= 1 + * STRAT NextFloat call 0x00587888 ProcessResearch+0x1c8 calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 15 words= 0 + * STRAT NextInt call 0x007929a4 FUN_00792750+0x254 calls= 1 words= 1 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 4 words= 4 + * STRAT NextFloat call 0x0088df4f FUN_0088df20+0x2f calls= 1 words= 1 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 8 words= 8 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 8 words= 8 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 16 words= 16 [internal to Chance: already counted on that row] + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 5 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 1 words= 1 [internal to Chance: already counted on that row] + => attributed strategic words: 24 +turn: strategic 40 words / 55 calls; other generators 10 words / 8 calls; overflow 0 + * STRAT NextFloat call 0x0050329d FUN_00503200+0x9d calls= 1 words= 1 + * STRAT NextFloat call 0x00587888 ProcessResearch+0x1c8 calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 15 words= 0 + * STRAT NextInt call 0x007929a4 FUN_00792750+0x254 calls= 1 words= 1 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 4 words= 4 + * STRAT NextInt call 0x0088b613 FUN_0088b440+0x1d3 calls= 1 words= 1 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 8 words= 8 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 8 words= 8 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 16 words= 16 [internal to Chance: already counted on that row] + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 5 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 1 words= 1 [internal to Chance: already counted on that row] + => attributed strategic words: 24 +turn: strategic 44 words / 55 calls; other generators 2121 words / 2077 calls; overflow 0 + * STRAT NextFloat call 0x00587888 ProcessResearch+0x1c8 calls= 1 words= 1 + * STRAT Chance call 0x00753d87 FUN_00753c60+0x127 calls= 15 words= 0 + * STRAT NextFloat call 0x00820c1b FUN_00820af0+0x12b calls= 1 words= 1 + * STRAT NextFloat call 0x00820e18 FUN_00820ca0+0x178 calls= 3 words= 3 + * STRAT NextInt call 0x0083abc4 FUN_0083aa30+0x194 calls= 1 words= 1 + * STRAT NextInt call 0x0083ac18 FUN_0083aa30+0x1e8 calls= 1 words= 1 + * STRAT NextInt call 0x0083af44 FUN_0083ace0+0x264 calls= 1 words= 1 + * STRAT NextInt call 0x0083b460 FUN_0083b1e0+0x280 calls= 1 words= 1 + * STRAT NextInt call 0x0088f1eb FUN_0088f070+0x17b calls= 1 words= 5 + * STRAT NextInt call 0x0088f356 FUN_0088f070+0x2e6 calls= 1 words= 1 + * STRAT Chance call 0x00893426 FUN_00893290+0x196 calls= 7 words= 7 + * STRAT Chance call 0x00893513 FUN_00893290+0x283 calls= 7 words= 7 + * STRAT NextInt call 0x008939ee FUN_008938a0+0x14e calls= 1 words= 1 + STRAT NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls= 14 words= 14 [internal to Chance: already counted on that row] + other Chance call 0x00536a60 FUN_00536a10+0x50 calls= 1 words= 1 + other Chance call 0x00578d10 FUN_00578cf0+0x20 calls= 1 words= 1 + other NextInt call 0x00579910 FUN_005798e0+0x30 calls= 3 words= 6 + other NextInt call 0x0069dc29 FUN_0069dbb0+0x79 calls= 3 words= 3 + other NextInt call 0x006e87cd FUN_006e86b0+0x11d calls=129 words=160 + other NextFloat call 0x006e9753 FUN_006e96e0+0x73 calls=324 words=324 + other NextInt call 0x006eeb1c FUN_006ee960+0x1bc calls= 2 words= 3 + other Chance call 0x006f0b73 FUN_006f0a40+0x133 calls= 39 words= 39 + other NextInt call 0x006f3512 FUN_006f3450+0xc2 calls= 32 words= 41 + other Chance call 0x006fb69c FUN_006fb1a0+0x4fc calls=746 words=746 + other NextInt call 0x008622a5 FUN_00861ca0+0x605 calls= 10 words= 10 + other NextFloat call 0x008e6e04 FUN_008e6dd0+0x34 calls=787 words=787 [internal to Chance: already counted on that row] + => attributed strategic words: 30 diff --git a/verify/results/shim/ar/ar-r2-shim.log b/verify/results/shim/ar/ar-r2-shim.log new file mode 100644 index 0000000..a95a803 --- /dev/null +++ b/verify/results/shim/ar/ar-r2-shim.log @@ -0,0 +1,119 @@ +00:23:29.854 [tid 6236] ==== sots-engine shim (binkw32 proxy) build ar-989c692-20260909T0313Z ==== +00:23:29.854 [tid 6236] exe: C:\SOTS\Sword of the Stars.exe +00:23:29.854 [tid 6236] exe base=0x00210000 (link-time image base 0x00400000, ASLR delta -2031616) pid=7128 shim=72a50000 +00:23:29.854 [tid 6236] addresses: Source: sots-re ghidra/addresses.json @ 48db3cc, generated 2026-09-08 by tools/gen_addresses.py +00:23:29.854 [tid 6236] config: hooks=trace +00:23:29.854 [tid 6236] config: hook.Shim::SelfTest::Fill=off +00:23:29.854 [tid 6236] config: hook.Mars::GlobalConsts::LoadFile=off +00:23:29.854 [tid 6236] config: hook.Game::WeaponDictionary::Init=off +00:23:29.854 [tid 6236] config: hook.Game::SectionDictionary::SectionDictionary=off +00:23:29.854 [tid 6236] config: hook.Game::ServerPlayer::ComputeBudget=off +00:23:29.854 [tid 6236] config: hook.Game::TechTree::ProcessResearch=off +00:23:29.854 [tid 6236] config: hook.Game::ServerPlayer::OnTechResearched=off +00:23:29.854 [tid 6236] config: hook.Game::ServerSystem::ProcessTurn=off +00:23:29.854 [tid 6236] config: hook.Game::ServerPlayer::ProcessTurn=off +00:23:29.854 [tid 6236] config: hook.Game::ServerSystem::GroupOutput=off +00:23:29.854 [tid 6236] config: hook.Game::ServerSystem::ComputeTotalOutput=off +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::MoveFleet=off +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::ProcessFleetMovement=off +00:23:29.854 [tid 6236] config: hook.Game::StrategyHost::Autosave=trace +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::ProcessTurn=trace +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::OnAllCombatDone_Tail=trace +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::ApplyEncounterResult=trace +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::NodeLineDecay=trace +00:23:29.854 [tid 6236] config: hook.Game::StrategyServer::ProcessNodeSpaceTravel=trace +00:23:29.854 [tid 6236] config: hook.Game::EncounterDetect::AssignContacts=trace +00:23:29.854 [tid 6236] config: hook.Game::EncounterDetect::ProcessTeamRecord=trace +00:23:29.854 [tid 6236] config: fpu.sample_turn=off +00:23:29.854 [tid 6236] config: fpu.sample_ticks=off +00:23:29.854 [tid 6236] config: trace.inline_max=64 +00:23:29.854 [tid 6236] config: trace.path=C:\SOTS\shim.trace.jsonl +00:23:29.854 [tid 6236] config: trace.flush=always +00:23:29.854 [tid 6236] config: probes=8 -> 8 lane-H entry probes +00:23:29.916 [tid 6236] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 64, flush always) +00:23:29.916 [tid 6236] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=006b0e50 +00:23:29.916 [tid 6236] hook: MH_Initialize -> MH_OK +00:23:29.916 [tid 6236] hook: MH_CreateHook -> MH_OK (trampoline=01170fe0) +00:23:29.947 [tid 6236] hook: MH_EnableHook -> MH_OK +00:23:29.947 [tid 6236] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295) +00:23:29.947 [tid 6236] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 mode=off (not installed) +00:23:29.947 [tid 6236] dict: dictionaries hook ready (crt new=74b3232b delete=74b30174) +00:23:29.947 [tid 6236] hook: Game::WeaponDictionary::Init rva=0x0019a4c0 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::SectionDictionary::SectionDictionary rva=0x00176f40 mode=off (not installed) +00:23:29.947 [tid 6236] research: ProcessResearch hook ready (Cost=0038da00, node=0x34, rng=0x9cc, fpu_cw=0x027f) +00:23:29.947 [tid 6236] hook: Game::TechTree::ProcessResearch rva=0x001876c0 mode=off (not installed) +00:23:29.947 [tid 6236] techfx: OnTechResearched hook ready (regions=15, gate=0/0, fpu_cw=0x027f) +00:23:29.947 [tid 6236] hook: Game::ServerPlayer::OnTechResearched rva=0x00491790 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::ServerPlayer::ComputeBudget rva=0x00463030 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::ServerSystem::ProcessTurn rva=0x003598e0 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::ServerSystem::GroupOutput rva=0x0034b7a0 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::ServerSystem::ComputeTotalOutput rva=0x00350480 mode=off (not installed) +00:23:29.947 [tid 6236] player_turn: ServerPlayer::ProcessTurn hook armed (ratio helper at 0038e950) +00:23:29.947 [tid 6236] hook: Game::ServerPlayer::ProcessTurn rva=0x00491340 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::StrategyServer::MoveFleet rva=0x003d9ee0 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::StrategyServer::ProcessFleetMovement rva=0x003da9a0 mode=off (not installed) +00:23:29.947 [tid 6236] hook: Game::StrategyHost::Autosave rva=0x00495210 -> va=006a5210 MH_CreateHook -> MH_OK (trampoline=01170fc0) +00:23:29.963 [tid 6236] hook: Game::StrategyHost::Autosave MH_EnableHook -> MH_OK mode=trace +00:23:29.963 [tid 6236] hook: Game::StrategyServer::ProcessTurn rva=0x003dc6c0 -> va=005ec6c0 MH_CreateHook -> MH_OK (trampoline=01170fa0) +00:23:29.979 [tid 6236] hook: Game::StrategyServer::ProcessTurn MH_EnableHook -> MH_OK mode=trace +00:23:29.979 [tid 6236] hook: Game::StrategyServer::OnAllCombatDone_Tail rva=0x003d92a0 -> va=005e92a0 MH_CreateHook -> MH_OK (trampoline=01170f80) +00:23:29.994 [tid 6236] hook: Game::StrategyServer::OnAllCombatDone_Tail MH_EnableHook -> MH_OK mode=trace +00:23:29.994 [tid 6236] hook: Game::StrategyServer::ApplyEncounterResult rva=0x003d8920 -> va=005e8920 MH_CreateHook -> MH_OK (trampoline=01170f60) +00:23:30.010 [tid 6236] hook: Game::StrategyServer::ApplyEncounterResult MH_EnableHook -> MH_OK mode=trace +00:23:30.010 [tid 6236] hook: Game::StrategyServer::NodeLineDecay rva=0x003ae010 -> va=005be010 MH_CreateHook -> MH_OK (trampoline=01170f40) +00:23:30.025 [tid 6236] hook: Game::StrategyServer::NodeLineDecay MH_EnableHook -> MH_OK mode=trace +00:23:30.025 [tid 6236] hook: Game::StrategyServer::ProcessNodeSpaceTravel rva=0x003a0e20 -> va=005b0e20 MH_CreateHook -> MH_OK (trampoline=01170f20) +00:23:30.057 [tid 6236] hook: Game::StrategyServer::ProcessNodeSpaceTravel MH_EnableHook -> MH_OK mode=trace +00:23:30.057 [tid 6236] hook: Game::EncounterDetect::AssignContacts rva=0x003aa240 -> va=005ba240 MH_CreateHook -> MH_OK (trampoline=01170f00) +00:23:30.072 [tid 6236] hook: Game::EncounterDetect::AssignContacts MH_EnableHook -> MH_OK mode=trace +00:23:30.072 [tid 6236] hook: Game::EncounterDetect::ProcessTeamRecord rva=0x003ca640 -> va=005da640 MH_CreateHook -> MH_OK (trampoline=01170ee0) +00:23:30.088 [tid 6236] hook: Game::EncounterDetect::ProcessTeamRecord MH_EnableHook -> MH_OK mode=trace +00:23:30.088 [tid 6236] hook: Game::StrategyServer::BeginProcessTurn rva=0x003d98e0 -> va=005e98e0 MH_CreateHook -> MH_OK (trampoline=01170ec0) +00:23:30.119 [tid 6236] hook: Game::StrategyServer::BeginProcessTurn MH_EnableHook -> MH_OK mode=trace +00:23:30.119 [tid 6236] hook: Game::SVSOSwarmQueen::OnTurnBegin rva=0x00129930 -> va=00339930 MH_CreateHook -> MH_OK (trampoline=01170ea0) +00:23:30.135 [tid 6236] hook: Game::SVSOSwarmQueen::OnTurnBegin MH_EnableHook -> MH_OK mode=trace +00:23:30.135 [tid 6236] hook: Game::SVSOSwarmQueen::RegisterHives rva=0x00127630 -> va=00337630 MH_CreateHook -> MH_OK (trampoline=01170e80) +00:23:30.151 [tid 6236] hook: Game::SVSOSwarmQueen::RegisterHives MH_EnableHook -> MH_OK mode=trace +00:23:30.151 [tid 6236] hook: Game::SVSOSwarmQueen::TickHives rva=0x00127770 -> va=00337770 MH_CreateHook -> MH_OK (trampoline=01170e60) +00:23:30.166 [tid 6236] hook: Game::SVSOSwarmQueen::TickHives MH_EnableHook -> MH_OK mode=trace +00:23:30.166 [tid 6236] hook: Game::SVSOSlaversRefuel::UpdateDifficultyTier rva=0x00115820 -> va=00325820 MH_CreateHook -> MH_OK (trampoline=01170e40) +00:23:30.182 [tid 6236] hook: Game::SVSOSlaversRefuel::UpdateDifficultyTier MH_EnableHook -> MH_OK mode=trace +00:23:30.182 [tid 6236] hook: Mars::RNG::Seed rva=0x0009fdf0 -> va=002afdf0 MH_CreateHook -> MH_OK (trampoline=01170e20) +00:23:30.197 [tid 6236] hook: Mars::RNG::Seed MH_EnableHook -> MH_OK mode=trace +00:23:30.197 [tid 6236] hook: Game::StrategyApp::RunAI rva=0x004706f0 -> va=006806f0 MH_CreateHook -> MH_OK (trampoline=01170e00) +00:23:30.229 [tid 6236] hook: Game::StrategyApp::RunAI MH_EnableHook -> MH_OK mode=trace +00:23:30.244 [tid 6236] drawsite: Mars::RNG::NextFloat rva=0x0007d830 -> va=0028d830 create=MH_OK enable=MH_OK +00:23:30.260 [tid 6236] drawsite: Mars::RNG::NextInt rva=0x000271c0 -> va=002371c0 create=MH_OK enable=MH_OK +00:23:30.276 [tid 6236] drawsite: Mars::RNG::Chance rva=0x004e6dd0 -> va=006f6dd0 create=MH_OK enable=MH_OK +00:23:30.291 [tid 6236] drawsite: Mars::RNG::NextUInt rva=0x000f7670 -> va=00307670 create=MH_OK enable=MH_OK +00:23:30.307 [tid 6236] drawsite: Mars::RNG::FloatRange rva=0x0007d8a0 -> va=0028d8a0 create=MH_OK enable=MH_OK +00:23:30.338 [tid 6236] drawsite: Mars::RNG::IntRangeBell rva=0x004e6d80 -> va=006f6d80 create=MH_OK enable=MH_OK +00:23:30.354 [tid 6236] drawsite: Mars::RNG::GaussianRange rva=0x004e6e30 -> va=006f6e30 create=MH_OK enable=MH_OK +00:23:30.354 [tid 6236] probe: installing 8 of 12 (probes= in shim.cfg) +00:23:30.369 [tid 6236] probe: Game::ServerSpyManager::vslot13 rva=0x004877b0 -> va=006977b0 create=MH_OK enable=MH_OK +00:23:30.385 [tid 6236] probe: Game::ServerSpyManager::vslot14 rva=0x0048db80 -> va=0069db80 create=MH_OK enable=MH_OK +00:23:30.401 [tid 6236] probe: Game::ServerTradeManagerImpl::vslot13 rva=0x0048ef80 -> va=0069ef80 create=MH_OK enable=MH_OK +00:23:30.416 [tid 6236] probe: Game::ServerTradeManagerImpl::vslot15 rva=0x0042cca0 -> va=0063cca0 create=MH_OK enable=MH_OK +00:23:30.432 [tid 6236] probe: Game::SpyManager::Slot13RngCallee rva=0x004408e0 -> va=006508e0 create=MH_OK enable=MH_OK +00:23:30.463 [tid 6236] probe: Game::TradeManager::Slot13RngCalleeA rva=0x00420ca0 -> va=00630ca0 create=MH_OK enable=MH_OK +00:23:30.479 [tid 6236] probe: Game::TradeManager::Slot13RngCalleeB rva=0x0048b440 -> va=0069b440 create=MH_OK enable=MH_OK +00:23:30.494 [tid 6236] probe: Game::ServerTradeManager::CreateRaidEncounter rva=0x004938a0 -> va=006a38a0 create=MH_OK enable=MH_OK +00:23:30.494 [tid 6236] watch: disabled (watch=off) +00:23:30.494 [tid 6236] aiorders: disabled (aiorders=off) +00:23:30.494 [tid 6236] fpu: module init, entry cw=0x027f 53bit-double/nearest; force=off value=0x0000 sample_ticks=off +00:23:30.494 [tid 6236] fpu: sample_turn=off (off releases StrategyServer::ProcessTurn for another hook) +00:23:30.494 [tid 6236] fpu: StrategyClient::EndTurn rva=0x00383be0 -> va=00593be0 MH_CreateHook -> MH_OK (trampoline=01170c00) +00:23:30.510 [tid 6236] fpu: StrategyClient::EndTurn MH_EnableHook -> MH_OK +00:23:30.510 [tid 6236] fpu: StrategyServer::BeginProcessTurn rva=0x003d98e0 -> va=005e98e0 MH_CreateHook -> MH_ERROR_ALREADY_CREATED (trampoline=00000000) +00:23:30.510 [tid 6236] fpu: StrategyServer::ProcessTurn rva=0x003dc6c0 not installed (sampler off) +00:23:30.510 [tid 6236] fpu: DemoApp::OnTick rva=0x0049a640 not installed (sampler off) +00:23:30.510 [tid 6236] selftest: Shim::SelfTest::Fill mode=off checksum=075ef0c3 records=0 +00:23:30.526 [tid 6236] Application::Initialize called (this=03348128) +00:27:45.137 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=0e23f478): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:27:48.309 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=34e00038): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:27:48.325 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=34e074b8): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:27:48.387 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=34e00780): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:29:38.215 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=0e23f478): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:29:41.340 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=34e00038): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:29:41.387 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=34e074b8): cw=0x127f 53bit-double/nearest [no fpu.force configured] +00:29:41.434 [tid 6236] fpu: sample at StrategyClient::EndTurn (this=34e00780): cw=0x127f 53bit-double/nearest [no fpu.force configured] diff --git a/verify/traces/ar-r1-turn38-turn43.jsonl b/verify/traces/ar-r1-turn38-turn43.jsonl new file mode 100644 index 0000000..c01ef1c --- /dev/null +++ b/verify/traces/ar-r1-turn38-turn43.jsonl @@ -0,0 +1,117 @@ +{"meta":{"format":1,"build":"ar-989c692-20260909T0313Z","exe_sha256":"970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841","started":"2026-09-09T03:47:48Z","inline_max":64,"hooks":{"Shim::SelfTest::Fill":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"complete","why":"Fill writes buf[0..n) and nothing else; the whole range is a declared region","unmodelled":[]}},"Mars::GlobalConsts::LoadFile":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"erases each consumed key from the caller's std::map","risk":"medium","why":"the map is a LoadAll temporary; declaring a red-black tree as a region is not possible before the call. First-occurrence-wins is reproduced in game::config::apply instead, so the *effect* is modelled, the container is not","mitigation":"LoadAll's post-state would have to be hooked to see it"},{"what":"writes three kinds of line to the game log (unrecognised key, applied key, expected-but-not-found)","risk":"low","why":"log text is not part of the simulation state","mitigation":""},{"what":"opens the file through the VFS and allocates/releases a refcounted buffer","risk":"low","why":"ours performs the same two calls, so allocation behaviour matches by construction rather than by comparison","mitigation":""},{"what":"String slots assign through the engine's own std::string, leaking one heap block per long string in compare mode","risk":"low","why":"start-up only; documented in docs/M1.md","mitigation":""}]}},"Game::ServerPlayer::ComputeBudget":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"slots 1, 2, 3, 4, 7 and 11 are produced by callees this milestone does not model (per-system output, trade, ship-carried population, a second manager, the build-queue spend)","risk":"high","why":"they are copied out of the original's own output and back into the same slots, so they match BY CONSTRUCTION and prove nothing","mitigation":"declared input boundary; see budget_inputs.h"},{"what":"ServerSystem::ComputeOutput repairs damaged ships in orbit","risk":"high","why":"replace mode runs the original a second time on a scratch Budget to harvest the six unmodelled slots, so that repair happens TWICE per turn in replace mode and nothing in the trace would show it","mitigation":"guard:budget_object does not reach the ships; unverified"},{"what":"the difficulty-mods row still DRIVES `ours` as two fitted constants","risk":"low","why":"the old note here said the row was 'not reachable from a ServerPlayer'. That was wrong: the record is at ServerPlayer+0x36c and every consumer calls DifficultyMods_Select(p->+0x36c, p). Lane L5 now snapshots it and emits it as `inputs.live_difficulty` alongside the fitted pair, so a run SHOWS whether the fit is right instead of assuming it. `ours` was deliberately left on the fitted constants so that this run is evidence about them; switching it over is the next lane's one-line change","mitigation":"logged as `inputs.live_difficulty` on every record"},{"what":"three of the four float widths this routine turns on are unexercised by any reference turn","risk":"medium","why":"the savings-interest rate is a widened 0.01f and its boundary IS in the corpus (a treasury of 50,000 earns 499, not 500). The research yield factor is a widened 0.85f whose boundary needs a research money that is a multiple of 40,000, and the three research modifiers are summed in SINGLE precision, which needs two of them non-zero -- the corpus has shrm = TRM = 0. So a green compare here verifies one of the three and says nothing about the other two","mitigation":"the record carries `inputs.live_consts` so the widths are readable, and tests/game_sim/test_economy.cpp pins all three at their boundaries"},{"what":"the research-allocation vector's heap block","risk":"low","why":"only the element count is compared; the three words are heap pointers the default policy ignores","mitigation":""}]}},"Game::WeaponDictionary::Init":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"LoadWeapon -> WeaponDef::ParseScript registers each weapon's name with the string table and resolves `requires` against the live TechTree","risk":"high","why":"per-file parsing is M3 scope; ours delegates to the game's own LoadWeapon, so a compare run performs the registration a SECOND time and neither the string table nor the tech tree is a declared region","mitigation":"suspected cause of the sibling section hook's compare crash (docs/M2.md)"},{"what":"allocates 123 WeaponDef objects (0x278 bytes each) on the game heap","risk":"low","why":"the definitions do not exist when the hook is entered, so they cannot be a before-snapshot; the dictionary region compares them by id/name/path","mitigation":""},{"what":"the word at dictionary+0x14","risk":"low","why":"not modelled; emitted as an opaque pointer, which the default policy ignores -- a change is visible in a trace but never a divergence","mitigation":"guard:dict"},{"what":"writes lines to the game log for a missing manifest","risk":"low","why":"log text is not simulation state","mitigation":""},{"what":"std::sort tie order for equal weapon names","risk":"low","why":"msvc_sort.h replays MSVC 2010's introsort, but the shipped data has no tied names, so the tie rule is unexercised rather than verified","mitigation":""}]}},"Game::SectionDictionary::SectionDictionary":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"LoadSection registers each section with the string table and the live TechTree, and may append to the dictionary's own vector","risk":"high","why":"M3 scope; ours delegates to the game's LoadSection after the original has already built all 885 definitions, so the second pass registers duplicates -- the leading hypothesis for this hook's compare-mode crash","mitigation":"see docs/M2.md; compare mode for this hook is not safe to run"},{"what":"post-load validation pass over every definition's @-token against the string table","risk":"medium","why":"runs after the loop and touches no declared region","mitigation":""},{"what":"allocates 885 SectionDef objects (0x3d8 bytes each) on the game heap","risk":"low","why":"they do not exist at hook entry; compared by index/species/id/token","mitigation":""},{"what":"the word at dictionary+0x14","risk":"low","why":"not modelled; emitted as an ignored pointer","mitigation":"guard:dict"},{"what":"the before-snapshot of the object is uninitialised heap","risk":"medium","why":"the hook is on the constructor, so `before` is meaningless and only `after` carries information","mitigation":""}]}},"Game::TechTree::ProcessResearch":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"posts EVENT_RESEARCH_OVERBUDGET on the owner's EventStorage: ours reproduces the decision and the id sequence, so region:events compares next_id, but the composed EvDsc/EvMsg text is not reproduced and no region can see it","risk":"medium","why":"text comes from the game's string table, which the engine must not carry; ours posts into its own EventStorage and writes only the counts into the scratch copy, so no live byte moves and replace mode posts nothing at all","mitigation":"region:events"},{"what":"composes EVENT_TECHS_UNLOCKED's message from the unlocked techs' names","risk":"low","why":"the trigger and the list are modelled (SetResearched's availability sweep plus the tail collector, both read off the instruction stream), so region:events compares next_id; the names come from the game's string table, so the message is composed from node indices instead and is not the game's text","mitigation":"region:events"},{"what":"TechTree::SetResearched in REPLACE mode: nothing of it runs","risk":"high","why":"the cascade is compare-mode only. In replace mode every pointer is live game memory, and applying half of OnTechResearched -- the observed-tech append and the research-event roll, but not the tech-effect field writes -- would leave the player in a state no code path produces. A replace run therefore still leaves the completed node unstamped and no tech unlocked","mitigation":"guard:player, guard:tree_header"},{"what":"ServerPlayer::OnTechResearched's tech effects: the ~90 hard-coded ServerPlayer field writes, the plague-cure masks, the design-option bitmasks and the species tech flags","risk":"high","why":"B2's milestone. `ours` models only the two parts of the callback this hook's regions can see -- the observed-tech append and the RNG word RollResearchEvent draws before its branch (one word on a missed roll, two on a fired plague roll) -- and the rest is what the player guard reports","mitigation":"guard:player"},{"what":"the research-event branch RollResearchEvent takes when its roll beats the odds (ServerPlayer::OnResearchRollSucceeded: the plague and AI-rebellion event paths)","risk":"high","why":"RollResearchEvent draws one NextFloat unconditionally and that draw IS modelled -- but that is only the cost of REACHING the branch. A FIRED roll costs one or two words: the plague path draws a SECOND word (NextInt) to pick an owned system and posts EVENT_PLAGUE_OUTBREAK, while the rebellion path allocates an AIRebellion at ServerPlayer+0x3b8 and CANCELS the current research (no further draw). The branch is entered only for the plague and AI-rebellion tech families, whose odds are 0 everywhere else, and it has never been observed firing in three sessions -- which is why every earlier note in this repo said 'exactly one NextFloat' and nothing caught it. If it is ever entered, region:rng is the check","mitigation":"region:rng"},{"what":"constructs the ObservedTech element it appends to ServerPlayer+0x274","risk":"medium","why":"`ours` models the append DECISION -- RecordObservedTech de-duplicates by tech name, so it decides whether the vector grows -- and moves the scratch header's byte span by one 0x2c element per append. The element's own fields (turn_first, turn_last, detected, the name string, `with`) are not built, and no region can see them","mitigation":"region:observed_techs"},{"what":"the tree's completion-order counter (TechTree+0x20) is read pre-call, not modelled as a region","risk":"low","why":"the per-node `order` word IS compared, and it is stamped from a counter `ours` seeds from the pre-call read and advances itself; the counter's own final value is only seen by the tree_header guard","mitigation":"guard:tree_header"},{"what":"writes a completion line to the game log","risk":"low","why":"log text is not simulation state","mitigation":""}]}},"Game::ServerPlayer::OnTechResearched":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"posts EVENT_RESEARCH_COMPLETE / _UNDERBUDGET / _TEMPERANCE on the owner's EventStorage when !silent","risk":"high","why":"the same class of write as B3's defect, and this hook has no replace-mode oracle that could catch it: gotcha 4 in docs/B2.md says a changed save hash on a completion turn is expected and therefore not a finding","mitigation":"guard:player (EventStorage is inline at ServerPlayer+0x29c)"},{"what":"writes every owned system's AI flag (CCC_AIVrus / CCC_AISlv), re-evaluates the arcology civilian cap, cures addiction and clears plague across systems AND ships","risk":"high","why":"writes through pointers to other objects; compare mode must not touch live state, and no region reaches them","mitigation":""},{"what":"the pending plague-cure roll (ServerPlayer::RollResearchEvent)","risk":"high","why":"it draws one word from the strategic generator unconditionally, and a SECOND word (NextInt) when the roll beats the odds and takes the plague path -- which also posts EVENT_PLAGUE_OUTBREAK, while the rebellion path cancels the research. So a fired roll costs one or two words, not one; running it in compare mode would consume real randomness. The two words it guards are still cleared and the record says whether it would have fired","mitigation":"this is the extra draw B3 observed on a completion"},{"what":"TechTree::SetResearched for the Zuul boarding-pod grant","risk":"medium","why":"it would mutate the live tree, and it recurses","mitigation":""},{"what":"allocates or frees the node-bore block at ServerPlayer+0x308","risk":"medium","why":"ours has no allocator the game's runtime could free, so replace mode calls the game's own updater -- which means replace mode never exercises our node-bore selection at all","mitigation":"region:node_bore, declared only when the block already exists"}]}},"Game::ServerSystem::ProcessTurn":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"the addiction sweep raises MoraleEvents, which are constructed and appended to the system's capped morale history","risk":"high","why":"the same class of write as B3's defect. sim::ProcessColonyTurn does compute the morale events (ColonyTurnResult), but the hook never emits them: DescribeMoraleEvents is dead code, so they are neither compared nor logged","mitigation":"guard:system"},{"what":"every callee: the plague pass, imperial and civilian growth, the resource debit, in-orbit refuel, slaves, rebellion and the build queue","risk":"high","why":"declared input boundary -- ProcessTurn is a dispatcher and only the words it writes itself are modelled. The callees raise EVENT_SLAVES_DEAD, EVENT_SYSTEM_REBELLION_CONTINUES, the plague events and SEBuildCompleted, create ships and bump per-player ShipRecords counters","mitigation":"guard:system covers the system object only, not the other objects"},{"what":"ApplyInfraBonus / ApplyPopBonus read the owner's home-system id, and the build queue writes the owning ServerPlayer","risk":"medium","why":"writes through a pointer to another object; no region reaches the player","mitigation":""},{"what":"ProcessRebellion is the pass's only RNG consumer and its draw count is data-dependent","risk":"low","why":"the generator IS a declared region, so a moved post-state is visible and names the system whose rebellion fired -- it is reported, not modelled","mitigation":""},{"what":"replace mode is refused for this hook","risk":"medium","why":"our side models the dispatcher's own writes and none of the callees, so a replace run would silently skip a colony's whole turn. There is therefore no oracle layer behind the compare for this hook","mitigation":""}]}},"Game::ServerSystem::GroupOutput":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"the imperial and civilian output modifiers, the 1.8 factor and the 500000 divisor are literals inside the executable, so nothing about them is assumed from the data files","unmodelled":[{"what":"the station count that scales the imperial term","risk":"high","why":"the original gets it from a helper that walks the system's fleets and their ships through virtual calls and takes the system in EBX, which a hook cannot call portably. `ours` therefore assumes ZERO stations. A divergence on an imperial row is expected to be exactly the station factor, and the record carries `count` and the return, so the factor is MEASURED from the trace rather than fitted","mitigation":"declared input boundary; the trace makes it recoverable"},{"what":"the slave row's output modifier, and every value the data files supply","risk":"medium","why":"SLAVES_OUTPUT_MOD, the two morale thresholds and their two modifiers, and STATION_BONUS_IMPERIAL_OUTPUT are read out of the live process's globals and logged with every record, so the record says which value drove it","mitigation":"logged as `tuning` on every record"}]}},"Game::ServerSystem::ComputeTotalOutput":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"the station count, as for GroupOutput","risk":"high","why":"`ours` assumes zero stations, so a system with an imperial population and a station diverges by the station factor","mitigation":"declared input boundary"},{"what":"the slave population and its xenotech adjustment","risk":"high","why":"the original's slave count is not a plain field: it runs the count through a per-species xenotech factor. `ours` takes the slave term as ZERO, so any system holding slaves diverges. The record logs the raw group-2 population sums so a divergence can be attributed","mitigation":"declared input boundary"},{"what":"the capacity surplus the civilian term adds for the owner's own species","risk":"medium","why":"the original calls the carrying-capacity helper twice with different out-parameter slots and adds max(0, B - A) to the civilian count; `ours` uses the raw civilian population. The surplus is zero except when the colony is at its cap","mitigation":"declared input boundary"},{"what":"the addiction phase","risk":"low","why":"`ours` assumes it is below 3, so ADDICTION_OUTPUT_MOD never applies; the record logs the system's addiction table length so the case is visible","mitigation":""}]}},"Game::ServerPlayer::ProcessTurn":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"phases 2, 3 and 6 -- the savings apply Sav = SatAdd(budget[0], net), the three aid/trade records copied out of the budget, and the research refund -- are NOT declared and NOT compared","risk":"high","why":"all three are pure functions of ComputeBudget's 22-slot output and of ProcessResearch's overBudget out-parameter, and both live in the original's own stack frame ([ebp-0x90] and [ebp-0x14]). The three ways to reach them are each worse than not having them: call ComputeBudget ourselves (it repairs damaged ships in orbit -- harness-audit #6), read them out of the nested B1/B3 hooks (harness-audit #5, the self-fulfilling compare), or infer them from the observed Sav delta (the same trap). The formulas ARE written and unit-tested in player_turn_inputs.cpp; they are simply not wired into the verdict","mitigation":"guard:player reports Sav, +0xc8 and +0xcc moving"},{"what":"ComputeBudget (0x00863030) itself, including ServerSystem::ComputeOutput, which REPAIRS DAMAGED SHIPS IN ORBIT","risk":"high","why":"B1 is the hook that checks the budget; its ship-repair side effect happens inside this call too, once per system per player per turn","mitigation":"run hook.Game::ServerPlayer::ComputeBudget=compare alongside"},{"what":"TechTree::ProcessResearch and the whole SetResearched / OnTechResearched cascade it can trigger: progress, the completion roll, the 5% decay sweep, the child-unlock cascade, ~90 tech-effect field writes, EVENT_RESEARCH_* and EVENT_TECHS_UNLOCKED","risk":"high","why":"declared input boundary. B3/U own it; this hook reports the pre-call research state and lets the player guard say how much moved","mitigation":"guard:player, and hook.Game::TechTree::ProcessResearch=compare"},{"what":"RollResearchAccident (0x00889dc0) draws Mars::RNG::NextInt(100) whenever the research boost is non-zero, can apply progress loss across EVERY system, and posts EVENT_LABACCIDENT_{SMALL,MEDIUM,LARGE}","risk":"high","why":"it runs before ProcessResearch and gates it entirely. Its draws move the declared `rng` region, so they are visible -- but as an unexplained RNG divergence, not as their cause","mitigation":"region:rng shows the draws; nothing shows the systems it wrote"},{"what":"the ResearchRollPending roll: RollResearchEvent draws one NextFloat, and when it BEATS the odds the plague branch draws a SECOND word (NextInt) and posts EVENT_PLAGUE_OUTBREAK, while the rebellion branch allocates an AIRebellion at ServerPlayer+0x3b8 and cancels the current research","risk":"high","why":"every previous coverage note in this repo says 'exactly one NextFloat'. That is the cost of REACHING the branch; a fired roll costs one or two words. The branch has never been observed firing. `predict_roll` says whether we expected the roll, `region:rng` says what it actually cost, and `roll_flags` says whether ResErrRoll was consumed","mitigation":"region:rng + region:roll_flags + guard:player; ours never rolls"},{"what":"ServerPlayer::ProcessSpecialProjects (0x00840fe0) and, for an AI player, ConstructionSpend (0x00817f90)","risk":"medium","why":"1015 bytes of special-project state, plus the log line \"SpecialProject: %s completed investigation phase\"","mitigation":"guard:player"},{"what":"the EVENT_NO_RESEARCH post at 0x0089168c, which appends to the player's EventStorage (+0x29c) and bumps EvNxID (+0x2b0)","risk":"medium","why":"B3's exact failure mode: a list append outside every Result region. Its condition is fully known (ResT == 0, nothing completed this turn, and at least one state-2 tech exists) but ours posts nothing","mitigation":"guard:player reports the EvNxID bump"},{"what":"PruneRaidTargets (0x00863cf0) erases from the heap vector at +0x338","risk":"low","why":"the vector header is inside the player guard, but its elements are heap memory no region reaches, and the erase runs each removed element's scalar destructor","mitigation":"guard:player sees the header move only"},{"what":"the timed-bonus element regions are captured from the PRE-CALL element addresses, and the sweep may shrink the vector under them","risk":"low","why":"erase moves data down inside the same buffer and only lowers _Mylast, so the addresses stay valid and readable. Elements past the new _Mylast are compared as stale bytes; `bonus_header` is the region that carries the count, and ours writes the same stale tail the original leaves","mitigation":"region:bonus_header"},{"what":"replace mode is refused for this hook","risk":"medium","why":"ours models the driver's own writes and none of ComputeBudget, ProcessResearch, ProcessSpecialProjects or the raid-target prune. A replace run would leave a player in a state no code path produces, and there is therefore no oracle layer behind this compare","mitigation":""}]}},"Game::StrategyServer::MoveFleet":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"on arrival: dispatches SEFleetArrived and runs one of three arrival handlers by destination kind (enter system / join fleet / stop at point)","risk":"high","why":"declared input boundary -- an arriving call is expected to differ in all of it, and none of it is declared, so the compare says nothing about arrivals","mitigation":"guard:fleet sees the fleet's own words; the event and the system do not"},{"what":"on departure: cancels every still-acting ship (with a log line each) and calls ServerSystem::FleetDeparts, which rewrites the system's ownership bits","risk":"high","why":"writes through pointers to ships and to the system","mitigation":""},{"what":"the tanker top-up refuels other ships in the fleet","risk":"medium","why":"the per-ship range regions would show it, but ours does not model it, so a fleet with a tanker diverges for a known reason","mitigation":""},{"what":"a node-line waypoint's step comes from the stutter profile","risk":"medium","why":"NodeLineStep / BuildStutterSegments are written and unit-tested but not wired in; the hook steps every waypoint type as speed x dt, so a node-line leg is knowingly mis-stepped and only its type is recorded","mitigation":"declared gap: docs/B4.md"},{"what":"a missed probabilistic jump scatters the fleet in a random direction","risk":"medium","why":"the direction is a second draw whose mapping is not modelled; ours leaves the position alone and reports the scatter distance, so the generator region diverges by one word on a miss","mitigation":""},{"what":"the route revalidation and the waypoint list itself","risk":"medium","why":"declared input boundary; the waypoint vector is not a region","mitigation":""}]}},"Game::StrategyServer::ProcessFleetMovement":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"`ours` re-reads the LIVE fleet list after the original has run","risk":"high","why":"the gate-traffic total is computed by the original at the very end of the pass, so a pre-call snapshot would diverge for the wrong reason. It breaks the compare invariant that ours never touches live memory, and it makes this hook's verdict partly self-fulfilling: the input to our arithmetic is the original's own post-move state","mitigation":""},{"what":"drives MoveFleet up to five times per fleet","risk":"high","why":"every undeclared effect of MoveFleet happens inside this call too; the pass schedule is recorded in the arguments but never compared","mitigation":""},{"what":"writes FPdpos into every fleet and clears flags 0x2 and 0x100 on every fleet","risk":"high","why":"no region covers the fleets, only the players' gate-traffic words","mitigation":""},{"what":"OnFleetArrived posts EVENT_FLEET_ARRIVED","risk":"high","why":"the same class of write as B3's defect, and there is no replace mode for this hook, so nothing behind the compare could catch it either","mitigation":""},{"what":"the original accumulates by player->index but writes back by the player's position in the server vector, into a fixed 32-int array with no bounds check","risk":"medium","why":"a real latent bug in the original that our side reproduces only while index == position; the reference save never separates them","mitigation":""},{"what":"PassSchedule() is never called by the hook, and FleetSummary::targetFleetId / relation are never filled","risk":"medium","why":"the header claims ours predicts the call order for a trace to check; that prediction is not actually emitted","mitigation":""}]}},"Game::StrategyHost::Autosave":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the whole save write: four path buffers, the ENDTURN pair removal, the backup rotation, the per-player connection detach/reattach, and SaveGame_WriteFile 0x00877070 itself","risk":"low","why":"this hook exists to timestamp the generator at the two moments the two save files are written. It is a marker and models nothing","mitigation":"region:rng only"},{"what":"the generator is reached through a CACHED StrategyServer pointer, not from this call's own arguments","risk":"medium","why":"`this` is the global at 0x00b29f98, hardcoded by both call sites, and no argument here names the server. On the first pre-turn autosave after a load no turn driver has run yet, so the cache is empty and that record carries no ledger position -- the FIRST BRACKET OF A SESSION IS INCOMPLETE BY CONSTRUCTION and must not be read as a zero-cost turn","mitigation":"arg:server_cached / host_plus_0x54 / server_agrees say which pointer was used and whether the +0x54 candidate is the same object"}]}},"Game::StrategyServer::ProcessTurn":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"no model of the turn's RNG cost: 32 phases, each of which may draw","risk":"high","why":"ProcessResearch's completion roll, RollResearchAccident's NextInt(100), the ResearchRollPending roll (one word, or two on the plague path), and whatever ProcessStations / ProcessSurrenders / ProcessMissions / ProcessSpecialProjects spend -- none of which has ever been measured. `ours` predicts nothing and the record reports the measurement","mitigation":"region:rng measures the total; the per-phase split is not resolved here"},{"what":"this hook takes the address the fpu module also wants to sample","risk":"low","why":"MinHook allows one hook per target. `fpu.sample_turn=off` releases StrategyServer::ProcessTurn so this hook can install; with it on, this hook fails to install and the trace is missing half the ledger","mitigation":"shim.log records the MH_CreateHook status for both"}]}},"Game::StrategyServer::OnAllCombatDone_Tail":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"36 phases, of which two can draw and neither is modelled here","risk":"high","why":"phase 6 reaches the unread 7499-byte combat resolver 0x007d5af0 (NextInt on the node-cannon path, Twist plus NextInt on the salvage path) and phase 11 draws one word per expired node line. `predict_nodeline_words` covers only the second, and the nested ApplyEncounterResult / NodeLineDecay hooks are what attribute the split","mitigation":"region:rng plus the two nested hooks"},{"what":"whether this handler runs on a turn with NO combat is what this hook is here to settle, and until it has run it is a hypothesis","risk":"medium","why":"combat-done-tail.md \u00c2\u00a76 infers it from the determinism note -- the post-turn autosave appears on every End Turn and this handler is its only reachable caller -- not from the instruction stream","mitigation":"arg:encounters says how many encounters this call saw; a call with 0 settles it"}]}},"Game::StrategyServer::ApplyEncounterResult":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the combat resolver 0x007d5af0 (7499 B) is completely unread","risk":"high","why":"this hook measures what its subtree spends and models none of it. Nothing about combat determinism can be settled until that function is read; this only puts a number on the hole","mitigation":"region:rng measures the subtotal"},{"what":"the ~0xea0-byte combat report, the CombatReport list append at S+0x1fc, the ClientEncounterResults push into S+0x2f4, the per-ship turn stamps and the pairwise engagement bits","risk":"medium","why":"all of it is game state this hook does not declare and does not check","mitigation":""}]}},"Game::StrategyServer::NodeLineDecay":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the collapse itself: 0x007a92e0 (690 B) and 0x007a4700 (2244 B) destroy or halt fleets and post EVENT_NODEDECAY_FLEET_DESTROYED_VIANODE / _HALTED / _HALTED_VIANODE, and loop 3 posts two more decay-stage events","risk":"high","why":"ours advances the generator and writes nothing else. In compare mode that is the intent -- the check is the word count -- but it means a clean verdict here says nothing about which lines actually collapsed","mitigation":"region:rng only"},{"what":"the draw-count model is verified by a DIRECT-call sweep of the downstream pair; their subtrees contain unresolved indirect call sites","risk":"medium","why":"if one of those vtable slots reaches a generator, the measured delta will exceed `predict_words` and this hook will diverge -- which is the correct outcome, and the reason the prediction is recorded as an argument","mitigation":"arg:predict_words vs region:rng is exactly that check"},{"what":"the expiry formula reproduces a signed idiv on nptf/npdtf without knowing whether nptf can be negative","risk":"low","why":"the original never sign-checks the traffic accumulator. The model truncates toward zero the same way; if the field is always non-negative the question never arises, and no save has been observed with a negative one","mitigation":""}]}},"Game::StrategyServer::ProcessNodeSpaceTravel":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"2945 bytes of node-space movement, entirely unmodelled and never swept for RNG by any lane","risk":"medium","why":"it is hooked here only because it runs TWICE a turn -- ProcessTurn phase 7 and tail phase 10 -- so a draw inside it would be double-counted by anyone modelling it once. The record says whether it draws at all","mitigation":"region:rng"}]}},"Game::EncounterDetect::AssignContacts":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the contact-to-detector assignment itself, and the two-pass outer loop","risk":"medium","why":"this hook exists because the draw here is INLINED and therefore invisible to every call-graph sweep and to the entry-point detours -- it is the one site in ProcessTurn's closure that neither instrument can see. It measures the word cost of the whole call and models nothing","mitigation":"region:rng; arg:detectors/contacts/max_trials bound the expected count"},{"what":"the per-trial threshold is 0.25f or 0.0f depending on two tech lookups, and the accept test short-circuits the inner loop","risk":"low","why":"so the measured cost is between |contacts| and |contacts| x |detectors| and the exact number depends on tech state this hook does not read","mitigation":"arg:max_trials is the upper bound only"}]}},"Game::EncounterDetect::ProcessTeamRecord":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the whole body of ProcessTeamRecord: the gate call, the two vector builds and the bucket construction","risk":"medium","why":"this hook measures the word cost of the call and recomputes three integers the original derives from the same record. It models none of the work and asserts nothing about the contact assignment","mitigation":"region:rng; arg:gate/pred_contacts/pred_detectors are a prediction, not a check"},{"what":"`+0xfc` and `+0xfb` are read as BYTES, following lane I's reading of the classifier functions","risk":"medium","why":"if either is really a wider field, every count here is wrong in the same direction and no cross-check inside this hook would notice. So the dword at +0xfc is read as well and any row where the two disagree is COUNTED, not silently resolved -- a non-zero disagreement count means the byte reading is unsafe on this workload","mitigation":"arg:fc_byte_vs_dword_disagreements; arg:entry_flags carries the raw values"},{"what":"an entry whose object pointer is unreadable is skipped","risk":"low","why":"it is not counted into any of the three classes, so entries != contacts + detectors + neither is the signal that this happened","mitigation":"arg:entries against the three class counts"}]}}}}} +{"ts":202117088,"hook":"Mars::RNG::Seed","mode":"trace","call_id":0,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"u32","v":0,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0de79bb8"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":233602624},"mt1":{"t":"u32","v":0},"mt2":{"t":"u32","v":1065353216},"mt623_left":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":2443250962},"mt1":{"t":"u32","v":1093594115},"mt2":{"t":"u32","v":1878467924},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":202199843,"hook":"Mars::RNG::Seed","mode":"trace","call_id":1,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x1f876a80","n":"rng"},{"t":"u32","v":3431414581,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x1f876a80"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":529370632},"mt1":{"t":"u32","v":16},"mt2":{"t":"u32","v":0},"mt623_left":{"t":"i32","v":14}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":3201035215},"mt1":{"t":"u32","v":3356749240},"mt2":{"t":"u32","v":2617362850},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":256424550,"hook":"Mars::RNG::Seed","mode":"trace","call_id":3,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0de79098","n":"rng"},{"t":"u32","v":4064245900,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0de79098"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":233286568},"mt1":{"t":"u32","v":869632184},"mt2":{"t":"u32","v":869631744},"mt623_left":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":2708645936},"mt1":{"t":"u32","v":298104520},"mt2":{"t":"u32","v":4130595105},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":256463957,"hook":"Game::StrategyApp::RunAI","mode":"trace","call_id":2,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"app"},{"t":"i32","v":32,"n":"player_net_id"},{"t":"str","v":"SavedGames/ar-turn37-816raiders.sav","n":"ai_data"},{"t":"u32","v":0,"n":"personality"},{"t":"u32","v":4064245900,"n":"rng_seed"}],"ret":null,"side":{}} +{"ts":256464079,"hook":"Mars::RNG::Seed","mode":"trace","call_id":5,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x34352570","n":"rng"},{"t":"u32","v":2977348927,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x34352570"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":870723600},"mt1":{"t":"u32","v":912099542},"mt2":{"t":"u32","v":2147959040},"mt623_left":{"t":"i32","v":925206942}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":376462705},"mt1":{"t":"u32","v":1408522452},"mt2":{"t":"u32","v":1997668355},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":256485502,"hook":"Game::StrategyApp::RunAI","mode":"trace","call_id":4,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"app"},{"t":"i32","v":496,"n":"player_net_id"},{"t":"str","v":"SavedGames/ar-turn37-816raiders.sav","n":"ai_data"},{"t":"u32","v":0,"n":"personality"},{"t":"u32","v":2977348927,"n":"rng_seed"}],"ret":null,"side":{}} +{"ts":256485610,"hook":"Mars::RNG::Seed","mode":"trace","call_id":7,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dede148","n":"rng"},{"t":"u32","v":2490921889,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0dede148"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":233915472},"mt1":{"t":"u32","v":1575750400},"mt2":{"t":"u32","v":3306446855},"mt623_left":{"t":"i32","v":-799615902}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":722610378},"mt1":{"t":"u32","v":1068857634},"mt2":{"t":"u32","v":2206442012},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":256505870,"hook":"Game::StrategyApp::RunAI","mode":"trace","call_id":6,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"app"},{"t":"i32","v":512,"n":"player_net_id"},{"t":"str","v":"SavedGames/ar-turn37-816raiders.sav","n":"ai_data"},{"t":"u32","v":0,"n":"personality"},{"t":"u32","v":2490921889,"n":"rng_seed"}],"ret":null,"side":{}} +{"ts":317826278,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":8,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x00000000","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x00000000","n":"rng"},{"t":"null","v":null,"n":"rng_words_in"},{"t":"null","v":null,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{}} +{"ts":317881280,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":11,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":317881509,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":12,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":317881612,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":10,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":317881701,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":9,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":37,"n":"turn"},{"t":"i32","v":2057,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":-1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":37}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":38}}}}}} +{"ts":317883323,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":14,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2106,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":-1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":317888305,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":15,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":317888388,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":13,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2105,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":-1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":369180643,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":17,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"encounter"},{"t":"ptr","v":"0x33da6c78","n":"result"},{"t":"u8","v":0,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2107,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":369180815,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":18,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2108,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":369180934,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":19,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2108,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":369181234,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":20,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":38,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":369182510,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":16,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x341575e4","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2106,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":369249965,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":21,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4596394},"calls":{"t":"u32","v":2},"words":{"t":"u32","v":2},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3093783},"calls":{"t":"u32","v":2},"words":{"t":"u32","v":2},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":81},"words":{"t":"u32","v":81},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3126945},"calls":{"t":"u32","v":80},"words":{"t":"u32","v":80},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":5},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":37,"n":"draw_site_words"},{"t":"u32","v":52,"n":"draw_site_calls"},{"t":"u32","v":174,"n":"draw_site_words_other_rng"},{"t":"u32","v":172,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497530914,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":22,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497578641,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":25,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497578805,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":26,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497578863,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":24,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497578947,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":23,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2108,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":38}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":39}}}}}} +{"ts":497579852,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":28,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2146,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497583179,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":27,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2145,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497625073,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":30,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"encounter"},{"t":"ptr","v":"0x33da6f88","n":"result"},{"t":"u8","v":1,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497625250,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":31,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497625356,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":32,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497625686,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":33,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":39,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497626964,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":29,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x34080e2c","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2146,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":497687942,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":34,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1061538},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3746217},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":12},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":40,"n":"draw_site_words"},{"t":"u32","v":53,"n":"draw_site_calls"},{"t":"u32","v":17,"n":"draw_site_words_other_rng"},{"t":"u32","v":8,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":8},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542625293,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":35,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542678627,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":38,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542678818,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":39,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542678904,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":37,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542678992,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":36,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":39}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":40}}}}}} +{"ts":542680245,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":41,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2185,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542684264,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":42,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":252,"n":"rng_words_in"},{"t":"i32","v":372,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":542684355,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":40,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2184,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":589033416,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":44,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"encounter"},{"t":"ptr","v":"0x33da75a8","n":"result"},{"t":"u8","v":0,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2186,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":252,"n":"rng_words_in"},{"t":"i32","v":372,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":589033725,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":45,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2186,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":252,"n":"rng_words_in"},{"t":"i32","v":372,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":589033907,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":46,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2186,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":252,"n":"rng_words_in"},{"t":"i32","v":372,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":589034325,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":47,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":40,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":252,"n":"rng_words_in"},{"t":"i32","v":372,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":589036572,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":43,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33f0119c","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2185,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":252,"n":"rng_words_in"},{"t":"i32","v":372,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":372},"index":{"t":"i32","v":252},"block":{"t":"i32","v":0},"words":{"t":"i64","v":252},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":589102847,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":48,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4596394},"calls":{"t":"u32","v":7},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3093783},"calls":{"t":"u32","v":7},"words":{"t":"u32","v":13},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":3053400},"calls":{"t":"u32","v":113},"words":{"t":"u32","v":113},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":188},"words":{"t":"u32","v":188},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3126945},"calls":{"t":"u32","v":186},"words":{"t":"u32","v":186},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1272421},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":9},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":37,"n":"draw_site_words"},{"t":"u32","v":52,"n":"draw_site_calls"},{"t":"u32","v":522,"n":"draw_site_words_other_rng"},{"t":"u32","v":509,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":3},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":3},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":3},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":3},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":12},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606876611,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":49,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606924412,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":52,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606924542,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":53,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606924599,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":51,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606924652,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":50,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":40,"n":"turn"},{"t":"i32","v":2186,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":40}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":41}}}}}} +{"ts":606925917,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":55,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2247,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606928631,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":56,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":273,"n":"rng_words_in"},{"t":"i32","v":351,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":606928703,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":54,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2246,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":256,"n":"rng_words_in"},{"t":"i32","v":368,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":368},"index":{"t":"i32","v":256},"block":{"t":"i32","v":0},"words":{"t":"i64","v":256},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":653206256,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":58,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"encounter"},{"t":"ptr","v":"0x33da6c78","n":"result"},{"t":"u8","v":0,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2250,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":273,"n":"rng_words_in"},{"t":"i32","v":351,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":653206522,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":59,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2251,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":273,"n":"rng_words_in"},{"t":"i32","v":351,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":653206688,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":60,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2251,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":273,"n":"rng_words_in"},{"t":"i32","v":351,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":653207129,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":61,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":41,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":273,"n":"rng_words_in"},{"t":"i32","v":351,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":653209237,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":57,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33fef3ec","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2249,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":273,"n":"rng_words_in"},{"t":"i32","v":351,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":351},"index":{"t":"i32","v":273},"block":{"t":"i32","v":0},"words":{"t":"i64","v":273},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":653274990,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":62,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":16},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3093783},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":21},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":3053400},"calls":{"t":"u32","v":259},"words":{"t":"u32","v":259},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":435},"words":{"t":"u32","v":435},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3126945},"calls":{"t":"u32","v":434},"words":{"t":"u32","v":434},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":6},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":37,"n":"draw_site_words"},{"t":"u32","v":53,"n":"draw_site_calls"},{"t":"u32","v":1159,"n":"draw_site_words_other_rng"},{"t":"u32","v":1150,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":16},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680670781,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":63,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680716973,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":66,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680717170,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":67,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680717235,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":65,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680717318,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":64,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":41,"n":"turn"},{"t":"i32","v":2251,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":41}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":42}}}}}} +{"ts":680718773,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":69,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2302,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680722016,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":68,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2301,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":277,"n":"rng_words_in"},{"t":"i32","v":347,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":347},"index":{"t":"i32","v":277},"block":{"t":"i32","v":0},"words":{"t":"i64","v":277},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680759469,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":71,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"encounter"},{"t":"ptr","v":"0x33da64d0","n":"result"},{"t":"u8","v":1,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2303,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":297,"n":"rng_words_in"},{"t":"i32","v":327,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680759626,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":72,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2303,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":297,"n":"rng_words_in"},{"t":"i32","v":327,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680759717,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":73,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2303,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":297,"n":"rng_words_in"},{"t":"i32","v":327,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680759931,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":74,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":42,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":297,"n":"rng_words_in"},{"t":"i32","v":327,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680761177,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":70,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x34429c24","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2302,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":297,"n":"rng_words_in"},{"t":"i32","v":327,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":327},"index":{"t":"i32","v":297},"block":{"t":"i32","v":0},"words":{"t":"i64","v":297},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":680823097,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":75,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4775764},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1061538},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3746217},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":5},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":40,"n":"draw_site_words"},{"t":"u32","v":55,"n":"draw_site_calls"},{"t":"u32","v":10,"n":"draw_site_words_other_rng"},{"t":"u32","v":8,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":5},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":5},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":5},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":5},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":20},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725900235,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":76,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725952121,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":79,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725952289,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":80,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725952350,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":78,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725952401,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":77,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":42,"n":"turn"},{"t":"i32","v":2303,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":42}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":43}}}}}} +{"ts":725953584,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":82,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2378,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725956997,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":81,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2377,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":301,"n":"rng_words_in"},{"t":"i32","v":323,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":323},"index":{"t":"i32","v":301},"block":{"t":"i32","v":0},"words":{"t":"i64","v":301},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725998298,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":84,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33d46730","n":"encounter"},{"t":"ptr","v":"0x33da7730","n":"result"},{"t":"u8","v":1,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2379,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":320,"n":"rng_words_in"},{"t":"i32","v":304,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725998496,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":85,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2379,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":320,"n":"rng_words_in"},{"t":"i32","v":304,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725998612,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":86,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2379,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":320,"n":"rng_words_in"},{"t":"i32","v":304,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":725998892,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":87,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":43,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":320,"n":"rng_words_in"},{"t":"i32","v":304,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":726000779,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":83,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x33fef46c","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2378,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":320,"n":"rng_words_in"},{"t":"i32","v":304,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":304},"index":{"t":"i32","v":320},"block":{"t":"i32","v":0},"words":{"t":"i64","v":320},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":726070341,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":88,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1061538},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3746217},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4765208},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":5},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":40,"n":"draw_site_words"},{"t":"u32","v":55,"n":"draw_site_calls"},{"t":"u32","v":10,"n":"draw_site_words_other_rng"},{"t":"u32","v":8,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":6},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":6},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":6},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":6},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":24},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":3},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771116354,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":89,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771168709,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":92,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771168853,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":93,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771168928,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":91,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771168997,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":90,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":43,"n":"turn"},{"t":"i32","v":2379,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":43}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":44}}}}}} +{"ts":771170018,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":95,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2434,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771174065,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":96,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x0debdb98","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771174179,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":97,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x0debdc0c","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":1,"n":"pred_detectors"},{"t":"i32","v":1,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":1},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16842752}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":771174240,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":94,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2433,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":325,"n":"rng_words_in"},{"t":"i32","v":299,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":299},"index":{"t":"i32","v":325},"block":{"t":"i32","v":0},"words":{"t":"i64","v":325},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817818980,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":99,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x0debdb98","n":"encounter"},{"t":"ptr","v":"0x33dab7f8","n":"result"},{"t":"u8","v":0,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2437,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":2,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817819295,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":100,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x0debdc0c","n":"encounter"},{"t":"ptr","v":"0x33dab970","n":"result"},{"t":"u8","v":0,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2437,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":2,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817819446,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":101,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2437,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817819562,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":102,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2437,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817819816,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":103,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de69e8","n":"slavers"},{"t":"i32","v":44,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817821292,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":98,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x3408130c","n":"results"},{"t":"i32","v":2,"n":"result_count"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2436,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":2,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":352,"n":"rng_words_in"},{"t":"i32","v":272,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":272},"index":{"t":"i32","v":352},"block":{"t":"i32","v":0},"words":{"t":"i64","v":352},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":817888694,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":104,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5f830","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":14},"words":{"t":"u32","v":14},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":7},"words":{"t":"u32","v":7},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":7},"words":{"t":"u32","v":7},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4798963},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4437093},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4780528},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":5},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4780891},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328480},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4434889},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4434973},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4435785},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4596394},"calls":{"t":"u32","v":10},"words":{"t":"u32","v":10},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3093783},"calls":{"t":"u32","v":32},"words":{"t":"u32","v":41},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":787},"words":{"t":"u32","v":787},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3126945},"calls":{"t":"u32","v":746},"words":{"t":"u32","v":746},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3049426},"calls":{"t":"u32","v":129},"words":{"t":"u32","v":160},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3074849},"calls":{"t":"u32","v":2},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3083128},"calls":{"t":"u32","v":39},"words":{"t":"u32","v":39},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":3053400},"calls":{"t":"u32","v":324},"words":{"t":"u32","v":324},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1272421},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":6},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":44,"n":"draw_site_words"},{"t":"u32","v":55,"n":"draw_site_calls"},{"t":"u32","v":2121,"n":"draw_site_words_other_rng"},{"t":"u32","v":2077,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":7},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":7},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":7},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":7},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":3},"calls_since_launch":{"t":"u32","v":27},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":3},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":3},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x00d5f830"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835557918,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":105,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x00d5fa40","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0dec7b00","n":"server_cached"},{"t":"ptr","v":"0x03d17b90","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x00d5fa40"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835599376,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":108,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835599620,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":109,"thread":5640,"depth":2,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835599682,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":107,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x03de6a30","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835599732,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":106,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":44,"n":"turn"},{"t":"i32","v":2437,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":44}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":45}}}}}} +{"ts":835600760,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":111,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"i32","v":45,"n":"turn"},{"t":"i32","v":2502,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835603396,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":112,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x0debdb98","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":372,"n":"rng_words_in"},{"t":"i32","v":252,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":252},"index":{"t":"i32","v":372},"block":{"t":"i32","v":0},"words":{"t":"i64","v":372},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":252},"index":{"t":"i32","v":372},"block":{"t":"i32","v":0},"words":{"t":"i64","v":372},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835603494,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":113,"thread":5640,"depth":1,"args":[{"t":"ptr","v":"0x00d5efd4","n":"ctx"},{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"ptr","v":"0x0debdc0c","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":372,"n":"rng_words_in"},{"t":"i32","v":252,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":252},"index":{"t":"i32","v":372},"block":{"t":"i32","v":0},"words":{"t":"i64","v":372},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":252},"index":{"t":"i32","v":372},"block":{"t":"i32","v":0},"words":{"t":"i64","v":372},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":835603546,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":110,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x0dec7b00","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":45,"n":"turn"},{"t":"i32","v":2501,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0de79bb8","n":"rng"},{"t":"i64","v":355,"n":"rng_words_in"},{"t":"i32","v":269,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":269},"index":{"t":"i32","v":355},"block":{"t":"i32","v":0},"words":{"t":"i64","v":355},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":252},"index":{"t":"i32","v":372},"block":{"t":"i32","v":0},"words":{"t":"i64","v":372},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":882413938,"hook":"Mars::RNG::Seed","mode":"trace","call_id":114,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x33fed090","n":"rng"},{"t":"u32","v":268324285,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x33fed090"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":875284040},"mt1":{"t":"u32","v":4},"mt2":{"t":"u32","v":0},"mt623_left":{"t":"i32","v":872066648}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":2376414167},"mt1":{"t":"u32","v":3182422085},"mt2":{"t":"u32","v":401000165},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":888219272,"hook":"Mars::RNG::Seed","mode":"trace","call_id":115,"thread":5640,"depth":0,"args":[{"t":"ptr","v":"0x00d5ed68","n":"rng"},{"t":"u32","v":278311435,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x00d5ed68"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":256},"mt1":{"t":"u32","v":1},"mt2":{"t":"u32","v":1},"mt623_left":{"t":"i32","v":14022484}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":1884260152},"mt1":{"t":"u32","v":2661721365},"mt2":{"t":"u32","v":682561293},"mt623_left":{"t":"i32","v":624}}}}}} diff --git a/verify/traces/ar-r2-control-turn38-turn39.jsonl b/verify/traces/ar-r2-control-turn38-turn39.jsonl new file mode 100644 index 0000000..ec4d4eb --- /dev/null +++ b/verify/traces/ar-r2-control-turn38-turn39.jsonl @@ -0,0 +1,36 @@ +{"meta":{"format":1,"build":"ar-989c692-20260909T0313Z","exe_sha256":"970b7de729956a53094c7eb98aba4270aee98e2fed5daf0d39e290013c90c841","started":"2026-09-09T04:23:29Z","inline_max":64,"hooks":{"Shim::SelfTest::Fill":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"complete","why":"Fill writes buf[0..n) and nothing else; the whole range is a declared region","unmodelled":[]}},"Mars::GlobalConsts::LoadFile":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"erases each consumed key from the caller's std::map","risk":"medium","why":"the map is a LoadAll temporary; declaring a red-black tree as a region is not possible before the call. First-occurrence-wins is reproduced in game::config::apply instead, so the *effect* is modelled, the container is not","mitigation":"LoadAll's post-state would have to be hooked to see it"},{"what":"writes three kinds of line to the game log (unrecognised key, applied key, expected-but-not-found)","risk":"low","why":"log text is not part of the simulation state","mitigation":""},{"what":"opens the file through the VFS and allocates/releases a refcounted buffer","risk":"low","why":"ours performs the same two calls, so allocation behaviour matches by construction rather than by comparison","mitigation":""},{"what":"String slots assign through the engine's own std::string, leaking one heap block per long string in compare mode","risk":"low","why":"start-up only; documented in docs/M1.md","mitigation":""}]}},"Game::ServerPlayer::ComputeBudget":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"slots 1, 2, 3, 4, 7 and 11 are produced by callees this milestone does not model (per-system output, trade, ship-carried population, a second manager, the build-queue spend)","risk":"high","why":"they are copied out of the original's own output and back into the same slots, so they match BY CONSTRUCTION and prove nothing","mitigation":"declared input boundary; see budget_inputs.h"},{"what":"ServerSystem::ComputeOutput repairs damaged ships in orbit","risk":"high","why":"replace mode runs the original a second time on a scratch Budget to harvest the six unmodelled slots, so that repair happens TWICE per turn in replace mode and nothing in the trace would show it","mitigation":"guard:budget_object does not reach the ships; unverified"},{"what":"the difficulty-mods row still DRIVES `ours` as two fitted constants","risk":"low","why":"the old note here said the row was 'not reachable from a ServerPlayer'. That was wrong: the record is at ServerPlayer+0x36c and every consumer calls DifficultyMods_Select(p->+0x36c, p). Lane L5 now snapshots it and emits it as `inputs.live_difficulty` alongside the fitted pair, so a run SHOWS whether the fit is right instead of assuming it. `ours` was deliberately left on the fitted constants so that this run is evidence about them; switching it over is the next lane's one-line change","mitigation":"logged as `inputs.live_difficulty` on every record"},{"what":"three of the four float widths this routine turns on are unexercised by any reference turn","risk":"medium","why":"the savings-interest rate is a widened 0.01f and its boundary IS in the corpus (a treasury of 50,000 earns 499, not 500). The research yield factor is a widened 0.85f whose boundary needs a research money that is a multiple of 40,000, and the three research modifiers are summed in SINGLE precision, which needs two of them non-zero -- the corpus has shrm = TRM = 0. So a green compare here verifies one of the three and says nothing about the other two","mitigation":"the record carries `inputs.live_consts` so the widths are readable, and tests/game_sim/test_economy.cpp pins all three at their boundaries"},{"what":"the research-allocation vector's heap block","risk":"low","why":"only the element count is compared; the three words are heap pointers the default policy ignores","mitigation":""}]}},"Game::WeaponDictionary::Init":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"LoadWeapon -> WeaponDef::ParseScript registers each weapon's name with the string table and resolves `requires` against the live TechTree","risk":"high","why":"per-file parsing is M3 scope; ours delegates to the game's own LoadWeapon, so a compare run performs the registration a SECOND time and neither the string table nor the tech tree is a declared region","mitigation":"suspected cause of the sibling section hook's compare crash (docs/M2.md)"},{"what":"allocates 123 WeaponDef objects (0x278 bytes each) on the game heap","risk":"low","why":"the definitions do not exist when the hook is entered, so they cannot be a before-snapshot; the dictionary region compares them by id/name/path","mitigation":""},{"what":"the word at dictionary+0x14","risk":"low","why":"not modelled; emitted as an opaque pointer, which the default policy ignores -- a change is visible in a trace but never a divergence","mitigation":"guard:dict"},{"what":"writes lines to the game log for a missing manifest","risk":"low","why":"log text is not simulation state","mitigation":""},{"what":"std::sort tie order for equal weapon names","risk":"low","why":"msvc_sort.h replays MSVC 2010's introsort, but the shipped data has no tied names, so the tie rule is unexercised rather than verified","mitigation":""}]}},"Game::SectionDictionary::SectionDictionary":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"LoadSection registers each section with the string table and the live TechTree, and may append to the dictionary's own vector","risk":"high","why":"M3 scope; ours delegates to the game's LoadSection after the original has already built all 885 definitions, so the second pass registers duplicates -- the leading hypothesis for this hook's compare-mode crash","mitigation":"see docs/M2.md; compare mode for this hook is not safe to run"},{"what":"post-load validation pass over every definition's @-token against the string table","risk":"medium","why":"runs after the loop and touches no declared region","mitigation":""},{"what":"allocates 885 SectionDef objects (0x3d8 bytes each) on the game heap","risk":"low","why":"they do not exist at hook entry; compared by index/species/id/token","mitigation":""},{"what":"the word at dictionary+0x14","risk":"low","why":"not modelled; emitted as an ignored pointer","mitigation":"guard:dict"},{"what":"the before-snapshot of the object is uninitialised heap","risk":"medium","why":"the hook is on the constructor, so `before` is meaningless and only `after` carries information","mitigation":""}]}},"Game::TechTree::ProcessResearch":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"posts EVENT_RESEARCH_OVERBUDGET on the owner's EventStorage: ours reproduces the decision and the id sequence, so region:events compares next_id, but the composed EvDsc/EvMsg text is not reproduced and no region can see it","risk":"medium","why":"text comes from the game's string table, which the engine must not carry; ours posts into its own EventStorage and writes only the counts into the scratch copy, so no live byte moves and replace mode posts nothing at all","mitigation":"region:events"},{"what":"composes EVENT_TECHS_UNLOCKED's message from the unlocked techs' names","risk":"low","why":"the trigger and the list are modelled (SetResearched's availability sweep plus the tail collector, both read off the instruction stream), so region:events compares next_id; the names come from the game's string table, so the message is composed from node indices instead and is not the game's text","mitigation":"region:events"},{"what":"TechTree::SetResearched in REPLACE mode: nothing of it runs","risk":"high","why":"the cascade is compare-mode only. In replace mode every pointer is live game memory, and applying half of OnTechResearched -- the observed-tech append and the research-event roll, but not the tech-effect field writes -- would leave the player in a state no code path produces. A replace run therefore still leaves the completed node unstamped and no tech unlocked","mitigation":"guard:player, guard:tree_header"},{"what":"ServerPlayer::OnTechResearched's tech effects: the ~90 hard-coded ServerPlayer field writes, the plague-cure masks, the design-option bitmasks and the species tech flags","risk":"high","why":"B2's milestone. `ours` models only the two parts of the callback this hook's regions can see -- the observed-tech append and the RNG word RollResearchEvent draws before its branch (one word on a missed roll, two on a fired plague roll) -- and the rest is what the player guard reports","mitigation":"guard:player"},{"what":"the research-event branch RollResearchEvent takes when its roll beats the odds (ServerPlayer::OnResearchRollSucceeded: the plague and AI-rebellion event paths)","risk":"high","why":"RollResearchEvent draws one NextFloat unconditionally and that draw IS modelled -- but that is only the cost of REACHING the branch. A FIRED roll costs one or two words: the plague path draws a SECOND word (NextInt) to pick an owned system and posts EVENT_PLAGUE_OUTBREAK, while the rebellion path allocates an AIRebellion at ServerPlayer+0x3b8 and CANCELS the current research (no further draw). The branch is entered only for the plague and AI-rebellion tech families, whose odds are 0 everywhere else, and it has never been observed firing in three sessions -- which is why every earlier note in this repo said 'exactly one NextFloat' and nothing caught it. If it is ever entered, region:rng is the check","mitigation":"region:rng"},{"what":"constructs the ObservedTech element it appends to ServerPlayer+0x274","risk":"medium","why":"`ours` models the append DECISION -- RecordObservedTech de-duplicates by tech name, so it decides whether the vector grows -- and moves the scratch header's byte span by one 0x2c element per append. The element's own fields (turn_first, turn_last, detected, the name string, `with`) are not built, and no region can see them","mitigation":"region:observed_techs"},{"what":"the tree's completion-order counter (TechTree+0x20) is read pre-call, not modelled as a region","risk":"low","why":"the per-node `order` word IS compared, and it is stamped from a counter `ours` seeds from the pre-call read and advances itself; the counter's own final value is only seen by the tree_header guard","mitigation":"guard:tree_header"},{"what":"writes a completion line to the game log","risk":"low","why":"log text is not simulation state","mitigation":""}]}},"Game::ServerPlayer::OnTechResearched":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"posts EVENT_RESEARCH_COMPLETE / _UNDERBUDGET / _TEMPERANCE on the owner's EventStorage when !silent","risk":"high","why":"the same class of write as B3's defect, and this hook has no replace-mode oracle that could catch it: gotcha 4 in docs/B2.md says a changed save hash on a completion turn is expected and therefore not a finding","mitigation":"guard:player (EventStorage is inline at ServerPlayer+0x29c)"},{"what":"writes every owned system's AI flag (CCC_AIVrus / CCC_AISlv), re-evaluates the arcology civilian cap, cures addiction and clears plague across systems AND ships","risk":"high","why":"writes through pointers to other objects; compare mode must not touch live state, and no region reaches them","mitigation":""},{"what":"the pending plague-cure roll (ServerPlayer::RollResearchEvent)","risk":"high","why":"it draws one word from the strategic generator unconditionally, and a SECOND word (NextInt) when the roll beats the odds and takes the plague path -- which also posts EVENT_PLAGUE_OUTBREAK, while the rebellion path cancels the research. So a fired roll costs one or two words, not one; running it in compare mode would consume real randomness. The two words it guards are still cleared and the record says whether it would have fired","mitigation":"this is the extra draw B3 observed on a completion"},{"what":"TechTree::SetResearched for the Zuul boarding-pod grant","risk":"medium","why":"it would mutate the live tree, and it recurses","mitigation":""},{"what":"allocates or frees the node-bore block at ServerPlayer+0x308","risk":"medium","why":"ours has no allocator the game's runtime could free, so replace mode calls the game's own updater -- which means replace mode never exercises our node-bore selection at all","mitigation":"region:node_bore, declared only when the block already exists"}]}},"Game::ServerSystem::ProcessTurn":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"the addiction sweep raises MoraleEvents, which are constructed and appended to the system's capped morale history","risk":"high","why":"the same class of write as B3's defect. sim::ProcessColonyTurn does compute the morale events (ColonyTurnResult), but the hook never emits them: DescribeMoraleEvents is dead code, so they are neither compared nor logged","mitigation":"guard:system"},{"what":"every callee: the plague pass, imperial and civilian growth, the resource debit, in-orbit refuel, slaves, rebellion and the build queue","risk":"high","why":"declared input boundary -- ProcessTurn is a dispatcher and only the words it writes itself are modelled. The callees raise EVENT_SLAVES_DEAD, EVENT_SYSTEM_REBELLION_CONTINUES, the plague events and SEBuildCompleted, create ships and bump per-player ShipRecords counters","mitigation":"guard:system covers the system object only, not the other objects"},{"what":"ApplyInfraBonus / ApplyPopBonus read the owner's home-system id, and the build queue writes the owning ServerPlayer","risk":"medium","why":"writes through a pointer to another object; no region reaches the player","mitigation":""},{"what":"ProcessRebellion is the pass's only RNG consumer and its draw count is data-dependent","risk":"low","why":"the generator IS a declared region, so a moved post-state is visible and names the system whose rebellion fired -- it is reported, not modelled","mitigation":""},{"what":"replace mode is refused for this hook","risk":"medium","why":"our side models the dispatcher's own writes and none of the callees, so a replace run would silently skip a colony's whole turn. There is therefore no oracle layer behind the compare for this hook","mitigation":""}]}},"Game::ServerSystem::GroupOutput":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"the imperial and civilian output modifiers, the 1.8 factor and the 500000 divisor are literals inside the executable, so nothing about them is assumed from the data files","unmodelled":[{"what":"the station count that scales the imperial term","risk":"high","why":"the original gets it from a helper that walks the system's fleets and their ships through virtual calls and takes the system in EBX, which a hook cannot call portably. `ours` therefore assumes ZERO stations. A divergence on an imperial row is expected to be exactly the station factor, and the record carries `count` and the return, so the factor is MEASURED from the trace rather than fitted","mitigation":"declared input boundary; the trace makes it recoverable"},{"what":"the slave row's output modifier, and every value the data files supply","risk":"medium","why":"SLAVES_OUTPUT_MOD, the two morale thresholds and their two modifiers, and STATION_BONUS_IMPERIAL_OUTPUT are read out of the live process's globals and logged with every record, so the record says which value drove it","mitigation":"logged as `tuning` on every record"}]}},"Game::ServerSystem::ComputeTotalOutput":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"the station count, as for GroupOutput","risk":"high","why":"`ours` assumes zero stations, so a system with an imperial population and a station diverges by the station factor","mitigation":"declared input boundary"},{"what":"the slave population and its xenotech adjustment","risk":"high","why":"the original's slave count is not a plain field: it runs the count through a per-species xenotech factor. `ours` takes the slave term as ZERO, so any system holding slaves diverges. The record logs the raw group-2 population sums so a divergence can be attributed","mitigation":"declared input boundary"},{"what":"the capacity surplus the civilian term adds for the owner's own species","risk":"medium","why":"the original calls the carrying-capacity helper twice with different out-parameter slots and adds max(0, B - A) to the civilian count; `ours` uses the raw civilian population. The surplus is zero except when the colony is at its cap","mitigation":"declared input boundary"},{"what":"the addiction phase","risk":"low","why":"`ours` assumes it is below 3, so ADDICTION_OUTPUT_MOD never applies; the record logs the system's addiction table length so the case is visible","mitigation":""}]}},"Game::ServerPlayer::ProcessTurn":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"phases 2, 3 and 6 -- the savings apply Sav = SatAdd(budget[0], net), the three aid/trade records copied out of the budget, and the research refund -- are NOT declared and NOT compared","risk":"high","why":"all three are pure functions of ComputeBudget's 22-slot output and of ProcessResearch's overBudget out-parameter, and both live in the original's own stack frame ([ebp-0x90] and [ebp-0x14]). The three ways to reach them are each worse than not having them: call ComputeBudget ourselves (it repairs damaged ships in orbit -- harness-audit #6), read them out of the nested B1/B3 hooks (harness-audit #5, the self-fulfilling compare), or infer them from the observed Sav delta (the same trap). The formulas ARE written and unit-tested in player_turn_inputs.cpp; they are simply not wired into the verdict","mitigation":"guard:player reports Sav, +0xc8 and +0xcc moving"},{"what":"ComputeBudget (0x00863030) itself, including ServerSystem::ComputeOutput, which REPAIRS DAMAGED SHIPS IN ORBIT","risk":"high","why":"B1 is the hook that checks the budget; its ship-repair side effect happens inside this call too, once per system per player per turn","mitigation":"run hook.Game::ServerPlayer::ComputeBudget=compare alongside"},{"what":"TechTree::ProcessResearch and the whole SetResearched / OnTechResearched cascade it can trigger: progress, the completion roll, the 5% decay sweep, the child-unlock cascade, ~90 tech-effect field writes, EVENT_RESEARCH_* and EVENT_TECHS_UNLOCKED","risk":"high","why":"declared input boundary. B3/U own it; this hook reports the pre-call research state and lets the player guard say how much moved","mitigation":"guard:player, and hook.Game::TechTree::ProcessResearch=compare"},{"what":"RollResearchAccident (0x00889dc0) draws Mars::RNG::NextInt(100) whenever the research boost is non-zero, can apply progress loss across EVERY system, and posts EVENT_LABACCIDENT_{SMALL,MEDIUM,LARGE}","risk":"high","why":"it runs before ProcessResearch and gates it entirely. Its draws move the declared `rng` region, so they are visible -- but as an unexplained RNG divergence, not as their cause","mitigation":"region:rng shows the draws; nothing shows the systems it wrote"},{"what":"the ResearchRollPending roll: RollResearchEvent draws one NextFloat, and when it BEATS the odds the plague branch draws a SECOND word (NextInt) and posts EVENT_PLAGUE_OUTBREAK, while the rebellion branch allocates an AIRebellion at ServerPlayer+0x3b8 and cancels the current research","risk":"high","why":"every previous coverage note in this repo says 'exactly one NextFloat'. That is the cost of REACHING the branch; a fired roll costs one or two words. The branch has never been observed firing. `predict_roll` says whether we expected the roll, `region:rng` says what it actually cost, and `roll_flags` says whether ResErrRoll was consumed","mitigation":"region:rng + region:roll_flags + guard:player; ours never rolls"},{"what":"ServerPlayer::ProcessSpecialProjects (0x00840fe0) and, for an AI player, ConstructionSpend (0x00817f90)","risk":"medium","why":"1015 bytes of special-project state, plus the log line \"SpecialProject: %s completed investigation phase\"","mitigation":"guard:player"},{"what":"the EVENT_NO_RESEARCH post at 0x0089168c, which appends to the player's EventStorage (+0x29c) and bumps EvNxID (+0x2b0)","risk":"medium","why":"B3's exact failure mode: a list append outside every Result region. Its condition is fully known (ResT == 0, nothing completed this turn, and at least one state-2 tech exists) but ours posts nothing","mitigation":"guard:player reports the EvNxID bump"},{"what":"PruneRaidTargets (0x00863cf0) erases from the heap vector at +0x338","risk":"low","why":"the vector header is inside the player guard, but its elements are heap memory no region reaches, and the erase runs each removed element's scalar destructor","mitigation":"guard:player sees the header move only"},{"what":"the timed-bonus element regions are captured from the PRE-CALL element addresses, and the sweep may shrink the vector under them","risk":"low","why":"erase moves data down inside the same buffer and only lowers _Mylast, so the addresses stay valid and readable. Elements past the new _Mylast are compared as stale bytes; `bonus_header` is the region that carries the count, and ours writes the same stale tail the original leaves","mitigation":"region:bonus_header"},{"what":"replace mode is refused for this hook","risk":"medium","why":"ours models the driver's own writes and none of ComputeBudget, ProcessResearch, ProcessSpecialProjects or the raid-target prune. A replace run would leave a player in a state no code path produces, and there is therefore no oracle layer behind this compare","mitigation":""}]}},"Game::StrategyServer::MoveFleet":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"on arrival: dispatches SEFleetArrived and runs one of three arrival handlers by destination kind (enter system / join fleet / stop at point)","risk":"high","why":"declared input boundary -- an arriving call is expected to differ in all of it, and none of it is declared, so the compare says nothing about arrivals","mitigation":"guard:fleet sees the fleet's own words; the event and the system do not"},{"what":"on departure: cancels every still-acting ship (with a log line each) and calls ServerSystem::FleetDeparts, which rewrites the system's ownership bits","risk":"high","why":"writes through pointers to ships and to the system","mitigation":""},{"what":"the tanker top-up refuels other ships in the fleet","risk":"medium","why":"the per-ship range regions would show it, but ours does not model it, so a fleet with a tanker diverges for a known reason","mitigation":""},{"what":"a node-line waypoint's step comes from the stutter profile","risk":"medium","why":"NodeLineStep / BuildStutterSegments are written and unit-tested but not wired in; the hook steps every waypoint type as speed x dt, so a node-line leg is knowingly mis-stepped and only its type is recorded","mitigation":"declared gap: docs/B4.md"},{"what":"a missed probabilistic jump scatters the fleet in a random direction","risk":"medium","why":"the direction is a second draw whose mapping is not modelled; ours leaves the position alone and reports the scatter distance, so the generator region diverges by one word on a miss","mitigation":""},{"what":"the route revalidation and the waypoint list itself","risk":"medium","why":"declared input boundary; the waypoint vector is not a region","mitigation":""}]}},"Game::StrategyServer::ProcessFleetMovement":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"`ours` re-reads the LIVE fleet list after the original has run","risk":"high","why":"the gate-traffic total is computed by the original at the very end of the pass, so a pre-call snapshot would diverge for the wrong reason. It breaks the compare invariant that ours never touches live memory, and it makes this hook's verdict partly self-fulfilling: the input to our arithmetic is the original's own post-move state","mitigation":""},{"what":"drives MoveFleet up to five times per fleet","risk":"high","why":"every undeclared effect of MoveFleet happens inside this call too; the pass schedule is recorded in the arguments but never compared","mitigation":""},{"what":"writes FPdpos into every fleet and clears flags 0x2 and 0x100 on every fleet","risk":"high","why":"no region covers the fleets, only the players' gate-traffic words","mitigation":""},{"what":"OnFleetArrived posts EVENT_FLEET_ARRIVED","risk":"high","why":"the same class of write as B3's defect, and there is no replace mode for this hook, so nothing behind the compare could catch it either","mitigation":""},{"what":"the original accumulates by player->index but writes back by the player's position in the server vector, into a fixed 32-int array with no bounds check","risk":"medium","why":"a real latent bug in the original that our side reproduces only while index == position; the reference save never separates them","mitigation":""},{"what":"PassSchedule() is never called by the hook, and FleetSummary::targetFleetId / relation are never filled","risk":"medium","why":"the header claims ours predicts the call order for a trace to check; that prediction is not actually emitted","mitigation":""}]}},"Game::StrategyHost::Autosave":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the whole save write: four path buffers, the ENDTURN pair removal, the backup rotation, the per-player connection detach/reattach, and SaveGame_WriteFile 0x00877070 itself","risk":"low","why":"this hook exists to timestamp the generator at the two moments the two save files are written. It is a marker and models nothing","mitigation":"region:rng only"},{"what":"the generator is reached through a CACHED StrategyServer pointer, not from this call's own arguments","risk":"medium","why":"`this` is the global at 0x00b29f98, hardcoded by both call sites, and no argument here names the server. On the first pre-turn autosave after a load no turn driver has run yet, so the cache is empty and that record carries no ledger position -- the FIRST BRACKET OF A SESSION IS INCOMPLETE BY CONSTRUCTION and must not be read as a zero-cost turn","mitigation":"arg:server_cached / host_plus_0x54 / server_agrees say which pointer was used and whether the +0x54 candidate is the same object"}]}},"Game::StrategyServer::ProcessTurn":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"no model of the turn's RNG cost: 32 phases, each of which may draw","risk":"high","why":"ProcessResearch's completion roll, RollResearchAccident's NextInt(100), the ResearchRollPending roll (one word, or two on the plague path), and whatever ProcessStations / ProcessSurrenders / ProcessMissions / ProcessSpecialProjects spend -- none of which has ever been measured. `ours` predicts nothing and the record reports the measurement","mitigation":"region:rng measures the total; the per-phase split is not resolved here"},{"what":"this hook takes the address the fpu module also wants to sample","risk":"low","why":"MinHook allows one hook per target. `fpu.sample_turn=off` releases StrategyServer::ProcessTurn so this hook can install; with it on, this hook fails to install and the trace is missing half the ledger","mitigation":"shim.log records the MH_CreateHook status for both"}]}},"Game::StrategyServer::OnAllCombatDone_Tail":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"36 phases, of which two can draw and neither is modelled here","risk":"high","why":"phase 6 reaches the unread 7499-byte combat resolver 0x007d5af0 (NextInt on the node-cannon path, Twist plus NextInt on the salvage path) and phase 11 draws one word per expired node line. `predict_nodeline_words` covers only the second, and the nested ApplyEncounterResult / NodeLineDecay hooks are what attribute the split","mitigation":"region:rng plus the two nested hooks"},{"what":"whether this handler runs on a turn with NO combat is what this hook is here to settle, and until it has run it is a hypothesis","risk":"medium","why":"combat-done-tail.md \u00c2\u00a76 infers it from the determinism note -- the post-turn autosave appears on every End Turn and this handler is its only reachable caller -- not from the instruction stream","mitigation":"arg:encounters says how many encounters this call saw; a call with 0 settles it"}]}},"Game::StrategyServer::ApplyEncounterResult":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the combat resolver 0x007d5af0 (7499 B) is completely unread","risk":"high","why":"this hook measures what its subtree spends and models none of it. Nothing about combat determinism can be settled until that function is read; this only puts a number on the hole","mitigation":"region:rng measures the subtotal"},{"what":"the ~0xea0-byte combat report, the CombatReport list append at S+0x1fc, the ClientEncounterResults push into S+0x2f4, the per-ship turn stamps and the pairwise engagement bits","risk":"medium","why":"all of it is game state this hook does not declare and does not check","mitigation":""}]}},"Game::StrategyServer::NodeLineDecay":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the collapse itself: 0x007a92e0 (690 B) and 0x007a4700 (2244 B) destroy or halt fleets and post EVENT_NODEDECAY_FLEET_DESTROYED_VIANODE / _HALTED / _HALTED_VIANODE, and loop 3 posts two more decay-stage events","risk":"high","why":"ours advances the generator and writes nothing else. In compare mode that is the intent -- the check is the word count -- but it means a clean verdict here says nothing about which lines actually collapsed","mitigation":"region:rng only"},{"what":"the draw-count model is verified by a DIRECT-call sweep of the downstream pair; their subtrees contain unresolved indirect call sites","risk":"medium","why":"if one of those vtable slots reaches a generator, the measured delta will exceed `predict_words` and this hook will diverge -- which is the correct outcome, and the reason the prediction is recorded as an argument","mitigation":"arg:predict_words vs region:rng is exactly that check"},{"what":"the expiry formula reproduces a signed idiv on nptf/npdtf without knowing whether nptf can be negative","risk":"low","why":"the original never sign-checks the traffic accumulator. The model truncates toward zero the same way; if the field is always non-negative the question never arises, and no save has been observed with a negative one","mitigation":""}]}},"Game::StrategyServer::ProcessNodeSpaceTravel":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"2945 bytes of node-space movement, entirely unmodelled and never swept for RNG by any lane","risk":"medium","why":"it is hooked here only because it runs TWICE a turn -- ProcessTurn phase 7 and tail phase 10 -- so a draw inside it would be double-counted by anyone modelling it once. The record says whether it draws at all","mitigation":"region:rng"}]}},"Game::EncounterDetect::AssignContacts":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the contact-to-detector assignment itself, and the two-pass outer loop","risk":"medium","why":"this hook exists because the draw here is INLINED and therefore invisible to every call-graph sweep and to the entry-point detours -- it is the one site in ProcessTurn's closure that neither instrument can see. It measures the word cost of the whole call and models nothing","mitigation":"region:rng; arg:detectors/contacts/max_trials bound the expected count"},{"what":"the per-trial threshold is 0.25f or 0.0f depending on two tech lookups, and the accept test short-circuits the inner loop","risk":"low","why":"so the measured cost is between |contacts| and |contacts| x |detectors| and the exact number depends on tech state this hook does not read","mitigation":"arg:max_trials is the upper bound only"}]}},"Game::EncounterDetect::ProcessTeamRecord":{"ftol":0,"ftol_kind":"abs","ptr":"ignore","coverage":{"state":"partial","why":"","unmodelled":[{"what":"everything the original writes except the strategic generator","risk":"high","why":"this hook family measures ONE thing -- how many words the generator advances and where. It declares no region over game state and makes no claim about it. A clean run here says the RNG accounting is right and says nothing whatever about whether the turn was computed correctly","mitigation":"region:rng is the only check; the turn's own correctness is B1/B3/B4's job"},{"what":"the ledger reports WORDS, not draws","risk":"low","why":"a NextInt that rejects three times is four words and one call. Words are the unit that decides whether a save reproduces; they are the wrong unit for counting decisions, and nothing here should be read as a draw count","mitigation":"region:rng carries left/block/words, never a call count"},{"what":"the ledger is deliberately blind to WHICH primitive spent a word","risk":"low","why":"that is the design, and it is why this instrument was preferred to hooking the primitives: the image has FOUR draw entry points (NextFloat 0x0047d830, NextInt 0x004271c0, Chance 0x008e6dd0 and NextUInt 0x004f7670, the last of which appears in no previous lane's primitive set) plus inlined draws in at least twelve functions, two of them reachable from the turn roots. A primitive-counting hook would have silently undercounted every one of those","mitigation":"region:rng reads the state, so an inlined draw is as visible as a called one"},{"what":"a generator position the ledger cannot place reads `words: null`","risk":"medium","why":"a block more than 4096 twists ahead of the frontier, or any state behind the anchor, is reported unknown rather than guessed. A null in a ledger field is a measurement failure and must not be read as zero","mitigation":"region:rng emits null explicitly; tracecmp shows it as a value, not a gap"},{"what":"the whole body of ProcessTeamRecord: the gate call, the two vector builds and the bucket construction","risk":"medium","why":"this hook measures the word cost of the call and recomputes three integers the original derives from the same record. It models none of the work and asserts nothing about the contact assignment","mitigation":"region:rng; arg:gate/pred_contacts/pred_detectors are a prediction, not a check"},{"what":"`+0xfc` and `+0xfb` are read as BYTES, following lane I's reading of the classifier functions","risk":"medium","why":"if either is really a wider field, every count here is wrong in the same direction and no cross-check inside this hook would notice. So the dword at +0xfc is read as well and any row where the two disagree is COUNTED, not silently resolved -- a non-zero disagreement count means the byte reading is unsafe on this workload","mitigation":"arg:fc_byte_vs_dword_disagreements; arg:entry_flags carries the raw values"},{"what":"an entry whose object pointer is unreadable is skipped","risk":"low","why":"it is not counted into any of the three classes, so entries != contacts + detectors + neither is the signal that this happened","mitigation":"arg:entries against the three class counts"}]}}}}} +{"ts":167980113,"hook":"Mars::RNG::Seed","mode":"trace","call_id":0,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"u32","v":0,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0e229db0"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":236920784},"mt1":{"t":"u32","v":1575750400},"mt2":{"t":"u32","v":3306446855},"mt623_left":{"t":"i32","v":-799615902}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":2443250962},"mt1":{"t":"u32","v":1093594115},"mt2":{"t":"u32","v":1878467924},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":168067287,"hook":"Mars::RNG::Seed","mode":"trace","call_id":1,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e23fb88","n":"rng"},{"t":"u32","v":2643601460,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0e23fb88"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":236921576},"mt1":{"t":"u32","v":16},"mt2":{"t":"u32","v":0},"mt623_left":{"t":"i32","v":-1}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":3929580531},"mt1":{"t":"u32","v":1537699969},"mt2":{"t":"u32","v":811142571},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":229626567,"hook":"Mars::RNG::Seed","mode":"trace","call_id":3,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e28bd58","n":"rng"},{"t":"u32","v":99366953,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0e28bd58"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":237275176},"mt1":{"t":"u32","v":237550936},"mt2":{"t":"u32","v":8683116},"mt623_left":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":3560799337},"mt1":{"t":"u32","v":2353252208},"mt2":{"t":"u32","v":861403528},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":229658491,"hook":"Game::StrategyApp::RunAI","mode":"trace","call_id":2,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"app"},{"t":"i32","v":32,"n":"player_net_id"},{"t":"str","v":"SavedGames/ar-turn37-816raiders.sav","n":"ai_data"},{"t":"u32","v":0,"n":"personality"},{"t":"u32","v":99366953,"n":"rng_seed"}],"ret":null,"side":{}} +{"ts":229658659,"hook":"Mars::RNG::Seed","mode":"trace","call_id":5,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x3517f178","n":"rng"},{"t":"u32","v":3832490328,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x3517f178"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":891332952},"mt1":{"t":"u32","v":0},"mt2":{"t":"u32","v":1},"mt623_left":{"t":"i32","v":15}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":2239706452},"mt1":{"t":"u32","v":1349933464},"mt2":{"t":"u32","v":1874883795},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":229679357,"hook":"Game::StrategyApp::RunAI","mode":"trace","call_id":4,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"app"},{"t":"i32","v":496,"n":"player_net_id"},{"t":"str","v":"SavedGames/ar-turn37-816raiders.sav","n":"ai_data"},{"t":"u32","v":0,"n":"personality"},{"t":"u32","v":3832490328,"n":"rng_seed"}],"ret":null,"side":{}} +{"ts":229679525,"hook":"Mars::RNG::Seed","mode":"trace","call_id":7,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e2904e8","n":"rng"},{"t":"u32","v":1773148389,"n":"seed"},{"t":"bool","v":false,"n":"is_strategic_generator"}],"ret":{"t":"ptr","v":"0x0e2904e8"},"side":{"rng":{"before":{"t":"struct","v":{"mt0":{"t":"u32","v":890936864},"mt1":{"t":"u32","v":1575750400},"mt2":{"t":"u32","v":3306446855},"mt623_left":{"t":"i32","v":-799615902}}},"after":{"t":"struct","v":{"mt0":{"t":"u32","v":177755408},"mt1":{"t":"u32","v":3246618953},"mt2":{"t":"u32","v":4211886088},"mt623_left":{"t":"i32","v":624}}}}}} +{"ts":229707699,"hook":"Game::StrategyApp::RunAI","mode":"trace","call_id":6,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"app"},{"t":"i32","v":512,"n":"player_net_id"},{"t":"str","v":"SavedGames/ar-turn37-816raiders.sav","n":"ai_data"},{"t":"u32","v":0,"n":"personality"},{"t":"u32","v":1773148389,"n":"rng_seed"}],"ret":null,"side":{}} +{"ts":259334637,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":8,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x010ff6c4","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x00000000","n":"server_cached"},{"t":"ptr","v":"0x040282c0","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x00000000","n":"rng"},{"t":"null","v":null,"n":"rng_words_in"},{"t":"null","v":null,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x010ff6c4"},"side":{}} +{"ts":259387117,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":11,"thread":6236,"depth":2,"args":[{"t":"ptr","v":"0x040f64d8","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":259387323,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":12,"thread":6236,"depth":2,"args":[{"t":"ptr","v":"0x040f64d8","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":259387386,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":10,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x040f64d8","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":259387461,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":9,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":37,"n":"turn"},{"t":"i32","v":2057,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":-1,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":37}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":38}}}}}} +{"ts":259388660,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":14,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2106,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":-1,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":259391857,"hook":"Game::EncounterDetect::ProcessTeamRecord","mode":"trace","call_id":15,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x010fec58","n":"ctx"},{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"ptr","v":"0x351320f0","n":"record"},{"t":"i32","v":2,"n":"entries"},{"t":"bool","v":false,"n":"gate"},{"t":"i32","v":0,"n":"pred_contacts"},{"t":"i32","v":2,"n":"pred_detectors"},{"t":"i32","v":0,"n":"pred_neither"},{"t":"i32","v":-1,"n":"pred_max_trials"},{"t":"i32","v":2,"n":"fc_byte_vs_dword_disagreements"},{"t":"list","v":[{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}},{"t":"struct","v":{"fb":{"t":"u32","v":0},"fc":{"t":"u32","v":0},"fc_dword":{"t":"u32","v":16843008}}}],"n":"entry_flags"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":259391924,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":13,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2105,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":-1,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":190,"n":"rng_words_in"},{"t":"i32","v":434,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":434},"index":{"t":"i32","v":190},"block":{"t":"i32","v":0},"words":{"t":"i64","v":190},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":318877855,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":17,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"ptr","v":"0x351320f0","n":"encounter"},{"t":"ptr","v":"0x351106b0","n":"result"},{"t":"u8","v":0,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2107,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":318878120,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":18,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2108,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":318878255,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":19,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2108,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":318878580,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":20,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x040f60e8","n":"slavers"},{"t":"i32","v":38,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":318880049,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":16,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"ptr","v":"0x356efb84","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2106,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":207,"n":"rng_words_in"},{"t":"i32","v":417,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":417},"index":{"t":"i32","v":207},"block":{"t":"i32","v":0},"words":{"t":"i64","v":207},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":318944241,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":21,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x010ff4b4","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0e249088","n":"server_cached"},{"t":"ptr","v":"0x040282c0","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1603725},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":4596394},"calls":{"t":"u32","v":2},"words":{"t":"u32","v":2},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3093783},"calls":{"t":"u32","v":2},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":81},"words":{"t":"u32","v":81},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3126945},"calls":{"t":"u32","v":80},"words":{"t":"u32","v":80},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":6},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":37,"n":"draw_site_words"},{"t":"u32","v":52,"n":"draw_site_calls"},{"t":"u32","v":176,"n":"draw_site_words_other_rng"},{"t":"u32","v":172,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":4},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x010ff4b4"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372389397,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":22,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x010ff6c4","n":"out_name"},{"t":"bool","v":true,"n":"end_turn"},{"t":"ptr","v":"0x0e249088","n":"server_cached"},{"t":"ptr","v":"0x040282c0","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":{"t":"ptr","v":"0x010ff6c4"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372438265,"hook":"Game::SVSOSwarmQueen::RegisterHives","mode":"trace","call_id":25,"thread":6236,"depth":2,"args":[{"t":"ptr","v":"0x040f64d8","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"i32","v":28,"n":"systems"},{"t":"i32","v":0,"n":"systems_tagged"},{"t":"i32","v":0,"n":"predict_new_hives"},{"t":"i32","v":0,"n":"predict_min_words"},{"t":"struct","v":{"rva":{"t":"u32","v":7209476},"ptr":{"t":"u32","v":9553888},"value":{"t":"i32","v":20}},"n":"hive_nextq_lo"},{"t":"struct","v":{"rva":{"t":"u32","v":7209480},"ptr":{"t":"u32","v":9553892},"value":{"t":"i32","v":30}},"n":"hive_nextq_hi"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372438537,"hook":"Game::SVSOSwarmQueen::TickHives","mode":"trace","call_id":26,"thread":6236,"depth":2,"args":[{"t":"ptr","v":"0x040f64d8","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"struct","v":{"rva":{"t":"u32","v":7209488},"ptr":{"t":"u32","v":9553900},"value":{"t":"i32","v":10}},"n":"gate_frame_floor"},{"t":"struct","v":{"rva":{"t":"u32","v":7209512},"ptr":{"t":"u32","v":9372196},"value":{"t":"i32","v":5}},"n":"gate_queen_age"},{"t":"struct","v":{"rva":{"t":"u32","v":7209504},"ptr":{"t":"u32","v":9372188},"value":{"t":"i32","v":3}},"n":"spawn_list_cap"},{"t":"bool","v":false,"n":"predict_gate1_fails"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372438711,"hook":"Game::SVSOSwarmQueen::OnTurnBegin","mode":"trace","call_id":24,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x040f64d8","n":"queen"},{"t":"i32","v":3,"n":"scenario_tag"},{"t":"i32","v":10,"n":"enc_id"},{"t":"i32","v":-1,"n":"hives_in"},{"t":"i32","v":-1,"n":"queens_in"},{"t":"null","v":null,"n":"hives"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372438796,"hook":"Game::StrategyServer::BeginProcessTurn","mode":"trace","call_id":23,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":38,"n":"turn"},{"t":"i32","v":2108,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}},"frame":{"before":{"t":"struct","v":{"value":{"t":"i32","v":38}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":39}}}}}} +{"ts":372440252,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":28,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2146,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372445064,"hook":"Game::StrategyServer::ProcessTurn","mode":"trace","call_id":27,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"f32","v":1,"n":"dt"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2145,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":211,"n":"rng_words_in"},{"t":"i32","v":413,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":413},"index":{"t":"i32","v":211},"block":{"t":"i32","v":0},"words":{"t":"i64","v":211},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372488513,"hook":"Game::StrategyServer::ApplyEncounterResult","mode":"trace","call_id":30,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"ptr","v":"0x351320f0","n":"encounter"},{"t":"ptr","v":"0x3510fd80","n":"result"},{"t":"u8","v":1,"n":"res_no_battle"},{"t":"u8","v":0,"n":"res_peaceful"},{"t":"u8","v":0,"n":"res_surrendered"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372488804,"hook":"Game::StrategyServer::ProcessNodeSpaceTravel","mode":"trace","call_id":31,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372488986,"hook":"Game::StrategyServer::NodeLineDecay","mode":"trace","call_id":32,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2147,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":0,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372489576,"hook":"Game::SVSOSlaversRefuel::UpdateDifficultyTier","mode":"trace","call_id":33,"thread":6236,"depth":1,"args":[{"t":"ptr","v":"0x040f60e8","n":"slavers"},{"t":"i32","v":39,"n":"frame"},{"t":"i32","v":0,"n":"cdiff_in"},{"t":"list","v":[{"t":"i32","v":1},{"t":"i32","v":50},{"t":"i32","v":100}],"n":"thresholds"},{"t":"str","v":"no_store_unchanged","n":"predict_path"},{"t":"null","v":null,"n":"predict_cdiff_out"},{"t":"i32","v":0,"n":"predict_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"cdiff":{"before":{"t":"struct","v":{"value":{"t":"i32","v":0}}},"after":{"t":"struct","v":{"value":{"t":"i32","v":0}}}},"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372491614,"hook":"Game::StrategyServer::OnAllCombatDone_Tail","mode":"trace","call_id":29,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x0e249088","n":"server"},{"t":"ptr","v":"0x354bf454","n":"results"},{"t":"i32","v":1,"n":"result_count"},{"t":"i32","v":39,"n":"turn"},{"t":"i32","v":2146,"n":"phase_counter"},{"t":"i32","v":8,"n":"players"},{"t":"i32","v":1,"n":"encounters"},{"t":"i32","v":51,"n":"node_paths"},{"t":"i32","v":51,"n":"np_permanent"},{"t":"i32","v":0,"n":"np_immortal"},{"t":"i32","v":0,"n":"np_mortal"},{"t":"i32","v":-1,"n":"np_min_life"},{"t":"i32","v":0,"n":"np_within5"},{"t":"i32","v":0,"n":"predict_nodeline_words"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":231,"n":"rng_words_in"},{"t":"i32","v":393,"n":"rng_left_in"}],"ret":null,"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":393},"index":{"t":"i32","v":231},"block":{"t":"i32","v":0},"words":{"t":"i64","v":231},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}} +{"ts":372556136,"hook":"Game::StrategyHost::Autosave","mode":"trace","call_id":34,"thread":6236,"depth":0,"args":[{"t":"ptr","v":"0x00939f98","n":"host"},{"t":"ptr","v":"0x010ff4b4","n":"out_name"},{"t":"bool","v":false,"n":"end_turn"},{"t":"ptr","v":"0x0e249088","n":"server_cached"},{"t":"ptr","v":"0x040282c0","n":"host_plus_0x54"},{"t":"bool","v":false,"n":"server_agrees"},{"t":"ptr","v":"0x0e229db0","n":"rng"},{"t":"i64","v":235,"n":"rng_words_in"},{"t":"i32","v":389,"n":"rng_left_in"},{"t":"list","v":[{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":3489164},"calls":{"t":"u32","v":15},"words":{"t":"u32","v":0},"no_draw_calls":{"t":"u32","v":15},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":16},"words":{"t":"u32","v":16},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797483},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":4797720},"calls":{"t":"u32","v":8},"words":{"t":"u32","v":8},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":1061538},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":3746217},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":4328989},"calls":{"t":"u32","v":4},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":true}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":1546517},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":4},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextFloat"},"ret_rva":{"t":"u32","v":5139977},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"Chance"},"ret_rva":{"t":"u32","v":1543445},"calls":{"t":"u32","v":1},"words":{"t":"u32","v":1},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}},{"t":"struct","v":{"entry":{"t":"str","v":"NextInt"},"ret_rva":{"t":"u32","v":2743342},"calls":{"t":"u32","v":3},"words":{"t":"u32","v":3},"no_draw_calls":{"t":"u32","v":0},"strategic":{"t":"bool","v":false}}}],"n":"draw_sites"},{"t":"u32","v":40,"n":"draw_site_words"},{"t":"u32","v":53,"n":"draw_site_calls"},{"t":"u32","v":9,"n":"draw_site_words_other_rng"},{"t":"u32","v":8,"n":"draw_site_calls_other_rng"},{"t":"u32","v":0,"n":"draw_site_overflow"},{"t":"list","v":[{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot13"},"rva":{"t":"u32","v":4749232},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot14"},"rva":{"t":"u32","v":4774784},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot13"},"rva":{"t":"u32","v":4779904},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot15"},"rva":{"t":"u32","v":4377760},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":2},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::SpyManager::Slot13RngCallee"},"rva":{"t":"u32","v":4458720},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeA"},"rva":{"t":"u32","v":4328608},"calls":{"t":"u32","v":4},"calls_since_launch":{"t":"u32","v":8},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::TradeManager::Slot13RngCalleeB"},"rva":{"t":"u32","v":4764736},"calls":{"t":"u32","v":1},"calls_since_launch":{"t":"u32","v":1},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::CreateRaidEncounter"},"rva":{"t":"u32","v":4798624},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":true}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManager::GenerateTradeRaidEncounters"},"rva":{"t":"u32","v":4797072},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerSpyManager::vslot15 [control]"},"rva":{"t":"u32","v":4751152},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::ServerTradeManagerImpl::vslot14 [control]"},"rva":{"t":"u32","v":4559056},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}},{"t":"struct","v":{"name":{"t":"str","v":"Game::EncounterDetect::Run [control]"},"rva":{"t":"u32","v":3977344},"calls":{"t":"u32","v":0},"calls_since_launch":{"t":"u32","v":0},"installed":{"t":"bool","v":false}}}],"n":"probe_entries"}],"ret":{"t":"ptr","v":"0x010ff4b4"},"side":{"rng":{"before":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}},"after":{"t":"struct","v":{"left":{"t":"i32","v":389},"index":{"t":"i32","v":235},"block":{"t":"i32","v":0},"words":{"t":"i64","v":235},"block_hash":{"t":"u64","v":"16041122331981849194"}}}}}}