From d7ea0a048cb45636f65ebfa43bf89b502c9fd590 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 8 Sep 2026 05:51:37 -0400 Subject: [PATCH] lane D: automated struct recovery from the IStreamable serializers Every serializable class carries an enumeration of its own fields -- its Write(Stream&), walking the members in order with a 4-char tag. This decodes that idiom mechanically for the whole binary in 0.35 s. Validation first (tools/serializers.py validate), against answers the campaign already had before the tool existed: A 305/307 field offsets+kinds exact across 17 classes, 0 WRONG, vs struct-recovery.md 1-4 and observedtech-append.md B sizeof from the container-stride divides: ObservedTech 0x2c, MoraleEvent 0x50, PlayerReport 0x30, DiplomacyStats 0x24 -- all matching C 22 of save_reader.py's shapes, tag order identical (Sys 78 tags, Player 104, CreateParams 25, Ship 22): 22 agree, 0 disagree D Read/Write cross-check on every class: 437/437 field offsets agree At scale: 386 classes with a Write, 1,682 member fields. verified 87 (542 fields) | clean 77 (328) | unnamed 176 (471) partial 31 (341) | empty 15 58 classes with a sizeof corroborated by a second line of evidence (45 container stride, 13 enumeration meeting the embedding bound); the rest report a lower bound and say so. Four things each worth 10-170 classes: the RTTI class hierarchy descriptor as the only honest "is this an IStreamable" test (a 3-slot vftable also matches TacAISquadRule_* and the row parsers); mod=0 memory operands, which x86disp.py cannot index and which hide every field at offset 0; the member->id pointer idiom behind every handle field; and sub-writers, both base-class and private (StrategyServer's six id lists live in FUN_00794cd0). Failure classes are enumerated in the finding -- 176 anonymous-tag classes are a hard limit on names but not on layout, and the other 64 are bounded mechanical fixes. Two fields lost to a value assembled across a branch were left unrecovered rather than patched with an unverifiable heuristic. Write-back: 288 structures + 328 labels into Ghidra (0 failures), +201 addresses.json entries, header regenerated with tools/gen_addresses.py. Note: ghidra/addresses.json also carries lane V's already-written live confirmation text on ObservedTech_sizeof and ServerPlayer_off_ObservedTechs -- their edit, swept in only because we share the file. --- .gitignore | 2 + .../objects/serializer-struct-recovery.md | 248 + ghidra/addresses.json | 1612 +- ghidra/generated/sots_addresses.h | 408 +- objects/layouts.h | 2224 + objects/layouts.json | 34628 ++++++++++++++++ objects/layouts.md | 4342 ++ tools/rtti_map.py | 261 + tools/serializers.py | 1425 + tools/serializers_ghidra.py | 152 + tools/serializers_golden.py | 275 + 11 files changed, 45572 insertions(+), 5 deletions(-) create mode 100644 findings/objects/serializer-struct-recovery.md create mode 100644 objects/layouts.h create mode 100644 objects/layouts.json create mode 100644 objects/layouts.md create mode 100644 tools/rtti_map.py create mode 100644 tools/serializers.py create mode 100644 tools/serializers_ghidra.py create mode 100644 tools/serializers_golden.py diff --git a/.gitignore b/.gitignore index 72cebb3..a751064 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ captures/ *.lock __pycache__/ *.pyc +# local ghidra write-back progress (machine-local, resumable) +objects/.ghidra_pushed diff --git a/findings/objects/serializer-struct-recovery.md b/findings/objects/serializer-struct-recovery.md new file mode 100644 index 0000000..3f3cd90 --- /dev/null +++ b/findings/objects/serializer-struct-recovery.md @@ -0,0 +1,248 @@ +# Automated struct recovery from the `Mars::IStreamable` serializers + +Lane D, 2026-09-08. Static/host only — VM140 was held by lane V and the game was never run. + +The campaign had ~1,600 classes mapped by name and a few dozen by layout. This round makes the +layout step mechanical: every serializable class in the exe carries an **enumeration** of its own +fields — its `Write(Stream&)`, which walks the members in order with a 4-char name tag — and a +decoder for that idiom turns "read one class in an afternoon" into "read them all in 0.35 s". + +Tools: `tools/rtti_map.py` (RTTI → vftables), `tools/serializers.py` (the recovery), +`tools/serializers_golden.py` (the regression set), `tools/serializers_ghidra.py` (write-back). +Outputs: `objects/layouts.json`, `objects/layouts.md`, `objects/layouts.h`. + +--- + +## 1. Validation first + +`uv run python3 tools/serializers.py validate` runs three checks, all against answers this +campaign already had **before** the tool existed. Nothing below §1 is claimed until this passes. + +### A — field offsets and kinds, vs `struct-recovery.md` §1–§4 and `observedtech-append.md` + +``` + [OK ] Game::DiplomacyStats 14/14 exact + [OK ] Game::FlightPlan 6/6 exact + [OK ] Game::FlightPlan::Waypoint 3/3 exact + [OK ] Game::IndependenceInfo 5/5 exact + [OK ] Game::MoraleEvent 6/6 exact + [OK ] Game::NodeRoute 3/3 exact + [OK ] Game::ObservedTech 5/5 exact + [OK ] Game::ObservedWeapon 5/5 exact + [OK ] Game::PlayerReport 11/11 exact + [OK ] Game::PopulationGroup 3/3 exact + [MISS] Game::ServerPlayer 101/103 exact 2 missing + [OK ] Game::ServerSystem 79/79 exact + [OK ] Game::ShipBuildOrder 5/5 exact + [OK ] Game::StarFleet 16/16 exact + [OK ] Game::StarShip 23/23 exact + [OK ] Game::StarSystem::OutputRates 7/7 exact + [OK ] Game::StarSystem::PlayerView 13/13 exact + + fields: 305/307 exact, 2 not recovered, 0 WRONG +``` + +**Zero wrong.** Every offset, every width, every tag the tool emits for these 17 classes matches the +hand-recovered tables — including the ones that were traps: `ObservedTech` `+0x24` is *not* reported +as a field (it is the string's trailing `_Alval`), `Bats2`/`rcex` come out as int64 and not int, +`TShn`/`ETS`/the whole `DiplomacyStats` block come out int16, `ltis` comes out int, `pswd` comes out +string, `TRM`/`CstR`/`CstE`/`CstT`/`shrm`/`RefCap`/`RepCap`/`PlayerView.Infra` come out float. + +The two misses are one failure class, described in §4: a value assembled **across a branch** +(`ResTNm` writes `tech ? tech->name : ""`; `tnc` writes `max(member, 1)`). A linear pass sees only +the last branch's expression. Neither was papered over with a heuristic. + +### B — `sizeof`, from the container-stride divides + +``` + [OK ] Game::DiplomacyStats got 0x24 [OK ] Game::ObservedWeapon got 0x2c + [OK ] Game::MoraleEvent got 0x50 [OK ] Game::PlayerReport got 0x30 + [OK ] Game::ObservedTech got 0x2c +``` + +`sizeof(ObservedTech) = 0x2c` — the value lane X pinned three ways — falls out mechanically, from a +completely different place: `VectorHelper::Write` divides the vector's byte span by +the element stride, and MSVC's magic-number sequence for that divide is invertible +(`M = ceil(2^(32+k)/s)`). `PopulationGroup` and `OutputRates` are `[--]` — they have no +`VectorHelper`, so this oracle is silent on them rather than guessing. + +### C — on-disk tag order, vs `save_reader.py` + +22 of `save_reader.py`'s shapes name the exact `::Write` that produces them. For every one, the +tool's recovered tag sequence contains the oracle's tag sequence **in the same relative order**: + +``` + 22 shapes agree, 0 disagree +``` + +That includes `Sys` (78 tags), `Player` (104), `CreateParams` (25), `Ship` (22), `Slot` (18), +`DipStat` (14), `PlayerView` (14). `save_reader.py` parses the three real saves `--strict` clean +with 36 tests and lane C's `state_checksum.py` proves its coverage by re-serialising byte-for-byte, +so this is disassembly and the save oracle agreeing independently, at scale. + +### D — Read/Write cross-check, run on every class + +The campaign's own standard ("the Read functions agree on every member address"), automated: the +class's `Read` is extracted the same way and its member offsets compared to `Write`'s, matched by +tag name. + +``` + Read/Write cross-check : 437/437 fields agree (0 classes with any disagreement) +``` + +Two subtleties had to be handled or this check manufactures false alarms, and both are worth +carrying: a tag used **twice** in one class (`ServerPlayer` writes both an `int Team` at `0xac` and +a `PlayerAlliances Team` at `0x168`) cannot be matched by name, and an **anonymous** tag (`"."`, +the writer passed NULL) carries no identity at all, so positional matching turns one side's +under-recovery into a cascade of fake conflicts. Both are excluded, and the classes affected are +reported as not-cross-checkable rather than as agreeing. + +--- + +## 2. How it works + +Five things had to be got right; each of the last four was worth 10–170 classes on its own. + +**The idiom.** Writer side, one shape under two calling conventions: + +``` +push 0xff ; default-value argument + ; lea r,[this+D] | mov r,[this+D] | movzx r,word [this+D] +push r +push ; -> .rdata "otch", "pswd", ... (or 0 -> "." on disk) +push / mov ecx, +call WriteString/WriteBool/… | call [[stream]+slot] +``` + +The push **immediately before the tag push** is always the member. Stream vftable slots, read off +the wrappers rather than assumed: `+0x18` string, `+0x1c` bool, `+0x20` float, `+0x24` int, +`+0x28` nested, `+0x30` raw bytes (`n = 8` → int64). + +**Sizes come from the kind, never from the offsets touched** — lane S's rule. `bool` 1, `int16` 2, +int/float/enum/handle 4, `int64` 8, `std::string` **0x1c**, `std::vector` **0x10**, both +*allocator-last* in this build's STL and therefore invisible to any touch-scan. + +**(a) RTTI gives the owner and the this-adjustment.** `tools/rtti_map.py` walks +type-descriptor ← `COL.pTypeDescriptor` ← `vftable[-1]` for the whole image: 1,924 type +descriptors (exactly the inventory's count), 2,172 COLs, 2,172 vftables. It reproduces the known +anchors exactly — `ObservedTech` vftable `0x00a2439c` / COL `0x00a81c78`; `ServerSystem`'s +IStreamable vftable `0x00a2043c` at COL offset **+8** with Read `0x0075d4b0` / Write `0x00749630`. +`COL.offset` is what turns a decompiled offset into an absolute one, and for `ServerPlayer` that is +`+0x3a0`, so most of its members are at *negative* decompiled offsets. + +**(b) The class hierarchy descriptor is the only honest membership test.** A 3-slot vftable is +*not* a serializer test: `TacAISquadRule_*`, the CSV row parsers and ~100 other classes have three +virtuals. Walking `COL → ClassHierarchyDescriptor → base class array` and requiring +`Mars::IStreamable` in the base list removes them all. This dropped a 116-class "empty" bucket to +11 — i.e. it removed 105 classes that were never serializers, instead of reporting them as failures. + +**(c) `mod=0` memory operands.** `tools/x86disp.py` indexes operands that carry a *displacement*, so +`mov eax,[edi]` — a member at offset **0** — is invisible to it. For a plain struct with no vptr, +offset 0 is a real field: `StarSystem::OutputRates.SRt` is exactly that, and so is every +`handle`/element read through a bare iterator. Synthesising the mod=0 case recovered `SRt` and every +`Flt`/`GF`/`SnF`/`MnF` element in `ServerSystem`. + +**(d) The pointer-member idiom.** `HomeSys`, `PlrID`, `DesID`, `FltID`, `SrnTo` are written as +`member->id`, so the pushed value is a load off a *pointer that came from* a member, three to six +instructions and a conditional branch earlier. Remembering where a register's pointer came from +(and reading the base's this-ness **before** retiring the destination — `mov edi,[edi+0x1c0]` +overwrites the this-register with the member it is reading) recovered those five plus +`ServerSystem::indi`. + +**(e) Sub-writers.** Two kinds, both invisible without special handling. A **base-class Write** +(`StarMapNode::Write` inside `ServerSystem::Write`, giving `Pos`) and a **private sub-writer of the +same class** (`StrategyServer` writes its six id lists in `FUN_00794cd0`, so `PlayerIDs`, +`DesignIDs`, `SystemIDs`, `FleetIDs`, `ShipIDs`, `TradeIDs` are simply absent without it — that was +the last disagreement in check C). Both are spliced in at the call site, which preserves disk order. +A third kind, a **tag-forwarding** writer `f(stream, name, member)` that passes the caller's name +through to a stream primitive, is *discovered* (by spotting a tag push that is `[ebp+0xc]`) rather +than listed by hand, because a hand list is exactly what silently under-reports on 1,600 classes. + +**Containers.** A count argument is never a member; it is `(_Mylast - _Myfirst)/stride`. Recovering +the subtraction gives the container's offset (`NumFlts` → the `vector` at `0x16c`, `NVO` → the map +`_Mysize` at `0x278`), and inverting the divide gives the element stride — which is `sizeof(T)`. + +--- + +## 3. Results at scale + +`uv run python3 tools/serializers.py all` — 0.35 s for the whole binary. + +| tier | classes | member fields | meaning | +|---|---|---|---| +| **verified** | 87 | 542 | every field resolved and sized, and `Read` agrees on every comparable offset | +| **clean** | 77 | 328 | every field resolved and sized; no `Read`-side comparison available | +| **unnamed** | 176 | 471 | offsets and types resolved, but the writer passes a NULL name so the fields have no on-disk names (combat commands, network messages) | +| **partial** | 31 | 341 | see §4 | +| **empty** | 15 | 0 | the class's `Write` writes no tagged field | +| **total** | **386** | **1,682** | | + +* **58 classes have a `sizeof` corroborated by a second, independent line of evidence** — 45 from a + `VectorHelper` element-stride divide, 13 where the field enumeration's lower bound meets the + upper bound implied by every embedding of that type in another class. For the rest the tool + reports a **lower bound** and says so: a serializer enumerates *serialised* members, so a + non-streamed cache or back-pointer at the tail is invisible to it. That is the honest limit of + this method and it is stated everywhere the number appears. +* Coverage of the population: 368 non-template classes have `Mars::IStreamable` in their RTTI base + list; 348 of them are covered here, plus 38 POD types (`Vector3`, `OutputRates`, …) that have no + vftable of their own and are reachable only through a specialised `StreamableHelper` thunk + (`push ebp; mov ebp,esp; mov ecx,[ecx+8]; pop ebp; jmp writer`). +* This is roughly a **10× increase** in classes with a known layout, and it is reproducible from the + exe in under a second. + +--- + +## 4. Failure classes — what defeats the tool, and whether it scales + +This is the part that says whether the remaining classes are reachable. + +| # | failure | classes | why it happens | fixable? | +|---|---|---|---|---| +| 1 | **anonymous tags** | 176 | the writer passes a NULL name, so the field is `"."` on disk. Offsets and types are still recovered; only the *names* are missing, and the Read cross-check cannot run | not by this method — the names do not exist in the binary. These are combat commands and network messages, where the reader is positional | +| 2 | **nested member of unknown size** | 19 | an inline sub-object whose own type has neither a `VectorHelper` stride nor a tight embedding bound (`TechTree`, `ShipRecords`, `FleetLayout`) | yes — one constructor or `operator new` size each | +| 3 | **container elements only** | 9 | everything the serializer writes is a loop body over a `std::map`/`std::list` node, so the offsets are within the node, not the object (`BuildQueue`, `SpyReport`'s four lists) | partly — needs a node-layout model for the map/list | +| 4 | **untyped sub-writer** | 3 | a discovered tag-forwarding writer whose argument type could not be classified, so the member's offset is known but its size is not | yes, per sub-writer | +| 5 | **value built across a branch** | 2 fields | `tech ? tech->name : ""`, `max(member, 1)`. The pass is linear, so it sees the last branch only | yes, with a basic-block-aware pass — deliberately **not** patched with a backward-search heuristic, because there is no oracle for the 1,600 classes on which a heuristic would silently be wrong | +| 6 | **`std::map` / `std::list` members** | — | recovered as their `_Mysize` int, not as the container. `ServerSystem::NVO` comes out as `int @0x278`; the map itself starts at `0x274` | yes, and cheaply: this build's `std::map` is 0x10 bytes with head@0/size@4, from `NVO@0x274` → `NVE@0x284` | +| 7 | **runtime-built tag** | ~1 | `Mars::ParticleSystem::Write` makes six write-side calls and not one tag is a compile-time constant | no | +| 8 | **stub `Write`** | 15 | e.g. `Game::ServerTradeManager`'s Read and Write are both the inherited no-op `0x924fb0`; `Game::ShipDesign::Write` makes no stream call at all. These classes are not streamed through `IStreamable` and something else persists them | n/a — a finding, not a failure | + +**Does it generalise?** Yes, with one caveat that matters. Categories 2, 3, 4, 5 and 6 are 64 +classes and every one of them is a bounded, mechanical fix — none is a research problem. Category 1 +(176 classes, 46% of the population) is a hard limit, but a *soft* one: those layouts are complete +in offsets and types, and only the names are missing, so a reimplementation can use them as-is. +Category 7 is genuinely out of reach and is one class. + +The caveat: **this method covers only what the class serialises.** `ServerSystem` is `>= 0x2d8` by +enumeration and the campaign's hand table agrees, but neither can see a non-streamed member past the +last serialised one. Every `sizeof` in the output is therefore labelled with how it was obtained, +and the 58 corroborated ones are the only ones that should be treated as closed. + +--- + +## 5. Write-back + +* **`objects/layouts.json`** — the full machine-readable result (fields, offsets, kinds, tags, + nested types, container strides, grade, why, Read/Write agreement). +* **`objects/layouts.md`** — the same as tables, one section per class. +* **`objects/layouts.h`** — 288 C structs, gaps made explicit as padding, `Mars_string` (0x1c) and + `Mars_vector` (0x10) declared once with the allocator word in place. +* **Ghidra** — `tools/serializers_ghidra.py structs` pushes every struct through + `parse-c-structure` (dependencies first, resumable) — **288 pushed, 0 failed** — and `… labels` + names the `Write`/`Read` entry points (**328 labels, 0 failed**). `Game_ObservedTech` comes back from Ghidra as `size: 44`. +* **`ghidra/addresses.json`** — +201 entries: `_Write` / `_Read` for all 87 + verified-tier classes, and `sizeof_` for every corroborated size, each carrying its + Read/Write agreement count in the prototype comment. Header regenerated with + `tools/gen_addresses.py` (never hand-edited). + +## 6. Open items for the next lane + +1. **`Game::ShipDesign::Write` (`0x8747a0`) makes no stream call.** `ShipDesign` is an important + class and its IStreamable slots are inert — worth knowing how designs actually persist + (`ShipDesignDef` is already verified separately, which may be the whole answer). +2. **`std::map`/`std::list` node layouts** would close failure classes 3 and 6 — ~15 classes. +3. **The 19 unsized nested types** need one size each; a constructor or `operator new` argument + scan would do it in bulk and would also give sizes for the non-streamed tail. +4. `Game::SVSOJewelsOfTheCrown` writes the tag `JEWELLOCATIONID` **twice**, at `+0x8` and `+0x10`. + Not an error in the tool (the Write really does emit it twice) but it means the on-disk record + has a duplicated name — a save reader matching that shape by name will get the wrong field. diff --git a/ghidra/addresses.json b/ghidra/addresses.json index 11aef4d..f123ab4 100644 --- a/ghidra/addresses.json +++ b/ghidra/addresses.json @@ -1454,7 +1454,7 @@ "name": "ServerPlayer_off_ObservedTechs", "offset": "0x274", "convention": "offset", - "prototype": "std::vector otch -- 3 words {_Myfirst@0x274,_Mylast@0x278,_Myend@0x27c}; save tag otch. sizeof(ObservedTech) = 0x2c (44), PINNED three ways: magic divide 0x2e8ba2e9 sar 3 (=/44) in vector_ObservedTech_assign 0x0087239f, imul reg,reg,0x2c at 0x0087243a / 0x007b735b, and the linear search stride `add edi,0x2c` at 0x007ba257. Append site = RecordObservedTech+0xdf (0x007ba27f): lea ecx,[player+0x274]; call vector_ObservedTech_push_back 0x007b7320. All three words move because push_back reallocs through vector_44B_grow 0x007b5820.", + "prototype": "std::vector otch -- 3 words {_Myfirst@0x274,_Mylast@0x278,_Myend@0x27c}; save tag otch. sizeof(ObservedTech) = 0x2c (44), PINNED three ways: magic divide 0x2e8ba2e9 sar 3 (=/44) in vector_ObservedTech_assign 0x0087239f, imul reg,reg,0x2c at 0x0087243a / 0x007b735b, and the linear search stride `add edi,0x2c` at 0x007ba257. Append site = RecordObservedTech+0xdf (0x007ba27f): lea ecx,[player+0x274]; call vector_ObservedTech_push_back 0x007b7320. All three words move because push_back reallocs through vector_44B_grow 0x007b5820. LIVE CONFIRMATION (lane V, 2026-09-08, VM140, build eventlive-dd38117-20260908T0916Z): the ProcessResearch `observed_techs` Result region measured the vector's byte span growing by exactly 44 on each of the two tech-completion calls of the five-End-Turn run from ref-turn2 (call 3: 440 -> 484; call 9: 484 -> 528) -- an independent behavioural confirmation of the static pin. Both non-completing players' spans were 880 = 20 x 44 and never moved.", "status": "verified", "source": "findings/subsystems/observedtech-append.md (lane X, tools/x86disp.py displacement scan)" }, @@ -3174,7 +3174,7 @@ "name": "ObservedTech_sizeof", "offset": "0x2c", "convention": "constant", - "prototype": "sizeof(Game::ObservedTech) = 0x2c (44 bytes). Confirmed independently by (a) the compiler's magic division by 44 (mov eax,0x2e8ba2e9; imul; sar edx,3) at 0x0087239f and 0x007b7339, (b) imul reg,reg,0x2c at 0x0087243a, 0x00872468, 0x007b735b, and (c) the iterator advance `add edi,0x2c` in RecordObservedTech's linear search at 0x007ba257. FULL MEMBER MAP, from ObservedTech_Write 0x00817cf0 / ObservedTech_Read 0x00817c40 (lane S 2026-09-08): +0x00 vptr 0x00a2439c; +0x04 uint16 otnF; +0x06 uint16 otnL; +0x08 bool odet (1 byte, +3 pad); +0x0c std::string otch (0x1c, so _Mysize at +0x1c, _Myres at +0x20, _Alval at +0x24); +0x28 int owith. 4 + 2 + 2 + 4 + 0x1c + 4 = 0x2c exactly, no padding slack and no unaccounted field.", + "prototype": "sizeof(Game::ObservedTech) = 0x2c (44 bytes). Confirmed independently by (a) the compiler's magic division by 44 (mov eax,0x2e8ba2e9; imul; sar edx,3) at 0x0087239f and 0x007b7339, (b) imul reg,reg,0x2c at 0x0087243a, 0x00872468, 0x007b735b, and (c) the iterator advance `add edi,0x2c` in RecordObservedTech's linear search at 0x007ba257. FULL MEMBER MAP, from ObservedTech_Write 0x00817cf0 / ObservedTech_Read 0x00817c40 (lane S 2026-09-08): +0x00 vptr 0x00a2439c; +0x04 uint16 otnF; +0x06 uint16 otnL; +0x08 bool odet (1 byte, +3 pad); +0x0c std::string otch (0x1c, so _Mysize at +0x1c, _Myres at +0x20, _Alval at +0x24); +0x28 int owith. 4 + 2 + 2 + 4 + 0x1c + 4 = 0x2c exactly, no padding slack and no unaccounted field. LIVE CONFIRMATION (lane V, 2026-09-08, VM140, build eventlive-dd38117-20260908T0916Z): the ProcessResearch `observed_techs` Result region measured the vector's byte span growing by exactly 44 on each of the two tech-completion calls of the five-End-Turn run from ref-turn2 (call 3: 440 -> 484; call 9: 484 -> 528) -- an independent behavioural confirmation of the static pin. Both non-completing players' spans were 880 = 20 x 44 and never moved.", "status": "verified", "source": "findings/subsystems/observedtech-append.md (lane X, tools/x86disp.py displacement scan)" }, @@ -3313,6 +3313,1614 @@ "prototype": "vector::_Reserve/grow for a 44-byte element type. Shared with FUN_0086dec0, so it may be a COMDAT-folded body -- do NOT assume it is ObservedTech-specific.", "status": "mapped", "source": "findings/subsystems/observedtech-append.md (lane X, tools/x86disp.py displacement scan)" + }, + { + "name": "Game_AIAutoPeaceRun_Write", + "addr": "0x00692cf0", + "convention": "thiscall", + "prototype": "void (Game_AIAutoPeaceRun* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a199b4, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_AIAutoPeaceRun_Read", + "addr": "0x00692c90", + "convention": "thiscall", + "prototype": "void (Game_AIAutoPeaceRun* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a199b4, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_AIAutoPeaceRun", + "offset": "0x10", + "convention": "layout", + "prototype": "sizeof(Game::AIAutoPeaceRun) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_BackEngProject_Write", + "addr": "0x00853390", + "convention": "thiscall", + "prototype": "void (Game_BackEngProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3185c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_BackEngProject_Read", + "addr": "0x00853280", + "convention": "thiscall", + "prototype": "void (Game_BackEngProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3185c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatPlayerReport_Write", + "addr": "0x0059d6d0", + "convention": "thiscall", + "prototype": "void (Game_CombatPlayerReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0623c, COL offset +0x0; 11 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatPlayerReport_Read", + "addr": "0x0059d360", + "convention": "thiscall", + "prototype": "void (Game_CombatPlayerReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0623c, COL offset +0x0; 11 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_CombatPlayerReport", + "offset": "0x54", + "convention": "layout", + "prototype": "sizeof(Game::CombatPlayerReport) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatPlayerStats_Write", + "addr": "0x00459140", + "convention": "thiscall", + "prototype": "void (Game_CombatPlayerStats* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e4b74, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatPlayerStats_Read", + "addr": "0x00459070", + "convention": "thiscall", + "prototype": "void (Game_CombatPlayerStats* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e4b74, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_CombatPlayerStats", + "offset": "0x24", + "convention": "layout", + "prototype": "sizeof(Game::CombatPlayerStats) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatReport_Write", + "addr": "0x0059db30", + "convention": "thiscall", + "prototype": "void (Game_CombatReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0624c, COL offset +0x0; 14 member fields; 6/6 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatReport_Read", + "addr": "0x0059d8f0", + "convention": "thiscall", + "prototype": "void (Game_CombatReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0624c, COL offset +0x0; 14 member fields; 6/6 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatShipReport_Write", + "addr": "0x0059b960", + "convention": "thiscall", + "prototype": "void (Game_CombatShipReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a06064, COL offset +0x0; 12 member fields; 7/7 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatShipReport_Read", + "addr": "0x0059c650", + "convention": "thiscall", + "prototype": "void (Game_CombatShipReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a06064, COL offset +0x0; 12 member fields; 7/7 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_CombatShipReport", + "offset": "0x50", + "convention": "layout", + "prototype": "sizeof(Game::CombatShipReport) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatWeaponReport_Write", + "addr": "0x0059bb70", + "convention": "thiscall", + "prototype": "void (Game_CombatWeaponReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a06074, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CombatWeaponReport_Read", + "addr": "0x0059bad0", + "convention": "thiscall", + "prototype": "void (Game_CombatWeaponReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a06074, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_CombatWeaponReport", + "offset": "0x30", + "convention": "layout", + "prototype": "sizeof(Game::CombatWeaponReport) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CommDeclareShareSystemNotes_Write", + "addr": "0x00810da0", + "convention": "thiscall", + "prototype": "void (Game_CommDeclareShareSystemNotes* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3157c, COL offset +0x0; 8 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CommDeclareShareSystemNotes_Read", + "addr": "0x00810d50", + "convention": "thiscall", + "prototype": "void (Game_CommDeclareShareSystemNotes* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3157c, COL offset +0x0; 8 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CommonPlague_Write", + "addr": "0x005360e0", + "convention": "thiscall", + "prototype": "void (Game_CommonPlague* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f8b50, COL offset +0x0; 6 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_CommonPlague_Read", + "addr": "0x005373e0", + "convention": "thiscall", + "prototype": "void (Game_CommonPlague* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f8b50, COL offset +0x0; 6 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_DefenceFleetAssignment_Write", + "addr": "0x008119d0", + "convention": "thiscall", + "prototype": "void (Game_DefenceFleetAssignment* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e3c48, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_DefenceFleetAssignment_Read", + "addr": "0x00832330", + "convention": "thiscall", + "prototype": "void (Game_DefenceFleetAssignment* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e3c48, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_DiplomacyStats_Write", + "addr": "0x00818cb0", + "convention": "thiscall", + "prototype": "void (Game_DiplomacyStats* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21430, COL offset +0x0; 14 member fields; 13/13 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_DiplomacyStats_Read", + "addr": "0x00818b80", + "convention": "thiscall", + "prototype": "void (Game_DiplomacyStats* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21430, COL offset +0x0; 14 member fields; 13/13 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_DiplomacyStats", + "offset": "0x24", + "convention": "layout", + "prototype": "sizeof(Game::DiplomacyStats) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_EventStorage_Write", + "addr": "0x00825cc0", + "convention": "thiscall", + "prototype": "void (Game_EventStorage* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a313c8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_EventStorage_Read", + "addr": "0x008850f0", + "convention": "thiscall", + "prototype": "void (Game_EventStorage* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a313c8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_EventStorage_Event_Write", + "addr": "0x00825ab0", + "convention": "thiscall", + "prototype": "void (Game_EventStorage_Event* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21958, COL offset +0x0; 8 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_EventStorage_Event_Read", + "addr": "0x00825970", + "convention": "thiscall", + "prototype": "void (Game_EventStorage_Event* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21958, COL offset +0x0; 8 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_EventStorage_TurnEvents_Write", + "addr": "0x00825c40", + "convention": "thiscall", + "prototype": "void (Game_EventStorage_TurnEvents* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0f07c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_EventStorage_TurnEvents_Read", + "addr": "0x00825bb0", + "convention": "thiscall", + "prototype": "void (Game_EventStorage_TurnEvents* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0f07c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_EventStorage_TurnEvents", + "offset": "0x18", + "convention": "layout", + "prototype": "sizeof(Game::EventStorage::TurnEvents) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_FleetNameGenerator_Write", + "addr": "0x00817460", + "convention": "thiscall", + "prototype": "void (Game_FleetNameGenerator* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a32760, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_FleetNameGenerator_Read", + "addr": "0x00817440", + "convention": "thiscall", + "prototype": "void (Game_FleetNameGenerator* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a32760, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_FlightPlan_Write", + "addr": "0x00700f60", + "convention": "thiscall", + "prototype": "void (Game_FlightPlan* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1d50c, COL offset +0x0; 6 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_FlightPlan_Read", + "addr": "0x00704c70", + "convention": "thiscall", + "prototype": "void (Game_FlightPlan* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1d50c, COL offset +0x0; 6 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_FlightPlan", + "offset": "0x38", + "convention": "layout", + "prototype": "sizeof(Game::FlightPlan) -- enumeration meets embedding", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_IndependenceInfo_Write", + "addr": "0x00748ee0", + "convention": "thiscall", + "prototype": "void (Game_IndependenceInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2005c, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_IndependenceInfo_Read", + "addr": "0x00748df0", + "convention": "thiscall", + "prototype": "void (Game_IndependenceInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2005c, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_JewelsProject_Write", + "addr": "0x00548910", + "convention": "thiscall", + "prototype": "void (Game_JewelsProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa438, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_JewelsProject_Read", + "addr": "0x005488d0", + "convention": "thiscall", + "prototype": "void (Game_JewelsProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa438, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_MonitorProject_Write", + "addr": "0x008287d0", + "convention": "thiscall", + "prototype": "void (Game_MonitorProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3180c, COL offset +0x0; 7 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_MonitorProject_Read", + "addr": "0x00828740", + "convention": "thiscall", + "prototype": "void (Game_MonitorProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3180c, COL offset +0x0; 7 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_Morale_Write", + "addr": "0x00744ea0", + "convention": "thiscall", + "prototype": "void (Game_Morale* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1f7c8, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_Morale_Read", + "addr": "0x00744dd0", + "convention": "thiscall", + "prototype": "void (Game_Morale* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1f7c8, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_MoraleEvent_Write", + "addr": "0x007491b0", + "convention": "thiscall", + "prototype": "void (Game_MoraleEvent* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2003c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_MoraleEvent_Read", + "addr": "0x007490b0", + "convention": "thiscall", + "prototype": "void (Game_MoraleEvent* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2003c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_MoraleEvent", + "offset": "0x50", + "convention": "layout", + "prototype": "sizeof(Game::MoraleEvent) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_NodePath_Write", + "addr": "0x006e1fd0", + "convention": "thiscall", + "prototype": "void (Game_NodePath* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1cb50, COL offset +0x0; 11 member fields; 6/6 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_NodePath_Read", + "addr": "0x006e1e90", + "convention": "thiscall", + "prototype": "void (Game_NodePath* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1cb50, COL offset +0x0; 11 member fields; 6/6 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_NodePath", + "offset": "0x30", + "convention": "layout", + "prototype": "sizeof(Game::NodePath) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ObservedTech_Write", + "addr": "0x00817cf0", + "convention": "thiscall", + "prototype": "void (Game_ObservedTech* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2439c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ObservedTech_Read", + "addr": "0x00817c40", + "convention": "thiscall", + "prototype": "void (Game_ObservedTech* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2439c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_ObservedTech", + "offset": "0x2c", + "convention": "layout", + "prototype": "sizeof(Game::ObservedTech) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ObservedWeapon_Write", + "addr": "0x00817bc0", + "convention": "thiscall", + "prototype": "void (Game_ObservedWeapon* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2438c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ObservedWeapon_Read", + "addr": "0x00817b10", + "convention": "thiscall", + "prototype": "void (Game_ObservedWeapon* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2438c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_ObservedWeapon", + "offset": "0x2c", + "convention": "layout", + "prototype": "sizeof(Game::ObservedWeapon) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PlayerAid_Write", + "addr": "0x00818dc0", + "convention": "thiscall", + "prototype": "void (Game_PlayerAid* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a286dc, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PlayerAid_Read", + "addr": "0x008207b0", + "convention": "thiscall", + "prototype": "void (Game_PlayerAid* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a286dc, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_PlayerAid", + "offset": "0x18", + "convention": "layout", + "prototype": "sizeof(Game::PlayerAid) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PlayerNotes_Write", + "addr": "0x008132b0", + "convention": "thiscall", + "prototype": "void (Game_PlayerNotes* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21948, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PlayerNotes_Read", + "addr": "0x00813250", + "convention": "thiscall", + "prototype": "void (Game_PlayerNotes* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21948, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PlayerReport_Write", + "addr": "0x00817480", + "convention": "thiscall", + "prototype": "void (Game_PlayerReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21440, COL offset +0x0; 11 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PlayerReport_Read", + "addr": "0x008200a0", + "convention": "thiscall", + "prototype": "void (Game_PlayerReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21440, COL offset +0x0; 11 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_PlayerReport", + "offset": "0x30", + "convention": "layout", + "prototype": "sizeof(Game::PlayerReport) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PopulationGroup_Write", + "addr": "0x00536af0", + "convention": "thiscall", + "prototype": "void (Game_PopulationGroup* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f8d50, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_PopulationGroup_Read", + "addr": "0x00536a80", + "convention": "thiscall", + "prototype": "void (Game_PopulationGroup* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f8d50, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_RaidTargets_Write", + "addr": "0x00818ec0", + "convention": "thiscall", + "prototype": "void (Game_RaidTargets* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21968, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_RaidTargets_Read", + "addr": "0x0083a090", + "convention": "thiscall", + "prototype": "void (Game_RaidTargets* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21968, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOAntiquarians_Write", + "addr": "0x0054bb40", + "convention": "thiscall", + "prototype": "void (Game_SVSOAntiquarians* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fab94, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOAntiquarians_Read", + "addr": "0x00551e90", + "convention": "thiscall", + "prototype": "void (Game_SVSOAntiquarians* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fab94, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOCrowDefenders_Write", + "addr": "0x004f8c90", + "convention": "thiscall", + "prototype": "void (Game_SVSOCrowDefenders* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f5904, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOCrowDefenders_Read", + "addr": "0x0050fe90", + "convention": "thiscall", + "prototype": "void (Game_SVSOCrowDefenders* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f5904, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOLandGrab_Write", + "addr": "0x00548f70", + "convention": "thiscall", + "prototype": "void (Game_SVSOLandGrab* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa92c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOLandGrab_Read", + "addr": "0x0054a9e0", + "convention": "thiscall", + "prototype": "void (Game_SVSOLandGrab* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa92c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOLocust_Write", + "addr": "0x00508ef0", + "convention": "thiscall", + "prototype": "void (Game_SVSOLocust* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f56bc, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOLocust_Read", + "addr": "0x0050d380", + "convention": "thiscall", + "prototype": "void (Game_SVSOLocust* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f56bc, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOOrtgay_Write", + "addr": "0x00509510", + "convention": "thiscall", + "prototype": "void (Game_SVSOOrtgay* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f0e94, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOOrtgay_Read", + "addr": "0x00509390", + "convention": "thiscall", + "prototype": "void (Game_SVSOOrtgay* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f0e94, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOProgressionWars_Write", + "addr": "0x0054cdb0", + "convention": "thiscall", + "prototype": "void (Game_SVSOProgressionWars* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fb34c, COL offset +0x0; 10 member fields; 8/8 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOProgressionWars_Read", + "addr": "0x00553490", + "convention": "thiscall", + "prototype": "void (Game_SVSOProgressionWars* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fb34c, COL offset +0x0; 10 member fields; 8/8 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOPuppetMaster_Write", + "addr": "0x00509f80", + "convention": "thiscall", + "prototype": "void (Game_SVSOPuppetMaster* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f3dcc, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOPuppetMaster_Read", + "addr": "0x00511b80", + "convention": "thiscall", + "prototype": "void (Game_SVSOPuppetMaster* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f3dcc, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSORefugees_Write", + "addr": "0x00509640", + "convention": "thiscall", + "prototype": "void (Game_SVSORefugees* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f575c, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSORefugees_Read", + "addr": "0x00526420", + "convention": "thiscall", + "prototype": "void (Game_SVSORefugees* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f575c, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSORefugees_PlayerStatus_Write", + "addr": "0x004fbf50", + "convention": "thiscall", + "prototype": "void (Game_SVSORefugees_PlayerStatus* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f11cc, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSORefugees_PlayerStatus_Read", + "addr": "0x004fbeb0", + "convention": "thiscall", + "prototype": "void (Game_SVSORefugees_PlayerStatus* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f11cc, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSlaversRefuel_Write", + "addr": "0x004fdf80", + "convention": "thiscall", + "prototype": "void (Game_SVSOSlaversRefuel* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f4834, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSlaversRefuel_Read", + "addr": "0x00520b00", + "convention": "thiscall", + "prototype": "void (Game_SVSOSlaversRefuel* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f4834, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSwarm_Infestation_Write", + "addr": "0x004fe0e0", + "convention": "thiscall", + "prototype": "void (Game_SVSOSwarm_Infestation* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1720, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSwarm_Infestation_Read", + "addr": "0x00504bd0", + "convention": "thiscall", + "prototype": "void (Game_SVSOSwarm_Infestation* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1720, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSwarmQueen_HiveInfo_Write", + "addr": "0x004fe730", + "convention": "thiscall", + "prototype": "void (Game_SVSOSwarmQueen_HiveInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1a68, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSwarmQueen_HiveInfo_Read", + "addr": "0x004fe6f0", + "convention": "thiscall", + "prototype": "void (Game_SVSOSwarmQueen_HiveInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1a68, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_SVSOSwarmQueen_HiveInfo", + "offset": "0x10", + "convention": "layout", + "prototype": "sizeof(Game::SVSOSwarmQueen::HiveInfo) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSystemKiller_Write", + "addr": "0x0050af20", + "convention": "thiscall", + "prototype": "void (Game_SVSOSystemKiller* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f3e6c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOSystemKiller_Read", + "addr": "0x00511f90", + "convention": "thiscall", + "prototype": "void (Game_SVSOSystemKiller* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f3e6c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_Write", + "addr": "0x0054d1b0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fb4cc, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_Read", + "addr": "0x00563850", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fb4cc, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_Write", + "addr": "0x0054cfe0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fb290, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_Read", + "addr": "0x0054cef0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fb290, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS_Write", + "addr": "0x00548ce0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa564, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS_Read", + "addr": "0x00548c90", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa564, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_VICTORY_Write", + "addr": "0x00548ce0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_VICTORY* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa534, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_VICTORY_Read", + "addr": "0x00548c90", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_VICTORY* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa534, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT_Write", + "addr": "0x00548ce0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa504, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT_Read", + "addr": "0x00548c90", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa504, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER_Write", + "addr": "0x00548ce0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa4d4, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER_Read", + "addr": "0x00548c90", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa4d4, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_GIFTS_Write", + "addr": "0x00548c50", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_GIFTS* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa54c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_GIFTS_Read", + "addr": "0x00548c10", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_GIFTS* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa54c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_MUST_EXPAND_Write", + "addr": "0x00548bb0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_MUST_EXPAND* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa51c, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_MUST_EXPAND_Read", + "addr": "0x00548b50", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_MUST_EXPAND* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa51c, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_REQUIRES_CASH_Write", + "addr": "0x00548ce0", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_REQUIRES_CASH* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa4ec, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_REQUIRES_CASH_Read", + "addr": "0x00548c90", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_REQUIRES_CASH* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa4ec, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOVonNeumann_Write", + "addr": "0x0052b8d0", + "convention": "thiscall", + "prototype": "void (Game_SVSOVonNeumann* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f59cc, COL offset +0x0; 24 member fields; 14/14 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOVonNeumann_Read", + "addr": "0x0050e130", + "convention": "thiscall", + "prototype": "void (Game_SVSOVonNeumann* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f59cc, COL offset +0x0; 24 member fields; 14/14 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOVonNeumann_DefeatRecord_Write", + "addr": "0x004ff7f0", + "convention": "thiscall", + "prototype": "void (Game_SVSOVonNeumann_DefeatRecord* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1c9c, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOVonNeumann_DefeatRecord_Read", + "addr": "0x005051f0", + "convention": "thiscall", + "prototype": "void (Game_SVSOVonNeumann_DefeatRecord* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1c9c, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_SVSOVonNeumann_DefeatRecord", + "offset": "0x18", + "convention": "layout", + "prototype": "sizeof(Game::SVSOVonNeumann::DefeatRecord) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerNodeGraph_Write", + "addr": "0x006e3530", + "convention": "thiscall", + "prototype": "void (Game_ServerNodeGraph* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1cc4c, COL offset +0x44; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerNodeGraph_Read", + "addr": "0x006e61e0", + "convention": "thiscall", + "prototype": "void (Game_ServerNodeGraph* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1cc4c, COL offset +0x44; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerSpyManager_Write", + "addr": "0x00828a40", + "convention": "thiscall", + "prototype": "void (Game_ServerSpyManager* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a30728, COL offset +0x4; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerSpyManager_Read", + "addr": "0x008381b0", + "convention": "thiscall", + "prototype": "void (Game_ServerSpyManager* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a30728, COL offset +0x4; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerTradeManagerImpl_Write", + "addr": "0x0082cb60", + "convention": "thiscall", + "prototype": "void (Game_ServerTradeManagerImpl* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31b64, COL offset +0x4c; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerTradeManagerImpl_Read", + "addr": "0x00858a10", + "convention": "thiscall", + "prototype": "void (Game_ServerTradeManagerImpl* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31b64, COL offset +0x4c; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerTradeSector_Write", + "addr": "0x0082c8c0", + "convention": "thiscall", + "prototype": "void (Game_ServerTradeSector* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31b30, COL offset +0x8; 12 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerTradeSector_Read", + "addr": "0x00858290", + "convention": "thiscall", + "prototype": "void (Game_ServerTradeSector* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31b30, COL offset +0x8; 12 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerTradeSector_FreighterWarning_Write", + "addr": "0x008197d0", + "convention": "thiscall", + "prototype": "void (Game_ServerTradeSector_FreighterWarning* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2d858, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ServerTradeSector_FreighterWarning_Read", + "addr": "0x00819780", + "convention": "thiscall", + "prototype": "void (Game_ServerTradeSector_FreighterWarning* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2d858, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_ServerTradeSector_FreighterWarning", + "offset": "0xc", + "convention": "layout", + "prototype": "sizeof(Game::ServerTradeSector::FreighterWarning) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipBuildOrder_Write", + "addr": "0x00813800", + "convention": "thiscall", + "prototype": "void (Game_ShipBuildOrder* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0c160, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipBuildOrder_Read", + "addr": "0x00813770", + "convention": "thiscall", + "prototype": "void (Game_ShipBuildOrder* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0c160, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipBuildOrderDef_Write", + "addr": "0x00813800", + "convention": "thiscall", + "prototype": "void (Game_ShipBuildOrderDef* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0ad08, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipBuildOrderDef_Read", + "addr": "0x00813770", + "convention": "thiscall", + "prototype": "void (Game_ShipBuildOrderDef* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0ad08, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_ShipBuildOrderDef", + "offset": "0x18", + "convention": "layout", + "prototype": "sizeof(Game::ShipBuildOrderDef) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipRecords_Write", + "addr": "0x008176a0", + "convention": "thiscall", + "prototype": "void (Game_ShipRecords* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3144c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipRecords_Read", + "addr": "0x008560d0", + "convention": "thiscall", + "prototype": "void (Game_ShipRecords* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3144c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpecialProject_Write", + "addr": "0x00814760", + "convention": "thiscall", + "prototype": "void (Game_SpecialProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21938, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpecialProject_Read", + "addr": "0x008146c0", + "convention": "thiscall", + "prototype": "void (Game_SpecialProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21938, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_SpecialProject", + "offset": "0x34", + "convention": "layout", + "prototype": "sizeof(Game::SpecialProject) -- enumeration meets embedding", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyCraft_Write", + "addr": "0x00814940", + "convention": "thiscall", + "prototype": "void (Game_SpyCraft* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a30718, COL offset +0x0; 13 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyCraft_Read", + "addr": "0x00837dc0", + "convention": "thiscall", + "prototype": "void (Game_SpyCraft* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a30718, COL offset +0x0; 13 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportDefences_Write", + "addr": "0x00828ba0", + "convention": "thiscall", + "prototype": "void (Game_SpyReportDefences* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a313e8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportDefences_Read", + "addr": "0x00828b10", + "convention": "thiscall", + "prototype": "void (Game_SpyReportDefences* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a313e8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportTechTree_Write", + "addr": "0x00814ba0", + "convention": "thiscall", + "prototype": "void (Game_SpyReportTechTree* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a318b4, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportTechTree_Read", + "addr": "0x00814b40", + "convention": "thiscall", + "prototype": "void (Game_SpyReportTechTree* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a318b4, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportTrade_Write", + "addr": "0x00828cf0", + "convention": "thiscall", + "prototype": "void (Game_SpyReportTrade* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a313f8, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportTrade_Read", + "addr": "0x00828c20", + "convention": "thiscall", + "prototype": "void (Game_SpyReportTrade* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a313f8, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportTradeRoute_Write", + "addr": "0x00814aa0", + "convention": "thiscall", + "prototype": "void (Game_SpyReportTradeRoute* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3079c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SpyReportTradeRoute_Read", + "addr": "0x00838980", + "convention": "thiscall", + "prototype": "void (Game_SpyReportTradeRoute* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3079c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_SpyReportTradeRoute", + "offset": "0x20", + "convention": "layout", + "prototype": "sizeof(Game::SpyReportTradeRoute) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyGameCreateParams_Write", + "addr": "0x0082ae40", + "convention": "thiscall", + "prototype": "void (Game_StrategyGameCreateParams* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a25574, COL offset +0x0; 25 member fields; 19/19 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyGameCreateParams_Read", + "addr": "0x00832cc0", + "convention": "thiscall", + "prototype": "void (Game_StrategyGameCreateParams* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a25574, COL offset +0x0; 25 member fields; 19/19 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyGameInfo_Write", + "addr": "0x00829960", + "convention": "thiscall", + "prototype": "void (Game_StrategyGameInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a07ba0, COL offset +0x0; 13 member fields; 10/10 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyGameInfo_Read", + "addr": "0x00875cb0", + "convention": "thiscall", + "prototype": "void (Game_StrategyGameInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a07ba0, COL offset +0x0; 13 member fields; 10/10 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyPlayerInfo_Write", + "addr": "0x008298d0", + "convention": "thiscall", + "prototype": "void (Game_StrategyPlayerInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a077d8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyPlayerInfo_Read", + "addr": "0x00829820", + "convention": "thiscall", + "prototype": "void (Game_StrategyPlayerInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a077d8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_StrategyPlayerInfo", + "offset": "0xc4", + "convention": "layout", + "prototype": "sizeof(Game::StrategyPlayerInfo) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyServer_Write", + "addr": "0x0079fa70", + "convention": "thiscall", + "prototype": "void (Game_StrategyServer* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a26084, COL offset +0x0; 38 member fields; 18/18 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyServer_Read", + "addr": "0x007d27a0", + "convention": "thiscall", + "prototype": "void (Game_StrategyServer* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a26084, COL offset +0x0; 38 member fields; 18/18 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyTimerParams_Write", + "addr": "0x008173e0", + "convention": "thiscall", + "prototype": "void (Game_StrategyTimerParams* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a07334, COL offset +0x0; 4 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StrategyTimerParams_Read", + "addr": "0x00820040", + "convention": "thiscall", + "prototype": "void (Game_StrategyTimerParams* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a07334, COL offset +0x0; 4 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TacReport_Write", + "addr": "0x00458e60", + "convention": "thiscall", + "prototype": "void (Game_TacReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e4600, COL offset +0x0; 17 member fields; 13/13 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TacReport_Read", + "addr": "0x00458c00", + "convention": "thiscall", + "prototype": "void (Game_TacReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e4600, COL offset +0x0; 17 member fields; 13/13 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TacReportEvents_Write", + "addr": "0x004565d0", + "convention": "thiscall", + "prototype": "void (Game_TacReportEvents* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e45f0, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TacReportEvents_Read", + "addr": "0x00456540", + "convention": "thiscall", + "prototype": "void (Game_TacReportEvents* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e45f0, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_TacReportEvents", + "offset": "0x20", + "convention": "layout", + "prototype": "sizeof(Game::TacReportEvents) -- enumeration meets embedding", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TechOfferProject_Write", + "addr": "0x008535c0", + "convention": "thiscall", + "prototype": "void (Game_TechOfferProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31884, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TechOfferProject_Read", + "addr": "0x00853530", + "convention": "thiscall", + "prototype": "void (Game_TechOfferProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31884, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TechProject_Write", + "addr": "0x00853390", + "convention": "thiscall", + "prototype": "void (Game_TechProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31834, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TechProject_Read", + "addr": "0x00853280", + "convention": "thiscall", + "prototype": "void (Game_TechProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31834, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TradeRoute_Write", + "addr": "0x00819650", + "convention": "thiscall", + "prototype": "void (Game_TradeRoute* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2d848, COL offset +0x0; 8 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_TradeRoute_Read", + "addr": "0x008208d0", + "convention": "thiscall", + "prototype": "void (Game_TradeRoute* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2d848, COL offset +0x0; 8 member fields; 5/5 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ZuulInfestation_Write", + "addr": "0x005361e0", + "convention": "thiscall", + "prototype": "void (Game_ZuulInfestation* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f8cb0, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ZuulInfestation_Read", + "addr": "0x00536160", + "convention": "thiscall", + "prototype": "void (Game_ZuulInfestation* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f8cb0, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_AICombatReport_Write", + "addr": "0x006986e0", + "convention": "thiscall", + "prototype": "void (Game_AICombatReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1a6f0, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_AICombatReport_Read", + "addr": "0x0069c6d0", + "convention": "thiscall", + "prototype": "void (Game_AICombatReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1a6f0, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_FieldTemplate_Point_Write", + "addr": "0x0059bfa0", + "convention": "thiscall", + "prototype": "void (Game_FieldTemplate_Point* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a05df8, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_FieldTemplate_Point_Read", + "addr": "0x0059bf10", + "convention": "thiscall", + "prototype": "void (Game_FieldTemplate_Point* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a05df8, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_FieldTemplate_Point", + "offset": "0x14", + "convention": "layout", + "prototype": "sizeof(Game::FieldTemplate::Point) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_LocustFleetLogistics_Write", + "addr": "0x00508e50", + "convention": "thiscall", + "prototype": "void (Game_LocustFleetLogistics* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1f00, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_LocustFleetLogistics_Read", + "addr": "0x00508d60", + "convention": "thiscall", + "prototype": "void (Game_LocustFleetLogistics* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1f00, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_Objective_Write", + "addr": "0x008505b0", + "convention": "thiscall", + "prototype": "void (Game_Objective* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2e0cc, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_Objective_Read", + "addr": "0x00850430", + "convention": "thiscall", + "prototype": "void (Game_Objective* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2e0cc, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_Objective", + "offset": "0x44", + "convention": "layout", + "prototype": "sizeof(Game::Objective) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest_Write", + "addr": "0x0055d120", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa614, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest_Read", + "addr": "0x0055d040", + "convention": "thiscall", + "prototype": "void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa614, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest", + "offset": "0x20", + "convention": "layout", + "prototype": "sizeof(Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest) -- container stride", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipDesignDef_LegacyWeaponDef_Write", + "addr": "0x00813950", + "convention": "thiscall", + "prototype": "void (Game_ShipDesignDef_LegacyWeaponDef* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2df7c, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipDesignDef_LegacyWeaponDef_Read", + "addr": "0x00846260", + "convention": "thiscall", + "prototype": "void (Game_ShipDesignDef_LegacyWeaponDef* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2df7c, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipWeapon_Write", + "addr": "0x0056f450", + "convention": "thiscall", + "prototype": "void (Game_ShipWeapon* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fdc8c, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_ShipWeapon_Read", + "addr": "0x00571130", + "convention": "thiscall", + "prototype": "void (Game_ShipWeapon* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fdc8c, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SlotDef_Write", + "addr": "0x008276d0", + "convention": "thiscall", + "prototype": "void (Game_SlotDef* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2db6c, COL offset +0x0; 18 member fields; 15/15 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_SlotDef_Read", + "addr": "0x00832790", + "convention": "thiscall", + "prototype": "void (Game_SlotDef* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2db6c, COL offset +0x0; 18 member fields; 15/15 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_SlotDef", + "offset": "0xbc", + "convention": "layout", + "prototype": "sizeof(Game::SlotDef) -- enumeration meets embedding", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StarSystem_OutputRates_Write", + "addr": "0x00745190", + "convention": "thiscall", + "prototype": "void (Game_StarSystem_OutputRates* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1f884, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "Game_StarSystem_OutputRates_Read", + "addr": "0x007472a0", + "convention": "thiscall", + "prototype": "void (Game_StarSystem_OutputRates* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1f884, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" + }, + { + "name": "sizeof_Game_StarSystem_OutputRates", + "offset": "0x1c", + "convention": "layout", + "prototype": "sizeof(Game::StarSystem::OutputRates) -- enumeration meets embedding", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md" } ] } diff --git a/ghidra/generated/sots_addresses.h b/ghidra/generated/sots_addresses.h index d1674ec..5781cad 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 @ d523d27, generated 2026-09-08 by tools/gen_addresses.py +// Source: sots-re ghidra/addresses.json @ 795aa47, generated 2026-09-08 by tools/gen_addresses.py // Runtime address = (uintptr_t)GetModuleHandle(NULL) + RVA (the exe is ASLR-relocated). #pragma once #include @@ -369,7 +369,7 @@ constexpr uint32_t ServerPlayer_off_SetupResearchMult = 0x0000022c; constexpr uint32_t ServerPlayer_off_Sav = 0x00000284; // offset Tech* current research target (ResT); NULL = none [verified-by-save] constexpr uint32_t ServerPlayer_off_ResearchTarget = 0x00000294; -// offset std::vector otch -- 3 words {_Myfirst@0x274,_Mylast@0x278,_Myend@0x27c}; save tag otch. sizeof(ObservedTech) = 0x2c (44), PINNED three ways: magic divide 0x2e8ba2e9 sar 3 (=/44) in vector_ObservedTech_assign 0x0087239f, imul reg,reg,0x2c at 0x0087243a / 0x007b735b, and the linear search stride `add edi,0x2c` at 0x007ba257. Append site = RecordObservedTech+0xdf (0x007ba27f): lea ecx,[player+0x274]; call vector_ObservedTech_push_back 0x007b7320. All three words move because push_back reallocs through vector_44B_grow 0x007b5820. [verified] +// offset std::vector otch -- 3 words {_Myfirst@0x274,_Mylast@0x278,_Myend@0x27c}; save tag otch. sizeof(ObservedTech) = 0x2c (44), PINNED three ways: magic divide 0x2e8ba2e9 sar 3 (=/44) in vector_ObservedTech_assign 0x0087239f, imul reg,reg,0x2c at 0x0087243a / 0x007b735b, and the linear search stride `add edi,0x2c` at 0x007ba257. Append site = RecordObservedTech+0xdf (0x007ba27f): lea ecx,[player+0x274]; call vector_ObservedTech_push_back 0x007b7320. All three words move because push_back reallocs through vector_44B_grow 0x007b5820. LIVE CONFIRMATION (lane V, 2026-09-08, VM140, build eventlive-dd38117-20260908T0916Z): the ProcessResearch `observed_techs` Result region measured the vector's byte span growing by exactly 44 on each of the two tech-completion calls of the five-End-Turn run from ref-turn2 (call 3: 440 -> 484; call 9: 484 -> 528) -- an independent behavioural confirmation of the static pin. Both non-completing players' spans were 880 = 20 x 44 and never moved. [verified] constexpr uint32_t ServerPlayer_off_ObservedTechs = 0x00000274; // offset float IncMod [verified-by-save] constexpr uint32_t ServerPlayer_off_IncMod = 0x0000030c; @@ -799,7 +799,7 @@ constexpr uint32_t Mars_Vec3_NormaliseEpsilon = 0x005e1ef8; constexpr uint32_t StrategyServer_MoveFleet_straight_leg = 0x003da0f2; // site site inside StrategyServer::MoveFleet /* the move != distance branch: exactly two roundings per component, tmp.c = float32(dir.c * move) then pos.c = float32(pos.c + tmp.c). `move` is reloaded from a float32 slot. The sibling branch (move == distance, an EXACT float compare) copies the destination's three words verbatim with mov, so an arrival never steps onto its destination. */ [verified] constexpr uint32_t StrategyServer_MoveFleet_position_update = 0x003da2ac; -// constant sizeof(Game::ObservedTech) = 0x2c (44 bytes). Confirmed independently by (a) the compiler's magic division by 44 (mov eax,0x2e8ba2e9; imul; sar edx,3) at 0x0087239f and 0x007b7339, (b) imul reg,reg,0x2c at 0x0087243a, 0x00872468, 0x007b735b, and (c) the iterator advance `add edi,0x2c` in RecordObservedTech's linear search at 0x007ba257. FULL MEMBER MAP, from ObservedTech_Write 0x00817cf0 / ObservedTech_Read 0x00817c40 (lane S 2026-09-08): +0x00 vptr 0x00a2439c; +0x04 uint16 otnF; +0x06 uint16 otnL; +0x08 bool odet (1 byte, +3 pad); +0x0c std::string otch (0x1c, so _Mysize at +0x1c, _Myres at +0x20, _Alval at +0x24); +0x28 int owith. 4 + 2 + 2 + 4 + 0x1c + 4 = 0x2c exactly, no padding slack and no unaccounted field. [verified] +// constant sizeof(Game::ObservedTech) = 0x2c (44 bytes). Confirmed independently by (a) the compiler's magic division by 44 (mov eax,0x2e8ba2e9; imul; sar edx,3) at 0x0087239f and 0x007b7339, (b) imul reg,reg,0x2c at 0x0087243a, 0x00872468, 0x007b735b, and (c) the iterator advance `add edi,0x2c` in RecordObservedTech's linear search at 0x007ba257. FULL MEMBER MAP, from ObservedTech_Write 0x00817cf0 / ObservedTech_Read 0x00817c40 (lane S 2026-09-08): +0x00 vptr 0x00a2439c; +0x04 uint16 otnF; +0x06 uint16 otnL; +0x08 bool odet (1 byte, +3 pad); +0x0c std::string otch (0x1c, so _Mysize at +0x1c, _Myres at +0x20, _Alval at +0x24); +0x28 int owith. 4 + 2 + 2 + 4 + 0x1c + 4 = 0x2c exactly, no padding slack and no unaccounted field. LIVE CONFIRMATION (lane V, 2026-09-08, VM140, build eventlive-dd38117-20260908T0916Z): the ProcessResearch `observed_techs` Result region measured the vector's byte span growing by exactly 44 on each of the two tech-completion calls of the five-End-Turn run from ref-turn2 (call 3: 440 -> 484; call 9: 484 -> 528) -- an independent behavioural confirmation of the static pin. Both non-completing players' spans were 880 = 20 x 44 and never moved. [verified] constexpr uint32_t ObservedTech_sizeof = 0x0000002c; // data Game::ObservedTech vftable. RTTI COL 0x00a81c78 -> type descriptor 0x00aeede4 = '.?AVObservedTech@Game@@'. Written to element+0x00 by ObservedTech_ctor 0x008562a0 -- so ObservedTech is polymorphic and its first word is the vptr, not a data field. [verified] constexpr uint32_t ObservedTech_vftable = 0x0062439c; @@ -835,5 +835,407 @@ constexpr uint32_t ObservedWeapon_Write = 0x00417bc0; constexpr uint32_t std_string_sizeof = 0x0000001c; // thiscall vector::_Reserve/grow for a 44-byte element type. Shared with FUN_0086dec0, so it may be a COMDAT-folded body -- do NOT assume it is ObservedTech-specific. [mapped] constexpr uint32_t vector_44B_grow = 0x003b5820; +// thiscall void (Game_AIAutoPeaceRun* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a199b4, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_AIAutoPeaceRun_Write = 0x00292cf0; +// thiscall void (Game_AIAutoPeaceRun* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a199b4, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_AIAutoPeaceRun_Read = 0x00292c90; +// layout sizeof(Game::AIAutoPeaceRun) -- container stride [verified] +constexpr uint32_t sizeof_Game_AIAutoPeaceRun = 0x00000010; +// thiscall void (Game_BackEngProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3185c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_BackEngProject_Write = 0x00453390; +// thiscall void (Game_BackEngProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3185c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_BackEngProject_Read = 0x00453280; +// thiscall void (Game_CombatPlayerReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0623c, COL offset +0x0; 11 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatPlayerReport_Write = 0x0019d6d0; +// thiscall void (Game_CombatPlayerReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0623c, COL offset +0x0; 11 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatPlayerReport_Read = 0x0019d360; +// layout sizeof(Game::CombatPlayerReport) -- container stride [verified] +constexpr uint32_t sizeof_Game_CombatPlayerReport = 0x00000054; +// thiscall void (Game_CombatPlayerStats* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e4b74, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatPlayerStats_Write = 0x00059140; +// thiscall void (Game_CombatPlayerStats* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e4b74, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatPlayerStats_Read = 0x00059070; +// layout sizeof(Game::CombatPlayerStats) -- container stride [verified] +constexpr uint32_t sizeof_Game_CombatPlayerStats = 0x00000024; +// thiscall void (Game_CombatReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0624c, COL offset +0x0; 14 member fields; 6/6 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatReport_Write = 0x0019db30; +// thiscall void (Game_CombatReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0624c, COL offset +0x0; 14 member fields; 6/6 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatReport_Read = 0x0019d8f0; +// thiscall void (Game_CombatShipReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a06064, COL offset +0x0; 12 member fields; 7/7 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatShipReport_Write = 0x0019b960; +// thiscall void (Game_CombatShipReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a06064, COL offset +0x0; 12 member fields; 7/7 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatShipReport_Read = 0x0019c650; +// layout sizeof(Game::CombatShipReport) -- container stride [verified] +constexpr uint32_t sizeof_Game_CombatShipReport = 0x00000050; +// thiscall void (Game_CombatWeaponReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a06074, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatWeaponReport_Write = 0x0019bb70; +// thiscall void (Game_CombatWeaponReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a06074, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CombatWeaponReport_Read = 0x0019bad0; +// layout sizeof(Game::CombatWeaponReport) -- container stride [verified] +constexpr uint32_t sizeof_Game_CombatWeaponReport = 0x00000030; +// thiscall void (Game_CommDeclareShareSystemNotes* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3157c, COL offset +0x0; 8 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CommDeclareShareSystemNotes_Write = 0x00410da0; +// thiscall void (Game_CommDeclareShareSystemNotes* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3157c, COL offset +0x0; 8 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CommDeclareShareSystemNotes_Read = 0x00410d50; +// thiscall void (Game_CommonPlague* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f8b50, COL offset +0x0; 6 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CommonPlague_Write = 0x001360e0; +// thiscall void (Game_CommonPlague* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f8b50, COL offset +0x0; 6 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_CommonPlague_Read = 0x001373e0; +// thiscall void (Game_DefenceFleetAssignment* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e3c48, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_DefenceFleetAssignment_Write = 0x004119d0; +// thiscall void (Game_DefenceFleetAssignment* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e3c48, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_DefenceFleetAssignment_Read = 0x00432330; +// thiscall void (Game_DiplomacyStats* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21430, COL offset +0x0; 14 member fields; 13/13 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_DiplomacyStats_Write = 0x00418cb0; +// thiscall void (Game_DiplomacyStats* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21430, COL offset +0x0; 14 member fields; 13/13 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_DiplomacyStats_Read = 0x00418b80; +// layout sizeof(Game::DiplomacyStats) -- container stride [verified] +constexpr uint32_t sizeof_Game_DiplomacyStats = 0x00000024; +// thiscall void (Game_EventStorage* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a313c8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_EventStorage_Write = 0x00425cc0; +// thiscall void (Game_EventStorage* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a313c8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_EventStorage_Read = 0x004850f0; +// thiscall void (Game_EventStorage_Event* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21958, COL offset +0x0; 8 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_EventStorage_Event_Write = 0x00425ab0; +// thiscall void (Game_EventStorage_Event* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21958, COL offset +0x0; 8 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_EventStorage_Event_Read = 0x00425970; +// thiscall void (Game_EventStorage_TurnEvents* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0f07c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_EventStorage_TurnEvents_Write = 0x00425c40; +// thiscall void (Game_EventStorage_TurnEvents* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0f07c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_EventStorage_TurnEvents_Read = 0x00425bb0; +// layout sizeof(Game::EventStorage::TurnEvents) -- container stride [verified] +constexpr uint32_t sizeof_Game_EventStorage_TurnEvents = 0x00000018; +// thiscall void (Game_FleetNameGenerator* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a32760, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_FleetNameGenerator_Write = 0x00417460; +// thiscall void (Game_FleetNameGenerator* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a32760, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_FleetNameGenerator_Read = 0x00417440; +// thiscall void (Game_FlightPlan* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1d50c, COL offset +0x0; 6 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_FlightPlan_Write = 0x00300f60; +// thiscall void (Game_FlightPlan* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1d50c, COL offset +0x0; 6 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_FlightPlan_Read = 0x00304c70; +// layout sizeof(Game::FlightPlan) -- enumeration meets embedding [verified] +constexpr uint32_t sizeof_Game_FlightPlan = 0x00000038; +// thiscall void (Game_IndependenceInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2005c, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_IndependenceInfo_Write = 0x00348ee0; +// thiscall void (Game_IndependenceInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2005c, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_IndependenceInfo_Read = 0x00348df0; +// thiscall void (Game_JewelsProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa438, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_JewelsProject_Write = 0x00148910; +// thiscall void (Game_JewelsProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa438, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_JewelsProject_Read = 0x001488d0; +// thiscall void (Game_MonitorProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3180c, COL offset +0x0; 7 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_MonitorProject_Write = 0x004287d0; +// thiscall void (Game_MonitorProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3180c, COL offset +0x0; 7 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_MonitorProject_Read = 0x00428740; +// thiscall void (Game_Morale* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1f7c8, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_Morale_Write = 0x00344ea0; +// thiscall void (Game_Morale* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1f7c8, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_Morale_Read = 0x00344dd0; +// thiscall void (Game_MoraleEvent* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2003c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_MoraleEvent_Write = 0x003491b0; +// thiscall void (Game_MoraleEvent* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2003c, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_MoraleEvent_Read = 0x003490b0; +// layout sizeof(Game::MoraleEvent) -- container stride [verified] +constexpr uint32_t sizeof_Game_MoraleEvent = 0x00000050; +// thiscall void (Game_NodePath* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1cb50, COL offset +0x0; 11 member fields; 6/6 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_NodePath_Write = 0x002e1fd0; +// thiscall void (Game_NodePath* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1cb50, COL offset +0x0; 11 member fields; 6/6 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_NodePath_Read = 0x002e1e90; +// layout sizeof(Game::NodePath) -- container stride [verified] +constexpr uint32_t sizeof_Game_NodePath = 0x00000030; +// thiscall void (Game_ObservedTech* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2439c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ObservedTech_Write = 0x00417cf0; +// thiscall void (Game_ObservedTech* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2439c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ObservedTech_Read = 0x00417c40; +// layout sizeof(Game::ObservedTech) -- container stride [verified] +constexpr uint32_t sizeof_Game_ObservedTech = 0x0000002c; +// thiscall void (Game_ObservedWeapon* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2438c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ObservedWeapon_Write = 0x00417bc0; +// thiscall void (Game_ObservedWeapon* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2438c, COL offset +0x0; 5 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ObservedWeapon_Read = 0x00417b10; +// layout sizeof(Game::ObservedWeapon) -- container stride [verified] +constexpr uint32_t sizeof_Game_ObservedWeapon = 0x0000002c; +// thiscall void (Game_PlayerAid* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a286dc, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PlayerAid_Write = 0x00418dc0; +// thiscall void (Game_PlayerAid* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a286dc, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PlayerAid_Read = 0x004207b0; +// layout sizeof(Game::PlayerAid) -- container stride [verified] +constexpr uint32_t sizeof_Game_PlayerAid = 0x00000018; +// thiscall void (Game_PlayerNotes* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21948, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PlayerNotes_Write = 0x004132b0; +// thiscall void (Game_PlayerNotes* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21948, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PlayerNotes_Read = 0x00413250; +// thiscall void (Game_PlayerReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21440, COL offset +0x0; 11 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PlayerReport_Write = 0x00417480; +// thiscall void (Game_PlayerReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21440, COL offset +0x0; 11 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PlayerReport_Read = 0x004200a0; +// layout sizeof(Game::PlayerReport) -- container stride [verified] +constexpr uint32_t sizeof_Game_PlayerReport = 0x00000030; +// thiscall void (Game_PopulationGroup* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f8d50, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PopulationGroup_Write = 0x00136af0; +// thiscall void (Game_PopulationGroup* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f8d50, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_PopulationGroup_Read = 0x00136a80; +// thiscall void (Game_RaidTargets* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21968, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_RaidTargets_Write = 0x00418ec0; +// thiscall void (Game_RaidTargets* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21968, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_RaidTargets_Read = 0x0043a090; +// thiscall void (Game_SVSOAntiquarians* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fab94, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOAntiquarians_Write = 0x0014bb40; +// thiscall void (Game_SVSOAntiquarians* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fab94, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOAntiquarians_Read = 0x00151e90; +// thiscall void (Game_SVSOCrowDefenders* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f5904, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOCrowDefenders_Write = 0x000f8c90; +// thiscall void (Game_SVSOCrowDefenders* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f5904, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOCrowDefenders_Read = 0x0010fe90; +// thiscall void (Game_SVSOLandGrab* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa92c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOLandGrab_Write = 0x00148f70; +// thiscall void (Game_SVSOLandGrab* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa92c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOLandGrab_Read = 0x0014a9e0; +// thiscall void (Game_SVSOLocust* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f56bc, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOLocust_Write = 0x00108ef0; +// thiscall void (Game_SVSOLocust* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f56bc, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOLocust_Read = 0x0010d380; +// thiscall void (Game_SVSOOrtgay* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f0e94, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOOrtgay_Write = 0x00109510; +// thiscall void (Game_SVSOOrtgay* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f0e94, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOOrtgay_Read = 0x00109390; +// thiscall void (Game_SVSOProgressionWars* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fb34c, COL offset +0x0; 10 member fields; 8/8 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOProgressionWars_Write = 0x0014cdb0; +// thiscall void (Game_SVSOProgressionWars* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fb34c, COL offset +0x0; 10 member fields; 8/8 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOProgressionWars_Read = 0x00153490; +// thiscall void (Game_SVSOPuppetMaster* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f3dcc, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOPuppetMaster_Write = 0x00109f80; +// thiscall void (Game_SVSOPuppetMaster* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f3dcc, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOPuppetMaster_Read = 0x00111b80; +// thiscall void (Game_SVSORefugees* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f575c, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSORefugees_Write = 0x00109640; +// thiscall void (Game_SVSORefugees* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f575c, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSORefugees_Read = 0x00126420; +// thiscall void (Game_SVSORefugees_PlayerStatus* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f11cc, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSORefugees_PlayerStatus_Write = 0x000fbf50; +// thiscall void (Game_SVSORefugees_PlayerStatus* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f11cc, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSORefugees_PlayerStatus_Read = 0x000fbeb0; +// thiscall void (Game_SVSOSlaversRefuel* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f4834, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSlaversRefuel_Write = 0x000fdf80; +// thiscall void (Game_SVSOSlaversRefuel* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f4834, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSlaversRefuel_Read = 0x00120b00; +// thiscall void (Game_SVSOSwarm_Infestation* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1720, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSwarm_Infestation_Write = 0x000fe0e0; +// thiscall void (Game_SVSOSwarm_Infestation* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1720, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSwarm_Infestation_Read = 0x00104bd0; +// thiscall void (Game_SVSOSwarmQueen_HiveInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1a68, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSwarmQueen_HiveInfo_Write = 0x000fe730; +// thiscall void (Game_SVSOSwarmQueen_HiveInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1a68, COL offset +0x0; 3 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSwarmQueen_HiveInfo_Read = 0x000fe6f0; +// layout sizeof(Game::SVSOSwarmQueen::HiveInfo) -- container stride [verified] +constexpr uint32_t sizeof_Game_SVSOSwarmQueen_HiveInfo = 0x00000010; +// thiscall void (Game_SVSOSystemKiller* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f3e6c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSystemKiller_Write = 0x0010af20; +// thiscall void (Game_SVSOSystemKiller* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f3e6c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOSystemKiller_Read = 0x00111f90; +// thiscall void (Game_SVSOUpstartApes* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fb4cc, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_Write = 0x0014d1b0; +// thiscall void (Game_SVSOUpstartApes* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fb4cc, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_Read = 0x00163850; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fb290, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_Write = 0x0014cfe0; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fb290, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_Read = 0x0014cef0; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa564, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS_Write = 0x00148ce0; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa564, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS_Read = 0x00148c90; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_VICTORY* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa534, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_VICTORY_Write = 0x00148ce0; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_VICTORY* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa534, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_VICTORY_Read = 0x00148c90; +// thiscall void (Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa504, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT_Write = 0x00148ce0; +// thiscall void (Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa504, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT_Read = 0x00148c90; +// thiscall void (Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa4d4, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER_Write = 0x00148ce0; +// thiscall void (Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa4d4, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER_Read = 0x00148c90; +// thiscall void (Game_SVSOUpstartApes_EO_GIFTS* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa54c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_GIFTS_Write = 0x00148c50; +// thiscall void (Game_SVSOUpstartApes_EO_GIFTS* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa54c, COL offset +0x0; 2 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_GIFTS_Read = 0x00148c10; +// thiscall void (Game_SVSOUpstartApes_EO_MUST_EXPAND* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa51c, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_MUST_EXPAND_Write = 0x00148bb0; +// thiscall void (Game_SVSOUpstartApes_EO_MUST_EXPAND* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa51c, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_MUST_EXPAND_Read = 0x00148b50; +// thiscall void (Game_SVSOUpstartApes_EO_REQUIRES_CASH* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa4ec, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_REQUIRES_CASH_Write = 0x00148ce0; +// thiscall void (Game_SVSOUpstartApes_EO_REQUIRES_CASH* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa4ec, COL offset +0x0; 3 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_REQUIRES_CASH_Read = 0x00148c90; +// thiscall void (Game_SVSOVonNeumann* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f59cc, COL offset +0x0; 24 member fields; 14/14 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOVonNeumann_Write = 0x0012b8d0; +// thiscall void (Game_SVSOVonNeumann* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f59cc, COL offset +0x0; 24 member fields; 14/14 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOVonNeumann_Read = 0x0010e130; +// thiscall void (Game_SVSOVonNeumann_DefeatRecord* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1c9c, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOVonNeumann_DefeatRecord_Write = 0x000ff7f0; +// thiscall void (Game_SVSOVonNeumann_DefeatRecord* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1c9c, COL offset +0x0; 5 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOVonNeumann_DefeatRecord_Read = 0x001051f0; +// layout sizeof(Game::SVSOVonNeumann::DefeatRecord) -- container stride [verified] +constexpr uint32_t sizeof_Game_SVSOVonNeumann_DefeatRecord = 0x00000018; +// thiscall void (Game_ServerNodeGraph* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1cc4c, COL offset +0x44; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerNodeGraph_Write = 0x002e3530; +// thiscall void (Game_ServerNodeGraph* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1cc4c, COL offset +0x44; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerNodeGraph_Read = 0x002e61e0; +// thiscall void (Game_ServerSpyManager* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a30728, COL offset +0x4; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerSpyManager_Write = 0x00428a40; +// thiscall void (Game_ServerSpyManager* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a30728, COL offset +0x4; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerSpyManager_Read = 0x004381b0; +// thiscall void (Game_ServerTradeManagerImpl* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31b64, COL offset +0x4c; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerTradeManagerImpl_Write = 0x0042cb60; +// thiscall void (Game_ServerTradeManagerImpl* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31b64, COL offset +0x4c; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerTradeManagerImpl_Read = 0x00458a10; +// thiscall void (Game_ServerTradeSector* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31b30, COL offset +0x8; 12 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerTradeSector_Write = 0x0042c8c0; +// thiscall void (Game_ServerTradeSector* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31b30, COL offset +0x8; 12 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerTradeSector_Read = 0x00458290; +// thiscall void (Game_ServerTradeSector_FreighterWarning* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2d858, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerTradeSector_FreighterWarning_Write = 0x004197d0; +// thiscall void (Game_ServerTradeSector_FreighterWarning* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2d858, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ServerTradeSector_FreighterWarning_Read = 0x00419780; +// layout sizeof(Game::ServerTradeSector::FreighterWarning) -- container stride [verified] +constexpr uint32_t sizeof_Game_ServerTradeSector_FreighterWarning = 0x0000000c; +// thiscall void (Game_ShipBuildOrder* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0c160, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipBuildOrder_Write = 0x00413800; +// thiscall void (Game_ShipBuildOrder* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0c160, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipBuildOrder_Read = 0x00413770; +// thiscall void (Game_ShipBuildOrderDef* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a0ad08, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipBuildOrderDef_Write = 0x00413800; +// thiscall void (Game_ShipBuildOrderDef* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a0ad08, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipBuildOrderDef_Read = 0x00413770; +// layout sizeof(Game::ShipBuildOrderDef) -- container stride [verified] +constexpr uint32_t sizeof_Game_ShipBuildOrderDef = 0x00000018; +// thiscall void (Game_ShipRecords* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3144c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipRecords_Write = 0x004176a0; +// thiscall void (Game_ShipRecords* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3144c, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipRecords_Read = 0x004560d0; +// thiscall void (Game_SpecialProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a21938, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpecialProject_Write = 0x00414760; +// thiscall void (Game_SpecialProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a21938, COL offset +0x0; 6 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpecialProject_Read = 0x004146c0; +// layout sizeof(Game::SpecialProject) -- enumeration meets embedding [verified] +constexpr uint32_t sizeof_Game_SpecialProject = 0x00000034; +// thiscall void (Game_SpyCraft* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a30718, COL offset +0x0; 13 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyCraft_Write = 0x00414940; +// thiscall void (Game_SpyCraft* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a30718, COL offset +0x0; 13 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyCraft_Read = 0x00437dc0; +// thiscall void (Game_SpyReportDefences* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a313e8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportDefences_Write = 0x00428ba0; +// thiscall void (Game_SpyReportDefences* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a313e8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportDefences_Read = 0x00428b10; +// thiscall void (Game_SpyReportTechTree* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a318b4, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportTechTree_Write = 0x00414ba0; +// thiscall void (Game_SpyReportTechTree* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a318b4, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportTechTree_Read = 0x00414b40; +// thiscall void (Game_SpyReportTrade* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a313f8, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportTrade_Write = 0x00428cf0; +// thiscall void (Game_SpyReportTrade* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a313f8, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportTrade_Read = 0x00428c20; +// thiscall void (Game_SpyReportTradeRoute* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a3079c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportTradeRoute_Write = 0x00414aa0; +// thiscall void (Game_SpyReportTradeRoute* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a3079c, COL offset +0x0; 4 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SpyReportTradeRoute_Read = 0x00438980; +// layout sizeof(Game::SpyReportTradeRoute) -- container stride [verified] +constexpr uint32_t sizeof_Game_SpyReportTradeRoute = 0x00000020; +// thiscall void (Game_StrategyGameCreateParams* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a25574, COL offset +0x0; 25 member fields; 19/19 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyGameCreateParams_Write = 0x0042ae40; +// thiscall void (Game_StrategyGameCreateParams* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a25574, COL offset +0x0; 25 member fields; 19/19 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyGameCreateParams_Read = 0x00432cc0; +// thiscall void (Game_StrategyGameInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a07ba0, COL offset +0x0; 13 member fields; 10/10 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyGameInfo_Write = 0x00429960; +// thiscall void (Game_StrategyGameInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a07ba0, COL offset +0x0; 13 member fields; 10/10 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyGameInfo_Read = 0x00475cb0; +// thiscall void (Game_StrategyPlayerInfo* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a077d8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyPlayerInfo_Write = 0x004298d0; +// thiscall void (Game_StrategyPlayerInfo* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a077d8, COL offset +0x0; 2 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyPlayerInfo_Read = 0x00429820; +// layout sizeof(Game::StrategyPlayerInfo) -- container stride [verified] +constexpr uint32_t sizeof_Game_StrategyPlayerInfo = 0x000000c4; +// thiscall void (Game_StrategyServer* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a26084, COL offset +0x0; 38 member fields; 18/18 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyServer_Write = 0x0039fa70; +// thiscall void (Game_StrategyServer* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a26084, COL offset +0x0; 38 member fields; 18/18 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyServer_Read = 0x003d27a0; +// thiscall void (Game_StrategyTimerParams* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a07334, COL offset +0x0; 4 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyTimerParams_Write = 0x004173e0; +// thiscall void (Game_StrategyTimerParams* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a07334, COL offset +0x0; 4 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StrategyTimerParams_Read = 0x00420040; +// thiscall void (Game_TacReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e4600, COL offset +0x0; 17 member fields; 13/13 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TacReport_Write = 0x00058e60; +// thiscall void (Game_TacReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e4600, COL offset +0x0; 17 member fields; 13/13 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TacReport_Read = 0x00058c00; +// thiscall void (Game_TacReportEvents* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009e45f0, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TacReportEvents_Write = 0x000565d0; +// thiscall void (Game_TacReportEvents* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009e45f0, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TacReportEvents_Read = 0x00056540; +// layout sizeof(Game::TacReportEvents) -- enumeration meets embedding [verified] +constexpr uint32_t sizeof_Game_TacReportEvents = 0x00000020; +// thiscall void (Game_TechOfferProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31884, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TechOfferProject_Write = 0x004535c0; +// thiscall void (Game_TechOfferProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31884, COL offset +0x0; 9 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TechOfferProject_Read = 0x00453530; +// thiscall void (Game_TechProject* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a31834, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TechProject_Write = 0x00453390; +// thiscall void (Game_TechProject* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a31834, COL offset +0x0; 6 member fields; 4/4 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TechProject_Read = 0x00453280; +// thiscall void (Game_TradeRoute* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2d848, COL offset +0x0; 8 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TradeRoute_Write = 0x00419650; +// thiscall void (Game_TradeRoute* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2d848, COL offset +0x0; 8 member fields; 5/5 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_TradeRoute_Read = 0x004208d0; +// thiscall void (Game_ZuulInfestation* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f8cb0, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ZuulInfestation_Write = 0x001361e0; +// thiscall void (Game_ZuulInfestation* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f8cb0, COL offset +0x0; 5 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ZuulInfestation_Read = 0x00136160; +// thiscall void (Game_AICombatReport* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1a6f0, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_AICombatReport_Write = 0x002986e0; +// thiscall void (Game_AICombatReport* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1a6f0, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_AICombatReport_Read = 0x0029c6d0; +// thiscall void (Game_FieldTemplate_Point* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a05df8, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_FieldTemplate_Point_Write = 0x0019bfa0; +// thiscall void (Game_FieldTemplate_Point* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a05df8, COL offset +0x0; 5 member fields; 3/3 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_FieldTemplate_Point_Read = 0x0019bf10; +// layout sizeof(Game::FieldTemplate::Point) -- container stride [verified] +constexpr uint32_t sizeof_Game_FieldTemplate_Point = 0x00000014; +// thiscall void (Game_LocustFleetLogistics* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009f1f00, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_LocustFleetLogistics_Write = 0x00108e50; +// thiscall void (Game_LocustFleetLogistics* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009f1f00, COL offset +0x0; 4 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_LocustFleetLogistics_Read = 0x00108d60; +// thiscall void (Game_Objective* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2e0cc, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_Objective_Write = 0x004505b0; +// thiscall void (Game_Objective* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2e0cc, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_Objective_Read = 0x00450430; +// layout sizeof(Game::Objective) -- container stride [verified] +constexpr uint32_t sizeof_Game_Objective = 0x00000044; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fa614, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest_Write = 0x0015d120; +// thiscall void (Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fa614, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest_Read = 0x0015d040; +// layout sizeof(Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest) -- container stride [verified] +constexpr uint32_t sizeof_Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest = 0x00000020; +// thiscall void (Game_ShipDesignDef_LegacyWeaponDef* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2df7c, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipDesignDef_LegacyWeaponDef_Write = 0x00413950; +// thiscall void (Game_ShipDesignDef_LegacyWeaponDef* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2df7c, COL offset +0x0; 1 member fields; 1/1 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipDesignDef_LegacyWeaponDef_Read = 0x00446260; +// thiscall void (Game_ShipWeapon* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x009fdc8c, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipWeapon_Write = 0x0016f450; +// thiscall void (Game_ShipWeapon* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x009fdc8c, COL offset +0x0; 3 member fields; 2/2 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_ShipWeapon_Read = 0x00171130; +// thiscall void (Game_SlotDef* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a2db6c, COL offset +0x0; 18 member fields; 15/15 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SlotDef_Write = 0x004276d0; +// thiscall void (Game_SlotDef* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a2db6c, COL offset +0x0; 18 member fields; 15/15 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_SlotDef_Read = 0x00432790; +// layout sizeof(Game::SlotDef) -- enumeration meets embedding [verified] +constexpr uint32_t sizeof_Game_SlotDef = 0x000000bc; +// thiscall void (Game_StarSystem_OutputRates* this, Mars::Stream* s) /* IStreamable slot 2, vftable 0x00a1f884, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StarSystem_OutputRates_Write = 0x00345190; +// thiscall void (Game_StarSystem_OutputRates* this, Mars::Stream* s) /* IStreamable slot 1, vftable 0x00a1f884, COL offset +0x0; 7 member fields; 7/7 field offsets agree between Read and Write */ [verified] +constexpr uint32_t Game_StarSystem_OutputRates_Read = 0x003472a0; +// layout sizeof(Game::StarSystem::OutputRates) -- enumeration meets embedding [verified] +constexpr uint32_t sizeof_Game_StarSystem_OutputRates = 0x0000001c; } // namespace sots::addr diff --git a/objects/layouts.h b/objects/layouts.h new file mode 100644 index 0000000..16ac334 --- /dev/null +++ b/objects/layouts.h @@ -0,0 +1,2224 @@ +// GENERATED by tools/serializers.py -- do not hand-edit. +// Layouts recovered from the Mars::IStreamable serializers. +// `Mars_string` is 0x1c and `Mars_vector` 0x10 -- allocator-LAST +// in this build's STL, which is why a touch-scan undercounts +// both by exactly 4 (findings/objects/struct-recovery.md 0). +struct Mars_string { char _bx[16]; unsigned int size; unsigned int res; void* alval; }; +struct Mars_vector { void* first; void* last; void* end; void* alval; }; + +struct Game_GunBankSelection { + char _pad0[4]; + int f4; +}; + +struct Game_CombatCommandFleetSetStance { + char _pad0[8]; + int f8; + int fc; +}; + +struct Game_CombatCommandFleetSetFacing { + char _pad0[8]; + int f8; + int fc; +}; + +struct Game_CombatCommandFleetSetHoldFire { + char _pad0[8]; + int f8; + bool fc; +}; + +struct Game_CombatCommandPickReserve { + char _pad0[8]; + int f8; + int fc; +}; + +struct Game_CombatCommandSetAEAutoFire { + char _pad0[8]; + int f8; + bool fc; +}; + +struct Game_CombatCommandSetPlanetAttackMode { + char _pad0[8]; + int f8; + int fc; +}; + +struct Game_CombatCommandSetWantEndCombat { + char _pad0[8]; + int f8; + bool fc; +}; + +struct Game_CombatCommandSetPlayerAI { + char _pad0[8]; + int f8; + bool fc; +}; + +struct Game_CombatCommandMoveReserves { + char _pad0[8]; + int f8; + int fc; + Mars_vector f10; +}; + +struct Game_CombatCommandShipAllStop { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandShipClearTargets { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandShipReleaseGrapple { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandCloak { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandDecloak { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandIntangOn { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandIntangOff { + char _pad0[8]; + Mars_vector f8; +}; + +struct Game_CombatCommandShipManeuver { + char _pad0[8]; + int f8; + Mars_vector fc; +}; + +struct Game_CombatCommandShipSetStance { + char _pad0[8]; + Mars_vector f8; + int f18; +}; + +struct Game_CombatCommandShipSetFacing { + char _pad0[8]; + Mars_vector f8; + int f18; +}; + +struct Game_CombatCommandShipToggleBank { + char _pad0[8]; + Mars_vector f8; + Game_GunBankSelection f18; + char _pad1[8]; + bool f28; +}; + +struct Game_CombatCommandShipFireOnce { + char _pad0[8]; + Mars_vector f8; + Game_GunBankSelection f18; +}; + +struct Game_CombatCommandShipSetHoldFire { + char _pad0[8]; + Mars_vector f8; + Game_GunBankSelection f18; + char _pad1[8]; + bool f28; +}; + +struct Game_CombatCommandShipSetOnlyMyTarget { + char _pad0[8]; + Mars_vector f8; + Game_GunBankSelection f18; + char _pad1[8]; + bool f28; +}; + +struct Game_PlanetClientContext { + char _pad0[4]; + float f4; + float f8; + float fc; + float f10; + int f14; + int f18; +}; + +struct Game_DefenceFleetAssignment { + char _pad0[4]; + int fid; + int stnid; + float head2; + float ori; + int quota; +}; + +struct Game_WeaponGroups { + char _pad0[4]; + Game_GunBankSelection wgb; +}; + +struct Game_PlayerMessage { + char _pad0[4]; + int f4; + int f8; + Mars_string fc; + Mars_vector f28; +}; + +struct Mars_LaunchParams { + char _pad0[4]; + Mars_string f4; +}; + +struct Game_TacReportEvents { + char _pad0[4]; + int TREhd; + int TREhi; + float TREd; + float TREdp; + float TREdi; + float TREdt; + bool TREb; + char _pad1[3]; +}; + +struct Game_TacReport { + char _pad0[4]; + int TRid; + int TRal; + Game_TacReportEvents TRby; + Game_TacReportEvents TRto; + char _pad1[12]; + int TRsats; + char _pad2[20]; + int TRbal; + int TRlas; + int TRmis; + int TRmin; + int TRnrg; + int TRbio; + int TRbrd; + bool TRsld; + bool TRsldd; + bool TRsldc; + bool TRsldi; + bool TRsldr; +}; + +struct Game_CombatPlayerStats { + char _pad0[4]; + Mars_vector TacReports; + float RPBon; + int RPBonT; + int SavBonus; + bool MaintHF; + char _pad1[3]; +}; + +struct Game_PlagueStats { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_HeraldEncounterResult { + char _pad0[8]; + int f8; + float fc; +}; + +struct Game_EncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_PlayerEncounterProgress { + char _pad0[4]; + int f4; + bool f8; + char _pad1[3]; + float fc; +}; + +struct Game_OrtgayEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_SVSORefugees_PlayerStatus { + char _pad0[4]; + int lr; + int lrt; + int llc; + bool atr; + bool asy; +}; + +struct Game_RefugeesEncounterParams { + char _pad0[8]; + bool f8; +}; + +struct Game_RefugeesEncounterResult { + char _pad0[8]; + int f8; + int fc; +}; + +struct Game_SVSOTraps_Trap { + char _pad0[4]; + int sys; + int pid; + int trenc; + int trgenc; +}; + +struct Game_DerelictEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_MeteorEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_MonitorEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_PirateEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_PuppetMasterEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_SlaversRefuelEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_SVSOSwarm_Infestation { + char _pad0[4]; + void * sysid; + int stg; + int strn; + int mtrn; + int trgtrn; + bool canh; +}; + +struct Game_SwarmEncounterParams { + char _pad0[8]; + int f8; +}; + +struct Game_SVSOSwarmQueen_HiveInfo { + char _pad0[4]; + void * HiveID; + int NextQ; + void * QueenID; +}; + +struct Game_SVSOSwarmQueen_QueenInfo { + char _pad0[4]; + void * QueenID; + void * QDstID; +}; + +struct Game_SwarmQueenEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_SystemKillerEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_SVSOVonNeumann_DefeatRecord { + char _pad0[4]; + int sys; + int ndft; + int lstd; + int nxrv; + bool bkdf; + char _pad1[3]; +}; + +struct Game_VNFinsolEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_VonNeumannEncounterParams { + char _pad0[8]; + int f8; +}; + +struct Game_VonNeumannEncounterResult { + char _pad0[8]; + int f8; + int fc; +}; + +struct Game_VNHomeEncounterParams { + char _pad0[8]; + int f8; + int fc; + int f10; + int f14; + int f18; + char _pad1[4]; + longlong f20; +}; + +struct Game_VNHomeEncounterResult { + char _pad0[8]; + int f8; + char _pad1[4]; + longlong f10; +}; + +struct Game_SimpleNodePath { + char _pad0[4]; + short f4; + short f6; +}; + +struct Game_BerserkerEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_CrowDefendersEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_CrowRuinsEncounterResult { + char _pad0[8]; + int f8; +}; + +struct Game_CombatCommandRequestAsylumResponse { + char _pad0[8]; + int f8; + int fc; + int f10; +}; + +struct Game_PlagueHit { + char _pad0[4]; + int f4; + int f8; + int fc; +}; + +struct Game_PopulationGroup { + char _pad0[4]; + int PopT; + int PopS; + char _pad1[4]; + longlong PopC; +}; + +struct Game_SVSOAntiquarians_Artifact { + char _pad0[4]; + void * shipid; + void * salsid; + int salpid; + int pvis; +}; + +struct Game_StarMapParams { + char _pad0[4]; + int f4; + Mars_vector f8; + Mars_vector f18; + Mars_vector f28; +}; + +struct Game_PrisonerHold { + char _pad0[20]; + void * PrMax; +}; + +struct Game_CombatShipReport { + char _pad0[4]; + Mars_string name; + int did; + int cls; + longlong caps2; + int nshp; + int nfld; + int nlst; + int dtak; + int dams; + int damp; + float dami; + float damt; +}; + +struct Game_CombatWeaponReport { + char _pad0[4]; + Mars_string wep; + int dams; + int damp; + float dami; + float damt; +}; + +struct Game_AIEncounterFlags { + char _pad0[12]; + int Nas; +}; + +struct Game_CombatPlayerReport { + char _pad0[4]; + int plr; + bool ai; + char _pad1[3]; + int ally; + char status; + int mxeng; + int mxcls; + int mxmsl; + char _pad2[6]; + char nsat; + char _pad3[12]; + char nsatl; + short ndam; + char _pad4[8]; + Mars_vector srep; +}; + +struct Game_CombatDamageReport { + char _pad0[4]; + void * did; + char _pad1[12]; + Mars_string wep; +}; + +struct Game_StrategyTimerParams { + char _pad0[4]; + float TSTL; + float TCTL; + float TQTL; + float TQTLE; +}; + +struct Game_StrategyPlayerGameSettings { + char _pad0[4]; + int f4; + int f8; + int fc; + int f10; +}; + +struct Game_StrategySessionParams { + char _pad0[4]; + Game_StrategyTimerParams TMRS; +}; + +struct Game_StrategyGameInfo { + char _pad0[32]; + Mars_string GameName; + int Turn; + int NumSys; + int Checksum; + int MapShape; + Mars_vector Players; + Game_StrategySessionParams Session; + float IncMod; + float ResMod; + bool Alliances; + bool Teams; + bool Encounters; + char _pad1[1]; + Mars_string Scenario; +}; + +struct Game_AllianceInvite_Response { + char _pad0[4]; + int f4; + int f8; + bool fc; + char _pad1[3]; +}; + +struct Game_AllianceInvite { + char _pad0[4]; + int f4; + bool f8; + bool f9; + bool fa; + bool fb; + int fc; + int f10; + int f14; + int f18; + Mars_vector f1c; + int f2c; + int f30; + int f34; + Mars_vector f38; + int f48; +}; + +struct Game_ShipBuildOrderDef { + char _pad0[4]; + int desID; + int con; + int sav; + int conleft; + int ordID; +}; + +struct Game_ShipBuildOrder { + char _pad0[4]; + int desID; + int con; + int sav; + int conleft; + int ordID; +}; + +struct Game_EventStorage_TurnEvents { + char _pad0[4]; + int EvTurn; + Mars_vector Events; +}; + +struct Game_AIAutoPeaceRun { + char _pad0[4]; + int sid; + int tn0; + int tn1; +}; + +struct Game_StrategyAIAgent_Streamable { + char _pad0[4]; + void * prs2; +}; + +struct Game_AIRelationRecord { + char _pad0[4]; + int f4; + int f8; + int fc; + float f10; + float f14; +}; + +struct Game_AIRebellionImpl { + char _pad0[4]; + int St; + char _pad1[4]; + void * Plr; + void * Reb; + Mars_vector NSys; +}; + +struct Game_StrategyAIAgent_DesignNameGen { + char _pad0[4]; + void * dnid; +}; + +struct Game_NodePath { + char _pad0[4]; + int npt; + int npid; + int npfr; + int npto; + int npctm; + int npcby; + int npdtn; + int npdtf; + int nptf; + int npenp; + int npuse; +}; + +struct Game_NodeRoute { + char _pad0[4]; + int nrp; + int nrf; + int nrt; +}; + +struct Game_ServerNodeGraph { + char _pad0[8]; + Mars_vector paths; + char _pad1[48]; + int nextid; +}; + +struct Game_ServerNodeGraph_Params { + char _pad0[4]; + int RSeed; + Mars_vector PSeed; + Mars_vector SSeed; +}; + +struct Game_EncounterResults_PrisonerShip { + char _pad0[4]; + int f4; + Game_PrisonerHold f8; +}; + +struct Game_EncounterResults_BoardedShip { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_EncounterResults_RetreatingShip { + char _pad0[4]; + int f4; + int f8; + int fc; + int f10; +}; + +struct Game_EncounterResults_SpyShip { + char _pad0[4]; + int f4; + int f8; + bool fc; + bool fd; + char _pad1[2]; + float f10; +}; + +struct Game_FlightPlan_Waypoint { + char _pad0[4]; + int Wpt; + int Tp; + Game_NodeRoute nrt; +}; + +struct Game_Morale { + char _pad0[4]; + int mv; +}; + +struct Game_MoraleEvent { + char _pad0[4]; + int mid; + int mtr; + int mn; + int mtp; + Game_Morale mfx; + char _pad1[24]; + Mars_string mdsc; +}; + +struct Game_DiplomacyStats { + char _pad0[4]; + int other; + short lastnap; + short lastnapbty; + short bknnap; + short btynap; + short lastally; + short lastallybty; + short bknally; + short btyally; + short lastcf; + short lastcfbty; + short bkncf; + short btycf; + short deadhome; + char _pad1[2]; +}; + +struct Game_PlayerReport { + char _pad0[4]; + int oid; + int pid; + int flds; + int sav; + int home; + int ncol; + int mpwr; + int mcls; + int mmsl; + int nshp; + int nsat; +}; + +struct Game_SpecialProject { + char _pad0[4]; + int SPid; + int Sts; + float Cst; + int MxC; + Mars_string Nm; + int Trns; +}; + +struct Game_PlayerNotes { + char _pad0[4]; + int NtSys; + Mars_string NtTxt; + int NtTrn; +}; + +struct Game_RaidTargets { + char _pad0[4]; + int rds; + int rdv; + Mars_vector dsc; + int rdt; +}; + +struct Game_DefenceLayout { + char _pad0[4]; + int sysid; + Mars_vector ndsa; + void * fa; +}; + +struct Game_ObservedDesign { + char _pad0[4]; + short otnF; + short otnL; + int odid; + int opid; +}; + +struct Game_SNMRefreshSlots_SlotData { + char _pad0[4]; + int f4; + int f8; + bool fc; + char _pad1[3]; +}; + +struct Game_TechOffer { + char _pad0[4]; + int giv; + int rcp; + char _pad1[4]; +}; + +struct Game_StrategyGameLoadParams { + char _pad0[4]; + Mars_string f4; +}; + +struct Game_ObservedWeapon { + char _pad0[4]; + short otnF; + short otnL; + bool odet; + char _pad1[3]; + Mars_string owep; + int owith; +}; + +struct Game_ObservedTech { + char _pad0[4]; + short otnF; + short otnL; + bool odet; + char _pad1[3]; + Mars_string otch; + int owith; +}; + +struct Game_SystemEvent { + char _pad0[4]; + int ses; + int set; + int seop; + int senp; + Mars_vector seno2; +}; + +struct Game_ClientEncounterResults { + char _pad0[4]; + int f4; + bool f8; + char _pad1[3]; + Game_CombatPlayerStats fc; +}; + +struct Game_StrategyScriptParams { + char _pad0[8]; + int spc; +}; + +struct Game_StrategyGameCreateParams { + char _pad0[4]; + Mars_string Name; + int ID; + int RSeed; + Mars_string Key; + Game_StarMapParams MapP; + int MapS; + Mars_string MapF; + int NSys; + float REnc; + float SDist; + float SSize; + float SRes; + float SSuit; + int MaxP; + int ASpec; + bool bAlly; + char _pad1[3]; + int NTeam; + bool tmgrp; + char _pad2[7]; + int PSav; + int PCol; + int PTech; + int AID; + float IncM; + float ResM; + Game_StrategyScriptParams scrp; +}; + +struct Game_StrategyGameParams { + char _pad0[4]; + int f4; + char _pad1[252]; + Game_StrategyGameCreateParams f104; +}; + +struct Game_StrategyServer { + char _pad0[8]; + int ModCount; + int Frame; + int GOTurn; + int GameID; + Mars_vector GOWinPly; + Mars_string GameName; + Mars_vector NumSys; + Mars_vector NumPlrs; + Mars_vector NumFlts; + Mars_vector NumActs; + char _pad1[24]; + int NMLc; + char _pad2[28]; + int Map; + float IncMod; + float ResMod; + bool EnAl; + bool EnTm; + char _pad3[106]; + Mars_string KeyPath; + char _pad4[4]; + void * NdGr2; + void * trdmgr; + void * spymgr; + void * sprjs; + void * Attrib; + char _pad5[4]; + void * RNG; + char _pad6[48]; + float RandEncAdj; + char _pad7[16]; + void * SvSctOb; + int NPCm; + int NPCo; + int NPCi; + int NPCv; + int NPCa; + float szadj; + float rsadj; + float suadj; + char _pad8[32]; + int cmbtid; + void * numcreps; + void * turnstats; + char _pad9[196]; + Mars_vector ninv; + char _pad10[68]; + int zdsc; +}; + +struct Game_PlayerAid { + char _pad0[4]; + int aidto; + int aidrai; + int aidrt; + int aidsa; + int aidst; +}; + +struct Game_StrategyTurnInfo { + char _pad0[4]; + int f4; + char _pad1[12]; + float f14; + int f18; + int f1c; + int f20; + char _pad2[12]; + int f30; +}; + +struct Game_TradeRoute { + char _pad0[4]; + int tro; + int trfow; + int trfr; + int trfrs; + int trtow; + int trto; + int trtos; + int trtc; +}; + +struct Game_ServerTradeSector_FreighterWarning { + char _pad0[4]; + int pid; + int ntrns; +}; + +struct Game_ShipDesignDef_LegacyGunBank { + char _pad0[4]; + int f4; +}; + +struct Game_CommMessageContainer { + char _pad0[4]; + Mars_vector nmsg; +}; + +struct Game_SpyCraft { + char _pad0[4]; + int sid; + int sown; + int atto; + int deat; + int tdep; + float cbh; + int spyon; + int spyat; + int cm; + float cmo; + Mars_vector ncp; + float sdo; + int sdet; +}; + +struct Game_ServerSpyManager { + char _pad0[12]; + int xsid; + Mars_vector nspy; +}; + +struct Game_SpyReportTradeRoute { + char _pad0[4]; + int stn; + int sctr; + int spl; + Mars_vector sdgc; +}; + +struct Game_SpyReportEvents { + char _pad0[4]; + int spl; + Mars_vector ste; +}; + +struct Game_DefenceSummary { + char _pad0[4]; + int pid; + int sid; + Mars_vector stac; + Mars_vector satc; + Game_DefenceLayout dlay; +}; + +struct Game_EventStorage { + char _pad0[4]; + Mars_vector Events; + int EvNxID; +}; + +struct Game_EncounterQuery { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_SpyReportDefences { + char _pad0[4]; + int stn; + Game_DefenceSummary sdef; +}; + +struct Game_SpyReportTrade { + char _pad0[4]; + int stn; + int spl; + int sctr; + Mars_vector srt; +}; + +struct Game_ShipRecords { + char _pad0[16]; + int srl; + char _pad1[32]; + void * srd; +}; + +struct Game_PlayerTurnStats { + char _pad0[4]; + short trn; + char _pad1[2]; + int almem; + int inc; + int tdinc; + int sav; + short col; + short bat; + char _pad2[4]; + longlong pop; + short tch; + char _pad3[38]; + Mars_vector sacq; + Mars_vector slost; +}; + +struct Game_SpyReportTechTree { + char _pad0[4]; + int stn; + int spl; +}; + +struct Game_ServerTradeManagerImpl { + char _pad0[8]; + float SctSize; + char _pad1[16]; + Mars_vector NumTradeSectors; +}; + +struct Game_SpecialProjectNameGen { + char _pad0[4]; + void * Nm; +}; + +struct Game_FleetNameGenerator { + char _pad0[4]; + int FNGNum; +}; + +struct Game_SpyReport { + char _pad0[8]; + int defc2; + char _pad1[8]; + int rtc; + char _pad2[8]; + int evc; + char _pad3[8]; + int ttc; +}; + +struct Game_PlayerTurnHistory { + char _pad0[4]; + int ply; +}; + +struct Game_GameTurnHistory { + char _pad0[12]; + int nply; +}; + +struct Mars_SyncChecksumBuffer { + char _pad0[4]; + int f4; + int f8; + Mars_vector fc; +}; + +struct Mars_SyncParams { + char _pad0[4]; + bool f4; + bool f5; + char _pad1[2]; + Mars_string f8; + int f24; + int f28; + int f2c; +}; + +struct Game_CNMPlayerLeft { + char _pad0[4]; + int f4; +}; + +struct Game_CNMClientNotResponding { + char _pad0[4]; + int f4; + bool f8; +}; + +struct Game_CNMUpdateComplete { + char _pad0[4]; + int f4; +}; + +struct Game_CNMUserShips { + char _pad0[4]; + Mars_vector f4; + int f14; +}; + +struct Game_CNMPlayerJoined { + char _pad0[4]; + int f4; + Mars_string f8; +}; + +struct Game_SVSOGrandMenaceTrigger { + char _pad0[4]; + int gmch; +}; + +struct Game_SVSODerelict { + char _pad0[4]; + void * Eflt; + char _pad1[16]; + Mars_vector NDsn; +}; + +struct Game_SVSOSlaversRefuel { + char _pad0[4]; + Mars_vector NAsg; + char _pad1[4]; + Mars_vector NTD; + Mars_vector NAD; + int CDiff; +}; + +struct Game_SVSOSwarm { + char _pad0[4]; + Mars_vector NAsg; + char _pad1[12]; + void * infest; +}; + +struct Game_SVSOSwarmQueen { + char _pad0[16]; + Mars_vector Hives; + Mars_vector Queens; + Mars_vector SysMem; +}; + +struct Game_SVSOCrowRuins { + char _pad0[4]; + Mars_vector NAsg; + char _pad1[4]; + Mars_vector NWD; +}; + +struct Game_SVSORefugees { + char _pad0[12]; + int rsuc; + char _pad1[4]; + bool ini; + char _pad2[3]; + Mars_vector didc; +}; + +struct Game_SVSOMonitor { + char _pad0[4]; + void * Eflt; + char _pad1[16]; + Mars_vector NDsn; + Mars_string scnm; +}; + +struct Game_SVSOCrowDefenders { + char _pad0[4]; + void * sys; + Mars_vector ndsys; + Mars_vector ndes; + char _pad1[16]; + float drad; +}; + +struct Game_SVSOVonNeumann { + char _pad0[4]; + Mars_vector dfts; + char _pad1[16]; + int rusav; + int nenc; + int nmb; + int nml; + int nbb; + int nbl; + int nskb; + int nskl; + void * vnhw; + longlong vnhp; + int mbid; + int mbgid; + int skgid; + int ntm; + Mars_vector mts; + int ntb; + bool sken; + char _pad2[3]; + int skdid; + int skhid; + int skfid; + int sktq; + int skt; + int sktc; +}; + +struct Game_SVSOTraps { + char _pad0[20]; + Mars_vector traps; +}; + +struct Game_CommonPlague { + char _pad0[8]; + void * PlgSys; + int PlgCByF; + void * PlgCBy; + char _pad1[36]; + int PlgCM; + int PlgTurns; + int PlgInf; +}; + +struct Game_ZuulInfestation { + char _pad0[8]; + void * PlgSys; + int PlgCByF; + void * PlgCBy; + char _pad1[4]; + longlong PlgNZ; + float PlgZdr; +}; + +struct Game_JewelsProject { + char _pad0[8]; + Game_SpecialProject SPi; + int Stp; + char _pad1[4]; + int einv; + int eapp; +}; + +struct Game_SVSOUpstartApes_EO_FEARS_YOUR_POWER { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + int LASTTURN; +}; + +struct Game_SVSOUpstartApes_EO_REQUIRES_CASH { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + int LASTTURN; +}; + +struct Game_SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + int LASTTURN; +}; + +struct Game_SVSOUpstartApes_EO_MUST_EXPAND { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + char _pad1[4]; + int LASTTURN; +}; + +struct Game_SVSOUpstartApes_EO_DEMANDS_VICTORY { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + int LASTTURN; +}; + +struct Game_SVSOUpstartApes_EO_GIFTS { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; +}; + +struct Game_SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + int LASTTURN; +}; + +struct Game_SVSOLandGrab { + char _pad0[8]; + int nwt; + char _pad1[124]; + float winr; +}; + +struct Game_SVSOAntiquarians { + char _pad0[8]; + Mars_vector narts; + int wpid; + int wpturn; +}; + +struct Game_SVSOMasterVoice { + char _pad0[8]; + Mars_vector hom; + Mars_vector hmd; +}; + +struct Game_SVSOJewelsOfTheCrown { + char _pad0[8]; + int JEWELLOCATIONID; + int JEWELSHIPID; + int JEWELLOCATIONID_1; + Mars_vector prjdone; + char _pad1[8]; + int PREVJEWELSHIPID; +}; + +struct Game_SVSOUpstartApes_EO_DEMANDS_SHIPS { + char _pad0[12]; + int OBJECTIVEID; + int TURNCREATED; + Mars_vector REQUESTS; + int LASTTURN; + int SUCCESSSTANDING; + int FAILURESTANDING; +}; + +struct Game_SVSOProgressionWars { + char _pad0[8]; + int stg; + int sft; + int snt; + int snec; + int ses; + int snet; + int snep; + int srsi; + int srs; + char _pad1[20]; + Mars_vector lts; +}; + +struct Game_SVSOUpstartApes { + char _pad0[12]; + int EMPIREFLAGS; + int EMPIRESTANDING; + char _pad1[28]; + int NEXTORDERTURN; + char _pad2[16]; + int EARTHID; +}; + +struct Game_SVSOSots { + char _pad0[4]; + int ScnID; + void * ScnObj; + Mars_vector NEncObjs; + char _pad1[24]; + int numx; +}; + +struct Game_SNMSetTimers { + char _pad0[4]; + Game_StrategyTimerParams f4; +}; + +struct Game_SNMLeaveAlliance { + char _pad0[4]; + int f4; +}; + +struct Game_SNMSetAIPolicy { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMRemoveCommMessage { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMDemandEmpireSurrender { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMDemandEmpireSurrenderResponse { + char _pad0[4]; + int f4; + int f8; + bool fc; +}; + +struct Game_SNMTechOffer { + char _pad0[4]; + int f4; + int f8; + int fc; + Mars_string f10; + bool f2c; +}; + +struct Game_SNMUpdateComplete { + char _pad0[4]; + Mars_string f4; +}; + +struct Game_SNMTurnInfo { + char _pad0[4]; + Game_StrategyTurnInfo f4; +}; + +struct Game_SNMDoEncounterQuery { + char _pad0[4]; + int f4; +}; + +struct Game_SNMChat { + char _pad0[4]; + int f4; + int f8; + int fc; + Mars_string f10; + int f2c; +}; + +struct Game_SNMTransferProgress { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_SNMUpdate { + char _pad0[4]; + Mars_vector f4; + Mars_vector f14; + Mars_vector f24; + Mars_vector f34; + Mars_vector f44; +}; + +struct Game_SNMAllCombatDone { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_SNMSlotSetForcedSpecies { + char _pad0[4]; + int f4; +}; + +struct Game_SNMSlotSetState { + char _pad0[4]; + int f4; + int f8; + int fc; +}; + +struct Game_SNMSlotRemoveClient { + char _pad0[4]; + int f4; +}; + +struct Game_SNMSlotMoveClient { + char _pad0[4]; + int f4; + int f8; + int fc; +}; + +struct Game_SNMSlotReqPW { + char _pad0[4]; + float f4; + int f8; +}; + +struct Game_SNMSlotPWRejected { + char _pad0[4]; + int f4; +}; + +struct Game_SNMJoinReply { + char _pad0[4]; + int f4; +}; + +struct Game_SNMCombatTimeRemaining { + char _pad0[4]; + int f4; + float f8; +}; + +struct Game_SNMSetPlayerStatus { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMMakePlayerAI { + char _pad0[4]; + int f4; + bool f8; +}; + +struct Game_SNMCommMessage { + char _pad0[4]; + void * f4; +}; + +struct Game_SNMKillAI { + char _pad0[4]; + int f4; +}; + +struct Game_SNMAllianceInvite { + char _pad0[4]; + int f4; + int f8; + int fc; +}; + +struct Game_SNMAllianceReply { + char _pad0[4]; + int f4; + int f8; + int fc; + bool f10; +}; + +struct Game_SNMAllianceNotify { + char _pad0[4]; + int f4; + int f8; + int fc; +}; + +struct Game_SNMLeaveNonAggression { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMLeaveCeaseFire { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMCancelAllianceInvite { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMGenericGameMessage { + char _pad0[4]; + int f4; + int f8; +}; + +struct Game_SNMPlaySpeechEvent { + char _pad0[4]; + int f4; + int f8; + int fc; +}; + +struct Game_SpecialProjectImpl { + char _pad0[8]; + Game_SpecialProject SPi; + int Stp; +}; + +struct Game_SNMProgressionWarsConvoyShips { + char _pad0[4]; + int f4; +}; + +struct Game_SNMEncounterQueryResults { + char _pad0[4]; + int f4; + Game_EncounterQuery f8; +}; + +struct Game_SNMPendingAlliances { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_SNMSlotInsertClient { + char _pad0[4]; + int f4; + int f8; + Mars_string fc; +}; + +struct Game_SNMSlotSetPW { + char _pad0[4]; + int f4; + Mars_string f8; + bool f24; + bool f25; +}; + +struct Game_SNMSlotPWAttempt { + char _pad0[4]; + Mars_string f4; +}; + +struct Game_SNMRefreshSlots { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_MonitorProject { + char _pad0[8]; + Game_SpecialProject SPi; + int Stp; + int Sys; + int RMn; + int RMx; + int RDn; + float RMd; +}; + +struct Game_TechProject { + char _pad0[8]; + Game_SpecialProject SPi; + int Stp; + float AOdd; + float AInc; + char _pad1[4]; + int RCst; + int RDn; +}; + +struct Game_BackEngProject { + char _pad0[8]; + Game_SpecialProject SPi; + int Stp; + float AOdd; + float AInc; + char _pad1[4]; + int RCst; + int RDn; +}; + +struct Game_TechOfferProject { + char _pad0[8]; + Game_SpecialProject SPi; + int Stp; + float AOdd; + float AInc; + char _pad1[4]; + int RCst; + int RDn; + int giv; + int rcp; + bool rcpd2; +}; + +struct Game_SNMJoin { + char _pad0[4]; + int f4; + Mars_string f8; + bool f24; +}; + +struct Game_SNMHostCombat { + char _pad0[4]; + int f4; + int f8; + Mars_string fc; + int f28; + float f2c; + bool f30; + bool f31; +}; + +struct Game_SNMJoinCombatReply { + char _pad0[4]; + bool f4; + char _pad1[3]; + Mars_string f8; +}; + +struct Game_SNMEncounterProgress { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_SNMAIRelationValues { + char _pad0[4]; + Mars_vector f4; +}; + +struct Game_SNMAllianceInviteChat { + char _pad0[4]; + int f4; + int f8; + Mars_string fc; + int f28; +}; + +struct Game_SNMLobbyChat { + char _pad0[4]; + int f4; + Mars_string f8; + Mars_string f24; +}; + +struct Game_SNMRunAI { + char _pad0[4]; + int f4; + Mars_string f8; + bool f24; +}; + +struct Game_SNMUserNames { + char _pad0[4]; + Mars_vector f4; + int f14; +}; + +struct Game_SNMSetSlotPassword { + char _pad0[4]; + int f4; + Mars_string f8; +}; + +struct Game_SNMGenericEvent { + char _pad0[4]; + int f4; + Mars_string f8; +}; + +struct Game_SNMAllianceInviteProgress { + char _pad0[4]; + int f4; + Game_AllianceInvite f8; +}; + +struct Game_SNMSlotInit { + char _pad0[4]; + bool f4; + bool f5; + bool f6; + char _pad1[1]; + int f8; + Mars_vector fc; + int f1c; + bool f20; + char _pad2[3]; + int f24; + int f28; + Game_StrategyPlayerGameSettings f2c; +}; + +struct Game_SNMLaunchCombat { + char _pad0[4]; + int f4; + Mars_vector f8; + Game_EncounterQuery f18; +}; + +struct Mars_NMCommand { + char _pad0[4]; + void * f4; +}; + +struct Mars_NMSyncCheck { + char _pad0[4]; + void * f4; +}; + +struct Mars_NMSyncError { + char _pad0[4]; + int f4; +}; + +struct Mars_FNMBase { + char _pad0[4]; + Mars_string f4; + int f20; +}; + +struct Mars_FNMSendNotify { + char _pad0[4]; + Mars_string f4; + int f20; + int f24; +}; + +struct Mars_FNMDone { + char _pad0[4]; + Mars_string f4; + int f20; + int f24; + int f28; +}; + +struct Mars_FNMError { + char _pad0[4]; + Mars_string f4; + int f20; + Mars_string f24; +}; + +struct Mars_FNMSendReply { + char _pad0[4]; + Mars_string f4; + int f20; +}; + +struct Mars_FNMChunkReply { + char _pad0[4]; + Mars_string f4; + int f20; +}; + +struct Mars_FNMDoneReply { + char _pad0[4]; + Mars_string f4; + int f20; +}; + +struct Quaternion { + float f0; + float f4; + float f8; + float fc; +}; + +struct Vector3 { + float f0; + float f4; + float f8; +}; + +struct Vector2 { + float f0; + float f4; +}; + +struct Game_PlanetStats { + float f0; + float f4; + int f8; + char _pad0[4]; + longlong f10; + longlong f18; + float f20; +}; + +struct Game_NodePointParams { + float f0; + int f4; + Mars_string f8; + float f24; + int f28; + Mars_vector f2c; +}; + +struct Game_CombatTechFlags { + int f0; + int f4; +}; + +struct Game_XenoTechsPerSpecies { + int f0; +}; + +struct Game_LocustFleetLogistics { + bool hav; + bool don; + char _pad0[2]; + int dsy; + Vector3 dst; +}; + +struct Game_SVSOUpstartApes_EO_DEMANDS_SHIPS_ShipRequest { + char _pad0[28]; + int NUMREQUIRED; +}; + +struct Game_ShipWeapon { + Mars_string wfn; + int wid; + int did; +}; + +struct Game_ShipParams_Section { + Mars_string f0; + char _pad0[28]; + Mars_vector f38; + Game_CombatTechFlags f48; +}; + +struct Game_FieldTemplate_Point { + int FTPShID; + int FTPDesID; + int FTPPosX; + int FTPPosY; + int FTPSqd; +}; + +struct Game_AttribMap { + char _pad0[8]; + int f8; +}; + +struct Game_AICombatReport { + int CRTrn; + bool CRPce; + char _pad0[3]; + int CRSys; + Game_CombatPlayerStats CRPlSv2; +}; + +struct Game_ShipSectionID { + int f0; + int f4; +}; + +struct Game_StarSystem_OutputRates { + float SRt; + float SRsc; + float SRtf; + float SRi; + float SRoh; + float SRs; + int SRnr; +}; + +struct Game_ShipDesignDef_Section { + char _pad0[8]; + Mars_vector DGbnk2; + Mars_vector DOpts; +}; + +struct Address { + Mars_string f0; + int f1c; + Mars_string f20; + Mars_string f3c; +}; + +struct Game_PlayerAlliances { + int ALid; + int AL; + int NA; + int CF; +}; + +struct Game_ShipDesignDef_LegacyWeaponDef { + char _pad0[28]; + int DWi; +}; + +struct Game_Objective { + int ID; + bool Cmp; + char _pad0[59]; + int NID; +}; + +struct Game_CombatCommandShipSetWaypoint { + char _pad0[8]; + Mars_vector f8; + Quaternion f18; + Mars_vector f28; + bool f38; +}; + +struct Game_CombatCommandShipAttack { + char _pad0[8]; + Mars_vector f8; + int f18; + Vector3 f1c; + float f28; + int f2c; +}; + +struct Game_CombatReport { + char _pad0[4]; + int cid; + int trn; + Vector3 pos; + int sid; + bool auto_; + char _pad1[3]; + float dur; + int cow; + bool cdst; + char _pad2[3]; + int cpk; + int cpt; + float cdt; + float cdi; + Mars_vector prep; + Mars_vector wrep; +}; + +struct Game_FlightPlan { + char _pad0[4]; + Mars_vector wpts; + float FPsp2; + int FPeta2; + Vector3 FPogn2; + Vector3 FPdpos; + int pnd; +}; + +struct Game_SystemParams { + char _pad0[4]; + Vector3 f4; + Mars_string f10; + int f2c; + int f30; + float f34; +}; + +struct Game_StarMapNode { + char _pad0[24]; + Vector3 Pos; +}; + +struct Game_StarSystem { + char _pad0[24]; + Vector3 Pos; +}; + +struct Game_ClientSystem { + char _pad0[24]; + Vector3 Pos; +}; + +struct Game_EventStorage_Event { + char _pad0[4]; + int EvEID; + Mars_string EvDsc; + Mars_string EvMsg; + int EvLoc; + Vector3 EvPos; + Mars_string EvImg; + int EvAct; + int EvCID; +}; + +struct Game_TradeSector { + char _pad0[24]; + Vector3 Pos; +}; + +struct Game_ClientTradeSector { + char _pad0[24]; + Vector3 Pos; +}; + +struct Game_ServerTradeSector { + char _pad0[24]; + Vector3 Pos; + char _pad1[68]; + int tsgridID; + Vector3 tsctr; + Mars_vector tsnumsys; + int tssec; + int tsct; + int tscr; + int ptssec; + int ptsct; + int ptscr; + Mars_vector tsnumflt; + void * fwarn; +}; + +struct Game_SVSOOrtgay { + char _pad0[4]; + bool init; + char _pad1[3]; + int design; + int state; + Vector3 origin; + Vector3 center; + int turnLv; + int turnAn; + int spawnturn; + int spawnodds; +}; + +struct Game_SVSOPuppetMaster { + char _pad0[8]; + void * Flt; + bool Init2; + char _pad1[3]; + Mars_vector NSys; + Vector3 End; +}; + +struct Game_SVSOSystemKiller { + char _pad0[8]; + void * Flt; + bool Init2; + char _pad1[3]; + Mars_vector NSys; + Vector3 End; +}; + +struct Game_SNMUpdateAlliances { + char _pad0[4]; + int f4; + Game_PlayerAlliances f8; +}; + +struct Game_SNMHostCombatReply { + char _pad0[4]; + bool f4; + char _pad1[3]; + Address f8; + Mars_string f60; +}; + +struct Game_SNMJoinCombat { + char _pad0[4]; + Address f4; + Mars_string f5c; + Mars_string f78; + int f94; + int f98; +}; diff --git a/objects/layouts.json b/objects/layouts.json new file mode 100644 index 0000000..01ee466 --- /dev/null +++ b/objects/layouts.json @@ -0,0 +1,34628 @@ +{ + "Address": { + "class": "Address", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 0, + "off_abs": 0, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9397200 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 9397223 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 32, + "off_abs": 32, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9397234 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 60, + "off_abs": 60, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9397248 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9397088, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 88, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 88, + "sizeof_stride": 88, + "sizeof_upper": 88, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10673340, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9397184 + }, + "Game::AIAutoPeaceRun": { + "class": "Game::AIAutoPeaceRun", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "sid", + "this": true, + "va": 6892812 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "tn0", + "this": true, + "va": 6892826 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "tn1", + "this": true, + "va": 6892843 + } + ], + "gaps": [], + "grade": "verified", + "read": 6892688, + "read_agree": 2, + "read_comparable": 2, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10590644, + "why": "fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated", + "write": 6892784 + }, + "Game::AICombatReport": { + "class": "Game::AICombatReport", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": "CRTrn", + "this": true, + "va": 6915861 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": "CRPce", + "this": true, + "va": 6915878 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364088, + "inner": "enum:uint", + "kind": "enum", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 40, + "tag": "CRSys", + "this": true, + "type": "?$StreamableHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 6915929 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10593888, + "inner": "Game::CombatPlayerStats", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": 36, + "slot": 40, + "tag": "CRPlSv2", + "this": true, + "type": "?$StreamableHelper@VCombatPlayerStats@Game@@@Mars", + "va": 6915974 + } + ], + "gaps": [], + "grade": "verified", + "read": 6932176, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10594032, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 6915808 + }, + "Game::AIEncounterFlags": { + "class": "Game::AIEncounterFlags", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": "Fid", + "this": false, + "va": 5890082 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 16, + "size": 4, + "slot": 36, + "tag": "Ast", + "this": false, + "va": 5890102 + } + ], + "fields": [ + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "Nas", + "this": true, + "va": 5890046 + } + ], + "gaps": [], + "grade": "clean", + "read": 5908144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10510892, + "why": "fields exact; sizeof is a lower bound only", + "write": 5890016 + }, + "Game::AIRebellion": { + "class": "Game::AIRebellion", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 8454064, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10594168, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 6885344 + }, + "Game::AIRebellionImpl": { + "class": "Game::AIRebellionImpl", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "St", + "this": true, + "va": 6896461 + }, + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "Plr", + "this": true, + "va": 6896473 + }, + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "Reb", + "this": true, + "va": 6896488 + }, + { + "alt_tags": [ + "Sys" + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": null, + "tag": "NSys", + "this": true, + "va": 6896517 + } + ], + "gaps": [ + { + "after": "St", + "at": 4, + "bytes": 4 + } + ], + "grade": "clean", + "read": 6955808, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "20": 4 + }, + "unsized_fields": 0, + "vftable": 10594788, + "why": "fields exact; sizeof is a lower bound only", + "write": 6896432 + }, + "Game::AIRelationRecord": { + "class": "Game::AIRelationRecord", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8481625 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8481642 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8481653 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8481667 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8481681 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8481456, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 24, + "sizeof_by": "container stride", + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": 24, + "strides": {}, + "unsized_fields": 0, + "vftable": 10593872, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8481600 + }, + "Game::AISituation": { + "class": "Game::AISituation", + "col_offset": 0, + "computed": [ + { + "helper": null, + "helper_vftable": 10593920, + "inner": "Game::Game::VShipSectionID::?$AIWeightMap", + "kind": "object", + "slot": 40, + "tag": "AISitSecs", + "type": "?$StreamableHelper@V?$AIWeightMap@VShipSectionID@Game@@@Game@@@Mars", + "unresolved": true, + "va": 6922868 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10593936, + "inner": "Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap", + "kind": "object", + "off": 16, + "off_abs": 16, + "size": 16, + "slot": 40, + "tag": "AISitWeapFams", + "this": true, + "type": "?$StreamableHelper@V?$AIWeightMap@U?$StreamableEnum@W4WeaponFamilyID@Game@@@Mars@@@Game@@@Mars", + "va": 6922913 + } + ], + "gaps": [], + "grade": "clean", + "read": 6922592, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10593904, + "why": "fields exact; sizeof is a lower bound only", + "write": 6922784 + }, + "Game::AISystem": { + "class": "Game::AISystem", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": null, + "helper_vftable": 10593904, + "inner": "Game::AISituation", + "kind": "object", + "off": -56, + "slot": 40, + "tag": "AISysSit", + "this": false, + "type": "?$StreamableHelper@UAISituation@Game@@@Mars", + "va": 7068306 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 7068000, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10595828, + "why": "only container elements / computed values recovered", + "write": 7068208 + }, + "Game::AllianceInvite": { + "class": "Game::AllianceInvite", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167019 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 7167064 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 9, + "off_abs": 9, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 7167078 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 10, + "off_abs": 10, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 7167092 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 11, + "off_abs": 11, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 7167106 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167036 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167129 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167146 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167163 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10598196, + "inner": "Game::AllianceInvite::Response", + "kind": "vector", + "off": 28, + "off_abs": 28, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@UResponse@AllianceInvite@Game@@@Mars", + "va": 7167205 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167229 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167246 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167263 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10598196, + "inner": "Game::AllianceInvite::Response", + "kind": "vector", + "off": 56, + "off_abs": 56, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@UResponse@AllianceInvite@Game@@@Mars", + "va": 7167305 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 72, + "off_abs": 72, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7167053 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7166416, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 76, + "sizeof_stride": 76, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10527572, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7166960 + }, + "Game::AllianceInvite::Response": { + "class": "Game::AllianceInvite::Response", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7154809 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7154826 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 7154837 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7154672, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 13, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10526356, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7154784 + }, + "Game::AttribMap": { + "class": "Game::AttribMap", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -72, + "size": 28, + "slot": null, + "tag": ".", + "this": false, + "va": 5893866 + }, + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": ".", + "this": false, + "va": 5893945 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5893798 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5933664, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10593952, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5893728 + }, + "Game::BackEngProject": { + "class": "Game::BackEngProject", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "Tch", + "this": false, + "va": 8729720 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673068, + "inner": "Game::SpecialProject", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 52, + "slot": 40, + "tag": "SPi", + "this": true, + "type": "?$StreamableHelper@VSpecialProject@Game@@@Mars", + "va": 8729593 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "Stp", + "this": true, + "va": 8729554 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "AOdd", + "this": true, + "va": 8729686 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "AInc", + "this": true, + "va": 8729703 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 76, + "off_abs": 76, + "size": 4, + "slot": null, + "tag": "RCst", + "this": true, + "va": 8729737 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 80, + "off_abs": 80, + "size": 4, + "slot": null, + "tag": "RDn", + "this": true, + "va": 8729757 + } + ], + "gaps": [ + { + "after": "AInc", + "at": 68, + "bytes": 4 + } + ], + "grade": "verified", + "read": 8729216, + "read_agree": 4, + "read_comparable": 4, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 84, + "sizeof_stride": 84, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688604, + "why": "fields exact; Read agrees on all 4 comparable offsets", + "write": 8729488 + }, + "Game::BerserkerEncounterResult": { + "class": "Game::BerserkerEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10428176, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::BuildQueue": { + "class": "Game::BuildQueue", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": null, + "helper_vftable": 10672716, + "inner": "Game::ShipBuildOrderDef", + "kind": "vector", + "off": -40, + "size": 16, + "slot": 40, + "tag": "ords", + "this": false, + "type": "?$VectorHelper@UShipBuildOrderDef@Game@@@Mars", + "va": 8778030 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 8671680, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687272, + "why": "only container elements / computed values recovered", + "write": 8777888 + }, + "Game::CNMClientNotResponding": { + "class": "Game::CNMClientNotResponding", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527779 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4527793 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 9, + "sizeof_stride": 9, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370672, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527760 + }, + "Game::CNMPlayerJoined": { + "class": "Game::CNMPlayerJoined", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527683 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4527697 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527616, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10371400, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527664 + }, + "Game::CNMPlayerLeft": { + "class": "Game::CNMPlayerLeft", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370652, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::CNMUpdate": { + "class": "Game::CNMUpdate", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10370996, + "inner": "Game::UpdateData", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VUpdateData@Game@@@Mars", + "va": 4530440 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4530256, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370804, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4530368 + }, + "Game::CNMUpdateComplete": { + "class": "Game::CNMUpdateComplete", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10371092, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::CNMUserShips": { + "class": "Game::CNMUserShips", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10370884, + "inner": "Game::ShipParams", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VShipParams@Game@@@Mars", + "va": 4530724 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4530755 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4530464, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10371364, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4530640 + }, + "Game::CivilianRatios": { + "class": "Game::CivilianRatios", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "smx", + "this": true, + "va": 8570744 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10673964, + "inner": "Game::SpeciesRatios", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": null, + "slot": 40, + "tag": "spe", + "this": true, + "type": "?$StreamableHelper@VSpeciesRatios@Game@@@Mars", + "va": 8570789 + } + ], + "gaps": [], + "grade": "partial", + "read": 8570544, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": null, + "sizeof_upper": 44, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 1, + "vftable": 10632828, + "why": "1 nested field(s) of unknown size", + "write": 8570688 + }, + "Game::ClientEncounterResults": { + "class": "Game::ClientEncounterResults", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8546187 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8546198 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10593888, + "inner": "Game::CombatPlayerStats", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": 36, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VCombatPlayerStats@Game@@@Mars", + "va": 8546246 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8545952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10637184, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8546128 + }, + "Game::ClientSystem": { + "class": "Game::ClientSystem", + "col_offset": 8, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + } + ], + "gaps": [], + "grade": "clean", + "read": 7501712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10617156, + "why": "fields exact; sizeof is a lower bound only", + "write": 7501856 + }, + "Game::ClientTradeSector": { + "class": "Game::ClientTradeSector", + "col_offset": 8, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + } + ], + "gaps": [], + "grade": "clean", + "read": 7501712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689284, + "why": "fields exact; sizeof is a lower bound only", + "write": 7501856 + }, + "Game::CombatCommandCloak": { + "class": "Game::CombatCommandCloak", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364636, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandDecloak": { + "class": "Game::CombatCommandDecloak", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364672, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandFleetSetFacing": { + "class": "Game::CombatCommandFleetSetFacing", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4376579 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4376602 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4382096, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364240, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4376560 + }, + "Game::CombatCommandFleetSetHoldFire": { + "class": "Game::CombatCommandFleetSetHoldFire", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527779 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4527793 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 13, + "sizeof_stride": 13, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364276, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527760 + }, + "Game::CombatCommandFleetSetStance": { + "class": "Game::CombatCommandFleetSetStance", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4376579 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4376602 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4382096, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364204, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4376560 + }, + "Game::CombatCommandIntangOff": { + "class": "Game::CombatCommandIntangOff", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364744, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandIntangOn": { + "class": "Game::CombatCommandIntangOn", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364708, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandMoveReserves": { + "class": "Game::CombatCommandMoveReserves", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4388693 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4388707 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 12, + "off_abs": 16, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@H@Mars", + "va": 4388755 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9469536, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364492, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388640 + }, + "Game::CombatCommandNull": { + "class": "Game::CombatCommandNull", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 6261440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364168, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 6261440 + }, + "Game::CombatCommandPickReserve": { + "class": "Game::CombatCommandPickReserve", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4382067 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4382081 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4382000, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364312, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4382048 + }, + "Game::CombatCommandRequestAsylumResponse": { + "class": "Game::CombatCommandRequestAsylumResponse", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5223747 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5223770 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5223787 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5223616, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10434904, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5223728 + }, + "Game::CombatCommandSetAEAutoFire": { + "class": "Game::CombatCommandSetAEAutoFire", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527779 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4527793 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 13, + "sizeof_stride": 13, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364348, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527760 + }, + "Game::CombatCommandSetPlanetAttackMode": { + "class": "Game::CombatCommandSetPlanetAttackMode", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4376579 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4376602 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4382096, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364384, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4376560 + }, + "Game::CombatCommandSetPlayerAI": { + "class": "Game::CombatCommandSetPlayerAI", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527779 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4527793 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 13, + "sizeof_stride": 13, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364456, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527760 + }, + "Game::CombatCommandSetWantEndCombat": { + "class": "Game::CombatCommandSetWantEndCombat", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527779 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4527793 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 13, + "sizeof_stride": 13, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364420, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527760 + }, + "Game::CombatCommandShipAllStop": { + "class": "Game::CombatCommandShipAllStop", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364528, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandShipAttack": { + "class": "Game::CombatCommandShipAttack", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10364040, + "inner": "Game::CombatCommandShipAttack::ShipData", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VShipData@CombatCommandShipAttack@Game@@@Mars", + "va": 4387076 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4387100 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 24, + "off_abs": 28, + "size": 12, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 4387142 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 36, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4387167 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4387181 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4386720, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10365068, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4386992 + }, + "Game::CombatCommandShipClearTargets": { + "class": "Game::CombatCommandShipClearTargets", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364564, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandShipFireOnce": { + "class": "Game::CombatCommandShipFireOnce", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4387684 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364024, + "inner": "Game::GunBankSelection", + "kind": "object", + "off": 20, + "off_abs": 24, + "size": 8, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VGunBankSelection@Game@@@Mars", + "va": 4387726 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4387408, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364960, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4387600 + }, + "Game::CombatCommandShipManeuver": { + "class": "Game::CombatCommandShipManeuver", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4388571 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 8, + "off_abs": 12, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388613 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388352, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364780, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388512 + }, + "Game::CombatCommandShipReleaseGrapple": { + "class": "Game::CombatCommandShipReleaseGrapple", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4388328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4388144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364600, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388256 + }, + "Game::CombatCommandShipSetFacing": { + "class": "Game::CombatCommandShipSetFacing", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4386020 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4386051 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4385760, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364852, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4385936 + }, + "Game::CombatCommandShipSetHoldFire": { + "class": "Game::CombatCommandShipSetHoldFire", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4387300 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364024, + "inner": "Game::GunBankSelection", + "kind": "object", + "off": 20, + "off_abs": 24, + "size": 8, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VGunBankSelection@Game@@@Mars", + "va": 4387342 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 40, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4387367 + } + ], + "gaps": [ + { + "after": ".", + "at": 24, + "bytes": 8 + } + ], + "grade": "unnamed", + "read": 4387904, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 41, + "sizeof_stride": 41, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364996, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4387216 + }, + "Game::CombatCommandShipSetOnlyMyTarget": { + "class": "Game::CombatCommandShipSetOnlyMyTarget", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4387300 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364024, + "inner": "Game::GunBankSelection", + "kind": "object", + "off": 20, + "off_abs": 24, + "size": 8, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VGunBankSelection@Game@@@Mars", + "va": 4387342 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 40, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4387367 + } + ], + "gaps": [ + { + "after": ".", + "at": 24, + "bytes": 8 + } + ], + "grade": "unnamed", + "read": 4387904, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 41, + "sizeof_stride": 41, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10365032, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4387216 + }, + "Game::CombatCommandShipSetStance": { + "class": "Game::CombatCommandShipSetStance", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4386020 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4386051 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4385760, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364816, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4385936 + }, + "Game::CombatCommandShipSetWaypoint": { + "class": "Game::CombatCommandShipSetWaypoint", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363976, + "inner": "Game::CombatCommandShipSetWaypoint::ShipData", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VShipData@CombatCommandShipSetWaypoint@Game@@@Mars", + "va": 4386430 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363992, + "inner": "Quaternion", + "kind": "object", + "off": 20, + "off_abs": 24, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VQuaternion@Mars@@@Mars", + "va": 4386467 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364008, + "inner": "Vector2", + "kind": "vector", + "off": 36, + "off_abs": 40, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VVector2@Mars@@@Mars", + "va": 4386504 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 52, + "off_abs": 56, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4386528 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4386080, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 57, + "sizeof_stride": 57, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364888, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4386352 + }, + "Game::CombatCommandShipToggleBank": { + "class": "Game::CombatCommandShipToggleBank", + "col_offset": 4, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 4, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4387300 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364024, + "inner": "Game::GunBankSelection", + "kind": "object", + "off": 20, + "off_abs": 24, + "size": 8, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VGunBankSelection@Game@@@Mars", + "va": 4387342 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 40, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4387367 + } + ], + "gaps": [ + { + "after": ".", + "at": 24, + "bytes": 8 + } + ], + "grade": "unnamed", + "read": 4387904, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 41, + "sizeof_stride": 41, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364924, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4387216 + }, + "Game::CombatDamageReport": { + "class": "Game::CombatDamageReport", + "col_offset": 0, + "computed": [ + { + "helper": null, + "kind": "int?", + "slot": 36, + "tag": "nshp", + "unresolved": true, + "va": 5880866 + }, + { + "helper": 9149408, + "kind": "float?", + "slot": null, + "tag": "damt", + "unresolved": true, + "va": 5881000 + }, + { + "helper": null, + "kind": "int?", + "slot": 36, + "tag": "nshp", + "unresolved": true, + "va": 5881059 + }, + { + "helper": 9149408, + "kind": "float?", + "slot": null, + "tag": "damt", + "unresolved": true, + "va": 5881167 + } + ], + "elements": [], + "fields": [ + { + "alt_tags": [ + "dtak", + "dams", + "damp", + "dami" + ], + "base": "ebx", + "helper": null, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "did", + "this": true, + "va": 5880909, + "via": "deref" + }, + { + "alt_tags": [ + "dams", + "damp", + "dami" + ], + "base": "ebx", + "helper": 9149808, + "kind": "string", + "off": 20, + "off_abs": 20, + "size": 28, + "slot": null, + "tag": "wep", + "this": true, + "va": 5881090 + } + ], + "gaps": [ + { + "after": "did", + "at": 4, + "bytes": 12 + } + ], + "grade": "clean", + "read": 5925824, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": 36, + "sizeof_vectorstride": null, + "strides": { + "4": 24, + "20": 44 + }, + "unsized_fields": 0, + "vftable": 10511060, + "why": "fields exact; sizeof is a lower bound only", + "write": 5880816 + }, + "Game::CombatLaunchParams": { + "class": "Game::CombatLaunchParams", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "edi", + "from": 4551104, + "helper": 9149776, + "kind": "int", + "off": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 4551130 + }, + { + "base": "eax", + "from": 4551104, + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 4551170 + } + ], + "fields": [ + { + "base": "ecx", + "from": 7784064, + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7784079 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 32, + "off_abs": 32, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4529661 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4529674 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4529696 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4529712 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370884, + "inner": "Game::ShipParams", + "kind": "vector", + "off": 72, + "off_abs": 72, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VShipParams@Game@@@Mars", + "va": 4529745 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 88, + "off_abs": 88, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4529762 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370900, + "inner": "Game::CombatPlayerInvariant", + "kind": "vector", + "off": 92, + "off_abs": 92, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VCombatPlayerInvariant@Game@@@Mars", + "va": 4529805 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 132, + "off_abs": 132, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4530133 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 160, + "off_abs": 160, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4529921 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370916, + "inner": "Game::NodePointParams", + "kind": "vector", + "off": 164, + "off_abs": 164, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VNodePointParams@Game@@@Mars", + "va": 4529967 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370932, + "inner": "Game::PlayerMessage", + "kind": "vector", + "off": 180, + "off_abs": 180, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VPlayerMessage@Game@@@Mars", + "va": 4530007 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 196, + "off_abs": 196, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4529844 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 200, + "off_abs": 200, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4529870 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 201, + "off_abs": 201, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4529886 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 204, + "off_abs": 204, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4530035 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 208, + "off_abs": 208, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4530051 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 236, + "off_abs": 236, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4530067 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370948, + "inner": "Game::PlanetStats", + "kind": "object", + "off": 264, + "off_abs": 264, + "size": 36, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VPlanetStats@Game@@@Mars", + "va": 4530113 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 328, + "off_abs": 328, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4529831 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 332, + "off_abs": 332, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 4529902 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370964, + "inner": "Game::CombatEncounterParams", + "kind": "object", + "off": 336, + "off_abs": 336, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VCombatEncounterParams@Game@@@Mars", + "va": 4530187 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370980, + "inner": "Game::DefenceLayout", + "kind": "object", + "off": 376, + "off_abs": 376, + "size": 28, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VDefenceLayout@Game@@@Mars", + "va": 4530227 + } + ], + "gaps": [ + { + "after": ".", + "at": 92, + "bytes": 24 + }, + { + "after": ".", + "at": 264, + "bytes": 28 + } + ], + "grade": "partial", + "read": 4528768, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 404, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 1, + "vftable": 10371504, + "why": "1 nested field(s) of unknown size", + "write": 4529600 + }, + "Game::CombatPlayerReport": { + "class": "Game::CombatPlayerReport", + "col_offset": 0, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "ncls", + "va": 5887901 + }, + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "cls", + "va": 5887935 + }, + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "nsec", + "va": 5888085 + }, + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "ssec", + "va": 5888116 + } + ], + "elements": [ + { + "base": "eax", + "helper": null, + "kind": "int16", + "off": -10, + "size": 2, + "slot": 36, + "tag": "nshp", + "this": false, + "va": 5887959 + }, + { + "base": "ecx", + "helper": null, + "kind": "int16", + "off": 0, + "size": 2, + "slot": 36, + "tag": "nshfld", + "this": false, + "va": 5888004 + }, + { + "base": "eax", + "helper": null, + "kind": "int16", + "off": 6, + "size": 2, + "slot": 36, + "tag": "nshlst", + "this": false, + "va": 5888028 + }, + { + "base": "eax", + "helper": null, + "kind": "int16", + "off": 0, + "size": 2, + "slot": 36, + "tag": "nshp", + "this": false, + "va": 5888139 + } + ], + "fields": [ + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 5887759 + }, + { + "base": "ebx", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": "ai", + "this": true, + "va": 5887773 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "ally", + "this": true, + "va": 5887799 + }, + { + "base": "ebx", + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "status", + "this": true, + "va": 5887820 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "mxeng", + "this": true, + "va": 5887840 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "mxcls", + "this": true, + "va": 5887860 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": 36, + "tag": "mxmsl", + "this": true, + "va": 5887880 + }, + { + "base": "ebx", + "helper": null, + "kind": "int8", + "off": 38, + "off_abs": 38, + "size": 4, + "slot": 36, + "tag": "nsat", + "this": true, + "va": 5887981 + }, + { + "base": "ebx", + "helper": null, + "kind": "int8", + "off": 54, + "off_abs": 54, + "size": 4, + "slot": 36, + "tag": "nsatl", + "this": true, + "va": 5888050 + }, + { + "base": "ebx", + "helper": null, + "kind": "int16", + "off": 58, + "off_abs": 58, + "size": 2, + "slot": 36, + "tag": "ndam", + "this": true, + "va": 5888170 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10509672, + "inner": "Game::CombatShipReport", + "kind": "vector", + "off": 68, + "off_abs": 68, + "size": 16, + "slot": 40, + "tag": "srep", + "this": true, + "type": "?$VectorHelper@VCombatShipReport@Game@@@Mars", + "va": 5888209 + } + ], + "gaps": [ + { + "after": "mxmsl", + "at": 28, + "bytes": 6 + }, + { + "after": "nsat", + "at": 38, + "bytes": 12 + }, + { + "after": "ndam", + "at": 58, + "bytes": 8 + } + ], + "grade": "verified", + "read": 5886816, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 84, + "sizeof_by": "container stride", + "sizeof_lower": 84, + "sizeof_stride": 84, + "sizeof_upper": null, + "sizeof_vectorstride": 84, + "strides": {}, + "unsized_fields": 0, + "vftable": 10510908, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 5887696 + }, + "Game::CombatPlayerStats": { + "class": "Game::CombatPlayerStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10372720, + "inner": "Game::TacReport", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": "TacReports", + "this": true, + "type": "?$VectorHelper@VTacReport@Game@@@Mars", + "va": 4559320 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "RPBon", + "this": true, + "va": 4559224 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "RPBonT", + "this": true, + "va": 4559241 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "SavBonus", + "this": true, + "va": 4559258 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 32, + "off_abs": 32, + "size": 1, + "slot": null, + "tag": "MaintHF", + "this": true, + "va": 4559275 + } + ], + "gaps": [], + "grade": "verified", + "read": 4558960, + "read_agree": 4, + "read_comparable": 4, + "sizeof": 36, + "sizeof_by": "container stride", + "sizeof_lower": 33, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": 36, + "strides": {}, + "unsized_fields": 0, + "vftable": 10374004, + "why": "fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated", + "write": 4559168 + }, + "Game::CombatReport": { + "class": "Game::CombatReport", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "cid", + "this": true, + "va": 5888879 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "trn", + "this": true, + "va": 5888893 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": 12, + "slot": 40, + "tag": "pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 5888938 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "sid", + "this": true, + "va": 5888965 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 28, + "off_abs": 28, + "size": 1, + "slot": null, + "tag": "auto", + "this": true, + "va": 5888979 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "dur", + "this": true, + "va": 5888996 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": "cow", + "this": true, + "va": 5889022 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 40, + "off_abs": 40, + "size": 1, + "slot": null, + "tag": "cdst", + "this": true, + "va": 5889036 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": 36, + "tag": "cpk", + "this": true, + "va": 5889062 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": 36, + "tag": "cpt", + "this": true, + "va": 5889082 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "cdt", + "this": true, + "va": 5889096 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": "cdi", + "this": true, + "va": 5889113 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10509688, + "inner": "Game::CombatPlayerReport", + "kind": "vector", + "off": 60, + "off_abs": 60, + "size": 16, + "slot": 40, + "tag": "prep", + "this": true, + "type": "?$VectorHelper@VCombatPlayerReport@Game@@@Mars", + "va": 5889160 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10509704, + "inner": "Game::CombatWeaponReport", + "kind": "vector", + "off": 76, + "off_abs": 76, + "size": 16, + "slot": 40, + "tag": "wrep", + "this": true, + "type": "?$VectorHelper@VCombatWeaponReport@Game@@@Mars", + "va": 5889201 + } + ], + "gaps": [], + "grade": "verified", + "read": 5888240, + "read_agree": 6, + "read_comparable": 6, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 92, + "sizeof_stride": 92, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10510924, + "why": "fields exact; Read agrees on all 6 comparable offsets", + "write": 5888816 + }, + "Game::CombatShipReport": { + "class": "Game::CombatShipReport", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": "name", + "this": true, + "va": 5880182 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": 36, + "tag": "did", + "this": true, + "va": 5880208 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": "cls", + "this": true, + "va": 5880228 + }, + { + "base": "edi", + "helper": 9149536, + "kind": "int64", + "off": 40, + "off_abs": 40, + "size": 8, + "slot": null, + "tag": "caps2", + "this": true, + "va": 5880242 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": "nshp", + "this": true, + "va": 5880259 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "nfld", + "this": true, + "va": 5880276 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": "nlst", + "this": true, + "va": 5880293 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "dtak", + "this": true, + "va": 5880319 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": 36, + "tag": "dams", + "this": true, + "va": 5880339 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": 36, + "tag": "damp", + "this": true, + "va": 5880359 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 72, + "off_abs": 72, + "size": 4, + "slot": null, + "tag": "dami", + "this": true, + "va": 5880373 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 76, + "off_abs": 76, + "size": 4, + "slot": null, + "tag": "damt", + "this": true, + "va": 5880390 + } + ], + "gaps": [], + "grade": "verified", + "read": 5883472, + "read_agree": 7, + "read_comparable": 7, + "sizeof": 80, + "sizeof_by": "container stride", + "sizeof_lower": 80, + "sizeof_stride": 80, + "sizeof_upper": null, + "sizeof_vectorstride": 80, + "strides": {}, + "unsized_fields": 0, + "vftable": 10510436, + "why": "fields exact; Read agrees on all 7 comparable offsets; sizeof corroborated", + "write": 5880160 + }, + "Game::CombatTechFlags": { + "class": "Game::CombatTechFlags", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5086760 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5086777 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5086656, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10372640, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5086736 + }, + "Game::CombatWeaponReport": { + "class": "Game::CombatWeaponReport", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": "wep", + "this": true, + "va": 5880710 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": 36, + "tag": "dams", + "this": true, + "va": 5880736 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": "damp", + "this": true, + "va": 5880756 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "dami", + "this": true, + "va": 5880770 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "damt", + "this": true, + "va": 5880787 + } + ], + "gaps": [], + "grade": "verified", + "read": 5880528, + "read_agree": 3, + "read_comparable": 3, + "sizeof": 48, + "sizeof_by": "container stride", + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": 48, + "strides": {}, + "unsized_fields": 0, + "vftable": 10510452, + "why": "fields exact; Read agrees on all 3 comparable offsets; sizeof corroborated", + "write": 5880688 + }, + "Game::CommDeclareCurse": { + "class": "Game::CommDeclareCurse", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674576, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareIDontWant": { + "class": "Game::CommDeclareIDontWant", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674816, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareIHate": { + "class": "Game::CommDeclareIHate", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674996, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareILike": { + "class": "Game::CommDeclareILike", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675056, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareISaw": { + "class": "Game::CommDeclareISaw", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674876, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareISeveredAllianceWith": { + "class": "Game::CommDeclareISeveredAllianceWith", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674936, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareIWant": { + "class": "Game::CommDeclareIWant", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674756, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareShareAllColonyStats": { + "class": "Game::CommDeclareShareAllColonyStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + } + ], + "gaps": [], + "grade": "clean", + "read": 8456272, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10676076, + "why": "fields exact; sizeof is a lower bound only", + "write": 8456592 + }, + "Game::CommDeclareShareStats": { + "class": "Game::CommDeclareShareStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10680368, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareShareSystemNotes": { + "class": "Game::CommDeclareShareSystemNotes", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457666 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 24, + "off_abs": 24, + "size": 28, + "slot": null, + "tag": "notes", + "this": true, + "va": 8457680 + } + ], + "gaps": [], + "grade": "verified", + "read": 8457552, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 52, + "sizeof_stride": 52, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687868, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8457632 + }, + "Game::CommDeclareShareSystemStats": { + "class": "Game::CommDeclareShareSystemStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457506 + } + ], + "gaps": [], + "grade": "clean", + "read": 8593824, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10676016, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457472 + }, + "Game::CommDeclareSorry": { + "class": "Game::CommDeclareSorry", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674696, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommDeclareThanks": { + "class": "Game::CommDeclareThanks", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674636, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommMessageContainer": { + "class": "Game::CommMessageContainer", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "ebx", + "helper": null, + "kind": "int8", + "off": 4, + "size": 4, + "slot": 36, + "tag": "msgt", + "this": false, + "va": 8541693 + }, + { + "base": "ecx", + "helper": null, + "helper_vftable": 10672732, + "inner": "Game::ICommMessage", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "msg", + "this": false, + "type": "?$StreamableHelper@VICommMessage@Game@@@Mars", + "va": 8541729 + } + ], + "fields": [ + { + "base": "ecx", + "count_of": true, + "helper": null, + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 36, + "tag": "nmsg", + "this": true, + "va": 8541657 + } + ], + "gaps": [], + "grade": "clean", + "read": 8703072, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "4": 4 + }, + "unsized_fields": 0, + "vftable": 10683952, + "why": "fields exact; sizeof is a lower bound only", + "write": 8541584 + }, + "Game::CommRequestAttackSystem": { + "class": "Game::CommRequestAttackSystem", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675596, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestDefendSystem": { + "class": "Game::CommRequestDefendSystem", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675656, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestDisposition": { + "class": "Game::CommRequestDisposition", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675236, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestHarassPlayer": { + "class": "Game::CommRequestHarassPlayer", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675896, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestHarassSystem": { + "class": "Game::CommRequestHarassSystem", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675716, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestMoney": { + "class": "Game::CommRequestMoney", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675116, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestRallyAtSystem": { + "class": "Game::CommRequestRallyAtSystem", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675536, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestResearch": { + "class": "Game::CommRequestResearch", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675176, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestSeverAllianceWith": { + "class": "Game::CommRequestSeverAllianceWith", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675836, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestShareSystemStats": { + "class": "Game::CommRequestShareSystemStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675476, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestStopColonizing": { + "class": "Game::CommRequestStopColonizing", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675416, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestStopHarassingMe": { + "class": "Game::CommRequestStopHarassingMe", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675296, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestStopHarassingPlayer": { + "class": "Game::CommRequestStopHarassingPlayer", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675956, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestStopHarrassingSystem": { + "class": "Game::CommRequestStopHarrassingSystem", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675776, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommRequestStopMining": { + "class": "Game::CommRequestStopMining", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 5, + "off_abs": 5, + "size": 4, + "slot": 36, + "tag": "rcpt", + "this": true, + "va": 8456725 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8456662 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "cid2", + "this": true, + "va": 8456620 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": 36, + "tag": "sent", + "this": true, + "va": 8456704 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": 36, + "tag": "exp", + "this": true, + "va": 8456683 + }, + { + "base": "edi", + "from": 8456592, + "helper": null, + "kind": "int8", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "snd", + "this": true, + "va": 8456641 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 8457453 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "plr", + "this": true, + "va": 8457427 + } + ], + "gaps": [], + "grade": "clean", + "read": 8457280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10675356, + "why": "fields exact; sizeof is a lower bound only", + "write": 8457376 + }, + "Game::CommonPlague": { + "class": "Game::CommonPlague", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "PlgSys", + "this": true, + "va": 5464308 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "PlgCByF", + "this": true, + "va": 5464349 + }, + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "PlgCBy", + "this": true, + "va": 5464323 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": "PlgCM", + "this": true, + "va": 5464363 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": null, + "tag": "PlgTurns", + "this": true, + "va": 5464380 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "PlgInf", + "this": true, + "va": 5464397 + } + ], + "gaps": [ + { + "after": "PlgCBy", + "at": 16, + "bytes": 36 + } + ], + "grade": "verified", + "read": 5469152, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 68, + "sizeof_stride": 68, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10455888, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5464288 + }, + "Game::CrowDefendersEncounterResult": { + "class": "Game::CrowDefendersEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10430540, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::CrowRuinsEncounterResult": { + "class": "Game::CrowRuinsEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10430556, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::DefenceFleetAssignment": { + "class": "Game::DefenceFleetAssignment", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "fid", + "this": true, + "va": 8460780 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "stnid", + "this": true, + "va": 8460800 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "head2", + "this": true, + "va": 8460814 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "ori", + "this": true, + "va": 8460831 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "quota", + "this": true, + "va": 8460848 + } + ], + "gaps": [], + "grade": "verified", + "read": 8594224, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370120, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 8460752 + }, + "Game::DefenceLayout": { + "class": "Game::DefenceLayout", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "nfa", + "unresolved": true, + "va": 8541984 + } + ], + "elements": [ + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "dsid", + "this": false, + "va": 8541938 + } + ], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "sysid", + "this": true, + "va": 8541839 + }, + { + "alt_tags": [ + "stnid" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": null, + "tag": "ndsa", + "this": true, + "va": 8541865 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672748, + "inner": "Game::DefenceFleetAssignment", + "kind": "object", + "off": 24, + "off_abs": 24, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "fa", + "this": true, + "type": "?$StreamableHelper@VDefenceFleetAssignment@Game@@@Mars", + "va": 8542046 + } + ], + "gaps": [], + "grade": "clean", + "read": 8709888, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "8": 8, + "24": 24 + }, + "unsized_fields": 0, + "vftable": 10625664, + "why": "fields exact; sizeof is a lower bound only", + "write": 8541776 + }, + "Game::DefenceSummary": { + "class": "Game::DefenceSummary", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "pid", + "this": true, + "va": 8542287 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "sid", + "this": true, + "va": 8542307 + }, + { + "alt_tags": [ + "stid", + "stt" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 12, + "off_abs": 12, + "size": 16, + "slot": null, + "tag": "stac", + "this": true, + "va": 8542386 + }, + { + "alt_tags": [ + "said", + "sasc" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 28, + "off_abs": 28, + "size": 16, + "slot": null, + "tag": "satc", + "this": true, + "va": 8542477 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370980, + "inner": "Game::DefenceLayout", + "kind": "object", + "off": 44, + "off_abs": 44, + "size": 28, + "slot": 40, + "tag": "dlay", + "this": true, + "type": "?$StreamableHelper@VDefenceLayout@Game@@@Mars", + "va": 8542346 + } + ], + "gaps": [], + "grade": "clean", + "read": 8710576, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 72, + "sizeof_stride": 72, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "12": 8, + "28": 8 + }, + "unsized_fields": 0, + "vftable": 10687416, + "why": "fields exact; sizeof is a lower bound only", + "write": 8542224 + }, + "Game::DerelictEncounterResult": { + "class": "Game::DerelictEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10425016, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::DiplomacyStats": { + "class": "Game::DiplomacyStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "other", + "this": true, + "va": 8490188 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 8, + "off_abs": 8, + "size": 2, + "slot": null, + "tag": "lastnap", + "this": true, + "va": 8490202 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 10, + "off_abs": 10, + "size": 2, + "slot": null, + "tag": "lastnapbty", + "this": true, + "va": 8490219 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 12, + "off_abs": 12, + "size": 2, + "slot": null, + "tag": "bknnap", + "this": true, + "va": 8490236 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 14, + "off_abs": 14, + "size": 2, + "slot": null, + "tag": "btynap", + "this": true, + "va": 8490253 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 16, + "off_abs": 16, + "size": 2, + "slot": null, + "tag": "lastally", + "this": true, + "va": 8490273 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 18, + "off_abs": 18, + "size": 2, + "slot": null, + "tag": "lastallybty", + "this": true, + "va": 8490290 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 20, + "off_abs": 20, + "size": 2, + "slot": null, + "tag": "bknally", + "this": true, + "va": 8490307 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 22, + "off_abs": 22, + "size": 2, + "slot": null, + "tag": "btyally", + "this": true, + "va": 8490324 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 24, + "off_abs": 24, + "size": 2, + "slot": null, + "tag": "lastcf", + "this": true, + "va": 8490344 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 26, + "off_abs": 26, + "size": 2, + "slot": null, + "tag": "lastcfbty", + "this": true, + "va": 8490361 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 28, + "off_abs": 28, + "size": 2, + "slot": null, + "tag": "bkncf", + "this": true, + "va": 8490378 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 30, + "off_abs": 30, + "size": 2, + "slot": null, + "tag": "btycf", + "this": true, + "va": 8490395 + }, + { + "base": "esi", + "helper": 9149696, + "kind": "int16", + "off": 32, + "off_abs": 32, + "size": 2, + "slot": null, + "tag": "deadhome", + "this": true, + "va": 8490415 + } + ], + "gaps": [], + "grade": "verified", + "read": 8489856, + "read_agree": 13, + "read_comparable": 13, + "sizeof": 36, + "sizeof_by": "container stride", + "sizeof_lower": 34, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": 36, + "strides": {}, + "unsized_fields": 0, + "vftable": 10622000, + "why": "fields exact; Read agrees on all 13 comparable offsets; sizeof corroborated", + "write": 8490160 + }, + "Game::EncounterQuery": { + "class": "Game::EncounterQuery", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "alt_tags": [ + ".", + ".", + ".", + "." + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 8463127 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8712592, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "4": 16 + }, + "unsized_fields": 0, + "vftable": 10687448, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463088 + }, + "Game::EncounterResult": { + "class": "Game::EncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10423128, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::EncounterResults": { + "class": "Game::EncounterResults", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8545761 + }, + { + "base": "ecx", + "helper": null, + "helper_vftable": 10427888, + "inner": "Game::EncounterResult", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VEncounterResult@Game@@@Mars", + "va": 8545809 + } + ], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8544999 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 5, + "off_abs": 5, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8545012 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 6, + "off_abs": 6, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8545025 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 7, + "off_abs": 7, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8545038 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8545077 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672796, + "inner": "Game::CombatPlayerStats", + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VCombatPlayerStats@Game@@@Mars", + "va": 8545114 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 40, + "off_abs": 40, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@H@Mars", + "va": 8545151 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672812, + "inner": "Game::EncounterResults::PrisonerShip", + "kind": "vector", + "off": 56, + "off_abs": 56, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@UPrisonerShip@EncounterResults@Game@@@Mars", + "va": 8545188 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672828, + "inner": "Game::EncounterResults::DamagedShip", + "kind": "vector", + "off": 72, + "off_abs": 72, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@UDamagedShip@EncounterResults@Game@@@Mars", + "va": 8545225 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672844, + "inner": "Game::EncounterResults::BoardedShip", + "kind": "vector", + "off": 88, + "off_abs": 88, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@UBoardedShip@EncounterResults@Game@@@Mars", + "va": 8545262 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672860, + "inner": "Game::EncounterResults::RetreatingShip", + "kind": "vector", + "off": 104, + "off_abs": 104, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@URetreatingShip@EncounterResults@Game@@@Mars", + "va": 8545299 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672876, + "inner": "Game::EncounterResults::SpyShip", + "kind": "vector", + "off": 120, + "off_abs": 120, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@USpyShip@EncounterResults@Game@@@Mars", + "va": 8545336 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 136, + "off_abs": 136, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8545376 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 152, + "off_abs": 152, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8545442 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 168, + "off_abs": 168, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8545482 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 184, + "off_abs": 184, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8545502 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672892, + "inner": "Game::CombatDamageReport", + "kind": "object", + "off": 188, + "off_abs": 188, + "size": 48, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VCombatDamageReport@Game@@@Mars", + "va": 8545548 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 224, + "off_abs": 224, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8545588 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 240, + "off_abs": 240, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8545614 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 244, + "off_abs": 244, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8545627 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 248, + "off_abs": 248, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8545643 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 252, + "off_abs": 252, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8545689 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 268, + "off_abs": 268, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8545396 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10370948, + "inner": "Game::PlanetStats", + "kind": "object", + "off": 272, + "off_abs": 272, + "size": 36, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VPlanetStats@Game@@@Mars", + "va": 8545883 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672908, + "inner": "Game::PlagueStats", + "kind": "object", + "off": 336, + "off_abs": 336, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VPlagueStats@Game@@@Mars", + "va": 8545928 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 356, + "off_abs": 356, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 8545724 + } + ], + "gaps": [ + { + "after": ".", + "at": 272, + "bytes": 28 + } + ], + "grade": "unnamed", + "read": 8649488, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 372, + "sizeof_stride": 372, + "sizeof_upper": 376, + "sizeof_vectorstride": null, + "strides": { + "356": 4 + }, + "unsized_fields": 0, + "vftable": 10639084, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8544944 + }, + "Game::EncounterResults::BoardedShip": { + "class": "Game::EncounterResults::BoardedShip", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 12, + "sizeof_by": "container stride", + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": 12, + "strides": {}, + "unsized_fields": 0, + "vftable": 10604264, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::EncounterResults::DamagedShip": { + "class": "Game::EncounterResults::DamagedShip", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8544775 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10427984, + "inner": "Game::ShipHealth", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VShipHealth@Game@@@Mars", + "va": 8544814 + }, + { + "alt_tags": [ + ".", + "." + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 8544843 + } + ], + "gaps": [], + "grade": "partial", + "read": 8713568, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 40, + "sizeof_by": "container stride", + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": 40, + "strides": { + "24": 8 + }, + "unsized_fields": 1, + "vftable": 10604624, + "why": "1 nested field(s) of unknown size", + "write": 8544720 + }, + "Game::EncounterResults::PrisonerShip": { + "class": "Game::EncounterResults::PrisonerShip", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8544645 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10476732, + "inner": "Game::PrisonerHold", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 24, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VPrisonerHold@Game@@@Mars", + "va": 8544693 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8544448, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 32, + "sizeof_by": "container stride", + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": 32, + "strides": {}, + "unsized_fields": 0, + "vftable": 10604248, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8544592 + }, + "Game::EncounterResults::RetreatingShip": { + "class": "Game::EncounterResults::RetreatingShip", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8463843 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463866 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463883 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463900 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8463680, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 20, + "sizeof_by": "container stride", + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": 20, + "strides": {}, + "unsized_fields": 0, + "vftable": 10604280, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463824 + }, + "Game::EncounterResults::SpyShip": { + "class": "Game::EncounterResults::SpyShip", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463545 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463562 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8463573 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 13, + "off_abs": 13, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8463587 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8463601 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8463376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 20, + "sizeof_by": "container stride", + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": 20, + "strides": {}, + "unsized_fields": 0, + "vftable": 10604296, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463520 + }, + "Game::EventStorage": { + "class": "Game::EventStorage", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10672780, + "inner": "Game::EventStorage::TurnEvents", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": "Events", + "this": true, + "type": "?$VectorHelper@VTurnEvents@EventStorage@Game@@@Mars", + "va": 8543525 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "EvNxID", + "this": true, + "va": 8543480 + } + ], + "gaps": [], + "grade": "verified", + "read": 8933616, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": 32, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687432, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8543424 + }, + "Game::EventStorage::Event": { + "class": "Game::EventStorage::Event", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "EvEID", + "this": true, + "va": 8542952 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": "EvDsc", + "this": true, + "va": 8542969 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 36, + "off_abs": 36, + "size": 28, + "slot": null, + "tag": "EvMsg", + "this": true, + "va": 8542986 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": 36, + "tag": "EvLoc", + "this": true, + "va": 8543029 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 68, + "off_abs": 68, + "size": 12, + "slot": 40, + "tag": "EvPos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 8543068 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 80, + "off_abs": 80, + "size": 28, + "slot": null, + "tag": "EvImg", + "this": true, + "va": 8543003 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 108, + "off_abs": 108, + "size": 4, + "slot": 36, + "tag": "EvAct", + "this": true, + "va": 8543102 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 112, + "off_abs": 112, + "size": 4, + "slot": 36, + "tag": "EvCID", + "this": true, + "va": 8543122 + } + ], + "gaps": [], + "grade": "verified", + "read": 8542576, + "read_agree": 4, + "read_comparable": 4, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 116, + "sizeof_stride": 116, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10623320, + "why": "fields exact; Read agrees on all 4 comparable offsets", + "write": 8542896 + }, + "Game::EventStorage::TurnEvents": { + "class": "Game::EventStorage::TurnEvents", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "EvTurn", + "this": true, + "va": 8543352 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10672764, + "inner": "Game::EventStorage::Event", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": "Events", + "this": true, + "type": "?$VectorHelper@VEvent@EventStorage@Game@@@Mars", + "va": 8543397 + } + ], + "gaps": [], + "grade": "verified", + "read": 8543152, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 24, + "sizeof_by": "container stride", + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": 24, + "strides": {}, + "unsized_fields": 0, + "vftable": 10547324, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 8543296 + }, + "Game::FieldTemplate": { + "class": "Game::FieldTemplate", + "col_offset": 0, + "computed": [ + { + "helper": null, + "helper_vftable": 10509752, + "inner": "Game::FieldTemplate::Point", + "kind": "vector", + "size": 16, + "slot": 40, + "tag": "FTPnts", + "type": "?$VectorHelper@UPoint@FieldTemplate@Game@@@Mars", + "unresolved": true, + "va": 5890904 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 5890720, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": 16, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10372624, + "why": "only container elements / computed values recovered", + "write": 5890832 + }, + "Game::FieldTemplate::Point": { + "class": "Game::FieldTemplate::Point", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": 36, + "tag": "FTPShID", + "this": true, + "va": 5881787 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "FTPDesID", + "this": true, + "va": 5881807 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "FTPPosX", + "this": true, + "va": 5881821 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "FTPPosY", + "this": true, + "va": 5881838 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "FTPSqd", + "this": true, + "va": 5881855 + } + ], + "gaps": [], + "grade": "verified", + "read": 5881616, + "read_agree": 3, + "read_comparable": 3, + "sizeof": 20, + "sizeof_by": "container stride", + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": 20, + "strides": {}, + "unsized_fields": 0, + "vftable": 10509816, + "why": "fields exact; Read agrees on all 3 comparable offsets; sizeof corroborated", + "write": 5881760 + }, + "Game::FleetLayout": { + "class": "Game::FleetLayout", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ebx", + "helper": null, + "helper_vftable": 10372624, + "inner": "Game::FieldTemplate", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VFieldTemplate@Game@@@Mars", + "va": 7343726 + }, + { + "alt_tags": [ + "." + ], + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 7343762 + } + ], + "gaps": [], + "grade": "partial", + "read": 7348912, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": null, + "sizeof_upper": 36, + "sizeof_vectorstride": null, + "strides": { + "20": 4 + }, + "unsized_fields": 1, + "vftable": 10548188, + "why": "1 nested field(s) of unknown size", + "write": 7343648 + }, + "Game::FleetNameGenerator": { + "class": "Game::FleetNameGenerator", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "FNGNum", + "this": true, + "va": 8483954 + } + ], + "gaps": [], + "grade": "verified", + "read": 8483904, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10692448, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8483936 + }, + "Game::FlightPlan": { + "class": "Game::FlightPlan", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10605404, + "inner": "Game::FlightPlan::Waypoint", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": "wpts", + "this": true, + "type": "?$VectorHelper@VWaypoint@FlightPlan@Game@@@Mars", + "va": 7344050 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "FPsp2", + "this": true, + "va": 7344071 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "FPeta2", + "this": true, + "va": 7344088 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 28, + "off_abs": 28, + "size": 12, + "slot": 40, + "tag": "FPogn2", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7344135 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 40, + "off_abs": 40, + "size": 12, + "slot": 40, + "tag": "FPdpos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7344176 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": 36, + "tag": "pnd", + "this": true, + "va": 7344210 + } + ], + "gaps": [], + "grade": "verified", + "read": 7359600, + "read_agree": 2, + "read_comparable": 2, + "sizeof": 56, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": 56, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10605836, + "why": "fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated", + "write": 7343968 + }, + "Game::FlightPlan::Waypoint": { + "class": "Game::FlightPlan::Waypoint", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "Wpt", + "this": true, + "va": 7343886 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "Tp", + "this": true, + "va": 7343906 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10605388, + "inner": "Game::NodeRoute", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": 16, + "slot": 40, + "tag": "nrt", + "this": true, + "type": "?$StreamableHelper@VNodeRoute@Game@@@Mars", + "va": 7343945 + } + ], + "gaps": [], + "grade": "clean", + "read": 7346272, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10605468, + "why": "fields exact; sizeof is a lower bound only", + "write": 7343824 + }, + "Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap": { + "class": "Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 5564734 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10462756, + "inner": "Game::SVSOBrokenEmpire::PCStat", + "kind": "object", + "off": 16, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VPCStat@SVSOBrokenEmpire@Game@@@Mars", + "va": 5564767 + } + ], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "siz", + "this": true, + "va": 5564690 + } + ], + "gaps": [], + "grade": "clean", + "read": 5600352, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462628, + "why": "fields exact; sizeof is a lower bound only", + "write": 5564624 + }, + "Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap": { + "class": "Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 5293662 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10428160, + "inner": "Game::LocustFleetLogistics", + "kind": "object", + "off": 16, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VLocustFleetLogistics@Game@@@Mars", + "va": 5293695 + } + ], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "siz", + "this": true, + "va": 5293618 + } + ], + "gaps": [], + "grade": "clean", + "read": 5359296, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": 16, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427920, + "why": "fields exact; sizeof is a lower bound only", + "write": 5293552 + }, + "Game::Game::VLocustNestState::?$NetworkIDDataMap": { + "class": "Game::Game::VLocustNestState::?$NetworkIDDataMap", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 5293406 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10428144, + "inner": "Game::LocustNestState", + "kind": "object", + "off": 16, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VLocustNestState@Game@@@Mars", + "va": 5293439 + } + ], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "siz", + "this": true, + "va": 5293362 + } + ], + "gaps": [], + "grade": "clean", + "read": 5359088, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": 16, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427904, + "why": "fields exact; sizeof is a lower bound only", + "write": 5293296 + }, + "Game::Game::VShipSectionID::?$AIWeightMap": { + "class": "Game::Game::VShipSectionID::?$AIWeightMap", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": ".", + "unresolved": true, + "va": 6908814 + } + ], + "elements": [ + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 6908928 + } + ], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10594080, + "inner": "Game::ShipSectionID", + "kind": "object", + "off": 0, + "off_abs": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VShipSectionID@Game@@@Mars", + "va": 6908897 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7077632, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 4, + "sizeof_stride": 4, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "0": 12 + }, + "unsized_fields": 0, + "vftable": 10593920, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 6908736 + }, + "Game::GameTurnHistory": { + "class": "Game::GameTurnHistory", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "size": 4, + "slot": null, + "tag": "ply", + "this": false, + "va": 8570380 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10673948, + "inner": "Game::PlayerTurnHistory", + "kind": "object", + "off": 16, + "slot": 40, + "tag": "hist", + "this": false, + "type": "?$StreamableHelper@VPlayerTurnHistory@Game@@@Mars", + "va": 8570423 + } + ], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "nply", + "this": true, + "va": 8570338 + } + ], + "gaps": [], + "grade": "clean", + "read": 8995200, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10695584, + "why": "fields exact; sizeof is a lower bound only", + "write": 8570272 + }, + "Game::GunBankSelection": { + "class": "Game::GunBankSelection", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5695847 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5695776, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": 16, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364152, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5695824 + }, + "Game::HeraldEncounterResult": { + "class": "Game::HeraldEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "from": 5218272, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5189641 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5189568, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10419344, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5189616 + }, + "Game::IndependenceInfo": { + "class": "Game::IndependenceInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "indsp", + "this": true, + "va": 7638814 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372656, + "inner": "Game::PlayerColorID", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 7, + "slot": 40, + "tag": "indcl", + "this": true, + "type": "?$StreamableHelper@UPlayerColorID@Game@@@Mars", + "va": 7638853 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 28, + "off_abs": 28, + "size": 28, + "slot": null, + "tag": "indnm", + "this": true, + "va": 7638881 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 56, + "off_abs": 56, + "size": 28, + "slot": null, + "tag": "indav", + "this": true, + "va": 7638898 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 84, + "off_abs": 84, + "size": 28, + "slot": null, + "tag": "indba", + "this": true, + "va": 7638915 + } + ], + "gaps": [ + { + "after": "indcl", + "at": 8, + "bytes": 13 + } + ], + "grade": "verified", + "read": 7638512, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 112, + "sizeof_stride": 112, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10616924, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 7638752 + }, + "Game::JewelsProject": { + "class": "Game::JewelsProject", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8553936, + "helper": null, + "helper_vftable": 10673068, + "inner": "Game::SpecialProject", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 52, + "slot": 40, + "tag": "SPi", + "this": true, + "type": "?$StreamableHelper@VSpecialProject@Game@@@Mars", + "va": 8554037 + }, + { + "base": "edi", + "from": 8553936, + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "Stp", + "this": true, + "va": 8553998 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "einv", + "this": true, + "va": 5540140 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 72, + "off_abs": 72, + "size": 4, + "slot": null, + "tag": "eapp", + "this": true, + "va": 5540157 + } + ], + "gaps": [ + { + "after": "Stp", + "at": 60, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5540048, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 76, + "sizeof_stride": 76, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462264, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 5540112 + }, + "Game::LocustEncounterParams": { + "class": "Game::LocustEncounterParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10427904, + "inner": "Game::Game::VLocustNestState::?$NetworkIDDataMap", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 12, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@V?$NetworkIDDataMap@VLocustNestState@Game@@@Game@@@Mars", + "va": 5278760 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5278576, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10442408, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5278688 + }, + "Game::LocustEncounterResult": { + "class": "Game::LocustEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5279003 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10427904, + "inner": "Game::Game::VLocustNestState::?$NetworkIDDataMap", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": 12, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@V?$NetworkIDDataMap@VLocustNestState@Game@@@Game@@@Mars", + "va": 5279045 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5278784, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10441960, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5278944 + }, + "Game::LocustFleetLogistics": { + "class": "Game::LocustFleetLogistics", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 0, + "off_abs": 0, + "size": 1, + "slot": null, + "tag": "hav", + "this": true, + "va": 5279365 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 1, + "off_abs": 1, + "size": 1, + "slot": null, + "tag": "don", + "this": true, + "va": 5279382 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "dsy", + "this": true, + "va": 5279408 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 12, + "slot": 40, + "tag": "dst", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 5279447 + } + ], + "gaps": [], + "grade": "verified", + "read": 5279072, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10428160, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 5279312 + }, + "Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap": { + "class": "Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10594144, + "inner": "enum:AIPurposeID", + "kind": "enum", + "off": 0, + "size": 4, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@U?$StreamableEnum@W4AIPurposeID@Game@@@Mars@@@Mars", + "va": 6927889 + } + ], + "fields": [ + { + "alt_tags": [ + "." + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 0, + "off_abs": 0, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 6927825 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7078304, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "0": 8 + }, + "unsized_fields": 0, + "vftable": 10593968, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 6927760 + }, + "Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap": { + "class": "Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10594128, + "inner": "enum:eaponFamilyID", + "kind": "enum", + "off": 0, + "size": 4, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@U?$StreamableEnum@W4WeaponFamilyID@Game@@@Mars@@@Mars", + "va": 6927681 + } + ], + "fields": [ + { + "alt_tags": [ + "." + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 0, + "off_abs": 0, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 6927617 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7077856, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "0": 8 + }, + "unsized_fields": 0, + "vftable": 10593936, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 6927552 + }, + "Game::Mars::I::U?$StreamableEnum::?$AIWeightMap": { + "class": "Game::Mars::I::U?$StreamableEnum::?$AIWeightMap", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10364088, + "inner": "enum:uint", + "kind": "enum", + "off": 0, + "size": 4, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 6909137 + } + ], + "fields": [ + { + "alt_tags": [ + "." + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 0, + "off_abs": 0, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 6909073 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7034816, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "0": 8 + }, + "unsized_fields": 0, + "vftable": 10593984, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 6909008 + }, + "Game::MeteorEncounterResult": { + "class": "Game::MeteorEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10425380, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::MonitorEncounterResult": { + "class": "Game::MonitorEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10425712, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::MonitorProject": { + "class": "Game::MonitorProject", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673068, + "inner": "Game::SpecialProject", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 52, + "slot": 40, + "tag": "SPi", + "this": true, + "type": "?$StreamableHelper@VSpecialProject@Game@@@Mars", + "va": 8554549 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "Stp", + "this": true, + "va": 8554510 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": 36, + "tag": "Sys", + "this": true, + "va": 8554583 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "RMn", + "this": true, + "va": 8554597 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 72, + "off_abs": 72, + "size": 4, + "slot": null, + "tag": "RMx", + "this": true, + "va": 8554614 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 76, + "off_abs": 76, + "size": 4, + "slot": null, + "tag": "RDn", + "this": true, + "va": 8554631 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 80, + "off_abs": 80, + "size": 4, + "slot": null, + "tag": "RMd", + "this": true, + "va": 8554648 + } + ], + "gaps": [], + "grade": "verified", + "read": 8554304, + "read_agree": 4, + "read_comparable": 4, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 84, + "sizeof_stride": 84, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688524, + "why": "fields exact; Read agrees on all 4 comparable offsets", + "write": 8554448 + }, + "Game::Morale": { + "class": "Game::Morale", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "mnsp", + "unresolved": true, + "va": 7622465 + }, + { + "const": 6, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "msp", + "va": 7622499 + } + ], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "mv", + "this": true, + "va": 7622517 + } + ], + "gaps": [], + "grade": "verified", + "read": 7622096, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": 32, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10614728, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 7622304 + }, + "Game::MoraleEvent": { + "class": "Game::MoraleEvent", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "mid", + "this": true, + "va": 7639528 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "mtr", + "this": true, + "va": 7639545 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "mn", + "this": true, + "va": 7639562 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "mtp", + "this": true, + "va": 7639588 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614884, + "inner": "Game::Morale", + "kind": "object", + "off": 20, + "off_abs": 20, + "size": 8, + "slot": 40, + "tag": "mfx", + "this": true, + "type": "?$StreamableHelper@VMorale@Game@@@Mars", + "va": 7639627 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 52, + "off_abs": 52, + "size": 28, + "slot": null, + "tag": "mdsc", + "this": true, + "va": 7639655 + } + ], + "gaps": [ + { + "after": "mfx", + "at": 20, + "bytes": 24 + } + ], + "grade": "verified", + "read": 7639216, + "read_agree": 4, + "read_comparable": 4, + "sizeof": 80, + "sizeof_by": "container stride", + "sizeof_lower": 80, + "sizeof_stride": 80, + "sizeof_upper": null, + "sizeof_vectorstride": 80, + "strides": {}, + "unsized_fields": 0, + "vftable": 10616892, + "why": "fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated", + "write": 7639472 + }, + "Game::NodePath": { + "class": "Game::NodePath", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "npt", + "this": true, + "va": 7217132 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "npid", + "this": true, + "va": 7217146 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "npfr", + "this": true, + "va": 7217172 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "npto", + "this": true, + "va": 7217192 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "npctm", + "this": true, + "va": 7217206 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "npcby", + "this": true, + "va": 7217223 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "npdtn", + "this": true, + "va": 7217240 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "npdtf", + "this": true, + "va": 7217257 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "nptf", + "this": true, + "va": 7217317 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": "npenp", + "this": true, + "va": 7217283 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": 36, + "tag": "npuse", + "this": true, + "va": 7217303 + } + ], + "gaps": [], + "grade": "verified", + "read": 7216784, + "read_agree": 6, + "read_comparable": 6, + "sizeof": 48, + "sizeof_by": "container stride", + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": 48, + "strides": {}, + "unsized_fields": 0, + "vftable": 10603344, + "why": "fields exact; Read agrees on all 6 comparable offsets; sizeof corroborated", + "write": 7217104 + }, + "Game::NodePointParams": { + "class": "Game::NodePointParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4795090 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4795113 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4795124 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4795138 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4795152 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 44, + "off_abs": 44, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 4795200 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4794832, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 60, + "sizeof_stride": 60, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10371060, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4795040 + }, + "Game::NodeRoute": { + "class": "Game::NodeRoute", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "nrp", + "this": true, + "va": 7217916 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "nrf", + "this": true, + "va": 7217936 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "nrt", + "this": true, + "va": 7217956 + } + ], + "gaps": [], + "grade": "clean", + "read": 7217760, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10603484, + "why": "fields exact; sizeof is a lower bound only", + "write": 7217888 + }, + "Game::Objective": { + "class": "Game::Objective", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -72, + "size": 28, + "slot": null, + "tag": "Spr", + "this": false, + "va": 8717955 + }, + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "Dsc", + "this": false, + "va": 8717972 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": "ID", + "this": true, + "va": 8717921 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": "Cmp", + "this": true, + "va": 8717938 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": 36, + "tag": "NID", + "this": true, + "va": 8717998 + } + ], + "gaps": [ + { + "after": "Cmp", + "at": 4, + "bytes": 59 + } + ], + "grade": "verified", + "read": 8717360, + "read_agree": 2, + "read_comparable": 2, + "sizeof": 68, + "sizeof_by": "container stride", + "sizeof_lower": 68, + "sizeof_stride": 68, + "sizeof_upper": null, + "sizeof_vectorstride": 68, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674380, + "why": "fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated", + "write": 8717744 + }, + "Game::ObservedDesign": { + "class": "Game::ObservedDesign", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 4, + "off_abs": 4, + "size": 2, + "slot": 36, + "tag": "otnF", + "this": true, + "va": 8485565 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "otnL", + "this": true, + "va": 8485586 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "odid", + "this": true, + "va": 8485606 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "opid", + "this": true, + "va": 8485626 + } + ], + "gaps": [], + "grade": "clean", + "read": 8485360, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10632292, + "why": "fields exact; sizeof corroborated", + "write": 8485536 + }, + "Game::ObservedTech": { + "class": "Game::ObservedTech", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 4, + "off_abs": 4, + "size": 2, + "slot": 36, + "tag": "otnF", + "this": true, + "va": 8486157 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "otnL", + "this": true, + "va": 8486178 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": "odet", + "this": true, + "va": 8486192 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": "otch", + "this": true, + "va": 8486209 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": "owith", + "this": true, + "va": 8486235 + } + ], + "gaps": [], + "grade": "verified", + "read": 8485952, + "read_agree": 2, + "read_comparable": 2, + "sizeof": 44, + "sizeof_by": "container stride", + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": 44, + "strides": {}, + "unsized_fields": 0, + "vftable": 10634140, + "why": "fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated", + "write": 8486128 + }, + "Game::ObservedWeapon": { + "class": "Game::ObservedWeapon", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 4, + "off_abs": 4, + "size": 2, + "slot": 36, + "tag": "otnF", + "this": true, + "va": 8485853 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": "otnL", + "this": true, + "va": 8485874 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": "odet", + "this": true, + "va": 8485888 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": "owep", + "this": true, + "va": 8485905 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": "owith", + "this": true, + "va": 8485931 + } + ], + "gaps": [], + "grade": "verified", + "read": 8485648, + "read_agree": 2, + "read_comparable": 2, + "sizeof": 44, + "sizeof_by": "container stride", + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": 44, + "strides": {}, + "unsized_fields": 0, + "vftable": 10634124, + "why": "fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated", + "write": 8485824 + }, + "Game::OrtgayEncounterResult": { + "class": "Game::OrtgayEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10423936, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::PirateEncounterResult": { + "class": "Game::PirateEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10425756, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::PlagueHit": { + "class": "Game::PlagueHit", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5465891 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5465914 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5465925 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5465776, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10456336, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5465872 + }, + "Game::PlagueStats": { + "class": "Game::PlagueStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10456428, + "inner": "Game::PlagueHit", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VPlagueHit@Game@@@Mars", + "va": 5471960 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5471776, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 20, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": 20, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10415984, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5471888 + }, + "Game::PlanetClientContext": { + "class": "Game::PlanetClientContext", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466547 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466575 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466561 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466589 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5466612 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5466629 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5466304, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370104, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5466528 + }, + "Game::PlanetStats": { + "class": "Game::PlanetStats", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466145 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466159 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466173 + }, + { + "base": "edi", + "helper": 9149536, + "kind": "int64", + "off": 16, + "off_abs": 16, + "size": 8, + "slot": null, + "tag": ".", + "this": true, + "va": 5466187 + }, + { + "base": "edi", + "helper": 9149536, + "kind": "int64", + "off": 24, + "off_abs": 24, + "size": 8, + "slot": null, + "tag": ".", + "this": true, + "va": 5466204 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5466230 + } + ], + "gaps": [ + { + "after": ".", + "at": 8, + "bytes": 4 + } + ], + "grade": "unnamed", + "read": 5465952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": 64, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370948, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5466128 + }, + "Game::PlayerAid": { + "class": "Game::PlayerAid", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "aidto", + "this": true, + "va": 8490460 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "aidrai", + "this": true, + "va": 8490508 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "aidrt", + "this": true, + "va": 8490525 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "aidsa", + "this": true, + "va": 8490474 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "aidst", + "this": true, + "va": 8490491 + } + ], + "gaps": [], + "grade": "verified", + "read": 8521648, + "read_agree": 4, + "read_comparable": 4, + "sizeof": 24, + "sizeof_by": "container stride", + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": 24, + "strides": {}, + "unsized_fields": 0, + "vftable": 10651356, + "why": "fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated", + "write": 8490432 + }, + "Game::PlayerAlliances": { + "class": "Game::PlayerAlliances", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": 36, + "tag": "ALid", + "this": true, + "va": 7155243 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "AL", + "this": true, + "va": 7155263 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "NA", + "this": true, + "va": 7155283 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "CF", + "this": true, + "va": 7155303 + } + ], + "gaps": [], + "grade": "clean", + "read": 7154976, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": 16, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10673500, + "why": "fields exact; sizeof corroborated", + "write": 7155216 + }, + "Game::PlayerColorID": { + "class": "Game::PlayerColorID", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5488784 + }, + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 1, + "off_abs": 1, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5488806 + }, + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 2, + "off_abs": 2, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5488820 + }, + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 3, + "off_abs": 3, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5488834 + } + ], + "gaps": [], + "grade": "partial", + "read": 5490816, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 7, + "sizeof_stride": 7, + "sizeof_upper": 20, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10372656, + "why": "4 field(s) via an untyped sub-writer", + "write": 5488768 + }, + "Game::PlayerEncounterProgress": { + "class": "Game::PlayerEncounterProgress", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5218387 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 5218401 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5218415 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5218304, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10423144, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218368 + }, + "Game::PlayerMessage": { + "class": "Game::PlayerMessage", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5491851 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5491868 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 5491879 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10428048, + "inner": "String", + "kind": "vector", + "off": 40, + "off_abs": 40, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VString@Mars@@@Mars", + "va": 5491927 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5491584, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370264, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5491792 + }, + "Game::PlayerNotes": { + "class": "Game::PlayerNotes", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "NtSys", + "this": true, + "va": 8467148 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": "NtTxt", + "this": true, + "va": 8467162 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "NtTrn", + "this": true, + "va": 8467179 + } + ], + "gaps": [], + "grade": "verified", + "read": 8467024, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10623304, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 8467120 + }, + "Game::PlayerReport": { + "class": "Game::PlayerReport", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "oid", + "this": true, + "va": 8483996 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "pid", + "this": true, + "va": 8484016 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "flds", + "this": true, + "va": 8484036 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "sav", + "this": true, + "va": 8484050 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "home", + "this": true, + "va": 8484076 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "ncol", + "this": true, + "va": 8484090 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": 36, + "tag": "mpwr", + "this": true, + "va": 8484116 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": 36, + "tag": "mcls", + "this": true, + "va": 8484136 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": "mmsl", + "this": true, + "va": 8484156 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "nshp", + "this": true, + "va": 8484170 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "nsat", + "this": true, + "va": 8484187 + } + ], + "gaps": [], + "grade": "verified", + "read": 8519840, + "read_agree": 4, + "read_comparable": 4, + "sizeof": 48, + "sizeof_by": "container stride", + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": 48, + "strides": {}, + "unsized_fields": 0, + "vftable": 10622016, + "why": "fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated", + "write": 8483968 + }, + "Game::PlayerTurnHistory": { + "class": "Game::PlayerTurnHistory", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10673932, + "inner": "Game::PlayerTurnStats", + "kind": "object", + "off": 24, + "slot": 40, + "tag": "stats", + "this": false, + "type": "?$StreamableHelper@VPlayerTurnStats@Game@@@Mars", + "va": 8570134 + } + ], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "ply", + "this": true, + "va": 8570082 + } + ], + "gaps": [], + "grade": "clean", + "read": 8934480, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10693776, + "why": "fields exact; sizeof is a lower bound only", + "write": 8570016 + }, + "Game::PlayerTurnStats": { + "class": "Game::PlayerTurnStats", + "col_offset": 0, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "ncls", + "va": 8569830 + }, + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "cls", + "va": 8569856 + } + ], + "elements": [ + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": -12, + "size": 2, + "slot": 36, + "tag": "shpt", + "this": false, + "va": 8569877 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 0, + "size": 2, + "slot": 36, + "tag": "shpl", + "this": false, + "va": 8569897 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 6, + "size": 2, + "slot": 36, + "tag": "shpk", + "this": false, + "va": 8569918 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": -6, + "size": 2, + "slot": 36, + "tag": "satt", + "this": false, + "va": 8569939 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 12, + "size": 2, + "slot": 36, + "tag": "satl", + "this": false, + "va": 8569960 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 18, + "size": 2, + "slot": 36, + "tag": "satk", + "this": false, + "va": 8569981 + } + ], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 4, + "off_abs": 4, + "size": 2, + "slot": 36, + "tag": "trn", + "this": true, + "va": 8569666 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "almem", + "this": true, + "va": 8569686 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "inc", + "this": true, + "va": 8569706 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "tdinc", + "this": true, + "va": 8569726 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "sav", + "this": true, + "va": 8569746 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 24, + "off_abs": 24, + "size": 2, + "slot": 36, + "tag": "col", + "this": true, + "va": 8569767 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 26, + "off_abs": 26, + "size": 2, + "slot": 36, + "tag": "bat", + "this": true, + "va": 8569788 + }, + { + "base": "edi", + "bytes": 8, + "helper": null, + "kind": "int64", + "off": 32, + "off_abs": 32, + "size": 8, + "slot": 48, + "tag": "pop", + "this": true, + "va": 8569551 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 40, + "off_abs": 40, + "size": 2, + "slot": 36, + "tag": "tch", + "this": true, + "va": 8569809 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673916, + "inner": "Game::SystemEvent", + "kind": "vector", + "off": 80, + "off_abs": 80, + "size": 16, + "slot": 40, + "tag": "sacq", + "this": true, + "type": "?$VectorHelper@VSystemEvent@Game@@@Mars", + "va": 8569590 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673916, + "inner": "Game::SystemEvent", + "kind": "vector", + "off": 96, + "off_abs": 96, + "size": 16, + "slot": 40, + "tag": "slost", + "this": true, + "type": "?$VectorHelper@VSystemEvent@Game@@@Mars", + "va": 8569631 + } + ], + "gaps": [ + { + "after": "bat", + "at": 26, + "bytes": 4 + }, + { + "after": "tch", + "at": 40, + "bytes": 38 + } + ], + "grade": "clean", + "read": 8598368, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 112, + "sizeof_stride": 112, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687580, + "why": "fields exact; sizeof is a lower bound only", + "write": 8569488 + }, + "Game::Population": { + "class": "Game::Population", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "PopNG", + "va": 5472099 + }, + { + "helper": null, + "helper_vftable": 10456444, + "inner": "Game::PopulationGroup", + "kind": "object", + "slot": 40, + "tag": "PopG", + "type": "?$StreamableHelper@VPopulationGroup@Game@@@Mars", + "unresolved": true, + "va": 5472196 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 5476544, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": 20, + "sizeof_vectorstride": null, + "strides": { + "4": 24 + }, + "unsized_fields": 0, + "vftable": 10457328, + "why": "only container elements / computed values recovered", + "write": 5471984 + }, + "Game::PopulationGroup": { + "class": "Game::PopulationGroup", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "PopT", + "this": true, + "va": 5466892 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "PopS", + "this": true, + "va": 5466912 + }, + { + "base": "edi", + "helper": 9149536, + "kind": "int64", + "off": 16, + "off_abs": 16, + "size": 8, + "slot": null, + "tag": "PopC", + "this": true, + "va": 5466926 + } + ], + "gaps": [ + { + "after": "PopS", + "at": 8, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5466752, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10456400, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5466864 + }, + "Game::PrisonerHold": { + "class": "Game::PrisonerHold", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "PrNSp", + "unresolved": true, + "va": 5696683 + } + ], + "elements": [ + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "PrSp", + "this": false, + "va": 5696735 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 0, + "size": 4, + "slot": null, + "tag": "PrNum", + "this": false, + "va": 5696749 + } + ], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "handle", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "PrMax", + "this": true, + "va": 5696559, + "via": "deref" + } + ], + "gaps": [], + "grade": "clean", + "read": 5696256, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 24, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": 24, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10477872, + "why": "fields exact; sizeof corroborated", + "write": 5696512 + }, + "Game::PuppetMasterEncounterResult": { + "class": "Game::PuppetMasterEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10426104, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::RaidTargets": { + "class": "Game::RaidTargets", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "rds", + "this": true, + "va": 8490717 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "rdv", + "this": true, + "va": 8490737 + }, + { + "alt_tags": [ + "did" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 12, + "off_abs": 12, + "size": 16, + "slot": null, + "tag": "dsc", + "this": true, + "va": 8490780 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "rdt", + "this": true, + "va": 8490751 + } + ], + "gaps": [], + "grade": "verified", + "read": 8626320, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "12": 4 + }, + "unsized_fields": 0, + "vftable": 10623336, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8490688 + }, + "Game::RefugeesEncounterParams": { + "class": "Game::RefugeesEncounterParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 5226495 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5226448, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 9, + "sizeof_stride": 9, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10424796, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5226480 + }, + "Game::RefugeesEncounterResult": { + "class": "Game::RefugeesEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5226633 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5226650 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5226512, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10424812, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5226608 + }, + "Game::SNMAIRelationValues": { + "class": "Game::SNMAIRelationValues", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10673420, + "inner": "Game::AIRelationRecord", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VAIRelationRecord@Game@@@Mars", + "va": 8562328 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8562144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688984, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8562256 + }, + "Game::SNMAllCombatDone": { + "class": "Game::SNMAllCombatDone", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10673372, + "inner": "Game::EncounterResults", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VEncounterResults@Game@@@Mars", + "va": 8561080 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8560896, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10635096, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8561008 + }, + "Game::SNMAllianceInvite": { + "class": "Game::SNMAllianceInvite", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483497 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483514 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483531 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482608, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671976, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483472 + }, + "Game::SNMAllianceInviteChat": { + "class": "Game::SNMAllianceInviteChat", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8481849 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8481866 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8481877 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8481891 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8481696, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689004, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8481824 + }, + "Game::SNMAllianceInviteProgress": { + "class": "Game::SNMAllianceInviteProgress", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8563227 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673484, + "inner": "Game::AllianceInvite", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 76, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VAllianceInvite@Game@@@Mars", + "va": 8563269 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8563008, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 84, + "sizeof_stride": 84, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10691388, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8563168 + }, + "Game::SNMAllianceNotify": { + "class": "Game::SNMAllianceNotify", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483497 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483514 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483531 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482608, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672016, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483472 + }, + "Game::SNMAllianceReply": { + "class": "Game::SNMAllianceReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482889 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8482900 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482923 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 16, + "off_abs": 16, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8482934 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482736, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 17, + "sizeof_stride": 17, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671996, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482864 + }, + "Game::SNMCancelAllianceInvite": { + "class": "Game::SNMCancelAllianceInvite", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672076, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMChat": { + "class": "Game::SNMChat", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482121 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482138 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482155 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 16, + "off_abs": 16, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8482166 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482189 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8481920, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10633668, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482096 + }, + "Game::SNMCombatTimeRemaining": { + "class": "Game::SNMCombatTimeRemaining", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8481171 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8481185 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8481104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671876, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8481152 + }, + "Game::SNMCommMessage": { + "class": "Game::SNMCommMessage", + "col_offset": 0, + "computed": [ + { + "const": 30, + "helper": null, + "kind": "const", + "slot": 36, + "tag": ".", + "va": 8561979 + } + ], + "elements": [], + "fields": [ + { + "base": "ebx", + "helper": null, + "helper_vftable": 10672732, + "inner": "Game::ICommMessage", + "kind": "object", + "off": 4, + "off_abs": 4, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VICommMessage@Game@@@Mars", + "va": 8562019 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8738448, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671936, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8561904 + }, + "Game::SNMDemandEmpireSurrender": { + "class": "Game::SNMDemandEmpireSurrender", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10622540, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMDemandEmpireSurrenderResponse": { + "class": "Game::SNMDemandEmpireSurrenderResponse", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8463616, + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "from": 8463616, + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 7752409 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7752336, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 13, + "sizeof_stride": 13, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10622560, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7752384 + }, + "Game::SNMDoEncounterQuery": { + "class": "Game::SNMDoEncounterQuery", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482595 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482528, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10632532, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482576 + }, + "Game::SNMEncounterProgress": { + "class": "Game::SNMEncounterProgress", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10673388, + "inner": "Game::PlayerEncounterProgress", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VPlayerEncounterProgress@Game@@@Mars", + "va": 8561288 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8561104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688964, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8561216 + }, + "Game::SNMEncounterQueryResults": { + "class": "Game::SNMEncounterQueryResults", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8561509 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10673356, + "inner": "Game::EncounterQuery", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VEncounterQuery@Game@@@Mars", + "va": 8561557 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8561312, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687524, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8561456 + }, + "Game::SNMEncounterResults": { + "class": "Game::SNMEncounterResults", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10673404, + "inner": "Game::EncounterResults", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 372, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VEncounterResults@Game@@@Mars", + "va": 8561844 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 384, + "off_abs": 384, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8561872 + } + ], + "gaps": [ + { + "after": ".", + "at": 8, + "bytes": 4 + } + ], + "grade": "unnamed", + "read": 8561584, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 388, + "sizeof_stride": 388, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10693204, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8561760 + }, + "Game::SNMEndTurn": { + "class": "Game::SNMEndTurn", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673436, + "inner": "Game::TurnCommands", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTurnCommands@Game@@@Mars", + "va": 8562628 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673452, + "inner": "Game::AIEncounterFlags", + "kind": "object", + "off": 440, + "off_abs": 440, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VAIEncounterFlags@Game@@@Mars", + "va": 8562673 + } + ], + "gaps": [], + "grade": "partial", + "read": 8562352, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 456, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 1, + "vftable": 10627552, + "why": "1 nested field(s) of unknown size", + "write": 8562544 + }, + "Game::SNMGenericEvent": { + "class": "Game::SNMGenericEvent", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527683 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 4527697 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4527616, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689104, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4527664 + }, + "Game::SNMGenericGameMessage": { + "class": "Game::SNMGenericGameMessage", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672116, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMHostCombat": { + "class": "Game::SNMHostCombat", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8480899 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8480913 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8480927 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8480941 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8480958 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 48, + "off_abs": 48, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8480972 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 49, + "off_abs": 49, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8480986 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8480752, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 50, + "sizeof_stride": 50, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688884, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8480880 + }, + "Game::SNMHostCombatReply": { + "class": "Game::SNMHostCombatReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8560165 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10673340, + "inner": "Address", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 88, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VAddress@Mars@@@Mars", + "va": 8560213 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 96, + "off_abs": 96, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8560238 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8559936, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 124, + "sizeof_stride": 124, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688904, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8560112 + }, + "Game::SNMJoin": { + "class": "Game::SNMJoin", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8480707 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8480721 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 36, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8480735 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8480624, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 37, + "sizeof_stride": 37, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688864, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8480688 + }, + "Game::SNMJoinCombat": { + "class": "Game::SNMJoinCombat", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10673340, + "inner": "Address", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 88, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VAddress@Mars@@@Mars", + "va": 8560788 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 92, + "off_abs": 92, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8560813 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 120, + "off_abs": 120, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8560827 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 148, + "off_abs": 148, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8560844 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 152, + "off_abs": 152, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8560861 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8560496, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 156, + "sizeof_stride": 156, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688924, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8560704 + }, + "Game::SNMJoinCombatReply": { + "class": "Game::SNMJoinCombatReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8481075 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8481089 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8481008, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688944, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8481056 + }, + "Game::SNMJoinReply": { + "class": "Game::SNMJoinReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671856, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::SNMKillAI": { + "class": "Game::SNMKillAI", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482595 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482528, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671956, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482576 + }, + "Game::SNMLaunchCombat": { + "class": "Game::SNMLaunchCombat", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": ".", + "unresolved": true, + "va": 8560447 + } + ], + "elements": [], + "fields": [ + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8560327 + }, + { + "alt_tags": [ + "." + ], + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 8560402 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10673356, + "inner": "Game::EncounterQuery", + "kind": "object", + "off": 24, + "off_abs": 24, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VEncounterQuery@Game@@@Mars", + "va": 8560366 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8891632, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "8": 32 + }, + "unsized_fields": 0, + "vftable": 10692428, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8560272 + }, + "Game::SNMLeaveAlliance": { + "class": "Game::SNMLeaveAlliance", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482595 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482528, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10621632, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482576 + }, + "Game::SNMLeaveCeaseFire": { + "class": "Game::SNMLeaveCeaseFire", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672056, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMLeaveNonAggression": { + "class": "Game::SNMLeaveNonAggression", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672036, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMLobbyChat": { + "class": "Game::SNMLobbyChat", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482329 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8482340 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 36, + "off_abs": 36, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8482354 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482208, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 64, + "sizeof_stride": 64, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689024, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482304 + }, + "Game::SNMMakePlayerAI": { + "class": "Game::SNMMakePlayerAI", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8481305 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 8, + "off_abs": 8, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8481316 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8481200, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 9, + "sizeof_stride": 9, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671916, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8481280 + }, + "Game::SNMPendingAlliances": { + "class": "Game::SNMPendingAlliances", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10673308, + "inner": "Game::PlayerAlliances", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VPlayerAlliances@Game@@@Mars", + "va": 8563768 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8563584, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687544, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8563696 + }, + "Game::SNMPlaySpeechEvent": { + "class": "Game::SNMPlaySpeechEvent", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483497 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483514 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483531 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482608, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672136, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483472 + }, + "Game::SNMProgressionWarsConvoyShips": { + "class": "Game::SNMProgressionWarsConvoyShips", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483577 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8621744, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10684348, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483552 + }, + "Game::SNMRefreshSlots": { + "class": "Game::SNMRefreshSlots", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10673052, + "inner": "Game::SNMRefreshSlots::SlotData", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@USlotData@SNMRefreshSlots@Game@@@Mars", + "va": 8553176 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8552992, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688432, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8553104 + }, + "Game::SNMRefreshSlots::SlotData": { + "class": "Game::SNMRefreshSlots::SlotData", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8472003 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8472017 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8472031 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8471920, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 13, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10632308, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8471984 + }, + "Game::SNMRemoveCommMessage": { + "class": "Game::SNMRemoveCommMessage", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10621980, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMRunAI": { + "class": "Game::SNMRunAI", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8482489 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8482500 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 36, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8482514 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482368, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 37, + "sizeof_stride": 37, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689044, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8482464 + }, + "Game::SNMSetAIPolicy": { + "class": "Game::SNMSetAIPolicy", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463641 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8463658 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483104, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10621960, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8463616 + }, + "Game::SNMSetPlayerStatus": { + "class": "Game::SNMSetPlayerStatus", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4376579 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 4376602 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 4382096, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671896, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4376560 + }, + "Game::SNMSetSlotPassword": { + "class": "Game::SNMSetSlotPassword", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483065 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8483076 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8482960, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689084, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483040 + }, + "Game::SNMSetTimers": { + "class": "Game::SNMSetTimers", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10535072, + "inner": "Game::StrategyTimerParams", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyTimerParams@Game@@@Mars", + "va": 6388744 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 6388560, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10535052, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 6388672 + }, + "Game::SNMSlotInit": { + "class": "Game::SNMSlotInit", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8552117 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 5, + "off_abs": 5, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8552131 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 6, + "off_abs": 6, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8552145 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552159 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673036, + "inner": "Game::Slot", + "kind": "vector", + "off": 12, + "off_abs": 12, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VSlot@Game@@@Mars", + "va": 8552207 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8552231 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 32, + "off_abs": 32, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8552242 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552256 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552270 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672988, + "inner": "Game::StrategyPlayerGameSettings", + "kind": "object", + "off": 44, + "off_abs": 44, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyPlayerGameSettings@Game@@@Mars", + "va": 8552318 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8551744, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 64, + "sizeof_stride": 64, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10691948, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8552064 + }, + "Game::SNMSlotInsertClient": { + "class": "Game::SNMSlotInsertClient", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471491 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471505 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8471519 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8471408, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688372, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8471472 + }, + "Game::SNMSlotMoveClient": { + "class": "Game::SNMSlotMoveClient", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471619 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471633 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471647 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8471536, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671508, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8471600 + }, + "Game::SNMSlotPWAttempt": { + "class": "Game::SNMSlotPWAttempt", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7784079 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688412, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7784064 + }, + "Game::SNMSlotPWRejected": { + "class": "Game::SNMSlotPWRejected", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671588, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::SNMSlotRemoveClient": { + "class": "Game::SNMSlotRemoveClient", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671488, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::SNMSlotReqPW": { + "class": "Game::SNMSlotReqPW", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471891 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471905 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8471824, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671528, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8471872 + }, + "Game::SNMSlotSetData": { + "class": "Game::SNMSlotSetData", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552741 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552755 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 12, + "off_abs": 12, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8552769 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552783 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8552800 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372656, + "inner": "Game::PlayerColorID", + "kind": "object", + "off": 48, + "off_abs": 48, + "size": 7, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@UPlayerColorID@Game@@@Mars", + "va": 8552848 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 68, + "off_abs": 68, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8552866 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 96, + "off_abs": 96, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8552880 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 124, + "off_abs": 124, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8552956 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672988, + "inner": "Game::StrategyPlayerGameSettings", + "kind": "object", + "off": 128, + "off_abs": 128, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyPlayerGameSettings@Game@@@Mars", + "va": 8552931 + } + ], + "gaps": [ + { + "after": ".", + "at": 48, + "bytes": 13 + } + ], + "grade": "unnamed", + "read": 8552352, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 148, + "sizeof_stride": 148, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688352, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8552688 + }, + "Game::SNMSlotSetForcedSpecies": { + "class": "Game::SNMSlotSetForcedSpecies", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671448, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::SNMSlotSetPW": { + "class": "Game::SNMSlotSetPW", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471763 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8471777 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 36, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8471791 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 37, + "off_abs": 37, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8471805 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8471664, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 38, + "sizeof_stride": 38, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688392, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8471744 + }, + "Game::SNMSlotSetState": { + "class": "Game::SNMSlotSetState", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471363 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8471377 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8471400 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8471264, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671468, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8471344 + }, + "Game::SNMTechOffer": { + "class": "Game::SNMTechOffer", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483385 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483402 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483419 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 16, + "off_abs": 16, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8483430 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 44, + "off_abs": 44, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8483444 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483200, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 45, + "sizeof_stride": 45, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10623252, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483360 + }, + "Game::SNMTransferProgress": { + "class": "Game::SNMTransferProgress", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10633708, + "inner": "char", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@D@Mars", + "va": 7934232 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7934048, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10633688, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7934160 + }, + "Game::SNMTurnInfo": { + "class": "Game::SNMTurnInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10632324, + "inner": "Game::StrategyTurnInfo", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 52, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyTurnInfo@Game@@@Mars", + "va": 7920296 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7920112, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10631820, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7920224 + }, + "Game::SNMUpdate": { + "class": "Game::SNMUpdate", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673308, + "inner": "Game::PlayerAlliances", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VPlayerAlliances@Game@@@Mars", + "va": 8559758 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8559795 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 36, + "off_abs": 36, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8559832 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 52, + "off_abs": 52, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 8559869 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673324, + "inner": "Game::TechOffer", + "kind": "vector", + "off": 68, + "off_abs": 68, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VTechOffer@Game@@@Mars", + "va": 8559906 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8559312, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 84, + "sizeof_stride": 84, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10635076, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8559680 + }, + "Game::SNMUpdateAlliances": { + "class": "Game::SNMUpdateAlliances", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8563515 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673500, + "inner": "Game::PlayerAlliances", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VPlayerAlliances@Game@@@Mars", + "va": 8563557 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8563296, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672096, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8563456 + }, + "Game::SNMUpdateComplete": { + "class": "Game::SNMUpdateComplete", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7784079 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10623696, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7784064 + }, + "Game::SNMUserNames": { + "class": "Game::SNMUserNames", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10673468, + "inner": "Game::StrategyUserInfo", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VStrategyUserInfo@Game@@@Mars", + "va": 8562948 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8562973 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8562704, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10689064, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8562864 + }, + "Game::SVSOAntiquarians": { + "class": "Game::SVSOAntiquarians", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10462612, + "inner": "Game::SVSOAntiquarians::Artifact", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "art", + "this": false, + "type": "?$StreamableHelper@VArtifact@SVSOAntiquarians@Game@@@Mars", + "va": 5553128 + } + ], + "fields": [ + { + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": null, + "tag": "narts", + "this": true, + "va": 5553066 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": "wpid", + "this": true, + "va": 5553023 + }, + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "wpturn", + "this": true, + "va": 5553037 + } + ], + "gaps": [], + "grade": "verified", + "read": 5578384, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "8": 4 + }, + "unsized_fields": 0, + "vftable": 10464148, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5552960 + }, + "Game::SVSOAntiquarians::Artifact": { + "class": "Game::SVSOAntiquarians::Artifact", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "shipid", + "this": true, + "va": 5535732 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "salsid", + "this": true, + "va": 5535747 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "salpid", + "this": true, + "va": 5535773 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "pvis", + "this": true, + "va": 5535793 + } + ], + "gaps": [], + "grade": "clean", + "read": 5535584, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462224, + "why": "fields exact; sizeof is a lower bound only", + "write": 5535712 + }, + "Game::SVSOBrokenEmpire": { + "class": "Game::SVSOBrokenEmpire", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10462628, + "inner": "Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 12, + "slot": 40, + "tag": "pcs", + "this": true, + "type": "?$StreamableHelper@V?$NetworkIDDataMap@VPCStat@SVSOBrokenEmpire@Game@@@Game@@@Mars", + "va": 5553563 + } + ], + "gaps": [], + "grade": "clean", + "read": 5553344, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10465588, + "why": "fields exact; sizeof is a lower bound only", + "write": 5553488 + }, + "Game::SVSOCrowDefenders": { + "class": "Game::SVSOCrowDefenders", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "des", + "va": 5213486 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "sys", + "this": true, + "va": 5213350 + }, + { + "alt_tags": [ + "dsys" + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": null, + "tag": "ndsys", + "this": true, + "va": 5213379 + }, + { + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": "ndes", + "this": true, + "va": 5213445 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": "drad", + "this": true, + "va": 5213512 + } + ], + "gaps": [ + { + "after": "ndes", + "at": 24, + "bytes": 16 + } + ], + "grade": "verified", + "read": 5308048, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 60, + "sizeof_stride": 60, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "8": 4, + "24": 4 + }, + "unsized_fields": 0, + "vftable": 10443012, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5213328 + }, + "Game::SVSOCrowRuins": { + "class": "Game::SVSOCrowRuins", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "wid", + "va": 5252994 + } + ], + "elements": [ + { + "base": "edi", + "from": 5226944, + "helper": 8479888, + "kind": "handle", + "off": 4, + "size": 4, + "slot": null, + "tag": "Esys", + "this": false, + "va": 5227042 + } + ], + "fields": [ + { + "alt_tags": [ + "Eflt" + ], + "base": "edi", + "count_of": true, + "from": 5226944, + "helper": 9149776, + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": null, + "tag": "NAsg", + "this": true, + "va": 5226985 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": "NWD", + "this": true, + "va": 5252953 + } + ], + "gaps": [ + { + "after": "NAsg", + "at": 4, + "bytes": 4 + } + ], + "grade": "clean", + "read": 5390800, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "24": 4 + }, + "unsized_fields": 0, + "vftable": 10440004, + "why": "fields exact; sizeof is a lower bound only", + "write": 5252912 + }, + "Game::SVSODerelict": { + "class": "Game::SVSODerelict", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "DsnID", + "va": 5227279 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "Dwght", + "unresolved": true, + "va": 5227299 + } + ], + "elements": [ + { + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 4, + "size": 16, + "slot": null, + "tag": "NAsg", + "this": false, + "va": 5227337 + }, + { + "base": "ebx", + "helper": 8479888, + "kind": "handle", + "off": 4, + "size": 4, + "slot": null, + "tag": "Esys", + "this": false, + "va": 5227394 + } + ], + "fields": [ + { + "base": "ebx", + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "Eflt", + "this": true, + "va": 5227379, + "via": "deref" + }, + { + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": "NDsn", + "this": true, + "va": 5227225 + } + ], + "gaps": [ + { + "after": "Eflt", + "at": 4, + "bytes": 16 + } + ], + "grade": "clean", + "read": 5370528, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "24": 8 + }, + "unsized_fields": 0, + "vftable": 10438244, + "why": "fields exact; sizeof is a lower bound only", + "write": 5227184 + }, + "Game::SVSOGrandMenaceTrigger": { + "class": "Game::SVSOGrandMenaceTrigger", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "gmch", + "this": true, + "va": 5229078 + } + ], + "gaps": [], + "grade": "clean", + "read": 5229008, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10424836, + "why": "fields exact; sizeof is a lower bound only", + "write": 5229056 + }, + "Game::SVSOHolyLands": { + "class": "Game::SVSOHolyLands", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 5555152, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10467052, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 5555264 + }, + "Game::SVSOHolyLands::PlayerState": { + "class": "Game::SVSOHolyLands::PlayerState", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 5554736, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 20, + "sizeof_by": "container stride", + "sizeof_lower": 0, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": 20, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462708, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 5554976 + }, + "Game::SVSOJewelsOfTheCrown": { + "class": "Game::SVSOJewelsOfTheCrown", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "JEWELLOCATIONID", + "this": true, + "va": 5556094 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "JEWELSHIPID", + "this": true, + "va": 5556114 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "JEWELLOCATIONID", + "this": true, + "va": 5556188 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": 40, + "tag": "prjdone", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 5556233 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": 36, + "tag": "PREVJEWELSHIPID", + "this": true, + "va": 5556174 + } + ], + "gaps": [ + { + "after": "prjdone", + "at": 20, + "bytes": 8 + } + ], + "grade": "clean", + "read": 5555696, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10465780, + "why": "fields exact; sizeof is a lower bound only", + "write": 5556032 + }, + "Game::SVSOLandGrab": { + "class": "Game::SVSOLandGrab", + "col_offset": 0, + "computed": [ + { + "const": 32, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "nplayers", + "va": 5541794 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "nwt", + "this": true, + "va": 5541821 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 136, + "off_abs": 136, + "size": 4, + "slot": null, + "tag": "winr", + "this": true, + "va": 5541770 + } + ], + "gaps": [ + { + "after": "nwt", + "at": 8, + "bytes": 124 + } + ], + "grade": "verified", + "read": 5548512, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 140, + "sizeof_stride": 140, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10463532, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 5541744 + }, + "Game::SVSOLocust": { + "class": "Game::SVSOLocust", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": "ini2", + "this": true, + "va": 5279529 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10427904, + "inner": "Game::Game::VLocustNestState::?$NetworkIDDataMap", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 12, + "slot": 40, + "tag": "nst", + "this": true, + "type": "?$StreamableHelper@V?$NetworkIDDataMap@VLocustNestState@Game@@@Game@@@Mars", + "va": 5279574 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10427920, + "inner": "Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap", + "kind": "object", + "off": 24, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "flt", + "this": true, + "type": "?$StreamableHelper@V?$NetworkIDDataMap@VLocustFleetLogistics@Game@@@Game@@@Mars", + "va": 5279615 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": "des", + "this": true, + "va": 5279690 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 44, + "off_abs": 44, + "size": 16, + "slot": 40, + "tag": "vis", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 5279656 + } + ], + "gaps": [ + { + "after": "nst", + "at": 8, + "bytes": 4 + }, + { + "after": "flt", + "at": 24, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5297024, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 60, + "sizeof_stride": 60, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10442428, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5279472 + }, + "Game::SVSOMasterVoice": { + "class": "Game::SVSOMasterVoice", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": "hom", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 5557607 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10462660, + "inner": "enum:HomeState", + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": 40, + "tag": "hmd", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@W4HomeState@SVSOMasterVoice@Game@@@Mars@@@Mars", + "va": 5557652 + } + ], + "gaps": [], + "grade": "clean", + "read": 5557312, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10465428, + "why": "fields exact; sizeof is a lower bound only", + "write": 5557520 + }, + "Game::SVSOMonitor": { + "class": "Game::SVSOMonitor", + "col_offset": 0, + "computed": [ + { + "const": 0, + "from": 5227184, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "DsnID", + "va": 5227279 + }, + { + "from": 5227184, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "Dwght", + "unresolved": true, + "va": 5227299 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "nt", + "unresolved": true, + "va": 5232713 + }, + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "dsgn", + "va": 5232817 + } + ], + "elements": [ + { + "base": "ebx", + "count_of": true, + "from": 5227184, + "helper": 9149776, + "kind": "vector", + "off": 4, + "size": 16, + "slot": null, + "tag": "NAsg", + "this": false, + "va": 5227337 + }, + { + "base": "ebx", + "from": 5227184, + "helper": 8479888, + "kind": "handle", + "off": 4, + "size": 4, + "slot": null, + "tag": "Esys", + "this": false, + "va": 5227394 + } + ], + "fields": [ + { + "base": "ebx", + "from": 5227184, + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "Eflt", + "this": true, + "va": 5227379, + "via": "deref" + }, + { + "base": "ebx", + "count_of": true, + "from": 5227184, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": "NDsn", + "this": true, + "va": 5227225 + }, + { + "alt_tags": [ + "spwt", + "rsmd" + ], + "base": "ebx", + "helper": 9149808, + "kind": "string", + "off": 40, + "off_abs": 40, + "size": 28, + "slot": null, + "tag": "scnm", + "this": true, + "va": 5232751 + } + ], + "gaps": [ + { + "after": "Eflt", + "at": 4, + "bytes": 16 + } + ], + "grade": "clean", + "read": 5420096, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 68, + "sizeof_stride": 68, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "40": 40 + }, + "unsized_fields": 0, + "vftable": 10442836, + "why": "fields exact; sizeof is a lower bound only", + "write": 5232656 + }, + "Game::SVSOOrtgay": { + "class": "Game::SVSOOrtgay", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": "init", + "this": true, + "va": 5281116 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "design", + "this": true, + "va": 5281142 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "state", + "this": true, + "va": 5281102 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 16, + "size": 12, + "slot": 40, + "tag": "origin", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 5281187 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 28, + "off_abs": 28, + "size": 12, + "slot": 40, + "tag": "center", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 5281232 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "turnLv", + "this": true, + "va": 5281260 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "turnAn", + "this": true, + "va": 5281277 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": "spawnturn", + "this": true, + "va": 5281294 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "spawnodds", + "this": true, + "va": 5281311 + } + ], + "gaps": [], + "grade": "verified", + "read": 5280656, + "read_agree": 5, + "read_comparable": 5, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10423956, + "why": "fields exact; Read agrees on all 5 comparable offsets", + "write": 5281040 + }, + "Game::SVSOProgressionWars": { + "class": "Game::SVSOProgressionWars", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "stg", + "this": true, + "va": 5557736 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "sft", + "this": true, + "va": 5557753 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "snt", + "this": true, + "va": 5557770 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "snec", + "this": true, + "va": 5557787 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "ses", + "this": true, + "va": 5557807 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "snet", + "this": true, + "va": 5557824 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "snep", + "this": true, + "va": 5557841 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "srsi", + "this": true, + "va": 5557858 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": "srs", + "this": true, + "va": 5557884 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10428048, + "inner": "String", + "kind": "vector", + "off": 64, + "off_abs": 64, + "size": 16, + "slot": 40, + "tag": "lts", + "this": true, + "type": "?$VectorHelper@VString@Mars@@@Mars", + "va": 5557941 + } + ], + "gaps": [ + { + "after": "srs", + "at": 40, + "bytes": 20 + } + ], + "grade": "verified", + "read": 5584016, + "read_agree": 8, + "read_comparable": 8, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 80, + "sizeof_stride": 80, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10466124, + "why": "fields exact; Read agrees on all 8 comparable offsets", + "write": 5557680 + }, + "Game::SVSOPuppetMaster": { + "class": "Game::SVSOPuppetMaster", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "Des", + "va": 5283853 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "Flt", + "this": true, + "va": 5283868 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": "Init2", + "this": true, + "va": 5283769 + }, + { + "alt_tags": [ + "SID" + ], + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 16, + "off_abs": 16, + "size": 16, + "slot": null, + "tag": "NSys", + "this": true, + "va": 5283897 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 32, + "off_abs": 32, + "size": 12, + "slot": 40, + "tag": "End", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 5283814 + } + ], + "gaps": [], + "grade": "verified", + "read": 5315456, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "16": 4 + }, + "unsized_fields": 0, + "vftable": 10436044, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5283712 + }, + "Game::SVSORefugees": { + "class": "Game::SVSORefugees", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": "pid", + "this": false, + "va": 5281458 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10427936, + "inner": "Game::SVSORefugees::PlayerStatus", + "kind": "object", + "off": 16, + "slot": 40, + "tag": "rsu", + "this": false, + "type": "?$StreamableHelper@VPlayerStatus@SVSORefugees@Game@@@Mars", + "va": 5281495 + } + ], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "rsuc", + "this": true, + "va": 5281410 + }, + { + "base": "eax", + "helper": 9149472, + "kind": "bool", + "off": 20, + "off_abs": 20, + "size": 1, + "slot": null, + "tag": "ini", + "this": true, + "va": 5281679 + }, + { + "alt_tags": [ + "did" + ], + "base": "eax", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": "didc", + "this": true, + "va": 5281611 + } + ], + "gaps": [ + { + "after": "rsuc", + "at": 12, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5399584, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "24": 4 + }, + "unsized_fields": 0, + "vftable": 10442588, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5281344 + }, + "Game::SVSORefugees::PlayerStatus": { + "class": "Game::SVSORefugees::PlayerStatus", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "lr", + "this": true, + "va": 5226348 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "lrt", + "this": true, + "va": 5226362 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "llc", + "this": true, + "va": 5226388 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 16, + "off_abs": 16, + "size": 1, + "slot": null, + "tag": "atr", + "this": true, + "va": 5226402 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 17, + "off_abs": 17, + "size": 1, + "slot": null, + "tag": "asy", + "this": true, + "va": 5226419 + } + ], + "gaps": [], + "grade": "verified", + "read": 5226160, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 18, + "sizeof_stride": 18, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10424780, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5226320 + }, + "Game::SVSOSlaversRefuel": { + "class": "Game::SVSOSlaversRefuel", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "TDID", + "va": 5234666 + }, + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "ADID", + "va": 5234746 + } + ], + "elements": [ + { + "base": "edi", + "from": 5226944, + "helper": 8479888, + "kind": "handle", + "off": 4, + "size": 4, + "slot": null, + "tag": "Esys", + "this": false, + "va": 5227042 + } + ], + "fields": [ + { + "alt_tags": [ + "Eflt" + ], + "base": "edi", + "count_of": true, + "from": 5226944, + "helper": 9149776, + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": null, + "tag": "NAsg", + "this": true, + "va": 5226985 + }, + { + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": "NTD", + "this": true, + "va": 5234619 + }, + { + "base": "esi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 40, + "off_abs": 40, + "size": 16, + "slot": null, + "tag": "NAD", + "this": true, + "va": 5234704 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": "CDiff", + "this": true, + "va": 5234590 + } + ], + "gaps": [ + { + "after": "NAsg", + "at": 4, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5376768, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 60, + "sizeof_stride": 60, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "24": 4, + "40": 4 + }, + "unsized_fields": 0, + "vftable": 10438708, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5234560 + }, + "Game::SVSOSots": { + "class": "Game::SVSOSots", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 12, + "size": 28, + "slot": null, + "tag": "xscn", + "this": false, + "va": 5889699 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10509736, + "inner": "Game::SVScriptObject", + "kind": "object", + "off": 40, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "xsc", + "this": false, + "type": "?$StreamableHelper@VSVScriptObject@Game@@@Mars", + "va": 5889750 + }, + { + "base": "eax", + "helper": null, + "helper_vftable": 10509736, + "inner": "Game::SVScriptObject", + "kind": "object", + "off": 4, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "EncObj", + "this": false, + "type": "?$StreamableHelper@VSVScriptObject@Game@@@Mars", + "va": 5889956 + } + ], + "fields": [ + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "ScnID", + "this": true, + "va": 5889590 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10509720, + "inner": "Game::SVSOScenarioBase", + "kind": "object", + "off": 8, + "off_abs": 8, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "ScnObj", + "this": true, + "type": "?$StreamableHelper@VSVSOScenarioBase@Game@@@Mars", + "va": 5889627 + }, + { + "alt_tags": [ + "EncID" + ], + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 12, + "off_abs": 12, + "size": 16, + "slot": null, + "tag": "NEncObjs", + "this": true, + "va": 5889864 + }, + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "numx", + "this": true, + "va": 5889666 + } + ], + "gaps": [ + { + "after": "NEncObjs", + "at": 12, + "bytes": 24 + } + ], + "grade": "clean", + "read": 5929536, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "12": 8 + }, + "unsized_fields": 0, + "vftable": 10511300, + "why": "fields exact; sizeof is a lower bound only", + "write": 5889520 + }, + "Game::SVSOSwarm": { + "class": "Game::SVSOSwarm", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "deshive", + "va": 5284164 + }, + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "deslarva", + "va": 5284196 + } + ], + "elements": [ + { + "base": "edi", + "from": 5226944, + "helper": 8479888, + "kind": "handle", + "off": 4, + "size": 4, + "slot": null, + "tag": "Esys", + "this": false, + "va": 5227042 + } + ], + "fields": [ + { + "alt_tags": [ + "Eflt" + ], + "base": "edi", + "count_of": true, + "from": 5226944, + "helper": 9149776, + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": null, + "tag": "NAsg", + "this": true, + "va": 5226985 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10427968, + "inner": "Game::SVSOSwarm::Infestation", + "kind": "vector", + "off": 32, + "off_abs": 32, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "infest", + "this": true, + "type": "?$VectorHelper@VInfestation@SVSOSwarm@Game@@@Mars", + "va": 5284125 + } + ], + "gaps": [ + { + "after": "NAsg", + "at": 4, + "bytes": 12 + } + ], + "grade": "clean", + "read": 5377360, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10438876, + "why": "fields exact; sizeof is a lower bound only", + "write": 5284032 + }, + "Game::SVSOSwarm::Infestation": { + "class": "Game::SVSOSwarm::Infestation", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "sysid", + "this": true, + "va": 5234932 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "stg", + "this": true, + "va": 5234958 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "strn", + "this": true, + "va": 5234972 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "mtrn", + "this": true, + "va": 5234989 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "trgtrn", + "this": true, + "va": 5235006 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 24, + "off_abs": 24, + "size": 1, + "slot": null, + "tag": "canh", + "this": true, + "va": 5235023 + } + ], + "gaps": [], + "grade": "verified", + "read": 5262288, + "read_agree": 4, + "read_comparable": 4, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 25, + "sizeof_stride": 25, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10426144, + "why": "fields exact; Read agrees on all 4 comparable offsets", + "write": 5234912 + }, + "Game::SVSOSwarmQueen": { + "class": "Game::SVSOSwarmQueen", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "QDesignID", + "va": 5287094 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10428000, + "inner": "Game::SVSOSwarmQueen::HiveInfo", + "kind": "vector", + "off": 16, + "off_abs": 16, + "size": 16, + "slot": 40, + "tag": "Hives", + "this": true, + "type": "?$VectorHelper@VHiveInfo@SVSOSwarmQueen@Game@@@Mars", + "va": 5287137 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10428016, + "inner": "Game::SVSOSwarmQueen::QueenInfo", + "kind": "vector", + "off": 32, + "off_abs": 32, + "size": 16, + "slot": 40, + "tag": "Queens", + "this": true, + "type": "?$VectorHelper@VQueenInfo@SVSOSwarmQueen@Game@@@Mars", + "va": 5287178 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 48, + "off_abs": 48, + "size": 16, + "slot": 40, + "tag": "SysMem", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 5287219 + } + ], + "gaps": [], + "grade": "clean", + "read": 5299872, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 64, + "sizeof_stride": 64, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10439140, + "why": "fields exact; sizeof is a lower bound only", + "write": 5287024 + }, + "Game::SVSOSwarmQueen::HiveInfo": { + "class": "Game::SVSOSwarmQueen::HiveInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "HiveID", + "this": true, + "va": 5236548 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "NextQ", + "this": true, + "va": 5236580 + }, + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "QueenID", + "this": true, + "va": 5236563 + } + ], + "gaps": [], + "grade": "verified", + "read": 5236464, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10426984, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 5236528 + }, + "Game::SVSOSwarmQueen::QueenInfo": { + "class": "Game::SVSOSwarmQueen::QueenInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "QueenID", + "this": true, + "va": 5203604 + }, + { + "base": "esi", + "helper": 8479888, + "kind": "handle", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "QDstID", + "this": true, + "va": 5203619 + } + ], + "gaps": [], + "grade": "clean", + "read": 5236608, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 12, + "sizeof_by": "container stride", + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": 12, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427000, + "why": "fields exact; sizeof corroborated", + "write": 5203584 + }, + "Game::SVSOSystemKiller": { + "class": "Game::SVSOSystemKiller", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": 8479888, + "kind": "const", + "slot": null, + "tag": "Des", + "va": 5287782 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "Flt", + "this": true, + "va": 5287797 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": "Init2", + "this": true, + "va": 5287814 + }, + { + "alt_tags": [ + "SID" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 16, + "off_abs": 16, + "size": 16, + "slot": null, + "tag": "NSys", + "this": true, + "va": 5287897 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 32, + "off_abs": 32, + "size": 12, + "slot": 40, + "tag": "End", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 5287857 + } + ], + "gaps": [], + "grade": "verified", + "read": 5316496, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "16": 4 + }, + "unsized_fields": 0, + "vftable": 10436204, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5287712 + }, + "Game::SVSOTraps": { + "class": "Game::SVSOTraps", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10427952, + "inner": "Game::SVSOTraps::Trap", + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": 40, + "tag": "traps", + "this": true, + "type": "?$VectorHelper@VTrap@SVSOTraps@Game@@@Mars", + "va": 5282491 + } + ], + "gaps": [], + "grade": "clean", + "read": 5282272, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10443724, + "why": "fields exact; sizeof is a lower bound only", + "write": 5282416 + }, + "Game::SVSOTraps::Trap": { + "class": "Game::SVSOTraps::Trap", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 5229116 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "pid", + "this": true, + "va": 5229136 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "trenc", + "this": true, + "va": 5229156 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "trgenc", + "this": true, + "va": 5229176 + } + ], + "gaps": [], + "grade": "clean", + "read": 5259968, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 20, + "sizeof_by": "container stride", + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": 20, + "strides": {}, + "unsized_fields": 0, + "vftable": 10424992, + "why": "fields exact; sizeof corroborated", + "write": 5229088 + }, + "Game::SVSOUpstartApes": { + "class": "Game::SVSOUpstartApes", + "col_offset": 0, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "NUMSHIPCLASSES", + "va": 5558805 + }, + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "SHIPCLASS", + "va": 5558836 + } + ], + "elements": [ + { + "base": "edx", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "EMPIREORDERID", + "this": false, + "va": 5558997 + }, + { + "base": "ecx", + "helper": null, + "helper_vftable": 10462692, + "inner": "Game::SVSOUpstartApes_EmpireOrder", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "EMPIREORDER", + "this": false, + "type": "?$StreamableHelper@VSVSOUpstartApes_EmpireOrder@Game@@@Mars", + "va": 5559039 + } + ], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "EMPIREFLAGS", + "this": true, + "va": 5558767 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "EMPIRESTANDING", + "this": true, + "va": 5558781 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": "NEXTORDERTURN", + "this": true, + "va": 5558917 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": 36, + "tag": "EARTHID", + "this": true, + "va": 5559089 + } + ], + "gaps": [ + { + "after": "EMPIRESTANDING", + "at": 16, + "bytes": 28 + }, + { + "after": "NEXTORDERTURN", + "at": 48, + "bytes": 16 + } + ], + "grade": "verified", + "read": 5650512, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 72, + "sizeof_stride": 72, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "52": 4 + }, + "unsized_fields": 0, + "vftable": 10466508, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 5558704 + }, + "Game::SVSOUpstartApes_EO_DEMANDS_SHIPS": { + "class": "Game::SVSOUpstartApes_EO_DEMANDS_SHIPS", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5558296 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5558313 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10462676, + "inner": "Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest", + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": 40, + "tag": "REQUESTS", + "this": true, + "type": "?$VectorHelper@UShipRequest@SVSOUpstartApes_EO_DEMANDS_SHIPS@Game@@@Mars", + "va": 5558358 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5558386 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "SUCCESSSTANDING", + "this": true, + "va": 5558403 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "FAILURESTANDING", + "this": true, + "va": 5558420 + } + ], + "gaps": [], + "grade": "verified", + "read": 5558000, + "read_agree": 5, + "read_comparable": 5, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10465936, + "why": "fields exact; Read agrees on all 5 comparable offsets", + "write": 5558240 + }, + "Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest": { + "class": "Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "MISSIONSECTION", + "this": false, + "va": 5624214 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "NUMREQUIRED", + "this": true, + "va": 5624231 + } + ], + "gaps": [], + "grade": "verified", + "read": 5623872, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 32, + "sizeof_by": "container stride", + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": 32, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462740, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 5624096 + }, + "Game::SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS": { + "class": "Game::SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5541110 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5541127 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5541144 + } + ], + "gaps": [], + "grade": "verified", + "read": 5541008, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462564, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5541088 + }, + "Game::SVSOUpstartApes_EO_DEMANDS_VICTORY": { + "class": "Game::SVSOUpstartApes_EO_DEMANDS_VICTORY", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5541110 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5541127 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5541144 + } + ], + "gaps": [], + "grade": "verified", + "read": 5541008, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462516, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5541088 + }, + "Game::SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT": { + "class": "Game::SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5541110 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5541127 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5541144 + } + ], + "gaps": [], + "grade": "verified", + "read": 5541008, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462468, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5541088 + }, + "Game::SVSOUpstartApes_EO_FEARS_YOUR_POWER": { + "class": "Game::SVSOUpstartApes_EO_FEARS_YOUR_POWER", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5541110 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5541127 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5541144 + } + ], + "gaps": [], + "grade": "verified", + "read": 5541008, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462420, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5541088 + }, + "Game::SVSOUpstartApes_EO_GIFTS": { + "class": "Game::SVSOUpstartApes_EO_GIFTS", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5540966 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5540983 + } + ], + "gaps": [], + "grade": "verified", + "read": 5540880, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462540, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 5540944 + }, + "Game::SVSOUpstartApes_EO_MUST_EXPAND": { + "class": "Game::SVSOUpstartApes_EO_MUST_EXPAND", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5540806 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5540823 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5540857 + } + ], + "gaps": [ + { + "after": "TURNCREATED", + "at": 16, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5540688, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462492, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5540784 + }, + "Game::SVSOUpstartApes_EO_REQUIRES_CASH": { + "class": "Game::SVSOUpstartApes_EO_REQUIRES_CASH", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "OBJECTIVEID", + "this": true, + "va": 5541110 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TURNCREATED", + "this": true, + "va": 5541127 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "LASTTURN", + "this": true, + "va": 5541144 + } + ], + "gaps": [], + "grade": "verified", + "read": 5541008, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10462444, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 5541088 + }, + "Game::SVSOVonNeumann": { + "class": "Game::SVSOVonNeumann", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": null, + "helper_vftable": 10428048, + "inner": "String", + "kind": "vector", + "off": -52, + "size": 16, + "slot": 40, + "tag": "trev", + "this": false, + "type": "?$VectorHelper@VString@Mars@@@Mars", + "va": 5421878 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10428032, + "inner": "Game::SVSOVonNeumann::DefeatRecord", + "kind": "vector", + "off": 4, + "off_abs": 4, + "size": 16, + "slot": 40, + "tag": "dfts", + "this": true, + "type": "?$VectorHelper@VDefeatRecord@SVSOVonNeumann@Game@@@Mars", + "va": 5421346 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "rusav", + "this": true, + "va": 5421367 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "nenc", + "this": true, + "va": 5421384 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "nmb", + "this": true, + "va": 5421401 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": "nml", + "this": true, + "va": 5421418 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "nbb", + "this": true, + "va": 5421438 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": "nbl", + "this": true, + "va": 5421455 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": null, + "tag": "nskb", + "this": true, + "va": 5421472 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "nskl", + "this": true, + "va": 5421489 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "vnhw", + "this": true, + "va": 5421818 + }, + { + "base": "edi", + "helper": 9149536, + "kind": "int64", + "off": 72, + "off_abs": 72, + "size": 8, + "slot": null, + "tag": "vnhp", + "this": true, + "va": 5421803 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 80, + "off_abs": 80, + "size": 4, + "slot": 36, + "tag": "mbid", + "this": true, + "va": 5421749 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 84, + "off_abs": 84, + "size": 4, + "slot": 36, + "tag": "mbgid", + "this": true, + "va": 5421769 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 88, + "off_abs": 88, + "size": 4, + "slot": 36, + "tag": "skgid", + "this": true, + "va": 5421789 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 92, + "off_abs": 92, + "size": 4, + "slot": null, + "tag": "ntm", + "this": true, + "va": 5421557 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 96, + "off_abs": 96, + "size": 16, + "slot": 40, + "tag": "mts", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 5421536 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 112, + "off_abs": 112, + "size": 4, + "slot": null, + "tag": "ntb", + "this": true, + "va": 5421574 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 116, + "off_abs": 116, + "size": 1, + "slot": null, + "tag": "sken", + "this": true, + "va": 5421591 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 120, + "off_abs": 120, + "size": 4, + "slot": 36, + "tag": "skdid", + "this": true, + "va": 5421617 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 124, + "off_abs": 124, + "size": 4, + "slot": 36, + "tag": "skhid", + "this": true, + "va": 5421637 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 128, + "off_abs": 128, + "size": 4, + "slot": 36, + "tag": "skfid", + "this": true, + "va": 5421660 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 132, + "off_abs": 132, + "size": 4, + "slot": null, + "tag": "sktq", + "this": true, + "va": 5421677 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 136, + "off_abs": 136, + "size": 4, + "slot": 36, + "tag": "skt", + "this": true, + "va": 5421706 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 140, + "off_abs": 140, + "size": 4, + "slot": null, + "tag": "sktc", + "this": true, + "va": 5421723 + } + ], + "gaps": [ + { + "after": "dfts", + "at": 4, + "bytes": 16 + } + ], + "grade": "verified", + "read": 5300528, + "read_agree": 14, + "read_comparable": 14, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 144, + "sizeof_stride": 144, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10443212, + "why": "fields exact; Read agrees on all 14 comparable offsets", + "write": 5421264 + }, + "Game::SVSOVonNeumann::DefeatRecord": { + "class": "Game::SVSOVonNeumann::DefeatRecord", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "sys", + "this": true, + "va": 5240844 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "ndft", + "this": true, + "va": 5240858 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "lstd", + "this": true, + "va": 5240892 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "nxrv", + "this": true, + "va": 5240875 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 20, + "off_abs": 20, + "size": 1, + "slot": null, + "tag": "bkdf", + "this": true, + "va": 5240909 + } + ], + "gaps": [], + "grade": "verified", + "read": 5263856, + "read_agree": 4, + "read_comparable": 4, + "sizeof": 24, + "sizeof_by": "container stride", + "sizeof_lower": 21, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": 24, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427548, + "why": "fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated", + "write": 5240816 + }, + "Game::ServerNodeGraph": { + "class": "Game::ServerNodeGraph", + "col_offset": 68, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10603516, + "inner": "Game::NodePath", + "kind": "vector", + "off": -60, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": "paths", + "this": true, + "type": "?$VectorHelper@VNodePath@Game@@@Mars", + "va": 7222657 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 72, + "size": 4, + "slot": null, + "tag": "nextid", + "this": true, + "va": 7222685 + } + ], + "gaps": [ + { + "after": "paths", + "at": 8, + "bytes": 48 + } + ], + "grade": "verified", + "read": 7234016, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 76, + "sizeof_stride": 76, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10603596, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 7222576 + }, + "Game::ServerNodeGraph::Params": { + "class": "Game::ServerNodeGraph::Params", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "RSeed", + "this": true, + "va": 7222462 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10603500, + "inner": "Game::SimpleNodePath", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": "PSeed", + "this": true, + "type": "?$VectorHelper@VSimpleNodePath@Game@@@Mars", + "va": 7222552 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": 40, + "tag": "SSeed", + "this": true, + "type": "?$VectorHelper@H@Mars", + "va": 7222507 + } + ], + "gaps": [], + "grade": "clean", + "read": 7222176, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10603628, + "why": "fields exact; sizeof is a lower bound only", + "write": 7222400 + }, + "Game::ServerPlayer": { + "class": "Game::ServerPlayer", + "col_offset": 928, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "ResTNm", + "this": false, + "va": 8743917 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "PRBt", + "unresolved": true, + "va": 8744727 + }, + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -61, + "size": 1, + "slot": null, + "tag": "HasAIR", + "this": false, + "va": 8744771 + }, + { + "helper": 9149408, + "kind": "float?", + "slot": null, + "tag": "xper", + "unresolved": true, + "va": 8745140 + }, + { + "const": 1, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "tnc", + "va": 8745850 + } + ], + "elements": [ + { + "base": "ebx", + "helper": 9149408, + "kind": "float", + "off": -12, + "size": 4, + "slot": null, + "tag": "ConMod", + "this": false, + "va": 8743967 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "DesID", + "this": false, + "va": 8744221 + }, + { + "base": "edx", + "helper": null, + "helper_vftable": 10673676, + "inner": "Game::ShipDesign", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Des", + "this": false, + "type": "?$StreamableHelper@VShipDesign@Game@@@Mars", + "va": 8744263 + }, + { + "base": "ecx", + "helper": null, + "helper_vftable": 10673676, + "inner": "Game::ShipDesign", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Des", + "this": false, + "type": "?$StreamableHelper@VShipDesign@Game@@@Mars", + "va": 8744442 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10673692, + "inner": "Game::PlayerNotes", + "kind": "object", + "off": 16, + "slot": 40, + "tag": "Nts", + "this": false, + "type": "?$StreamableHelper@VPlayerNotes@Game@@@Mars", + "va": 8744556 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 60, + "size": 4, + "slot": 36, + "tag": "SprjT", + "this": false, + "va": 8744959 + }, + { + "base": "edx", + "helper": null, + "helper_vftable": 10673724, + "inner": "Game::SpecialProjectImpl", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Sprj", + "this": false, + "type": "?$StreamableHelper@VSpecialProjectImpl@Game@@@Mars", + "va": 8745001 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "WeapXcl", + "this": false, + "va": 8745258 + }, + { + "base": "edx", + "helper": null, + "helper_vftable": 10370980, + "inner": "Game::DefenceLayout", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "deflay", + "this": false, + "type": "?$StreamableHelper@VDefenceLayout@Game@@@Mars", + "va": 8745694 + } + ], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -888, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "PlyrIdx", + "this": true, + "va": 8742002 + }, + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": -884, + "off_abs": 44, + "size": 4, + "slot": 36, + "tag": "HomeSys", + "this": true, + "va": 8741985, + "via": "deref" + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -880, + "off_abs": 48, + "size": 16, + "slot": null, + "tag": "NumOwn", + "this": true, + "va": 8744027 + }, + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": -876, + "off_abs": 52, + "size": 4, + "slot": 36, + "tag": "OwnId", + "this": true, + "va": 8744087, + "via": "deref" + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": -864, + "off_abs": 64, + "size": 28, + "slot": null, + "tag": "PlryName", + "this": true, + "va": 8742022 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -836, + "off_abs": 92, + "size": 4, + "slot": 36, + "tag": "Species", + "this": true, + "va": 8742051 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372656, + "inner": "Game::PlayerColorID", + "kind": "object", + "off": -832, + "off_abs": 96, + "size": 7, + "slot": 40, + "tag": "ClrID", + "this": true, + "type": "?$StreamableHelper@UPlayerColorID@Game@@@Mars", + "va": 8742095 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": -812, + "off_abs": 116, + "size": 28, + "slot": null, + "tag": "Bdg", + "this": true, + "va": 8742119 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": -784, + "off_abs": 144, + "size": 28, + "slot": null, + "tag": "Avt", + "this": true, + "va": 8742139 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -756, + "off_abs": 172, + "size": 4, + "slot": null, + "tag": "Team", + "this": true, + "va": 8742159 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -752, + "off_abs": 176, + "size": 4, + "slot": null, + "tag": "IdealSuit", + "this": true, + "va": 8742202 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -748, + "off_abs": 180, + "size": 4, + "slot": null, + "tag": "SuitTol", + "this": true, + "va": 8742222 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -744, + "off_abs": 184, + "size": 4, + "slot": null, + "tag": "MaxOH", + "this": true, + "va": 8742242 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -740, + "off_abs": 188, + "size": 4, + "slot": null, + "tag": "ResRate", + "this": true, + "va": 8742262 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -736, + "off_abs": 192, + "size": 4, + "slot": null, + "tag": "ResMod", + "this": true, + "va": 8742285 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -732, + "off_abs": 196, + "size": 4, + "slot": null, + "tag": "ResScl", + "this": true, + "va": 8742305 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -720, + "off_abs": 208, + "size": 4, + "slot": null, + "tag": "TRM", + "this": true, + "va": 8742325 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -716, + "off_abs": 212, + "size": 4, + "slot": null, + "tag": "TRA", + "this": true, + "va": 8742368 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -712, + "off_abs": 216, + "size": 4, + "slot": null, + "tag": "TRP", + "this": true, + "va": 8742345 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -700, + "off_abs": 228, + "size": 16, + "slot": null, + "tag": "NumDes", + "this": true, + "va": 8744139 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673612, + "inner": "Game::TechTree", + "kind": "object", + "off": -684, + "off_abs": 244, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "TechTree", + "this": true, + "type": "?$StreamableHelper@VTechTree@Game@@@Mars", + "va": 8741944 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -680, + "off_abs": 248, + "size": 1, + "slot": null, + "tag": "Elim", + "this": true, + "va": 8742766 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -677, + "off_abs": 251, + "size": 1, + "slot": null, + "tag": "NPC", + "this": true, + "va": 8742786 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -676, + "off_abs": 252, + "size": 1, + "slot": null, + "tag": "RebAI", + "this": true, + "va": 8742806 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -675, + "off_abs": 253, + "size": 1, + "slot": null, + "tag": "ReqCL", + "this": true, + "va": 8742826 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -674, + "off_abs": 254, + "size": 1, + "slot": null, + "tag": "AIBn", + "this": true, + "va": 8743219 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -673, + "off_abs": 255, + "size": 1, + "slot": null, + "tag": "CnTrd", + "this": true, + "va": 8743239 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -672, + "off_abs": 256, + "size": 1, + "slot": null, + "tag": "CnRad", + "this": true, + "va": 8743262 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -671, + "off_abs": 257, + "size": 1, + "slot": null, + "tag": "CnVItl", + "this": true, + "va": 8743345 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -670, + "off_abs": 258, + "size": 1, + "slot": null, + "tag": "hgs", + "this": true, + "va": 8743282 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -669, + "off_abs": 259, + "size": 1, + "slot": null, + "tag": "hadvs", + "this": true, + "va": 8743302 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -668, + "off_abs": 260, + "size": 1, + "slot": null, + "tag": "harcc", + "this": true, + "va": 8743322 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -664, + "off_abs": 264, + "size": 4, + "slot": null, + "tag": "pddm", + "this": true, + "va": 8743365 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -648, + "off_abs": 280, + "size": 4, + "slot": null, + "tag": "SavMod", + "this": true, + "va": 8743981 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -636, + "off_abs": 292, + "size": 4, + "slot": null, + "tag": "OutMod", + "this": true, + "va": 8742388 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -632, + "off_abs": 296, + "size": 4, + "slot": null, + "tag": "RebOutMod", + "this": true, + "va": 8742408 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -628, + "off_abs": 300, + "size": 4, + "slot": null, + "tag": "ScOutMod", + "this": true, + "va": 8742428 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -624, + "off_abs": 304, + "size": 4, + "slot": null, + "tag": "PopMod", + "this": true, + "va": 8742471 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -620, + "off_abs": 308, + "size": 4, + "slot": null, + "tag": "TerraMod", + "this": true, + "va": 8742491 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -616, + "off_abs": 312, + "size": 1, + "slot": null, + "tag": "AMine", + "this": true, + "va": 8742511 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -612, + "off_abs": 316, + "size": 4, + "slot": null, + "tag": "MinPure", + "this": true, + "va": 8742534 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -608, + "off_abs": 320, + "size": 4, + "slot": null, + "tag": "MinRate", + "this": true, + "va": 8742554 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -604, + "off_abs": 324, + "size": 4, + "slot": null, + "tag": "NGts", + "this": true, + "va": 8742574 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -600, + "off_abs": 328, + "size": 4, + "slot": null, + "tag": "PrGtTrf", + "this": true, + "va": 8742594 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -596, + "off_abs": 332, + "size": 4, + "slot": null, + "tag": "GTraf", + "this": true, + "va": 8742617 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -592, + "off_abs": 336, + "size": 4, + "slot": null, + "tag": "CstR", + "this": true, + "va": 8742637 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -588, + "off_abs": 340, + "size": 4, + "slot": null, + "tag": "CstE", + "this": true, + "va": 8742657 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -584, + "off_abs": 344, + "size": 4, + "slot": null, + "tag": "CstT", + "this": true, + "va": 8742677 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -580, + "off_abs": 348, + "size": 4, + "slot": null, + "tag": "Maint", + "this": true, + "va": 8742700 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -576, + "off_abs": 352, + "size": 4, + "slot": null, + "tag": "shrm", + "this": true, + "va": 8742720 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -572, + "off_abs": 356, + "size": 4, + "slot": 36, + "tag": "Status", + "this": true, + "va": 8742749 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673500, + "inner": "Game::PlayerAlliances", + "kind": "object", + "off": -568, + "off_abs": 360, + "size": 16, + "slot": 40, + "tag": "Team", + "this": true, + "type": "?$StreamableHelper@VPlayerAlliances@Game@@@Mars", + "va": 8742876 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -552, + "off_abs": 376, + "size": 16, + "slot": null, + "tag": "NumLeg", + "this": true, + "va": 8744326 + }, + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": -548, + "off_abs": 380, + "size": 4, + "slot": 36, + "tag": "DesID", + "this": true, + "va": 8744400, + "via": "deref" + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -536, + "off_abs": 392, + "size": 4, + "slot": null, + "tag": "PvSav", + "this": true, + "va": 8743179 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -532, + "off_abs": 396, + "size": 1, + "slot": null, + "tag": "PvMA", + "this": true, + "va": 8743199 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -516, + "off_abs": 412, + "size": 4, + "slot": 36, + "tag": "HasDisc", + "this": true, + "va": 8742975 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -512, + "off_abs": 416, + "size": 4, + "slot": 36, + "tag": "HasDiscSp", + "this": true, + "va": 8742998 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -508, + "off_abs": 420, + "size": 4, + "slot": 36, + "tag": "HasDiscCl", + "this": true, + "va": 8743021 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -504, + "off_abs": 424, + "size": 4, + "slot": 36, + "tag": "HasEnc", + "this": true, + "va": 8743044 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -500, + "off_abs": 428, + "size": 4, + "slot": 36, + "tag": "HasEng", + "this": true, + "va": 8743067 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673660, + "inner": "Game::ShipRecords", + "kind": "object", + "off": -496, + "off_abs": 432, + "size": 56, + "slot": 40, + "tag": "ShipRecs", + "this": true, + "type": "?$StreamableHelper@VShipRecords@Game@@@Mars", + "va": 8743501 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673788, + "inner": "Game::Objective", + "kind": "vector", + "off": -428, + "off_abs": 500, + "size": 16, + "slot": 40, + "tag": "Ojvs", + "this": true, + "type": "?$VectorHelper@UObjective@Game@@@Mars", + "va": 8745321 + }, + { + "alt_tags": [ + "xid", + "xmin", + "xmax" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -412, + "off_abs": 516, + "size": 16, + "slot": null, + "tag": "Nexp", + "this": true, + "va": 8745050 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -396, + "off_abs": 532, + "size": 16, + "slot": null, + "tag": "NWeapXcl", + "this": true, + "va": 8745194 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673804, + "inner": "Game::DiplomacyStats", + "kind": "vector", + "off": -368, + "off_abs": 560, + "size": 16, + "slot": 40, + "tag": "dipstats", + "this": true, + "type": "?$VectorHelper@VDiplomacyStats@Game@@@Mars", + "va": 8745362 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673820, + "inner": "Game::CommMessageContainer", + "kind": "object", + "off": -352, + "off_abs": 576, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "comms", + "this": true, + "type": "?$StreamableHelper@VCommMessageContainer@Game@@@Mars", + "va": 8745403 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673836, + "inner": "Game::PlayerReport", + "kind": "vector", + "off": -348, + "off_abs": 580, + "size": 16, + "slot": 40, + "tag": "preps", + "this": true, + "type": "?$VectorHelper@VPlayerReport@Game@@@Mars", + "va": 8745444 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673852, + "inner": "Game::ObservedDesign", + "kind": "vector", + "off": -332, + "off_abs": 596, + "size": 16, + "slot": 40, + "tag": "odes", + "this": true, + "type": "?$VectorHelper@VObservedDesign@Game@@@Mars", + "va": 8745485 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673868, + "inner": "Game::ObservedWeapon", + "kind": "vector", + "off": -316, + "off_abs": 612, + "size": 16, + "slot": 40, + "tag": "owep", + "this": true, + "type": "?$VectorHelper@VObservedWeapon@Game@@@Mars", + "va": 8745526 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673884, + "inner": "Game::ObservedTech", + "kind": "vector", + "off": -300, + "off_abs": 628, + "size": 16, + "slot": 40, + "tag": "otch", + "this": true, + "type": "?$VectorHelper@VObservedTech@Game@@@Mars", + "va": 8745567 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -284, + "off_abs": 644, + "size": 4, + "slot": null, + "tag": "Sav", + "this": true, + "va": 8742179 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -280, + "off_abs": 648, + "size": 4, + "slot": 36, + "tag": "HasImm", + "this": true, + "va": 8742929 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -276, + "off_abs": 652, + "size": 4, + "slot": 36, + "tag": "HasVac", + "this": true, + "va": 8742906 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -272, + "off_abs": 656, + "size": 4, + "slot": 36, + "tag": "NPTrk", + "this": true, + "va": 8742952 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673644, + "inner": "Game::FleetNameGenerator", + "kind": "object", + "off": -264, + "off_abs": 664, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "FNG", + "this": true, + "type": "?$StreamableHelper@VFleetNameGenerator@Game@@@Mars", + "va": 8743155 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673628, + "inner": "Game::EventStorage", + "kind": "object", + "off": -260, + "off_abs": 668, + "size": 24, + "slot": 40, + "tag": "Events", + "this": true, + "type": "?$StreamableHelper@VEventStorage@Game@@@Mars", + "va": 8743111 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -228, + "off_abs": 700, + "size": 4, + "slot": null, + "tag": "NumNotes", + "this": true, + "va": 8744496 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -220, + "off_abs": 708, + "size": 4, + "slot": 36, + "tag": "BnkWrn", + "this": true, + "va": 8743394 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -216, + "off_abs": 712, + "size": 4, + "slot": null, + "tag": "BnkTrn", + "this": true, + "va": 8743411 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -212, + "off_abs": 716, + "size": 4, + "slot": null, + "tag": "BnkEl", + "this": true, + "va": 8743451 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -208, + "off_abs": 720, + "size": 4, + "slot": null, + "tag": "BnkPr", + "this": true, + "va": 8743431 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -200, + "off_abs": 728, + "size": 4, + "slot": 36, + "tag": "plcy", + "this": true, + "va": 8743551 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": -196, + "off_abs": 732, + "size": 28, + "slot": null, + "tag": "pswd", + "this": true, + "va": 8743568 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -168, + "off_abs": 760, + "size": 1, + "slot": null, + "tag": "Srn", + "this": true, + "va": 8743751 + }, + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": -164, + "off_abs": 764, + "size": 4, + "slot": 36, + "tag": "SrnTo", + "this": true, + "va": 8743791, + "via": "deref" + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -160, + "off_abs": 768, + "size": 4, + "slot": null, + "tag": "lboid", + "this": true, + "va": 8743814 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -156, + "off_abs": 772, + "size": 4, + "slot": 36, + "tag": "lcid2", + "this": true, + "va": 8743843 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": -148, + "off_abs": 780, + "size": 4, + "slot": null, + "tag": "IncMod", + "this": true, + "va": 8742451 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673900, + "inner": "Game::PlayerAid", + "kind": "vector", + "off": -144, + "off_abs": 784, + "size": 16, + "slot": 40, + "tag": "aid", + "this": true, + "type": "?$VectorHelper@VPlayerAid@Game@@@Mars", + "va": 8745608 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -128, + "off_abs": 800, + "size": 16, + "slot": null, + "tag": "ndeflay", + "this": true, + "va": 8745638 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": -112, + "off_abs": 816, + "size": 1, + "slot": null, + "tag": "cdp", + "this": true, + "va": 8743619 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673756, + "inner": "Game::SpyReport", + "kind": "object", + "off": -108, + "off_abs": 820, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "spy2", + "this": true, + "type": "?$StreamableHelper@VSpyReport@Game@@@Mars", + "va": 8743666 + }, + { + "alt_tags": [ + "rdt" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -104, + "off_abs": 824, + "size": 16, + "slot": null, + "tag": "rdtc", + "this": true, + "va": 8745737 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": -56, + "off_abs": 872, + "size": 4, + "slot": 36, + "tag": "aidf", + "this": true, + "va": 8743734 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673772, + "inner": "Game::CivilianRatios", + "kind": "object", + "off": -48, + "off_abs": 880, + "size": null, + "slot": 40, + "tag": "civr", + "this": true, + "type": "?$StreamableHelper@VCivilianRatios@Game@@@Mars", + "va": 8743707 + }, + { + "alt_tags": [ + "PRm" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 4, + "off_abs": 932, + "size": 16, + "slot": null, + "tag": "NumPR", + "this": true, + "va": 8744665 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 20, + "off_abs": 948, + "size": 1, + "slot": null, + "tag": "ResErrRoll", + "this": true, + "va": 8743934 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 21, + "off_abs": 949, + "size": 1, + "slot": null, + "tag": "cta", + "this": true, + "va": 8744843 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673708, + "inner": "Game::AIRebellion", + "kind": "object", + "off": 24, + "off_abs": 952, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "AIR", + "this": true, + "type": "?$StreamableHelper@VAIRebellion@Game@@@Mars", + "va": 8744825 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673452, + "inner": "Game::AIEncounterFlags", + "kind": "object", + "off": 28, + "off_abs": 956, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "AIEnf", + "this": true, + "type": "?$StreamableHelper@VAIEncounterFlags@Game@@@Mars", + "va": 8744889 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 32, + "off_abs": 960, + "size": 16, + "slot": null, + "tag": "NSprj", + "this": true, + "va": 8744919 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 976, + "size": 4, + "slot": null, + "tag": "NextPrjID", + "this": true, + "va": 8743522 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 52, + "off_abs": 980, + "size": 4, + "slot": null, + "tag": "lret", + "this": true, + "va": 8743585 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 60, + "off_abs": 988, + "size": 4, + "slot": null, + "tag": "nmeid", + "this": true, + "va": 8743602 + } + ], + "gaps": [ + { + "after": "OwnId", + "at": 52, + "bytes": 8 + }, + { + "after": "ClrID", + "at": 96, + "bytes": 13 + }, + { + "after": "ResScl", + "at": 196, + "bytes": 8 + }, + { + "after": "TRP", + "at": 216, + "bytes": 8 + }, + { + "after": "pddm", + "at": 264, + "bytes": 12 + }, + { + "after": "SavMod", + "at": 280, + "bytes": 8 + }, + { + "after": "DesID", + "at": 380, + "bytes": 8 + }, + { + "after": "PvMA", + "at": 396, + "bytes": 15 + }, + { + "after": "ShipRecs", + "at": 432, + "bytes": 12 + }, + { + "after": "NWeapXcl", + "at": 532, + "bytes": 12 + }, + { + "after": "NPTrk", + "at": 656, + "bytes": 4 + }, + { + "after": "Events", + "at": 668, + "bytes": 8 + }, + { + "after": "NumNotes", + "at": 700, + "bytes": 4 + }, + { + "after": "BnkPr", + "at": 720, + "bytes": 4 + }, + { + "after": "lcid2", + "at": 772, + "bytes": 4 + }, + { + "after": "rdtc", + "at": 824, + "bytes": 32 + }, + { + "after": "aidf", + "at": 872, + "bytes": 4 + }, + { + "after": "lret", + "at": 980, + "bytes": 4 + } + ], + "grade": "partial", + "read": 8914128, + "read_agree": 56, + "read_comparable": 56, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 992, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "-880": 4, + "-700": 4, + "-552": 4, + "-412": 16, + "-396": 4, + "-128": 4, + "-104": 32, + "4": 8, + "32": 4 + }, + "unsized_fields": 1, + "vftable": 10692500, + "why": "1 nested field(s) of unknown size", + "write": 8741856 + }, + "Game::ServerSpyManager": { + "class": "Game::ServerSpyManager", + "col_offset": 4, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10673084, + "inner": "Game::SpyCraft", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "spy", + "this": false, + "type": "?$StreamableHelper@VSpyCraft@Game@@@Mars", + "va": 8555224 + } + ], + "fields": [ + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "xsid", + "this": true, + "va": 8555129 + }, + { + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 12, + "off_abs": 16, + "size": 16, + "slot": null, + "tag": "nspy", + "this": true, + "va": 8555158 + } + ], + "gaps": [], + "grade": "verified", + "read": 8618416, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "12": 4 + }, + "unsized_fields": 0, + "vftable": 10684200, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8555072 + }, + "Game::ServerSystem": { + "class": "Game::ServerSystem", + "col_offset": 8, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "haltc", + "va": 7641619 + }, + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "haltt", + "va": 7641647 + }, + { + "const": 1, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "nadct", + "va": 7642595 + }, + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "ads", + "va": 7642637 + }, + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": 11, + "size": 1, + "slot": null, + "tag": "hindi", + "this": false, + "va": 7644010 + } + ], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10614948, + "inner": "Game::Plague", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Plg", + "this": false, + "type": "?$StreamableHelper@VPlague@Game@@@Mars", + "va": 7642805 + }, + { + "base": "ebx", + "helper": 9149696, + "kind": "int16", + "off": 18, + "size": 2, + "slot": null, + "tag": "TShn", + "this": false, + "va": 7643348 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 20, + "size": 4, + "slot": 36, + "tag": "OID", + "this": false, + "va": 7643374 + }, + { + "base": "ebx", + "helper": 9149472, + "kind": "bool", + "off": 24, + "size": 1, + "slot": null, + "tag": "isind", + "this": false, + "va": 7643388 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10614964, + "inner": "Game::IndependenceInfo", + "kind": "object", + "off": 28, + "slot": 40, + "tag": "indi", + "this": false, + "type": "?$StreamableHelper@VIndependenceInfo@Game@@@Mars", + "va": 7643439 + }, + { + "base": "ecx", + "helper": 8479888, + "kind": "handle", + "off": 0, + "size": 4, + "slot": null, + "tag": "EPid", + "this": false, + "va": 7643619 + }, + { + "base": "ebx", + "helper": 9149696, + "kind": "int16", + "off": 18, + "size": 2, + "slot": null, + "tag": "ETS", + "this": false, + "va": 7643636 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 20, + "size": 4, + "slot": 36, + "tag": "Eid", + "this": false, + "va": 7643662 + }, + { + "base": "ecx", + "helper": 8479888, + "kind": "handle", + "off": 0, + "size": 4, + "slot": null, + "tag": "PID", + "this": false, + "va": 7643811 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10614996, + "inner": "Game::StarSystem::PlayerView", + "kind": "object", + "off": 16, + "slot": 40, + "tag": "pview", + "this": false, + "type": "?$StreamableHelper@UPlayerView@StarSystem@Game@@@Mars", + "va": 7643862 + } + ], + "fields": [ + { + "base": "ecx", + "from": 7501856, + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 68, + "off_abs": 76, + "size": 4, + "slot": null, + "tag": "R", + "this": true, + "va": 7640687 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 72, + "off_abs": 80, + "size": 4, + "slot": null, + "tag": "G", + "this": true, + "va": 7640704 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 76, + "off_abs": 84, + "size": 4, + "slot": null, + "tag": "B", + "this": true, + "va": 7640721 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 80, + "off_abs": 88, + "size": 4, + "slot": null, + "tag": "A", + "this": true, + "va": 7640738 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 84, + "off_abs": 92, + "size": 4, + "slot": null, + "tag": "Idx", + "this": true, + "va": 7640758 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 88, + "off_abs": 96, + "size": 4, + "slot": null, + "tag": "Size", + "this": true, + "va": 7640775 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 92, + "off_abs": 100, + "size": 4, + "slot": null, + "tag": "Suit", + "this": true, + "va": 7640792 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 96, + "off_abs": 104, + "size": 4, + "slot": null, + "tag": "Res", + "this": true, + "va": 7640809 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 100, + "off_abs": 108, + "size": 4, + "slot": null, + "tag": "ARes2", + "this": true, + "va": 7640829 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 104, + "off_abs": 112, + "size": 4, + "slot": null, + "tag": "MRes", + "this": true, + "va": 7640846 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 108, + "off_abs": 116, + "size": 4, + "slot": null, + "tag": "TRes", + "this": true, + "va": 7640883 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 112, + "off_abs": 120, + "size": 1, + "slot": null, + "tag": "haltv", + "this": true, + "va": 7641662 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 116, + "off_abs": 124, + "size": 4, + "slot": null, + "tag": "OutMod", + "this": true, + "va": 7641306 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 120, + "off_abs": 128, + "size": 4, + "slot": null, + "tag": "TAcq", + "this": true, + "va": 7642078 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 124, + "off_abs": 132, + "size": 4, + "slot": null, + "tag": "TFAcq", + "this": true, + "va": 7642095 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614916, + "inner": "Game::StarSystem::OutputRates", + "kind": "object", + "off": 128, + "off_abs": 136, + "size": 28, + "slot": 40, + "tag": "Rts", + "this": true, + "type": "?$StreamableHelper@VOutputRates@StarSystem@Game@@@Mars", + "va": 7641225 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614932, + "inner": "Game::BuildQueue", + "kind": "object", + "off": 156, + "off_abs": 164, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "BQ", + "this": true, + "type": "?$StreamableHelper@VBuildQueue@Game@@@Mars", + "va": 7642489 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 160, + "off_abs": 168, + "size": 28, + "slot": null, + "tag": "Name", + "this": true, + "va": 7641782 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 188, + "off_abs": 196, + "size": 1, + "slot": null, + "tag": "Abdn", + "this": true, + "va": 7641249 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 189, + "off_abs": 197, + "size": 1, + "slot": null, + "tag": "Dstyd", + "this": true, + "va": 7641269 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 190, + "off_abs": 198, + "size": 1, + "slot": null, + "tag": "vnh", + "this": true, + "va": 7641691 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 191, + "off_abs": 199, + "size": 1, + "slot": null, + "tag": "vnd", + "this": true, + "va": 7641719 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 192, + "off_abs": 200, + "size": 1, + "slot": null, + "tag": "vnex3", + "this": true, + "va": 7641739 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 193, + "off_abs": 201, + "size": 1, + "slot": null, + "tag": "vnpex3", + "this": true, + "va": 7641759 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 196, + "off_abs": 204, + "size": 4, + "slot": 36, + "tag": "VFlags", + "this": true, + "va": 7641811 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 200, + "off_abs": 208, + "size": 4, + "slot": 36, + "tag": "EFlags", + "this": true, + "va": 7641834 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 204, + "off_abs": 212, + "size": 4, + "slot": 36, + "tag": "AFlags", + "this": true, + "va": 7641857 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 208, + "off_abs": 216, + "size": 4, + "slot": 36, + "tag": "FFlags", + "this": true, + "va": 7641880 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 212, + "off_abs": 220, + "size": 4, + "slot": 36, + "tag": "GFlags", + "this": true, + "va": 7641903 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 216, + "off_abs": 224, + "size": 4, + "slot": 36, + "tag": "MnRFlags", + "this": true, + "va": 7641972 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 220, + "off_abs": 228, + "size": 4, + "slot": 36, + "tag": "RfRFlags", + "this": true, + "va": 7641995 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 224, + "off_abs": 232, + "size": 4, + "slot": 36, + "tag": "ClkFlags", + "this": true, + "va": 7642018 + }, + { + "base": "edi", + "bytes": 8, + "helper": null, + "kind": "int64", + "off": 232, + "off_abs": 240, + "size": 8, + "slot": 48, + "tag": "Bats2", + "this": true, + "va": 7641926 + }, + { + "base": "edi", + "bytes": 8, + "helper": null, + "kind": "int64", + "off": 240, + "off_abs": 248, + "size": 8, + "slot": 48, + "tag": "rcex", + "this": true, + "va": 7641949 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 248, + "off_abs": 256, + "size": 4, + "slot": null, + "tag": "PID", + "this": true, + "va": 7642395 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 252, + "off_abs": 260, + "size": null, + "slot": 40, + "tag": "dcs", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 7642167 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 272, + "off_abs": 280, + "size": 4, + "slot": null, + "tag": "dsu", + "this": true, + "va": 7642191 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614884, + "inner": "Game::Morale", + "kind": "object", + "off": 276, + "off_abs": 284, + "size": 8, + "slot": 40, + "tag": "cm", + "this": true, + "type": "?$StreamableHelper@VMorale@Game@@@Mars", + "va": 7642241 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614980, + "inner": "Game::MoraleEvent", + "kind": "vector", + "off": 308, + "off_abs": 316, + "size": 16, + "slot": 40, + "tag": "cme2", + "this": true, + "type": "?$VectorHelper@VMoraleEvent@Game@@@Mars", + "va": 7642329 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614884, + "inner": "Game::Morale", + "kind": "object", + "off": 324, + "off_abs": 332, + "size": 8, + "slot": 40, + "tag": "PvCM", + "this": true, + "type": "?$StreamableHelper@VMorale@Game@@@Mars", + "va": 7642285 + }, + { + "alt_tags": [ + "Flt" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 356, + "off_abs": 364, + "size": 16, + "slot": null, + "tag": "NumFlts", + "this": true, + "va": 7642873 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 372, + "off_abs": 380, + "size": 4, + "slot": null, + "tag": "RepCur", + "this": true, + "va": 7641329 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 376, + "off_abs": 384, + "size": 4, + "slot": null, + "tag": "RepMax", + "this": true, + "va": 7641349 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 380, + "off_abs": 388, + "size": 4, + "slot": 36, + "tag": "EggScio", + "this": true, + "va": 7642041 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 384, + "off_abs": 392, + "size": 1, + "slot": null, + "tag": "NoRebAI", + "this": true, + "va": 7640866 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 385, + "off_abs": 393, + "size": 1, + "slot": null, + "tag": "PvNoRebAI", + "this": true, + "va": 7641175 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 388, + "off_abs": 396, + "size": 4, + "slot": null, + "tag": "Pop", + "this": true, + "va": 7640906 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 392, + "off_abs": 400, + "size": 4, + "slot": null, + "tag": "Infra", + "this": true, + "va": 7640978 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 396, + "off_abs": 404, + "size": 4, + "slot": null, + "tag": "pbon", + "this": true, + "va": 7641389 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 400, + "off_abs": 408, + "size": 4, + "slot": null, + "tag": "ibon", + "this": true, + "va": 7641463 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 404, + "off_abs": 412, + "size": 4, + "slot": 36, + "tag": "TerrFl", + "this": true, + "va": 7642064 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 408, + "off_abs": 416, + "size": null, + "slot": 40, + "tag": "Pop2", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 7640954 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 428, + "off_abs": 436, + "size": null, + "slot": 40, + "tag": "pbon2", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 7641439 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614964, + "inner": "Game::IndependenceInfo", + "kind": "object", + "off": 448, + "off_abs": 456, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "indi", + "this": true, + "type": "?$StreamableHelper@VIndependenceInfo@Game@@@Mars", + "va": 7644070 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 452, + "off_abs": 460, + "size": 16, + "slot": 40, + "tag": "spies2", + "this": true, + "type": "?$VectorHelper@H@Mars", + "va": 7642373 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 468, + "off_abs": 476, + "size": 4, + "slot": 36, + "tag": "rbfl", + "this": true, + "va": 7641512 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 472, + "off_abs": 480, + "size": 1, + "slot": null, + "tag": "hsrg", + "this": true, + "va": 7641595 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 476, + "off_abs": 484, + "size": 4, + "slot": null, + "tag": "adt", + "this": true, + "va": 7642651 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 504, + "off_abs": 512, + "size": 4, + "slot": null, + "tag": "PvPop", + "this": true, + "va": 7640998 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 508, + "off_abs": 516, + "size": 4, + "slot": null, + "tag": "PvInfra", + "this": true, + "va": 7641072 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 512, + "off_abs": 520, + "size": 4, + "slot": null, + "tag": "PvSuit", + "this": true, + "va": 7641092 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 516, + "off_abs": 524, + "size": 4, + "slot": null, + "tag": "PvRes", + "this": true, + "va": 7641112 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 520, + "off_abs": 528, + "size": 4, + "slot": null, + "tag": "PvARes2", + "this": true, + "va": 7641132 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 524, + "off_abs": 532, + "size": 4, + "slot": null, + "tag": "PvMRes", + "this": true, + "va": 7641155 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 528, + "off_abs": 536, + "size": null, + "slot": 40, + "tag": "PvPop2", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 7641048 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 560, + "off_abs": 568, + "size": 4, + "slot": null, + "tag": "DefF", + "this": true, + "va": 7642413 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 564, + "off_abs": 572, + "size": 4, + "slot": null, + "tag": "DefSF", + "this": true, + "va": 7642431 + }, + { + "alt_tags": [ + "GF" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 568, + "off_abs": 576, + "size": 16, + "slot": null, + "tag": "NumGFs", + "this": true, + "va": 7642982 + }, + { + "alt_tags": [ + "SnF" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 584, + "off_abs": 592, + "size": 16, + "slot": null, + "tag": "NumSnF", + "this": true, + "va": 7643084 + }, + { + "alt_tags": [ + "MnF" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 600, + "off_abs": 608, + "size": 16, + "slot": null, + "tag": "NumMnF", + "this": true, + "va": 7643190 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 620, + "off_abs": 628, + "size": 4, + "slot": null, + "tag": "PID", + "this": true, + "va": 7643331, + "via": "deref" + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 624, + "off_abs": 632, + "size": 4, + "slot": null, + "tag": "NVO", + "this": true, + "va": 7643282 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 640, + "off_abs": 648, + "size": 4, + "slot": null, + "tag": "NVE", + "this": true, + "va": 7643574 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 656, + "off_abs": 664, + "size": 4, + "slot": null, + "tag": "NVs", + "this": true, + "va": 7643768 + }, + { + "alt_tags": [ + "PlgT" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 672, + "off_abs": 680, + "size": 16, + "slot": null, + "tag": "NumPlgs2", + "this": true, + "va": 7642699 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 688, + "off_abs": 696, + "size": 4, + "slot": null, + "tag": "TnsOH", + "this": true, + "va": 7641289 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 692, + "off_abs": 700, + "size": 4, + "slot": null, + "tag": "TDst", + "this": true, + "va": 7642115 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 700, + "off_abs": 708, + "size": 4, + "slot": null, + "tag": "ntdev", + "this": true, + "va": 7641369 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 704, + "off_abs": 712, + "size": 4, + "slot": null, + "tag": "ltis", + "this": true, + "va": 7641483 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 708, + "off_abs": 716, + "size": 4, + "slot": null, + "tag": "rbtn", + "this": true, + "va": 7641529 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 712, + "off_abs": 720, + "size": 4, + "slot": 36, + "tag": "rbfr", + "this": true, + "va": 7641558 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 716, + "off_abs": 724, + "size": 4, + "slot": null, + "tag": "rbwn", + "this": true, + "va": 7641575 + } + ], + "gaps": [ + { + "after": "Pos", + "at": 24, + "bytes": 40 + }, + { + "after": "ClkFlags", + "at": 232, + "bytes": 4 + }, + { + "after": "cm", + "at": 284, + "bytes": 24 + }, + { + "after": "PvCM", + "at": 332, + "bytes": 24 + }, + { + "after": "adt", + "at": 484, + "bytes": 24 + }, + { + "after": "NumMnF", + "at": 608, + "bytes": 4 + }, + { + "after": "NVO", + "at": 632, + "bytes": 12 + }, + { + "after": "NVE", + "at": 648, + "bytes": 12 + }, + { + "after": "NVs", + "at": 664, + "bytes": 12 + }, + { + "after": "TDst", + "at": 700, + "bytes": 4 + } + ], + "grade": "partial", + "read": 7722160, + "read_agree": 43, + "read_comparable": 43, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 728, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "356": 4, + "568": 4, + "584": 4, + "600": 4, + "672": 4 + }, + "unsized_fields": 4, + "vftable": 10617916, + "why": "4 nested field(s) of unknown size", + "write": 7640624 + }, + "Game::ServerTradeManager": { + "class": "Game::ServerTradeManager", + "col_offset": 76, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9588656, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10686864, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9588656 + }, + "Game::ServerTradeManagerImpl": { + "class": "Game::ServerTradeManagerImpl", + "col_offset": 76, + "computed": [], + "elements": [ + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "TradeID", + "this": false, + "va": 8571863 + }, + { + "base": "edx", + "helper": null, + "helper_vftable": 10673996, + "inner": "Game::TradeSector", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Trade", + "this": false, + "type": "?$StreamableHelper@VTradeSector@Game@@@Mars", + "va": 8571899 + }, + { + "base": "edx", + "helper": null, + "helper_vftable": 10674012, + "inner": "Game::TradeRoute", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "rt", + "this": false, + "type": "?$StreamableHelper@VTradeRoute@Game@@@Mars", + "va": 8572011 + } + ], + "fields": [ + { + "base": "ebx", + "helper": 9149408, + "kind": "float", + "off": -68, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "SctSize", + "this": true, + "va": 8571936 + }, + { + "base": "ebx", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": -48, + "off_abs": 28, + "size": 16, + "slot": null, + "tag": "NumTradeSectors", + "this": true, + "va": 8571816 + } + ], + "gaps": [ + { + "after": "SctSize", + "at": 8, + "bytes": 16 + } + ], + "grade": "verified", + "read": 8751632, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "-48": 4, + "-16": 4 + }, + "unsized_fields": 0, + "vftable": 10689380, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8571744 + }, + "Game::ServerTradeSector": { + "class": "Game::ServerTradeSector", + "col_offset": 8, + "computed": [], + "elements": [ + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "tssys", + "this": false, + "va": 8571450 + } + ], + "fields": [ + { + "base": "ecx", + "from": 7501856, + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 96, + "off_abs": 104, + "size": 4, + "slot": null, + "tag": "tsgridID", + "this": true, + "va": 8571135 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 100, + "off_abs": 108, + "size": 12, + "slot": 40, + "tag": "tsctr", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 8571180 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 112, + "off_abs": 120, + "size": 16, + "slot": null, + "tag": "tsnumsys", + "this": true, + "va": 8571409 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 128, + "off_abs": 136, + "size": 4, + "slot": 36, + "tag": "tssec", + "this": true, + "va": 8571210 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 132, + "off_abs": 140, + "size": 4, + "slot": 36, + "tag": "tsct", + "this": true, + "va": 8571233 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 136, + "off_abs": 144, + "size": 4, + "slot": 36, + "tag": "tscr", + "this": true, + "va": 8571256 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 140, + "off_abs": 148, + "size": 4, + "slot": 36, + "tag": "ptssec", + "this": true, + "va": 8571279 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 144, + "off_abs": 152, + "size": 4, + "slot": 36, + "tag": "ptsct", + "this": true, + "va": 8571302 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 148, + "off_abs": 156, + "size": 4, + "slot": 36, + "tag": "ptscr", + "this": true, + "va": 8571325 + }, + { + "alt_tags": [ + "tsflt" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 152, + "off_abs": 160, + "size": 16, + "slot": null, + "tag": "tsnumflt", + "this": true, + "va": 8571488 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673980, + "inner": "Game::ServerTradeSector::FreighterWarning", + "kind": "vector", + "off": 168, + "off_abs": 176, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "fwarn", + "this": true, + "type": "?$VectorHelper@VFreighterWarning@ServerTradeSector@Game@@@Mars", + "va": 8571369 + } + ], + "gaps": [ + { + "after": "Pos", + "at": 24, + "bytes": 68 + } + ], + "grade": "verified", + "read": 8749712, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 180, + "sizeof_stride": 180, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "112": 4, + "152": 4 + }, + "unsized_fields": 0, + "vftable": 10689328, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8571072 + }, + "Game::ServerTradeSector::FreighterWarning": { + "class": "Game::ServerTradeSector::FreighterWarning", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "pid", + "this": true, + "va": 8493036 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "ntrns", + "this": true, + "va": 8493050 + } + ], + "gaps": [], + "grade": "verified", + "read": 8492928, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 12, + "sizeof_by": "container stride", + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": 12, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672216, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 8493008 + }, + "Game::ShipBuildOrder": { + "class": "Game::ShipBuildOrder", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "desID", + "this": true, + "va": 8468508 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "con", + "this": true, + "va": 8468522 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "sav", + "this": true, + "va": 8468556 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "conleft", + "this": true, + "va": 8468539 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "ordID", + "this": true, + "va": 8468582 + } + ], + "gaps": [], + "grade": "verified", + "read": 8468336, + "read_agree": 3, + "read_comparable": 3, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10535264, + "why": "fields exact; Read agrees on all 3 comparable offsets", + "write": 8468480 + }, + "Game::ShipBuildOrderDef": { + "class": "Game::ShipBuildOrderDef", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "desID", + "this": true, + "va": 8468508 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "con", + "this": true, + "va": 8468522 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "sav", + "this": true, + "va": 8468556 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "conleft", + "this": true, + "va": 8468539 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "ordID", + "this": true, + "va": 8468582 + } + ], + "gaps": [], + "grade": "verified", + "read": 8468336, + "read_agree": 3, + "read_comparable": 3, + "sizeof": 24, + "sizeof_by": "container stride", + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": 24, + "strides": {}, + "unsized_fields": 0, + "vftable": 10530056, + "why": "fields exact; Read agrees on all 3 comparable offsets; sizeof corroborated", + "write": 8468480 + }, + "Game::ShipDesign": { + "class": "Game::ShipDesign", + "col_offset": 156, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 8867312, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10692368, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 8867296 + }, + "Game::ShipDesignDef::LegacyGunBank": { + "class": "Game::ShipDesignDef::LegacyGunBank", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 8, + "sizeof_by": "container stride", + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": 8, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672956, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Game::ShipDesignDef::LegacyWeaponDef": { + "class": "Game::ShipDesignDef::LegacyWeaponDef", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -1, + "size": 1, + "slot": null, + "tag": "DWu", + "this": false, + "va": 8468862 + }, + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -1, + "size": 1, + "slot": null, + "tag": "DWu", + "this": false, + "va": 8468909 + }, + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": 8, + "size": 28, + "slot": null, + "tag": "DWf", + "this": false, + "va": 8468923 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "DWi", + "this": true, + "va": 8468876 + } + ], + "gaps": [], + "grade": "verified", + "read": 8675936, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674044, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8468816 + }, + "Game::ShipDesignDef::Section": { + "class": "Game::ShipDesignDef::Section", + "col_offset": 0, + "computed": [ + { + "helper": null, + "helper_vftable": 10594080, + "inner": "Game::ShipSectionID", + "kind": "object", + "slot": 40, + "tag": "DSec", + "type": "?$StreamableHelper@VShipSectionID@Game@@@Mars", + "unresolved": true, + "va": 8548815 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10672924, + "inner": "Game::ShipDesignDef::GunBank", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": "DGbnk2", + "this": true, + "type": "?$VectorHelper@VGunBank@ShipDesignDef@Game@@@Mars", + "va": 8548856 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10428048, + "inner": "String", + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": 40, + "tag": "DOpts", + "this": true, + "type": "?$VectorHelper@VString@Mars@@@Mars", + "va": 8548897 + } + ], + "gaps": [], + "grade": "clean", + "read": 8905616, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672972, + "why": "fields exact; sizeof is a lower bound only", + "write": 8548736 + }, + "Game::ShipHealth": { + "class": "Game::ShipHealth", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149408, + "kind": "float", + "off": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8470127 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 8470000, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": 16, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427984, + "why": "only container elements / computed values recovered", + "write": 8470096 + }, + "Game::ShipParams": { + "class": "Game::ShipParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 5701847 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5701860 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10476716, + "inner": "Game::ShipParams::Section", + "kind": "vector", + "off": 36, + "off_abs": 36, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VSection@ShipParams@Game@@@Mars", + "va": 5701899 + }, + { + "alt_tags": [ + ".", + "." + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 52, + "off_abs": 52, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 5701928 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5702013 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 72, + "off_abs": 72, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5702035 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 76, + "off_abs": 76, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5702051 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 80, + "off_abs": 80, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5702067 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 84, + "off_abs": 84, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5702083 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 88, + "off_abs": 88, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5702099 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10427984, + "inner": "Game::ShipHealth", + "kind": "object", + "off": 92, + "off_abs": 92, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VShipHealth@Game@@@Mars", + "va": 5702136 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10476732, + "inner": "Game::PrisonerHold", + "kind": "object", + "off": 108, + "off_abs": 108, + "size": 24, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VPrisonerHold@Game@@@Mars", + "va": 5702173 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 132, + "off_abs": 132, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 5702193 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 133, + "off_abs": 133, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 5702209 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 134, + "off_abs": 134, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 5702225 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 136, + "off_abs": 136, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5702241 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 140, + "off_abs": 140, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5702260 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 144, + "off_abs": 144, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5702285 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 148, + "off_abs": 148, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 5702299 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10476748, + "inner": "Game::WeaponGroups", + "kind": "object", + "off": 152, + "off_abs": 152, + "size": 12, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VWeaponGroups@Game@@@Mars", + "va": 5702355 + } + ], + "gaps": [], + "grade": "partial", + "read": 5707728, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 164, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "52": 8 + }, + "unsized_fields": 1, + "vftable": 10370440, + "why": "1 nested field(s) of unknown size", + "write": 5701792 + }, + "Game::ShipParams::Section": { + "class": "Game::ShipParams::Section", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 0, + "off_abs": 0, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 5701666 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10476700, + "inner": "Game::ShipParams::GunBank", + "kind": "vector", + "off": 56, + "off_abs": 56, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VGunBank@ShipParams@Game@@@Mars", + "va": 5701714 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372640, + "inner": "Game::CombatTechFlags", + "kind": "object", + "off": 72, + "off_abs": 72, + "size": 8, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@UCombatTechFlags@Game@@@Mars", + "va": 5701756 + } + ], + "gaps": [ + { + "after": ".", + "at": 0, + "bytes": 28 + } + ], + "grade": "unnamed", + "read": 5701408, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 80, + "sizeof_by": "container stride", + "sizeof_lower": 80, + "sizeof_stride": 80, + "sizeof_upper": null, + "sizeof_vectorstride": 80, + "strides": {}, + "unsized_fields": 0, + "vftable": 10476780, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5701616 + }, + "Game::ShipRecords": { + "class": "Game::ShipRecords", + "col_offset": 0, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "srnc", + "va": 8484549 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "srbd", + "unresolved": true, + "va": 8484675 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "sri", + "unresolved": true, + "va": 8484785 + } + ], + "elements": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -12, + "size": 4, + "slot": null, + "tag": "srb", + "this": false, + "va": 8484572 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "size": 4, + "slot": null, + "tag": "srk", + "this": false, + "va": 8484603 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "size": 4, + "slot": null, + "tag": "sri", + "this": false, + "va": 8484620 + } + ], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "srl", + "this": true, + "va": 8484586 + }, + { + "alt_tags": [ + "src", + "srb", + "srl" + ], + "base": "eax", + "helper": null, + "kind": "handle", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": 36, + "tag": "srd", + "this": true, + "va": 8484717, + "via": "deref" + } + ], + "gaps": [ + { + "after": "srl", + "at": 16, + "bytes": 32 + } + ], + "grade": "verified", + "read": 8741072, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": 68, + "sizeof_vectorstride": null, + "strides": { + "52": 20 + }, + "unsized_fields": 0, + "vftable": 10687564, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8484512 + }, + "Game::ShipSectionID": { + "class": "Game::ShipSectionID", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5696872 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5696883 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5696784, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10594080, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5696848 + }, + "Game::ShipWeapon": { + "class": "Game::ShipWeapon", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -1, + "size": 1, + "slot": null, + "tag": "bID", + "this": false, + "va": 5698687 + }, + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -1, + "size": 1, + "slot": null, + "tag": "bID", + "this": false, + "va": 5698722 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 0, + "off_abs": 0, + "size": 28, + "slot": null, + "tag": "wfn", + "this": true, + "va": 5698736 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": "wid", + "this": true, + "va": 5698701 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": 36, + "tag": "did", + "this": true, + "va": 5698762 + } + ], + "gaps": [], + "grade": "verified", + "read": 5706032, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10476684, + "why": "fields exact; Read agrees on all 2 comparable offsets", + "write": 5698640 + }, + "Game::SimpleNodePath": { + "class": "Game::SimpleNodePath", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 4, + "off_abs": 4, + "size": 2, + "slot": 36, + "tag": ".", + "this": true, + "va": 7218090 + }, + { + "base": "edi", + "helper": null, + "kind": "int16", + "off": 6, + "off_abs": 6, + "size": 2, + "slot": 36, + "tag": ".", + "this": true, + "va": 7218108 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7217968, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 8, + "sizeof_by": "container stride", + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": 8, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427856, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7218064 + }, + "Game::SlaversRefuelEncounterResult": { + "class": "Game::SlaversRefuelEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10426120, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::Slot": { + "class": "Game::Slot", + "col_offset": 0, + "computed": [ + { + "helper": null, + "helper_vftable": 10673004, + "inner": "Game::SlotDef", + "kind": "object", + "slot": 40, + "tag": ".", + "type": "?$StreamableHelper@VSlotDef@Game@@@Mars", + "unresolved": true, + "va": 8551553 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673020, + "inner": "Game::SlotUser", + "kind": "object", + "off": 188, + "off_abs": 188, + "size": 161, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VSlotUser@Game@@@Mars", + "va": 8551598 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 352, + "off_abs": 352, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8551626 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8551232, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 356, + "sizeof_stride": 356, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674236, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8551472 + }, + "Game::SlotDef": { + "class": "Game::SlotDef", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 0, + "off_abs": 0, + "size": 1, + "slot": null, + "tag": "IsPlay", + "this": true, + "va": 8550149 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 1, + "off_abs": 1, + "size": 1, + "slot": null, + "tag": "IsDead", + "this": true, + "va": 8550166 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 2, + "off_abs": 2, + "size": 1, + "slot": null, + "tag": "IsReq", + "this": true, + "va": 8550183 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 3, + "off_abs": 3, + "size": 1, + "slot": null, + "tag": "IsRec", + "this": true, + "va": 8550200 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": "IsFxNm", + "this": true, + "va": 8550220 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": "FxNm", + "this": true, + "va": 8550237 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 36, + "size": 1, + "slot": null, + "tag": "IsFxSp", + "this": true, + "va": 8550254 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": "FxSp", + "this": true, + "va": 8550280 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 44, + "off_abs": 44, + "size": 1, + "slot": null, + "tag": "IsFxCr", + "this": true, + "va": 8550294 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372656, + "inner": "Game::PlayerColorID", + "kind": "object", + "off": 48, + "off_abs": 48, + "size": 7, + "slot": 40, + "tag": "FxCrID", + "this": true, + "type": "?$StreamableHelper@UPlayerColorID@Game@@@Mars", + "va": 8550345 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 68, + "off_abs": 68, + "size": 1, + "slot": null, + "tag": "IsFxBd", + "this": true, + "va": 8550366 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 72, + "off_abs": 72, + "size": 28, + "slot": null, + "tag": "FxBd", + "this": true, + "va": 8550383 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 100, + "off_abs": 100, + "size": 1, + "slot": null, + "tag": "IsFxAv", + "this": true, + "va": 8550400 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 104, + "off_abs": 104, + "size": 28, + "slot": null, + "tag": "FxAv", + "this": true, + "va": 8550417 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 132, + "off_abs": 132, + "size": 4, + "slot": null, + "tag": "Team", + "this": true, + "va": 8550480 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 136, + "off_abs": 136, + "size": 4, + "slot": null, + "tag": "Tag", + "this": true, + "va": 8550440 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 140, + "off_abs": 140, + "size": 28, + "slot": null, + "tag": "Pwd", + "this": true, + "va": 8550460 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672988, + "inner": "Game::StrategyPlayerGameSettings", + "kind": "object", + "off": 168, + "off_abs": 168, + "size": 20, + "slot": 40, + "tag": "Settings", + "this": true, + "type": "?$StreamableHelper@VStrategyPlayerGameSettings@Game@@@Mars", + "va": 8550534 + } + ], + "gaps": [ + { + "after": "FxCrID", + "at": 48, + "bytes": 13 + } + ], + "grade": "verified", + "read": 8595344, + "read_agree": 15, + "read_comparable": 15, + "sizeof": 188, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 188, + "sizeof_stride": 188, + "sizeof_upper": 188, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10673004, + "why": "fields exact; Read agrees on all 15 comparable offsets; sizeof corroborated", + "write": 8550096 + }, + "Game::SlotUser": { + "class": "Game::SlotUser", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8550970 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8550987 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8550998 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8551012 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 16, + "off_abs": 16, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8551026 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8551040 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8551057 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372656, + "inner": "Game::PlayerColorID", + "kind": "object", + "off": 52, + "off_abs": 52, + "size": 7, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@UPlayerColorID@Game@@@Mars", + "va": 8551105 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 72, + "off_abs": 72, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8551130 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 100, + "off_abs": 100, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8551144 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 128, + "off_abs": 128, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8551161 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 132, + "off_abs": 132, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8551178 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 160, + "off_abs": 160, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8551198 + } + ], + "gaps": [ + { + "after": ".", + "at": 52, + "bytes": 13 + } + ], + "grade": "unnamed", + "read": 8550560, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 164, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 161, + "sizeof_stride": 161, + "sizeof_upper": 164, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10673020, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8550912 + }, + "Game::SpecialProject": { + "class": "Game::SpecialProject", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "SPid", + "this": true, + "va": 8472438 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "Sts", + "this": true, + "va": 8472464 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "Cst", + "this": true, + "va": 8472478 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "MxC", + "this": true, + "va": 8472495 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 20, + "off_abs": 20, + "size": 28, + "slot": null, + "tag": "Nm", + "this": true, + "va": 8472512 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": "Trns", + "this": true, + "va": 8472529 + } + ], + "gaps": [], + "grade": "verified", + "read": 8472256, + "read_agree": 5, + "read_comparable": 5, + "sizeof": 52, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 52, + "sizeof_stride": 52, + "sizeof_upper": 52, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10623288, + "why": "fields exact; Read agrees on all 5 comparable offsets; sizeof corroborated", + "write": 8472416 + }, + "Game::SpecialProjectImpl": { + "class": "Game::SpecialProjectImpl", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673068, + "inner": "Game::SpecialProject", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 52, + "slot": 40, + "tag": "SPi", + "this": true, + "type": "?$StreamableHelper@VSpecialProject@Game@@@Mars", + "va": 8554037 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "Stp", + "this": true, + "va": 8553998 + } + ], + "gaps": [], + "grade": "clean", + "read": 8553776, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 64, + "sizeof_stride": 64, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10684144, + "why": "fields exact; sizeof is a lower bound only", + "write": 8553936 + }, + "Game::SpecialProjectNameGen": { + "class": "Game::SpecialProjectNameGen", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NNms2", + "unresolved": true, + "va": 8472598 + }, + { + "const": 0, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "usnc", + "va": 8472715 + }, + { + "const": 0, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "usp", + "va": 8472753 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "usc", + "unresolved": true, + "va": 8472770 + }, + { + "helper": 9149808, + "kind": "string?", + "slot": null, + "tag": "Ntg", + "unresolved": true, + "va": 8472813 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149808, + "kind": "handle", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "Nm", + "this": true, + "va": 8472796, + "via": "deref" + } + ], + "gaps": [], + "grade": "clean", + "read": 8726880, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "4": 88 + }, + "unsized_fields": 0, + "vftable": 10692400, + "why": "fields exact; sizeof is a lower bound only", + "write": 8472544 + }, + "Game::SpeciesRatios": { + "class": "Game::SpeciesRatios", + "col_offset": 0, + "computed": [ + { + "const": 0, + "helper": null, + "kind": "const", + "slot": 36, + "tag": "sp", + "va": 5490264 + } + ], + "elements": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 1, + "size": 4, + "slot": null, + "tag": "nv", + "this": false, + "va": 5490232 + }, + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 0, + "size": 4, + "slot": null, + "tag": "va2", + "this": false, + "va": 5490278 + } + ], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 5493280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10458900, + "why": "only container elements / computed values recovered", + "write": 5490144 + }, + "Game::SpyCraft": { + "class": "Game::SpyCraft", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "sid", + "this": true, + "va": 8472925 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "sown", + "this": true, + "va": 8472945 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "atto", + "this": true, + "va": 8472965 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "deat", + "this": true, + "va": 8472985 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "tdep", + "this": true, + "va": 8472999 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "cbh", + "this": true, + "va": 8473016 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": 36, + "tag": "spyon", + "this": true, + "va": 8473076 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": 36, + "tag": "spyat", + "this": true, + "va": 8473096 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": "cm", + "this": true, + "va": 8473116 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "cmo", + "this": true, + "va": 8473130 + }, + { + "alt_tags": [ + "cpl" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 44, + "off_abs": 44, + "size": 16, + "slot": null, + "tag": "ncp", + "this": true, + "va": 8473159 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": null, + "tag": "sdo", + "this": true, + "va": 8473033 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "sdet", + "this": true, + "va": 8473050 + } + ], + "gaps": [], + "grade": "verified", + "read": 8617408, + "read_agree": 5, + "read_comparable": 5, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 68, + "sizeof_stride": 68, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "44": 4 + }, + "unsized_fields": 0, + "vftable": 10684184, + "why": "fields exact; Read agrees on all 5 comparable offsets", + "write": 8472896 + }, + "Game::SpyReport": { + "class": "Game::SpyReport", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "ebx", + "helper": null, + "helper_vftable": 10673132, + "inner": "Game::SpyReportDefences", + "kind": "object", + "off": 8, + "slot": 40, + "tag": "def", + "this": false, + "type": "?$StreamableHelper@VSpyReportDefences@Game@@@Mars", + "va": 8556341 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10673148, + "inner": "Game::SpyReportTrade", + "kind": "object", + "off": 8, + "slot": 40, + "tag": "strd", + "this": false, + "type": "?$StreamableHelper@VSpyReportTrade@Game@@@Mars", + "va": 8556443 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10673164, + "inner": "Game::SpyReportEvents", + "kind": "object", + "off": 8, + "slot": 40, + "tag": "evs", + "this": false, + "type": "?$StreamableHelper@VSpyReportEvents@Game@@@Mars", + "va": 8556544 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10673180, + "inner": "Game::SpyReportTechTree", + "kind": "object", + "off": 8, + "slot": 40, + "tag": "tt", + "this": false, + "type": "?$StreamableHelper@VSpyReportTechTree@Game@@@Mars", + "va": 8556651 + } + ], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "defc2", + "this": true, + "va": 8556287 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "rtc", + "this": true, + "va": 8556382 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "evc", + "this": true, + "va": 8556484 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "ttc", + "this": true, + "va": 8556585 + } + ], + "gaps": [ + { + "after": "defc2", + "at": 8, + "bytes": 8 + }, + { + "after": "rtc", + "at": 20, + "bytes": 8 + }, + { + "after": "evc", + "at": 32, + "bytes": 8 + } + ], + "grade": "clean", + "read": 8930256, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10693420, + "why": "fields exact; sizeof is a lower bound only", + "write": 8556224 + }, + "Game::SpyReportDefences": { + "class": "Game::SpyReportDefences", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "stn", + "this": true, + "va": 8555480 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10673100, + "inner": "Game::DefenceSummary", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 72, + "slot": 40, + "tag": "sdef", + "this": true, + "type": "?$StreamableHelper@VDefenceSummary@Game@@@Mars", + "va": 8555525 + } + ], + "gaps": [], + "grade": "verified", + "read": 8555280, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 80, + "sizeof_stride": 80, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687464, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8555424 + }, + "Game::SpyReportEvents": { + "class": "Game::SpyReportEvents", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "spl", + "this": true, + "va": 8556158 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": "ste", + "this": true, + "type": "?$VectorHelper@H@Mars", + "va": 8556197 + } + ], + "gaps": [], + "grade": "clean", + "read": 8555936, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10684332, + "why": "fields exact; sizeof is a lower bound only", + "write": 8556096 + }, + "Game::SpyReportTechTree": { + "class": "Game::SpyReportTechTree", + "col_offset": 0, + "computed": [ + { + "from": 5780656, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NumTechs", + "unresolved": true, + "va": 5780750 + }, + { + "base": "ebp", + "from": 5780656, + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "TNm", + "this": false, + "va": 5780905 + }, + { + "from": 5780656, + "helper": 9149808, + "kind": "string?", + "slot": null, + "tag": "TNm", + "unresolved": true, + "va": 5780969 + } + ], + "elements": [ + { + "base": "ebx", + "from": 5780656, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "St", + "this": false, + "va": 5780996 + }, + { + "base": "ebx", + "from": 5780656, + "helper": 9149776, + "kind": "int", + "off": 8, + "size": 4, + "slot": null, + "tag": "TResCost", + "this": false, + "va": 5781011 + }, + { + "base": "ebx", + "from": 5780656, + "helper": 9149776, + "kind": "int", + "off": 12, + "size": 4, + "slot": null, + "tag": "TResDone", + "this": false, + "va": 5781029 + }, + { + "base": "ebx", + "from": 5780656, + "helper": 9149776, + "kind": "int", + "off": 20, + "size": 4, + "slot": null, + "tag": "TAcq", + "this": false, + "va": 5781047 + }, + { + "base": "ebx", + "from": 5780656, + "helper": 9149776, + "kind": "int", + "off": 24, + "size": 4, + "slot": null, + "tag": "TiAcq", + "this": false, + "va": 5781065 + }, + { + "base": "ebx", + "from": 5780656, + "helper": null, + "kind": "int", + "off": 28, + "size": 4, + "slot": 36, + "tag": "Tbd", + "this": false, + "va": 5781092 + }, + { + "base": "ebx", + "from": 5780656, + "helper": 9149472, + "kind": "bool", + "off": 32, + "size": 1, + "slot": null, + "tag": "Tfc", + "this": false, + "va": 5781107 + }, + { + "base": "ebx", + "from": 5780656, + "helper": 9149776, + "kind": "int", + "off": 16, + "size": 4, + "slot": null, + "tag": "TUnlck", + "this": false, + "va": 5781125 + } + ], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "stn", + "this": true, + "va": 8473526 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "spl", + "this": true, + "va": 8473552 + } + ], + "gaps": [], + "grade": "verified", + "read": 8473408, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688692, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8473504 + }, + "Game::SpyReportTrade": { + "class": "Game::SpyReportTrade", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "stn", + "this": true, + "va": 8555816 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "spl", + "this": true, + "va": 8555842 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "sctr", + "this": true, + "va": 8555862 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673116, + "inner": "Game::SpyReportTradeRoute", + "kind": "vector", + "off": 16, + "off_abs": 16, + "size": 16, + "slot": 40, + "tag": "srt", + "this": true, + "type": "?$VectorHelper@VSpyReportTradeRoute@Game@@@Mars", + "va": 8555901 + } + ], + "gaps": [], + "grade": "verified", + "read": 8555552, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10687480, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 8555760 + }, + "Game::SpyReportTradeRoute": { + "class": "Game::SpyReportTradeRoute", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "stn", + "this": true, + "va": 8473271 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "sctr", + "this": true, + "va": 8473317 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "spl", + "this": true, + "va": 8473297 + }, + { + "alt_tags": [ + "sdg" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 16, + "off_abs": 16, + "size": 16, + "slot": null, + "tag": "sdgc", + "this": true, + "va": 8473343 + } + ], + "gaps": [], + "grade": "verified", + "read": 8620416, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 32, + "sizeof_by": "container stride", + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": 32, + "strides": { + "16": 4 + }, + "unsized_fields": 0, + "vftable": 10684316, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 8473248 + }, + "Game::StarFleet": { + "class": "Game::StarFleet", + "col_offset": 8, + "computed": [ + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -13, + "size": 1, + "slot": null, + "tag": "HFPlan", + "this": false, + "va": 7344354 + }, + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": 11, + "size": 1, + "slot": null, + "tag": "HLay", + "this": false, + "va": 7344735 + } + ], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10605452, + "inner": "Game::StarShip", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Ship", + "this": false, + "type": "?$StreamableHelper@VStarShip@Game@@@Mars", + "va": 7344928 + } + ], + "fields": [ + { + "base": "ecx", + "from": 7501856, + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 68, + "off_abs": 76, + "size": 12, + "slot": 40, + "tag": "PrvPos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7344684 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 80, + "off_abs": 88, + "size": 4, + "slot": null, + "tag": "PID", + "this": true, + "va": 7344301 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 84, + "off_abs": 92, + "size": 28, + "slot": null, + "tag": "FtName", + "this": true, + "va": 7344428 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 112, + "off_abs": 120, + "size": 1, + "slot": null, + "tag": "Perm", + "this": true, + "va": 7344637 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10605436, + "inner": "Game::FleetLayout", + "kind": "object", + "off": 116, + "off_abs": 124, + "size": null, + "slot": 40, + "tag": "Lay", + "this": true, + "type": "?$StreamableHelper@VFleetLayout@Game@@@Mars", + "va": 7344788 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 152, + "off_abs": 160, + "size": 4, + "slot": null, + "tag": "LocID", + "this": true, + "va": 7344319 + }, + { + "alt_tags": [ + "ShipID" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 156, + "off_abs": 164, + "size": 16, + "slot": null, + "tag": "NShips", + "this": true, + "va": 7344827 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10605420, + "inner": "Game::FlightPlan", + "kind": "object", + "off": 188, + "off_abs": 196, + "size": 56, + "slot": 40, + "tag": "FPlan", + "this": true, + "type": "?$StreamableHelper@VFlightPlan@Game@@@Mars", + "va": 7344407 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 244, + "off_abs": 252, + "size": 4, + "slot": 36, + "tag": "FtTrans", + "this": true, + "va": 7344457 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 248, + "off_abs": 256, + "size": 12, + "slot": 40, + "tag": "FtOrig", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7344501 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 260, + "off_abs": 268, + "size": 4, + "slot": 36, + "tag": "FtFlg", + "this": true, + "va": 7344531 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 264, + "off_abs": 272, + "size": 4, + "slot": 36, + "tag": "Ftae", + "this": true, + "va": 7344554 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 268, + "off_abs": 276, + "size": 4, + "slot": 36, + "tag": "Ftpae", + "this": true, + "va": 7344577 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 272, + "off_abs": 280, + "size": 4, + "slot": 36, + "tag": "FtEnc", + "this": true, + "va": 7344600 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 276, + "off_abs": 284, + "size": 4, + "slot": 36, + "tag": "FtMS", + "this": true, + "va": 7344623 + } + ], + "gaps": [ + { + "after": "Pos", + "at": 24, + "bytes": 40 + }, + { + "after": "NShips", + "at": 164, + "bytes": 16 + } + ], + "grade": "partial", + "read": 7349360, + "read_agree": 2, + "read_comparable": 2, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 288, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "156": 4 + }, + "unsized_fields": 1, + "vftable": 10606072, + "why": "1 nested field(s) of unknown size", + "write": 7344240 + }, + "Game::StarMapNode": { + "class": "Game::StarMapNode", + "col_offset": 8, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + } + ], + "gaps": [], + "grade": "clean", + "read": 7501712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10610208, + "why": "fields exact; sizeof is a lower bound only", + "write": 7501856 + }, + "Game::StarMapParams": { + "class": "Game::StarMapParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 7502413 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10609324, + "inner": "Game::SystemParams", + "kind": "vector", + "off": 8, + "off_abs": 8, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VSystemParams@Game@@@Mars", + "va": 7502446 + }, + { + "alt_tags": [ + "." + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": null, + "tag": ".", + "this": true, + "va": 7502475 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10603500, + "inner": "Game::SimpleNodePath", + "kind": "vector", + "off": 40, + "off_abs": 40, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VSimpleNodePath@Game@@@Mars", + "va": 7502593 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7574800, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 56, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": 56, + "sizeof_vectorstride": null, + "strides": { + "24": 16 + }, + "unsized_fields": 0, + "vftable": 10465960, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7502352 + }, + "Game::StarShip": { + "class": "Game::StarShip", + "col_offset": 8, + "computed": [ + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": 11, + "size": 1, + "slot": null, + "tag": "hbq", + "this": false, + "va": 8557573 + }, + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": -13, + "size": 1, + "slot": null, + "tag": "hsp", + "this": false, + "va": 8557661 + }, + { + "base": "ebp", + "helper": 9149408, + "kind": "float", + "off": -24, + "size": 4, + "slot": null, + "tag": "TH", + "this": false, + "va": 8557838 + }, + { + "base": "ebp", + "helper": 9149408, + "kind": "float", + "off": -28, + "size": 4, + "slot": null, + "tag": "THM", + "this": false, + "va": 8557855 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": 8, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "PlrID", + "this": true, + "va": 8557187, + "via": "deref" + }, + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": 12, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "DesID", + "this": true, + "va": 8557125, + "via": "deref" + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 24, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "Range", + "this": true, + "va": 8557201 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10427984, + "inner": "Game::ShipHealth", + "kind": "object", + "off": 28, + "off_abs": 36, + "size": null, + "slot": 40, + "tag": "Health", + "this": true, + "type": "?$StreamableHelper@VShipHealth@Game@@@Mars", + "va": 8557244 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "MineCap", + "this": true, + "va": 8557316 + }, + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 48, + "off_abs": 56, + "size": 16, + "slot": null, + "tag": "NTH", + "this": true, + "va": 8557793 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 64, + "off_abs": 72, + "size": 4, + "slot": 36, + "tag": "Plg", + "this": true, + "va": 8557342 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 68, + "off_abs": 76, + "size": 4, + "slot": 36, + "tag": "Act", + "this": true, + "va": 8557362 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 72, + "off_abs": 80, + "size": 1, + "slot": null, + "tag": "Dep", + "this": true, + "va": 8557376 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 73, + "off_abs": 81, + "size": 1, + "slot": null, + "tag": "Atq", + "this": true, + "va": 8557393 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 84, + "off_abs": 92, + "size": 4, + "slot": null, + "tag": "LCT", + "this": true, + "va": 8557481 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 88, + "off_abs": 96, + "size": 4, + "slot": null, + "tag": "tsd", + "this": true, + "va": 8557498 + }, + { + "base": "edi", + "helper": null, + "kind": "handle", + "off": 92, + "off_abs": 100, + "size": 4, + "slot": 36, + "tag": "FltID", + "this": true, + "va": 8557156, + "via": "deref" + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 96, + "off_abs": 104, + "size": 4, + "slot": null, + "tag": "ConCap", + "this": true, + "va": 8557265 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 100, + "off_abs": 108, + "size": 4, + "slot": null, + "tag": "RefCap", + "this": true, + "va": 8557282 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 104, + "off_abs": 112, + "size": 4, + "slot": null, + "tag": "RepCap", + "this": true, + "va": 8557299 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 116, + "off_abs": 124, + "size": 4, + "slot": 36, + "tag": "EncID", + "this": true, + "va": 8557419 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10476732, + "inner": "Game::PrisonerHold", + "kind": "object", + "off": 120, + "off_abs": 128, + "size": 24, + "slot": 40, + "tag": "PrisH", + "this": true, + "type": "?$StreamableHelper@VPrisonerHold@Game@@@Mars", + "va": 8557460 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614932, + "inner": "Game::BuildQueue", + "kind": "object", + "off": 144, + "off_abs": 152, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "BQ2", + "this": true, + "type": "?$StreamableHelper@VBuildQueue@Game@@@Mars", + "va": 8557628 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 148, + "off_abs": 156, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "pop", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 8557716 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 152, + "off_abs": 160, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "ppop", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 8557760 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 160, + "off_abs": 168, + "size": 4, + "slot": 36, + "tag": "atsp", + "this": true, + "va": 8557527 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 164, + "off_abs": 172, + "size": 4, + "slot": null, + "tag": "tblt", + "this": true, + "va": 8557544 + } + ], + "gaps": [ + { + "after": "DesID", + "at": 20, + "bytes": 8 + }, + { + "after": "Atq", + "at": 81, + "bytes": 10 + }, + { + "after": "RepCap", + "at": 112, + "bytes": 8 + }, + { + "after": "ppop", + "at": 160, + "bytes": 4 + } + ], + "grade": "partial", + "read": 8732576, + "read_agree": 10, + "read_comparable": 10, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 176, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "48": 8 + }, + "unsized_fields": 1, + "vftable": 10687496, + "why": "1 nested field(s) of unknown size", + "write": 8557040 + }, + "Game::StarSystem": { + "class": "Game::StarSystem", + "col_offset": 8, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + } + ], + "gaps": [], + "grade": "clean", + "read": 7501712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10617044, + "why": "fields exact; sizeof is a lower bound only", + "write": 7501856 + }, + "Game::StarSystem::OutputRates": { + "class": "Game::StarSystem::OutputRates", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": "SRt", + "this": true, + "va": 7623092 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "SRsc", + "this": true, + "va": 7623109 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "SRtf", + "this": true, + "va": 7623126 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "SRi", + "this": true, + "va": 7623146 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "SRoh", + "this": true, + "va": 7623163 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "SRs", + "this": true, + "va": 7623078 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "SRnr", + "this": true, + "va": 7623180 + } + ], + "gaps": [], + "grade": "verified", + "read": 7631520, + "read_agree": 7, + "read_comparable": 7, + "sizeof": 28, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": 28, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10614916, + "why": "fields exact; Read agrees on all 7 comparable offsets; sizeof corroborated", + "write": 7623056 + }, + "Game::StarSystem::PlayerView": { + "class": "Game::StarSystem::PlayerView", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149472, + "kind": "bool", + "off": 11, + "size": 1, + "slot": null, + "tag": "footer", + "this": false, + "va": 7640117 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "VTrn", + "this": true, + "va": 7639817 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "Pop", + "this": true, + "va": 7639834 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 16, + "off_abs": 16, + "size": null, + "slot": 40, + "tag": "Pop2", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 7639879 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "Infra", + "this": true, + "va": 7639900 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": "Suit", + "this": true, + "va": 7639917 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": "Res", + "this": true, + "va": 7639934 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": "ARes2", + "this": true, + "va": 7639951 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": "MRes", + "this": true, + "va": 7639971 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 56, + "off_abs": 56, + "size": 1, + "slot": null, + "tag": "NoRebAI", + "this": true, + "va": 7639988 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": null, + "tag": "pbon", + "this": true, + "va": 7640005 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 64, + "off_abs": 64, + "size": null, + "slot": 40, + "tag": "pbon2", + "this": true, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 7640053 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 84, + "off_abs": 84, + "size": 4, + "slot": null, + "tag": "ibon", + "this": true, + "va": 7640074 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 88, + "off_abs": 88, + "size": 4, + "slot": 36, + "tag": "TerrFl", + "this": true, + "va": 7640100 + } + ], + "gaps": [], + "grade": "partial", + "read": 7678704, + "read_agree": 10, + "read_comparable": 10, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 92, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 2, + "vftable": 10617260, + "why": "2 nested field(s) of unknown size", + "write": 7639760 + }, + "Game::StrategyAIAgent::DesignNameGen": { + "class": "Game::StrategyAIAgent::DesignNameGen", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "dnnc", + "unresolved": true, + "va": 7108598 + }, + { + "helper": 9149808, + "kind": "string?", + "slot": null, + "tag": "dnnm", + "unresolved": true, + "va": 7108695 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10594080, + "inner": "Game::ShipSectionID", + "kind": "object", + "off": 4, + "off_abs": 4, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "dnid", + "this": true, + "type": "?$StreamableHelper@VShipSectionID@Game@@@Mars", + "va": 7108667 + } + ], + "gaps": [], + "grade": "clean", + "read": 7130224, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "4": 36 + }, + "unsized_fields": 0, + "vftable": 10596644, + "why": "fields exact; sizeof is a lower bound only", + "write": 7108512 + }, + "Game::StrategyAIAgent::Streamable": { + "class": "Game::StrategyAIAgent::Streamable", + "col_offset": 0, + "computed": [ + { + "helper": null, + "helper_vftable": 10593968, + "inner": "Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap", + "kind": "object", + "slot": 40, + "tag": "AITurnPris", + "type": "?$StreamableHelper@V?$AIWeightMap@U?$StreamableEnum@W4AIPurposeID@Game@@@Mars@@@Game@@@Mars", + "unresolved": true, + "va": 7106433 + }, + { + "helper": null, + "helper_vftable": 10593904, + "inner": "Game::AISituation", + "kind": "object", + "slot": 40, + "tag": "AISit", + "type": "?$StreamableHelper@UAISituation@Game@@@Mars", + "unresolved": true, + "va": 7106477 + }, + { + "helper": null, + "helper_vftable": 10593984, + "inner": "Game::Mars::I::U?$StreamableEnum::?$AIWeightMap", + "kind": "object", + "slot": 40, + "tag": "AIPlyHat", + "type": "?$StreamableHelper@V?$AIWeightMap@U?$StreamableEnum@I@Mars@@@Game@@@Mars", + "unresolved": true, + "va": 7106521 + }, + { + "base": "ebp", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": -80, + "size": 16, + "slot": 40, + "tag": "nalat", + "this": false, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 7107269 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "lnat", + "unresolved": true, + "va": 7107319 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "lat", + "unresolved": true, + "va": 7107339 + }, + { + "const": 0, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "AINumSys", + "va": 7107542 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NumCL", + "unresolved": true, + "va": 7108005 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "CLTn", + "unresolved": true, + "va": 7108077 + }, + { + "helper": null, + "helper_vftable": 10594064, + "inner": "Game::AIAutoPeaceRun", + "kind": "vector", + "size": 16, + "slot": 40, + "tag": "apr", + "type": "?$VectorHelper@VAIAutoPeaceRun@Game@@@Mars", + "unresolved": true, + "va": 7108477 + } + ], + "elements": [ + { + "base": "eax", + "helper": null, + "helper_vftable": 10593952, + "inner": "Game::AttribMap", + "kind": "object", + "off": 36, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "AIAttr", + "this": false, + "type": "?$StreamableHelper@VAttribMap@Game@@@Mars", + "va": 7106389 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": "pid", + "this": false, + "va": 7106645 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 16, + "size": 16, + "slot": 40, + "tag": "trns", + "this": false, + "type": "?$VectorHelper@H@Mars", + "va": 7106690 + }, + { + "base": "eax", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 56, + "size": 16, + "slot": null, + "tag": "NBStab", + "this": false, + "va": 7106817 + }, + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": "BStabTn", + "this": false, + "va": 7106896 + }, + { + "base": "eax", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 72, + "size": 16, + "slot": null, + "tag": "NMBlst", + "this": false, + "va": 7106951 + }, + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": "MBlstTn", + "this": false, + "va": 7107028 + }, + { + "base": "eax", + "helper": null, + "helper_vftable": 10594000, + "inner": "Game::StrategyAIAgent::DesignNameGen", + "kind": "object", + "off": 836, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "AIDNG", + "this": false, + "type": "?$StreamableHelper@VDesignNameGen@StrategyAIAgent@Game@@@Mars", + "va": 7107103 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "AISysID", + "this": false, + "va": 7107727 + }, + { + "base": "eax", + "helper": null, + "helper_vftable": 10594016, + "inner": "Game::AISystem", + "kind": "object", + "off": 16, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "AISys", + "this": false, + "type": "?$StreamableHelper@VAISystem@Game@@@Mars", + "va": 7107769 + }, + { + "base": "eax", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 40, + "size": 16, + "slot": null, + "tag": "NCmbR", + "this": false, + "va": 7107850 + }, + { + "base": "edx", + "helper": null, + "helper_vftable": 10594032, + "inner": "Game::AICombatReport", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "CmbR", + "this": false, + "type": "?$StreamableHelper@VAICombatReport@Game@@@Mars", + "va": 7107937 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "CLSyID", + "this": false, + "va": 7108115 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "CLPlID", + "this": false, + "va": 7108147 + }, + { + "base": "eax", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 812, + "size": 16, + "slot": null, + "tag": "NPrv", + "this": false, + "va": 7108234 + }, + { + "base": "ebx", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "NPrvId", + "this": false, + "va": 7108276 + }, + { + "base": "ebx", + "helper": 9149408, + "kind": "float", + "off": 4, + "size": 4, + "slot": null, + "tag": "NPrvVa", + "this": false, + "va": 7108290 + }, + { + "base": "eax", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 316, + "size": 16, + "slot": null, + "tag": "NTecS", + "this": false, + "va": 7108345 + }, + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "TecS", + "this": false, + "va": 7108395 + } + ], + "fields": [ + { + "alt_tags": [ + "dsh", + "BStabPl", + "MBlstSy", + "AIHivJ", + "SDFlT", + "fct" + ], + "base": "edi", + "helper": null, + "helper_vftable": 10594048, + "inner": "Game::AIPlayerRequestStamp", + "kind": "vector", + "off": 4, + "off_abs": 4, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "prs2", + "this": true, + "type": "?$VectorHelper@VAIPlayerRequestStamp@Game@@@Mars", + "va": 7106567 + } + ], + "gaps": [], + "grade": "clean", + "read": 7114704, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10593820, + "why": "fields exact; sizeof is a lower bound only", + "write": 7106304 + }, + "Game::StrategyGameCreateParams": { + "class": "Game::StrategyGameCreateParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": "Name", + "this": true, + "va": 8564344 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": 36, + "tag": "ID", + "this": true, + "va": 8564370 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": "RSeed", + "this": true, + "va": 8564384 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 40, + "off_abs": 40, + "size": 28, + "slot": null, + "tag": "Key", + "this": true, + "va": 8564427 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673532, + "inner": "Game::StarMapParams", + "kind": "object", + "off": 68, + "off_abs": 68, + "size": 56, + "slot": 40, + "tag": "MapP", + "this": true, + "type": "?$StreamableHelper@VStarMapParams@Game@@@Mars", + "va": 8564478 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 124, + "off_abs": 124, + "size": 4, + "slot": 36, + "tag": "MapS", + "this": true, + "va": 8564505 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 128, + "off_abs": 128, + "size": 28, + "slot": null, + "tag": "MapF", + "this": true, + "va": 8564522 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 156, + "off_abs": 156, + "size": 4, + "slot": null, + "tag": "NSys", + "this": true, + "va": 8564542 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 160, + "off_abs": 160, + "size": 4, + "slot": null, + "tag": "REnc", + "this": true, + "va": 8564562 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 164, + "off_abs": 164, + "size": 4, + "slot": null, + "tag": "SDist", + "this": true, + "va": 8564582 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 168, + "off_abs": 168, + "size": 4, + "slot": null, + "tag": "SSize", + "this": true, + "va": 8564605 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 172, + "off_abs": 172, + "size": 4, + "slot": null, + "tag": "SRes", + "this": true, + "va": 8564625 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 176, + "off_abs": 176, + "size": 4, + "slot": null, + "tag": "SSuit", + "this": true, + "va": 8564645 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 180, + "off_abs": 180, + "size": 4, + "slot": null, + "tag": "MaxP", + "this": true, + "va": 8564665 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 184, + "off_abs": 184, + "size": 4, + "slot": 36, + "tag": "ASpec", + "this": true, + "va": 8564694 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 188, + "off_abs": 188, + "size": 1, + "slot": null, + "tag": "bAlly", + "this": true, + "va": 8564711 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 192, + "off_abs": 192, + "size": 4, + "slot": null, + "tag": "NTeam", + "this": true, + "va": 8564731 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 196, + "off_abs": 196, + "size": 1, + "slot": null, + "tag": "tmgrp", + "this": true, + "va": 8564751 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 204, + "off_abs": 204, + "size": 4, + "slot": null, + "tag": "PSav", + "this": true, + "va": 8564771 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 208, + "off_abs": 208, + "size": 4, + "slot": null, + "tag": "PCol", + "this": true, + "va": 8564794 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 212, + "off_abs": 212, + "size": 4, + "slot": null, + "tag": "PTech", + "this": true, + "va": 8564814 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 216, + "off_abs": 216, + "size": 4, + "slot": 36, + "tag": "AID", + "this": true, + "va": 8564413 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 220, + "off_abs": 220, + "size": 4, + "slot": null, + "tag": "IncM", + "this": true, + "va": 8564834 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 224, + "off_abs": 224, + "size": 4, + "slot": null, + "tag": "ResM", + "this": true, + "va": 8564854 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673548, + "inner": "Game::StrategyScriptParams", + "kind": "object", + "off": 228, + "off_abs": 228, + "size": 12, + "slot": 40, + "tag": "scrp", + "this": true, + "type": "?$StreamableHelper@VStrategyScriptParams@Game@@@Mars", + "va": 8564908 + } + ], + "gaps": [ + { + "after": "tmgrp", + "at": 196, + "bytes": 7 + } + ], + "grade": "verified", + "read": 8596672, + "read_agree": 19, + "read_comparable": 19, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 240, + "sizeof_stride": 240, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10638708, + "why": "fields exact; Read agrees on all 19 comparable offsets", + "write": 8564288 + }, + "Game::StrategyGameInfo": { + "class": "Game::StrategyGameInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 32, + "off_abs": 32, + "size": 28, + "slot": null, + "tag": "GameName", + "this": true, + "va": 8559000 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": null, + "tag": "Turn", + "this": true, + "va": 8559017 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "NumSys", + "this": true, + "va": 8559034 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "Checksum", + "this": true, + "va": 8559051 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 72, + "off_abs": 72, + "size": 4, + "slot": 36, + "tag": "MapShape", + "this": true, + "va": 8559181 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673196, + "inner": "Game::StrategyPlayerInfo", + "kind": "vector", + "off": 76, + "off_abs": 76, + "size": 16, + "slot": 40, + "tag": "Players", + "this": true, + "type": "?$VectorHelper@VStrategyPlayerInfo@Game@@@Mars", + "va": 8559102 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673212, + "inner": "Game::StrategySessionParams", + "kind": "object", + "off": 92, + "off_abs": 92, + "size": 24, + "slot": 40, + "tag": "Session", + "this": true, + "type": "?$StreamableHelper@VStrategySessionParams@Game@@@Mars", + "va": 8559147 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 116, + "off_abs": 116, + "size": 4, + "slot": null, + "tag": "IncMod", + "this": true, + "va": 8559195 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 120, + "off_abs": 120, + "size": 4, + "slot": null, + "tag": "ResMod", + "this": true, + "va": 8559212 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 124, + "off_abs": 124, + "size": 1, + "slot": null, + "tag": "Alliances", + "this": true, + "va": 8559229 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 125, + "off_abs": 125, + "size": 1, + "slot": null, + "tag": "Teams", + "this": true, + "va": 8559246 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 126, + "off_abs": 126, + "size": 1, + "slot": null, + "tag": "Encounters", + "this": true, + "va": 8559266 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 128, + "off_abs": 128, + "size": 28, + "slot": null, + "tag": "Scenario", + "this": true, + "va": 8559283 + } + ], + "gaps": [], + "grade": "verified", + "read": 8871088, + "read_agree": 10, + "read_comparable": 10, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 156, + "sizeof_stride": 156, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10517408, + "why": "fields exact; Read agrees on all 10 comparable offsets", + "write": 8558944 + }, + "Game::StrategyGameLoadParams": { + "class": "Game::StrategyGameLoadParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7784079 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10633652, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7784064 + }, + "Game::StrategyGameLoader::CustomDataTable": { + "class": "Game::StrategyGameLoader::CustomDataTable", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NumIDs", + "unresolved": true, + "va": 8825347 + }, + { + "helper": 9149808, + "kind": "string?", + "slot": null, + "tag": "ID", + "unresolved": true, + "va": 8825409 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 8849824, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10691536, + "why": "only container elements / computed values recovered", + "write": 8825296 + }, + "Game::StrategyGameParams": { + "class": "Game::StrategyGameParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8565259 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673276, + "inner": "Game::StrategyGameCreateParams", + "kind": "object", + "off": 260, + "off_abs": 260, + "size": 240, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyGameCreateParams@Game@@@Mars", + "va": 8565340 + } + ], + "gaps": [ + { + "after": ".", + "at": 4, + "bytes": 252 + } + ], + "grade": "unnamed", + "read": 8564944, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 500, + "sizeof_stride": 500, + "sizeof_upper": 284, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10639100, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8565200 + }, + "Game::StrategyHostParams": { + "class": "Game::StrategyHostParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 44, + "off_abs": 44, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8565989 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 48, + "off_abs": 48, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8566017 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 76, + "off_abs": 76, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8566003 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673580, + "inner": "Game::StrategyGameParams", + "kind": "object", + "off": 80, + "off_abs": 80, + "size": 500, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyGameParams@Game@@@Mars", + "va": 8566065 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673212, + "inner": "Game::StrategySessionParams", + "kind": "object", + "off": 364, + "off_abs": 364, + "size": 24, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategySessionParams@Game@@@Mars", + "va": 8566110 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8565696, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 580, + "sizeof_stride": 580, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10639248, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8565936 + }, + "Game::StrategyLaunchParams": { + "class": "Game::StrategyLaunchParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "from": 7784064, + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7784079 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10673516, + "inner": "Game::StrategySimParams", + "kind": "object", + "off": 32, + "off_abs": 32, + "size": 524, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategySimParams@Game@@@Mars", + "va": 8564003 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8563792, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 556, + "sizeof_stride": 556, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10627616, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8563920 + }, + "Game::StrategyPlayerGameSettings": { + "class": "Game::StrategyPlayerGameSettings", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8483747 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8483761 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8483775 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8483798 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8483632, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10515268, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8483728 + }, + "Game::StrategyPlayerInfo": { + "class": "Game::StrategyPlayerInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10673004, + "inner": "Game::SlotDef", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 188, + "slot": 40, + "tag": "Slot", + "this": true, + "type": "?$StreamableHelper@VSlotDef@Game@@@Mars", + "va": 8558881 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 192, + "off_abs": 192, + "size": 4, + "slot": null, + "tag": "Rank", + "this": true, + "va": 8558912 + } + ], + "gaps": [], + "grade": "verified", + "read": 8558624, + "read_agree": 1, + "read_comparable": 1, + "sizeof": 196, + "sizeof_by": "container stride", + "sizeof_lower": 196, + "sizeof_stride": 196, + "sizeof_upper": null, + "sizeof_vectorstride": 196, + "strides": {}, + "unsized_fields": 0, + "vftable": 10516440, + "why": "fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated", + "write": 8558800 + }, + "Game::StrategyPlayerParams": { + "class": "Game::StrategyPlayerParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8566530 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8566544 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 32, + "off_abs": 32, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8566558 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 36, + "off_abs": 36, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8566572 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8566589 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8566612 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372656, + "inner": "Game::PlayerColorID", + "kind": "object", + "off": 72, + "off_abs": 72, + "size": 7, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@UPlayerColorID@Game@@@Mars", + "va": 8566654 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 92, + "off_abs": 92, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8566672 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 120, + "off_abs": 120, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8566686 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 148, + "off_abs": 148, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8566703 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10672988, + "inner": "Game::StrategyPlayerGameSettings", + "kind": "object", + "off": 152, + "off_abs": 152, + "size": 20, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyPlayerGameSettings@Game@@@Mars", + "va": 8566754 + } + ], + "gaps": [ + { + "after": ".", + "at": 72, + "bytes": 13 + } + ], + "grade": "unnamed", + "read": 8566144, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 172, + "sizeof_by": "container stride", + "sizeof_lower": 172, + "sizeof_stride": 172, + "sizeof_upper": null, + "sizeof_vectorstride": 172, + "strides": {}, + "unsized_fields": 0, + "vftable": 10674364, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8566480 + }, + "Game::StrategyScriptParams": { + "class": "Game::StrategyScriptParams", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "size": 28, + "slot": null, + "tag": "spsn", + "this": false, + "va": 8564092 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 36, + "size": 28, + "slot": null, + "tag": "sppn", + "this": false, + "va": 8564109 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 64, + "size": 28, + "slot": null, + "tag": "sppv", + "this": false, + "va": 8564126 + } + ], + "fields": [ + { + "base": "ebx", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "spc", + "this": true, + "va": 8564062 + } + ], + "gaps": [], + "grade": "clean", + "read": 8850112, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10638192, + "why": "fields exact; sizeof is a lower bound only", + "write": 8564032 + }, + "Game::StrategyServer": { + "class": "Game::StrategyServer", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NMSz", + "unresolved": true, + "va": 7994107 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NMnx", + "unresolved": true, + "va": 7994141 + }, + { + "from": 7949520, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "PlayerIDs", + "unresolved": true, + "va": 7951680 + }, + { + "from": 7949520, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "DesignIDs", + "unresolved": true, + "va": 7951779 + }, + { + "from": 7949520, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "SystemIDs", + "unresolved": true, + "va": 7951884 + }, + { + "from": 7949520, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "FleetIDs", + "unresolved": true, + "va": 7951977 + }, + { + "from": 7949520, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "ShipIDs", + "unresolved": true, + "va": 7952070 + }, + { + "from": 7949520, + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "TradeIDs", + "unresolved": true, + "va": 7952163 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "invtb", + "unresolved": true, + "va": 7995061 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "AllExc", + "unresolved": true, + "va": 7995110 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "AllExc", + "unresolved": true, + "va": 7995249 + }, + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "AllExcCF", + "unresolved": true, + "va": 7995390 + }, + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "ISsp", + "this": false, + "va": 7995747 + }, + { + "base": "ebp", + "helper": 9149408, + "kind": "float", + "off": -56, + "size": 4, + "slot": null, + "tag": "ISsu", + "this": false, + "va": 7995764 + } + ], + "elements": [ + { + "base": "eax", + "from": 7949520, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 7951737 + }, + { + "base": "eax", + "from": 7949520, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 7951842 + }, + { + "base": "eax", + "from": 7949520, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 7951935 + }, + { + "base": "eax", + "from": 7949520, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 7952028 + }, + { + "base": "eax", + "from": 7949520, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 7952121 + }, + { + "base": "eax", + "from": 7949520, + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 7952217 + }, + { + "base": "ebx", + "helper": null, + "helper_vftable": 10632356, + "inner": "Game::CombatReport", + "kind": "object", + "off": 8, + "slot": 40, + "tag": "crep", + "this": false, + "type": "?$StreamableHelper@VCombatReport@Game@@@Mars", + "va": 7994907 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "AllExc", + "this": false, + "va": 7995170 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "AllExc", + "this": false, + "va": 7995204 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "AllExc", + "this": false, + "va": 7995311 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "AllExc", + "this": false, + "va": 7995345 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": "AllExcCFp", + "this": false, + "va": 7995455 + }, + { + "base": "eax", + "helper": null, + "kind": "int", + "off": 4, + "size": 4, + "slot": 36, + "tag": "AllExcCFp", + "this": false, + "va": 7995489 + }, + { + "base": "eax", + "helper": null, + "helper_vftable": 10632372, + "inner": "Game::ServerPlayer", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Player", + "this": false, + "type": "?$StreamableHelper@VServerPlayer@Game@@@Mars", + "va": 7995623 + }, + { + "base": "eax", + "helper": null, + "helper_vftable": 10632388, + "inner": "Game::StarSystem", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Sys", + "this": false, + "type": "?$StreamableHelper@VStarSystem@Game@@@Mars", + "va": 7995936 + }, + { + "base": "eax", + "helper": null, + "helper_vftable": 10632420, + "inner": "Game::StarFleet", + "kind": "object", + "off": 0, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Flt", + "this": false, + "type": "?$StreamableHelper@VStarFleet@Game@@@Mars", + "va": 7996224 + } + ], + "fields": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "ModCount", + "this": true, + "va": 7994169 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "Frame", + "this": true, + "va": 7994186 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "GOTurn", + "this": true, + "va": 7994445 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": "GameID", + "this": true, + "va": 7994212 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10363960, + "inner": "enum:uint", + "kind": "vector", + "off": 24, + "off_abs": 24, + "size": 16, + "slot": 40, + "tag": "GOWinPly", + "this": true, + "type": "?$VectorHelper@U?$StreamableEnum@I@Mars@@@Mars", + "va": 7994492 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 40, + "off_abs": 40, + "size": 28, + "slot": null, + "tag": "GameName", + "this": true, + "va": 7994319 + }, + { + "alt_tags": [ + "SysID" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 68, + "off_abs": 68, + "size": 16, + "slot": null, + "tag": "NumSys", + "this": true, + "va": 7995841 + }, + { + "alt_tags": [ + "PlayerID" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 84, + "off_abs": 84, + "size": 16, + "slot": null, + "tag": "NumPlrs", + "this": true, + "va": 7995533 + }, + { + "alt_tags": [ + "FltID" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 100, + "off_abs": 100, + "size": 16, + "slot": null, + "tag": "NumFlts", + "this": true, + "va": 7996133 + }, + { + "alt_tags": [ + "Act" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 116, + "off_abs": 116, + "size": 16, + "slot": null, + "tag": "NumActs", + "this": true, + "va": 7996280 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 156, + "off_abs": 156, + "size": 4, + "slot": null, + "tag": "NMLc", + "this": true, + "va": 7994124 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 188, + "off_abs": 188, + "size": 4, + "slot": 36, + "tag": "Map", + "this": true, + "va": 7994348 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 192, + "off_abs": 192, + "size": 4, + "slot": null, + "tag": "IncMod", + "this": true, + "va": 7994365 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 196, + "off_abs": 196, + "size": 4, + "slot": null, + "tag": "ResMod", + "this": true, + "va": 7994385 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 200, + "off_abs": 200, + "size": 1, + "slot": null, + "tag": "EnAl", + "this": true, + "va": 7994405 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 201, + "off_abs": 201, + "size": 1, + "slot": null, + "tag": "EnTm", + "this": true, + "va": 7994425 + }, + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 308, + "off_abs": 308, + "size": 28, + "slot": null, + "tag": "KeyPath", + "this": true, + "va": 7994031 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10632404, + "inner": "Game::ServerNodeGraph", + "kind": "object", + "off": 340, + "off_abs": 340, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "NdGr2", + "this": true, + "type": "?$StreamableHelper@VServerNodeGraph@Game@@@Mars", + "va": 7996012 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10632468, + "inner": "Game::ServerTradeManager", + "kind": "object", + "off": 344, + "off_abs": 344, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "trdmgr", + "this": true, + "type": "?$StreamableHelper@VServerTradeManager@Game@@@Mars", + "va": 7996056 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10632484, + "inner": "Game::IServerSpyManager", + "kind": "object", + "off": 348, + "off_abs": 348, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "spymgr", + "this": true, + "type": "?$StreamableHelper@VIServerSpyManager@Game@@@Mars", + "va": 7996100 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10632340, + "inner": "Game::SpecialProjectNameGen", + "kind": "object", + "off": 352, + "off_abs": 352, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "sprjs", + "this": true, + "type": "?$StreamableHelper@VSpecialProjectNameGen@Game@@@Mars", + "va": 7994709 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10593952, + "inner": "Game::AttribMap", + "kind": "object", + "off": 356, + "off_abs": 356, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "Attrib", + "this": true, + "type": "?$StreamableHelper@VAttribMap@Game@@@Mars", + "va": 7994254 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10632436, + "inner": "RNG", + "kind": "object", + "off": 364, + "off_abs": 364, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "RNG", + "this": true, + "type": "?$StreamableHelper@VRNG@Mars@@@Mars", + "va": 7994298 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 416, + "off_abs": 416, + "size": 4, + "slot": null, + "tag": "RandEncAdj", + "this": true, + "va": 7994733 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10509736, + "inner": "Game::SVScriptObject", + "kind": "object", + "off": 436, + "off_abs": 436, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "SvSctOb", + "this": true, + "type": "?$StreamableHelper@VSVScriptObject@Game@@@Mars", + "va": 7996390 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 440, + "off_abs": 440, + "size": 4, + "slot": null, + "tag": "NPCm", + "this": true, + "va": 7994516 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 444, + "off_abs": 444, + "size": 4, + "slot": null, + "tag": "NPCo", + "this": true, + "va": 7994536 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 448, + "off_abs": 448, + "size": 4, + "slot": null, + "tag": "NPCi", + "this": true, + "va": 7994556 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 452, + "off_abs": 452, + "size": 4, + "slot": null, + "tag": "NPCv", + "this": true, + "va": 7994576 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 456, + "off_abs": 456, + "size": 4, + "slot": null, + "tag": "NPCa", + "this": true, + "va": 7994599 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 460, + "off_abs": 460, + "size": 4, + "slot": null, + "tag": "szadj", + "this": true, + "va": 7994619 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 464, + "off_abs": 464, + "size": 4, + "slot": null, + "tag": "rsadj", + "this": true, + "va": 7994639 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 468, + "off_abs": 468, + "size": 4, + "slot": null, + "tag": "suadj", + "this": true, + "va": 7994659 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 504, + "off_abs": 504, + "size": 4, + "slot": 36, + "tag": "cmbtid", + "this": true, + "va": 7994762 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "handle", + "off": 508, + "off_abs": 508, + "size": 4, + "slot": null, + "tag": "numcreps", + "this": true, + "va": 7994839, + "via": "deref" + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10632452, + "inner": "Game::GameTurnHistory", + "kind": "object", + "off": 512, + "off_abs": 512, + "ptr": true, + "size": 4, + "slot": 40, + "tag": "turnstats", + "this": true, + "type": "?$StreamableHelper@VGameTurnHistory@Game@@@Mars", + "va": 7994806 + }, + { + "alt_tags": [ + "invs", + "inve", + "invt", + "zdsi", + "zdst" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 712, + "off_abs": 712, + "size": 16, + "slot": null, + "tag": "ninv", + "this": true, + "va": 7994965 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 796, + "off_abs": 796, + "size": 4, + "slot": null, + "tag": "zdsc", + "this": true, + "va": 7996427 + } + ], + "gaps": [ + { + "after": "NumActs", + "at": 116, + "bytes": 24 + }, + { + "after": "NMLc", + "at": 156, + "bytes": 28 + }, + { + "after": "EnTm", + "at": 201, + "bytes": 106 + }, + { + "after": "KeyPath", + "at": 308, + "bytes": 4 + }, + { + "after": "Attrib", + "at": 356, + "bytes": 4 + }, + { + "after": "RNG", + "at": 364, + "bytes": 48 + }, + { + "after": "RandEncAdj", + "at": 416, + "bytes": 16 + }, + { + "after": "suadj", + "at": 468, + "bytes": 32 + }, + { + "after": "turnstats", + "at": 512, + "bytes": 196 + }, + { + "after": "ninv", + "at": 712, + "bytes": 68 + } + ], + "grade": "verified", + "read": 8202144, + "read_agree": 18, + "read_comparable": 18, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 800, + "sizeof_stride": 800, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "68": 4, + "84": 4, + "100": 4, + "116": 4, + "140": 20, + "712": 16 + }, + "unsized_fields": 0, + "vftable": 10641540, + "why": "fields exact; Read agrees on all 18 comparable offsets", + "write": 7993968 + }, + "Game::StrategySessionParams": { + "class": "Game::StrategySessionParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10535072, + "inner": "Game::StrategyTimerParams", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 20, + "slot": 40, + "tag": "TMRS", + "this": true, + "type": "?$StreamableHelper@VStrategyTimerParams@Game@@@Mars", + "va": 8565675 + } + ], + "gaps": [], + "grade": "clean", + "read": 8565376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 24, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": 24, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10515876, + "why": "fields exact; sizeof corroborated", + "write": 8565600 + }, + "Game::StrategySimParams": { + "class": "Game::StrategySimParams", + "col_offset": 0, + "computed": [ + { + "helper": null, + "helper_vftable": 10673212, + "inner": "Game::StrategySessionParams", + "kind": "object", + "slot": 40, + "tag": ".", + "type": "?$StreamableHelper@VStrategySessionParams@Game@@@Mars", + "unresolved": true, + "va": 8567136 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673580, + "inner": "Game::StrategyGameParams", + "kind": "object", + "off": 24, + "off_abs": 24, + "size": 500, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VStrategyGameParams@Game@@@Mars", + "va": 8567102 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673596, + "inner": "Game::StrategyPlayerParams", + "kind": "vector", + "off": 308, + "off_abs": 308, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@VStrategyPlayerParams@Game@@@Mars", + "va": 8567176 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 8566784, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 524, + "sizeof_stride": 524, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10673516, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8567024 + }, + "Game::StrategyTimerParams": { + "class": "Game::StrategyTimerParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "TSTL", + "this": true, + "va": 8483830 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "TCTL", + "this": true, + "va": 8483847 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "TQTL", + "this": true, + "va": 8483864 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TQTLE", + "this": true, + "va": 8483881 + } + ], + "gaps": [], + "grade": "verified", + "read": 8519744, + "read_agree": 4, + "read_comparable": 4, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 20, + "sizeof_stride": 20, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10515252, + "why": "fields exact; Read agrees on all 4 comparable offsets", + "write": 8483808 + }, + "Game::StrategyTurnInfo": { + "class": "Game::StrategyTurnInfo", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8479712 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8479726 + } + ], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8479625 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479647 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479661 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479675 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479689 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479740 + } + ], + "gaps": [ + { + "after": ".", + "at": 4, + "bytes": 12 + }, + { + "after": ".", + "at": 32, + "bytes": 12 + } + ], + "grade": "unnamed", + "read": 8479424, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 52, + "sizeof_stride": 52, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10671840, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 8479600 + }, + "Game::StrategyUserInfo": { + "class": "Game::StrategyUserInfo", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 8479843 + }, + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479857 + }, + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 33, + "off_abs": 33, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8479871 + } + ], + "gaps": [], + "grade": "partial", + "read": 8479760, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 36, + "sizeof_by": "container stride", + "sizeof_lower": 37, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": 36, + "strides": {}, + "unsized_fields": 0, + "vftable": 10623272, + "why": "2 field(s) via an untyped sub-writer", + "write": 8479824 + }, + "Game::SwarmEncounterParams": { + "class": "Game::SwarmEncounterParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10426188, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::SwarmEncounterResult": { + "class": "Game::SwarmEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5284955 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5284972 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10427984, + "inner": "Game::ShipHealth", + "kind": "object", + "off": 16, + "off_abs": 16, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VShipHealth@Game@@@Mars", + "va": 5285014 + } + ], + "gaps": [], + "grade": "partial", + "read": 5284704, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 1, + "vftable": 10426204, + "why": "1 nested field(s) of unknown size", + "write": 5284896 + }, + "Game::SwarmQueenEncounterResult": { + "class": "Game::SwarmQueenEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427032, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::SystemEvent": { + "class": "Game::SystemEvent", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "ses", + "this": true, + "va": 8489425 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "set", + "this": true, + "va": 8489405 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "seop", + "this": true, + "va": 8489445 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "senp", + "this": true, + "va": 8489465 + }, + { + "alt_tags": [ + "seot2" + ], + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 20, + "off_abs": 20, + "size": 16, + "slot": null, + "tag": "seno2", + "this": true, + "va": 8489491 + } + ], + "gaps": [], + "grade": "clean", + "read": 8625712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 36, + "sizeof_by": "container stride", + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": 36, + "strides": { + "20": 4 + }, + "unsized_fields": 0, + "vftable": 10634156, + "why": "fields exact; sizeof corroborated", + "write": 8489376 + }, + "Game::SystemKillerEncounterResult": { + "class": "Game::SystemKillerEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427424, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::SystemParams": { + "class": "Game::SystemParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 12, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7502244 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 16, + "off_abs": 16, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7502269 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 7502283 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 7502297 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 7502311 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 7501952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 56, + "sizeof_stride": 56, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10607084, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7502160 + }, + "Game::TacReport": { + "class": "Game::TacReport", + "col_offset": 0, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "TRnc", + "va": 4558868 + } + ], + "elements": [ + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": -12, + "size": 4, + "slot": null, + "tag": "TRships", + "this": false, + "va": 4558892 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "size": 4, + "slot": null, + "tag": "TRshipsL", + "this": false, + "va": 4558923 + } + ], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "TRid", + "this": true, + "va": 4558589 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "TRal", + "this": true, + "va": 4558609 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372704, + "inner": "Game::TacReportEvents", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": 29, + "slot": 40, + "tag": "TRby", + "this": true, + "type": "?$StreamableHelper@VTacReportEvents@Game@@@Mars", + "va": 4558514 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10372704, + "inner": "Game::TacReportEvents", + "kind": "object", + "off": 44, + "off_abs": 44, + "size": 29, + "slot": 40, + "tag": "TRto", + "this": true, + "type": "?$StreamableHelper@VTacReportEvents@Game@@@Mars", + "va": 4558555 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 88, + "off_abs": 88, + "size": 4, + "slot": null, + "tag": "TRsats", + "this": true, + "va": 4558906 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 112, + "off_abs": 112, + "size": 4, + "slot": null, + "tag": "TRbal", + "this": true, + "va": 4558623 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 116, + "off_abs": 116, + "size": 4, + "slot": null, + "tag": "TRlas", + "this": true, + "va": 4558640 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 120, + "off_abs": 120, + "size": 4, + "slot": null, + "tag": "TRmis", + "this": true, + "va": 4558657 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 124, + "off_abs": 124, + "size": 4, + "slot": null, + "tag": "TRmin", + "this": true, + "va": 4558674 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 128, + "off_abs": 128, + "size": 4, + "slot": null, + "tag": "TRnrg", + "this": true, + "va": 4558697 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 132, + "off_abs": 132, + "size": 4, + "slot": null, + "tag": "TRbio", + "this": true, + "va": 4558717 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 136, + "off_abs": 136, + "size": 4, + "slot": null, + "tag": "TRbrd", + "this": true, + "va": 4558737 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 140, + "off_abs": 140, + "size": 1, + "slot": null, + "tag": "TRsld", + "this": true, + "va": 4558757 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 141, + "off_abs": 141, + "size": 1, + "slot": null, + "tag": "TRsldd", + "this": true, + "va": 4558780 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 142, + "off_abs": 142, + "size": 1, + "slot": null, + "tag": "TRsldc", + "this": true, + "va": 4558800 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 143, + "off_abs": 143, + "size": 1, + "slot": null, + "tag": "TRsldi", + "this": true, + "va": 4558820 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 144, + "off_abs": 144, + "size": 1, + "slot": null, + "tag": "TRsldr", + "this": true, + "va": 4558840 + } + ], + "gaps": [ + { + "after": "TRto", + "at": 44, + "bytes": 15 + }, + { + "after": "TRsats", + "at": 88, + "bytes": 20 + } + ], + "grade": "verified", + "read": 4557824, + "read_agree": 13, + "read_comparable": 13, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 145, + "sizeof_stride": 145, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10372608, + "why": "fields exact; Read agrees on all 13 comparable offsets", + "write": 4558432 + }, + "Game::TacReportEvents": { + "class": "Game::TacReportEvents", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": "TREhd", + "this": true, + "va": 4548070 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "TREhi", + "this": true, + "va": 4548087 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "TREd", + "this": true, + "va": 4548104 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "TREdp", + "this": true, + "va": 4548121 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "TREdi", + "this": true, + "va": 4548141 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "TREdt", + "this": true, + "va": 4548158 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 28, + "off_abs": 28, + "size": 1, + "slot": null, + "tag": "TREb", + "this": true, + "va": 4548175 + } + ], + "gaps": [], + "grade": "verified", + "read": 4547904, + "read_agree": 7, + "read_comparable": 7, + "sizeof": 32, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 29, + "sizeof_stride": 29, + "sizeof_upper": 32, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10372592, + "why": "fields exact; Read agrees on all 7 comparable offsets; sizeof corroborated", + "write": 4548048 + }, + "Game::TechOffer": { + "class": "Game::TechOffer", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "tch", + "this": false, + "va": 8731042 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "giv", + "this": true, + "va": 8730945 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8730965 + } + ], + "gaps": [], + "grade": "clean", + "read": 8730608, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "container stride", + "sizeof_lower": 12, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": 16, + "strides": {}, + "unsized_fields": 0, + "vftable": 10632516, + "why": "fields exact; sizeof corroborated", + "write": 8730880 + }, + "Game::TechOfferProject": { + "class": "Game::TechOfferProject", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "from": 8729488, + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "Tch", + "this": false, + "va": 8729720 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 8729488, + "helper": null, + "helper_vftable": 10673068, + "inner": "Game::SpecialProject", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 52, + "slot": 40, + "tag": "SPi", + "this": true, + "type": "?$StreamableHelper@VSpecialProject@Game@@@Mars", + "va": 8729593 + }, + { + "base": "edi", + "from": 8729488, + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "Stp", + "this": true, + "va": 8729554 + }, + { + "base": "edi", + "from": 8729488, + "helper": 9149408, + "kind": "float", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "AOdd", + "this": true, + "va": 8729686 + }, + { + "base": "edi", + "from": 8729488, + "helper": 9149408, + "kind": "float", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "AInc", + "this": true, + "va": 8729703 + }, + { + "base": "edi", + "from": 8729488, + "helper": 9149776, + "kind": "int", + "off": 76, + "off_abs": 76, + "size": 4, + "slot": null, + "tag": "RCst", + "this": true, + "va": 8729737 + }, + { + "base": "edi", + "from": 8729488, + "helper": 9149776, + "kind": "int", + "off": 80, + "off_abs": 80, + "size": 4, + "slot": null, + "tag": "RDn", + "this": true, + "va": 8729757 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 84, + "off_abs": 84, + "size": 4, + "slot": 36, + "tag": "giv", + "this": true, + "va": 8730082 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 88, + "off_abs": 88, + "size": 4, + "slot": 36, + "tag": "rcp", + "this": true, + "va": 8730102 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 92, + "off_abs": 92, + "size": 1, + "slot": null, + "tag": "rcpd2", + "this": true, + "va": 8730116 + } + ], + "gaps": [ + { + "after": "AInc", + "at": 68, + "bytes": 4 + } + ], + "grade": "verified", + "read": 8729904, + "read_agree": 5, + "read_comparable": 5, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 93, + "sizeof_stride": 93, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688644, + "why": "fields exact; Read agrees on all 5 comparable offsets", + "write": 8730048 + }, + "Game::TechProject": { + "class": "Game::TechProject", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "Tch", + "this": false, + "va": 8729720 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10673068, + "inner": "Game::SpecialProject", + "kind": "object", + "off": 8, + "off_abs": 8, + "size": 52, + "slot": 40, + "tag": "SPi", + "this": true, + "type": "?$StreamableHelper@VSpecialProject@Game@@@Mars", + "va": 8729593 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 60, + "off_abs": 60, + "size": 4, + "slot": 36, + "tag": "Stp", + "this": true, + "va": 8729554 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 64, + "off_abs": 64, + "size": 4, + "slot": null, + "tag": "AOdd", + "this": true, + "va": 8729686 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 68, + "off_abs": 68, + "size": 4, + "slot": null, + "tag": "AInc", + "this": true, + "va": 8729703 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 76, + "off_abs": 76, + "size": 4, + "slot": null, + "tag": "RCst", + "this": true, + "va": 8729737 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 80, + "off_abs": 80, + "size": 4, + "slot": null, + "tag": "RDn", + "this": true, + "va": 8729757 + } + ], + "gaps": [ + { + "after": "AInc", + "at": 68, + "bytes": 4 + } + ], + "grade": "verified", + "read": 8729216, + "read_agree": 4, + "read_comparable": 4, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 84, + "sizeof_stride": 84, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10688564, + "why": "fields exact; Read agrees on all 4 comparable offsets", + "write": 8729488 + }, + "Game::TechTree": { + "class": "Game::TechTree", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": "NumTechs", + "unresolved": true, + "va": 5804302 + }, + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "TNm", + "this": false, + "va": 5804458 + }, + { + "helper": 9149808, + "kind": "string?", + "slot": null, + "tag": "TNm", + "unresolved": true, + "va": 5804508 + }, + { + "base": "ebp", + "helper": 9149808, + "kind": "string", + "off": -44, + "size": 28, + "slot": null, + "tag": "TNm", + "this": false, + "va": 5804678 + }, + { + "helper": 9149808, + "kind": "string?", + "slot": null, + "tag": "TNm", + "unresolved": true, + "va": 5804721 + } + ], + "elements": [ + { + "base": "edi", + "count_of": true, + "helper": 9149776, + "kind": "vector", + "off": 4, + "size": 16, + "slot": null, + "tag": "NumBrs", + "this": false, + "va": 5804537 + } + ], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 5802256, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10486696, + "why": "only container elements / computed values recovered", + "write": 5804192 + }, + "Game::TradeRoute": { + "class": "Game::TradeRoute", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": "tro", + "this": true, + "va": 8492652 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "trfow", + "this": true, + "va": 8492666 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": "trfr", + "this": true, + "va": 8492683 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": "trfrs", + "this": true, + "va": 8492709 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": null, + "tag": "trtow", + "this": true, + "va": 8492723 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": "trto", + "this": true, + "va": 8492740 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": 36, + "tag": "trtos", + "this": true, + "va": 8492766 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "trtc", + "this": true, + "va": 8492780 + } + ], + "gaps": [], + "grade": "verified", + "read": 8521936, + "read_agree": 5, + "read_comparable": 5, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10672200, + "why": "fields exact; Read agrees on all 5 comparable offsets", + "write": 8492624 + }, + "Game::TradeSector": { + "class": "Game::TradeSector", + "col_offset": 8, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10364056, + "inner": "Vector3", + "kind": "object", + "off": 16, + "off_abs": 24, + "size": 12, + "slot": 40, + "tag": "Pos", + "this": true, + "type": "?$StreamableHelper@VVector3@Mars@@@Mars", + "va": 7501931 + } + ], + "gaps": [], + "grade": "clean", + "read": 7501712, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10685612, + "why": "fields exact; sizeof is a lower bound only", + "write": 7501856 + }, + "Game::TurnCommands": { + "class": "Game::TurnCommands", + "col_offset": 0, + "computed": [], + "elements": [ + { + "base": "ebx", + "from": 8531104, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8531131 + }, + { + "base": "esi", + "from": 8531104, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8531167 + }, + { + "base": "ebx", + "from": 8578000, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8578061 + }, + { + "base": "esi", + "from": 8578000, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8578095 + }, + { + "base": "esi", + "from": 8578000, + "helper": null, + "helper_vftable": 10614916, + "inner": "Game::StarSystem::OutputRates", + "kind": "object", + "off": 12, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VOutputRates@StarSystem@Game@@@Mars", + "va": 8578137 + }, + { + "base": "esi", + "from": 8643920, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8643948 + }, + { + "base": "ebx", + "from": 8643920, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8643987 + }, + { + "base": "ebx", + "count_of": true, + "from": 8643920, + "helper": null, + "kind": "vector", + "off": 12, + "size": 16, + "slot": 36, + "tag": ".", + "this": false, + "va": 8644010 + }, + { + "base": "edx", + "from": 8643920, + "helper": null, + "kind": "int", + "off": 0, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8644039 + }, + { + "base": "ebx", + "from": 8530512, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530539 + }, + { + "base": "esi", + "from": 8530512, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8530575 + }, + { + "base": "esi", + "from": 8530512, + "helper": 9149472, + "kind": "bool", + "off": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": false, + "va": 8530586 + }, + { + "base": "ebx", + "from": 8530704, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530731 + }, + { + "base": "esi", + "from": 8530704, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8530767 + }, + { + "base": "esi", + "from": 8530704, + "helper": null, + "kind": "int", + "off": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8530784 + }, + { + "base": "esi", + "from": 8530704, + "helper": 9149472, + "kind": "bool", + "off": 16, + "size": 1, + "slot": null, + "tag": ".", + "this": false, + "va": 8530795 + }, + { + "base": "ebx", + "from": 8530816, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530843 + }, + { + "base": "esi", + "from": 8530816, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8530879 + }, + { + "base": "esi", + "from": 8530816, + "helper": 9149776, + "kind": "int", + "off": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530890 + }, + { + "base": "esi", + "from": 8530816, + "helper": 9149776, + "kind": "int", + "off": 16, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530904 + }, + { + "base": "edi", + "from": 8530928, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530955 + }, + { + "base": "esi", + "from": 8530928, + "helper": 9149776, + "kind": "int", + "off": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8530985 + }, + { + "base": "ebx", + "from": 8578944, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8579005 + }, + { + "base": "esi", + "from": 8578944, + "helper": null, + "kind": "int", + "off": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": false, + "va": 8579039 + }, + { + "base": "esi", + "from": 8578944, + "helper": null, + "helper_vftable": 10614900, + "inner": "Game::Population", + "kind": "object", + "off": 12, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VPopulation@Game@@@Mars", + "va": 8579081 + }, + { + "base": "ebx", + "from": 8579328, + "helper": 9149776, + "kind": "int", + "off": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": false, + "va": 8579389 + }, + { + "base": "esi", + "from": 8579328, + "helper": null, + "helper_vftable": 10673740, + "inner": "Game::RaidTargets", + "kind": "object", + "off": 8, + "slot": 40, + "tag": ".", + "this": false, + "type": "?$StreamableHelper@VRaidTargets@Game@@@Mars", + "va": 8579448 + } + ], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8660348 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660381 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 12, + "off_abs": 12, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660359 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660420 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 20, + "off_abs": 20, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660398 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660459 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 28, + "off_abs": 28, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660473 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 32, + "off_abs": 32, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660437 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 36, + "off_abs": 36, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660512 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 8660535 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 44, + "off_abs": 44, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660490 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 48, + "off_abs": 48, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660568 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 52, + "off_abs": 52, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660582 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 8660596 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 60, + "off_abs": 60, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660546 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10673772, + "inner": "Game::CivilianRatios", + "kind": "object", + "off": 64, + "off_abs": 64, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VCivilianRatios@Game@@@Mars", + "va": 8660659 + }, + { + "base": "edi", + "helper": 9149472, + "kind": "bool", + "off": 108, + "off_abs": 108, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 8660613 + } + ], + "gaps": [], + "grade": "partial", + "read": 8989408, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 109, + "sizeof_stride": null, + "sizeof_upper": 436, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 1, + "vftable": 10640896, + "why": "1 nested field(s) of unknown size", + "write": 8660288 + }, + "Game::UpdateData": { + "class": "Game::UpdateData", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527555 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527569 + }, + { + "base": "esi", + "helper": null, + "kind": "opaque", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4527583 + } + ], + "gaps": [], + "grade": "partial", + "read": 4527472, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370788, + "why": "1 field(s) via an untyped sub-writer", + "write": 4527536 + }, + "Game::VNFinsolEncounterResult": { + "class": "Game::VNFinsolEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427648, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::VNHomeEncounterParams": { + "class": "Game::VNHomeEncounterParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5243817 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5243834 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5243851 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 20, + "off_abs": 20, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5243868 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 24, + "off_abs": 24, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5243885 + }, + { + "base": "edi", + "helper": 9149536, + "kind": "int64", + "off": 32, + "off_abs": 32, + "size": 8, + "slot": null, + "tag": ".", + "this": true, + "va": 5243896 + } + ], + "gaps": [ + { + "after": ".", + "at": 24, + "bytes": 4 + } + ], + "grade": "unnamed", + "read": 5243584, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427704, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5243792 + }, + "Game::VNHomeEncounterResult": { + "class": "Game::VNHomeEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5244025 + }, + { + "base": "esi", + "helper": 9149536, + "kind": "int64", + "off": 16, + "off_abs": 16, + "size": 8, + "slot": null, + "tag": ".", + "this": true, + "va": 5244036 + } + ], + "gaps": [ + { + "after": ".", + "at": 8, + "bytes": 4 + } + ], + "grade": "unnamed", + "read": 5243920, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 24, + "sizeof_stride": 24, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427720, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5244000 + }, + "Game::VonNeumannEncounterParams": { + "class": "Game::VonNeumannEncounterParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5218291 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5233952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427672, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5218272 + }, + "Game::VonNeumannEncounterResult": { + "class": "Game::VonNeumannEncounterResult", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5243545 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 5243556 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5243440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10427688, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5243520 + }, + "Game::WeaponGroups": { + "class": "Game::WeaponGroups", + "col_offset": 0, + "computed": [ + { + "const": 3, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "wgng", + "va": 5700944 + }, + { + "const": 0, + "helper": 9149776, + "kind": "const", + "slot": null, + "tag": "wgid", + "va": 5700974 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10364024, + "inner": "Game::GunBankSelection", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": 8, + "slot": 40, + "tag": "wgb", + "this": true, + "type": "?$StreamableHelper@VGunBankSelection@Game@@@Mars", + "va": 5701023 + } + ], + "gaps": [], + "grade": "clean", + "read": 5700592, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10370144, + "why": "fields exact; sizeof is a lower bound only", + "write": 5700880 + }, + "Game::XenoTechsPerSpecies": { + "class": "Game::XenoTechsPerSpecies", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 5493265 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 5493152, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 4, + "sizeof_stride": 4, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10372688, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 5493232 + }, + "Game::ZuulInfestation": { + "class": "Game::ZuulInfestation", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": "PlgSys", + "this": true, + "va": 5464564 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": 36, + "tag": "PlgCByF", + "this": true, + "va": 5464605 + }, + { + "base": "edi", + "helper": 8479888, + "kind": "handle", + "off": 16, + "off_abs": 16, + "size": 4, + "slot": null, + "tag": "PlgCBy", + "this": true, + "va": 5464579 + }, + { + "base": "edi", + "bytes": 8, + "helper": null, + "kind": "int64", + "off": 24, + "off_abs": 24, + "size": 8, + "slot": 48, + "tag": "PlgNZ", + "this": true, + "va": 5464625 + }, + { + "base": "edi", + "helper": 9149408, + "kind": "float", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": "PlgZdr", + "this": true, + "va": 5464639 + } + ], + "gaps": [ + { + "after": "PlgCBy", + "at": 16, + "bytes": 4 + } + ], + "grade": "verified", + "read": 5464416, + "read_agree": 1, + "read_comparable": 1, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10456240, + "why": "fields exact; Read agrees on all 1 comparable offsets", + "write": 5464544 + }, + "Mars::DecalFile": { + "class": "Mars::DecalFile", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9054256, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10711424, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 6261440 + }, + "Mars::DirectionAttractorProxy": { + "class": "Mars::DirectionAttractorProxy", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9538912, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10757360, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9539232 + }, + "Mars::FNMBase": { + "class": "Mars::FNMBase", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9454992, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754628, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455552 + }, + "Mars::FNMChunk": { + "class": "Mars::FNMChunk", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9455552, + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "from": 9455552, + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455850 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455864 + }, + { + "base": "esi", + "helper": null, + "kind": "raw", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": 48, + "tag": ".", + "this": true, + "va": 9455888 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9455312, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754608, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455824 + }, + "Mars::FNMChunkReply": { + "class": "Mars::FNMChunkReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9454992, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754728, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455552 + }, + "Mars::FNMDone": { + "class": "Mars::FNMDone", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9455552, + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "from": 9455552, + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 9455935 + }, + { + "base": "edi", + "helper": null, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 9455952 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9455120, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 44, + "sizeof_stride": 44, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754668, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455904 + }, + "Mars::FNMDoneReply": { + "class": "Mars::FNMDoneReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9454992, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754748, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455552 + }, + "Mars::FNMError": { + "class": "Mars::FNMError", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9455552, + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "from": 9455552, + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 36, + "off_abs": 36, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455993 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9455248, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 64, + "sizeof_stride": 64, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754688, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455968 + }, + "Mars::FNMSendNotify": { + "class": "Mars::FNMSendNotify", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9455552, + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "from": 9455552, + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + }, + { + "base": "esi", + "helper": null, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": 36, + "tag": ".", + "this": true, + "va": 9455711 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9455040, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 40, + "sizeof_stride": 40, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754648, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455680 + }, + "Mars::FNMSendReply": { + "class": "Mars::FNMSendReply", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9455649 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 32, + "off_abs": 32, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9455663 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9454992, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 36, + "sizeof_stride": 36, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10754708, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9455552 + }, + "Mars::IStreamable": { + "class": "Mars::IStreamable", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9588656, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10363580, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9588656 + }, + "Mars::LaunchParams": { + "class": "Mars::LaunchParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149808, + "kind": "string", + "off": 4, + "off_abs": 4, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 7784079 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 32, + "sizeof_stride": 32, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10371384, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 7784064 + }, + "Mars::NMCommand": { + "class": "Mars::NMCommand", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": ".", + "unresolved": true, + "va": 9248511 + } + ], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": null, + "helper_vftable": 10371012, + "inner": "Command", + "kind": "object", + "off": 4, + "off_abs": 4, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VCommand@Mars@@@Mars", + "va": 9248559 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9248288, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10720888, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9248448 + }, + "Mars::NMLoad": { + "class": "Mars::NMLoad", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10720840, + "inner": "SyncParams", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VSyncParams@Mars@@@Mars", + "va": 9248180 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10720856, + "inner": "LaunchParams", + "kind": "object", + "off": 52, + "off_abs": 52, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VLaunchParams@Mars@@@Mars", + "va": 9248222 + }, + { + "base": "edi", + "helper": 9149776, + "kind": "int", + "off": 56, + "off_abs": 56, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9248247 + } + ], + "gaps": [], + "grade": "partial", + "read": 9247856, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 60, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 1, + "vftable": 10720948, + "why": "1 nested field(s) of unknown size", + "write": 9248096 + }, + "Mars::NMSyncCheck": { + "class": "Mars::NMSyncCheck", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": null, + "helper_vftable": 10720872, + "inner": "SyncChecksumBuffer", + "kind": "object", + "off": 4, + "off_abs": 4, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VSyncChecksumBuffer@Mars@@@Mars", + "va": 9248840 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9248592, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10720908, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9248768 + }, + "Mars::NMSyncError": { + "class": "Mars::NMSyncError", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "ecx", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9247423 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9247376, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10720928, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9247408 + }, + "Mars::ParticleAttractor": { + "class": "Mars::ParticleAttractor", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9539440, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10757388, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9539776 + }, + "Mars::ParticleChannel": { + "class": "Mars::ParticleChannel", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9565680, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10758628, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9565248 + }, + "Mars::ParticleEmitter": { + "class": "Mars::ParticleEmitter", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9297280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "124": 4 + }, + "unsized_fields": 0, + "vftable": 10722716, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9294864 + }, + "Mars::ParticleSystem": { + "class": "Mars::ParticleSystem", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9117360, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "196": 4, + "228": 4 + }, + "unsized_fields": 0, + "vftable": 10713136, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9115440 + }, + "Mars::ParticleTracker": { + "class": "Mars::ParticleTracker", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9287248, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": { + "336": 4, + "384": 4 + }, + "unsized_fields": 0, + "vftable": 10722448, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9284960 + }, + "Mars::PointAttractorProxy": { + "class": "Mars::PointAttractorProxy", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [], + "gaps": [], + "grade": "empty", + "read": 9538384, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10757332, + "why": "serializer writes no tagged field (default/stub Write)", + "write": 9538704 + }, + "Mars::RNG": { + "class": "Mars::RNG", + "col_offset": 0, + "computed": [ + { + "base": "ebp", + "bytes": 2500, + "helper": null, + "kind": "raw", + "off": -2504, + "size": 4, + "slot": 48, + "tag": ".", + "this": false, + "va": 9333992 + } + ], + "elements": [], + "fields": [], + "gaps": [], + "grade": "partial", + "read": 9333808, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10394348, + "why": "only container elements / computed values recovered", + "write": 9333920 + }, + "Mars::SyncChecksumBuffer": { + "class": "Mars::SyncChecksumBuffer", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4388693 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 4388707 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10364072, + "inner": "int", + "kind": "vector", + "off": 12, + "off_abs": 12, + "size": 16, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$VectorHelper@H@Mars", + "va": 4388755 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9469536, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": 28, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10755668, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 4388640 + }, + "Mars::SyncParams": { + "class": "Mars::SyncParams", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 4, + "off_abs": 4, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 9469267 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 5, + "off_abs": 5, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 9469281 + }, + { + "base": "esi", + "helper": 9149808, + "kind": "string", + "off": 8, + "off_abs": 8, + "size": 28, + "slot": null, + "tag": ".", + "this": true, + "va": 9469340 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 36, + "off_abs": 36, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9469326 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 40, + "off_abs": 40, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9469295 + }, + { + "base": "esi", + "helper": 9149776, + "kind": "int", + "off": 44, + "off_abs": 44, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9469309 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9469136, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 48, + "sizeof_stride": 48, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10755684, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9469248 + }, + "Mars::TNMConnect": { + "class": "Mars::TNMConnect", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426692 + }, + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426734 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 20, + "off_abs": 20, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9427162 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 28, + "off_abs": 28, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9427204 + } + ], + "gaps": [], + "grade": "partial", + "read": 9426880, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 4, + "vftable": 10751440, + "why": "4 nested field(s) of unknown size", + "write": 9427072 + }, + "Mars::TNMDisconnect": { + "class": "Mars::TNMDisconnect", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426692 + }, + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426734 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 20, + "off_abs": 20, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426851 + } + ], + "gaps": [], + "grade": "partial", + "read": 9427232, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 3, + "vftable": 10751420, + "why": "3 nested field(s) of unknown size", + "write": 9426768 + }, + "Mars::TNMHost": { + "class": "Mars::TNMHost", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426692 + }, + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426734 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 20, + "off_abs": 20, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426851 + } + ], + "gaps": [], + "grade": "partial", + "read": 9427232, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 3, + "vftable": 10751400, + "why": "3 nested field(s) of unknown size", + "write": 9426768 + }, + "Mars::TNMMessage": { + "class": "Mars::TNMMessage", + "col_offset": 0, + "computed": [ + { + "helper": 9149776, + "kind": "int?", + "slot": null, + "tag": ".", + "unresolved": true, + "va": 9427494 + } + ], + "elements": [], + "fields": [ + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426692 + }, + { + "base": "edi", + "from": 9426608, + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426734 + }, + { + "base": "esi", + "helper": 9149472, + "kind": "bool", + "off": 20, + "off_abs": 20, + "size": 1, + "slot": null, + "tag": ".", + "this": true, + "va": 9427467 + }, + { + "base": "esi", + "helper": null, + "helper_vftable": 10719584, + "inner": "NetMessage", + "kind": "object", + "off": 24, + "off_abs": 24, + "ptr": true, + "size": 4, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VNetMessage@Mars@@@Mars", + "va": 9427542 + } + ], + "gaps": [], + "grade": "partial", + "read": 9427360, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 28, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 2, + "vftable": 10751052, + "why": "2 nested field(s) of unknown size", + "write": 9427408 + }, + "Mars::TNMessage": { + "class": "Mars::TNMessage", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "edi", + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 4, + "off_abs": 4, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426692 + }, + { + "base": "edi", + "helper": null, + "helper_vftable": 10751284, + "inner": "TNID", + "kind": "object", + "off": 12, + "off_abs": 12, + "size": null, + "slot": 40, + "tag": ".", + "this": true, + "type": "?$StreamableHelper@VTNID@Mars@@@Mars", + "va": 9426734 + } + ], + "gaps": [], + "grade": "partial", + "read": 9426416, + "read_agree": 0, + "read_comparable": 0, + "sizeof": null, + "sizeof_by": null, + "sizeof_lower": 0, + "sizeof_stride": null, + "sizeof_upper": null, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 2, + "vftable": 10751380, + "why": "2 nested field(s) of unknown size", + "write": 9426608 + }, + "Quaternion": { + "class": "Quaternion", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9075376 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9075390 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9075404 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 12, + "off_abs": 12, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9075418 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9075280, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 16, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 16, + "sizeof_stride": 16, + "sizeof_upper": 16, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10363992, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9075360 + }, + "Vector2": { + "class": "Vector2", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9150016 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9150030 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9149952, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 8, + "sizeof_by": "container stride", + "sizeof_lower": 8, + "sizeof_stride": 8, + "sizeof_upper": null, + "sizeof_vectorstride": 8, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364120, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9150000 + }, + "Vector3": { + "class": "Vector3", + "col_offset": 0, + "computed": [], + "elements": [], + "fields": [ + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 0, + "off_abs": 0, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9068768 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 4, + "off_abs": 4, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9068782 + }, + { + "base": "esi", + "helper": 9149408, + "kind": "float", + "off": 8, + "off_abs": 8, + "size": 4, + "slot": null, + "tag": ".", + "this": true, + "va": 9068796 + } + ], + "gaps": [], + "grade": "unnamed", + "read": 9068688, + "read_agree": 0, + "read_comparable": 0, + "sizeof": 12, + "sizeof_by": "enumeration meets embedding", + "sizeof_lower": 12, + "sizeof_stride": 12, + "sizeof_upper": 12, + "sizeof_vectorstride": null, + "strides": {}, + "unsized_fields": 0, + "vftable": 10364056, + "why": "offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name", + "write": 9068752 + } +} \ No newline at end of file diff --git a/objects/layouts.md b/objects/layouts.md new file mode 100644 index 0000000..889a7d8 --- /dev/null +++ b/objects/layouts.md @@ -0,0 +1,4342 @@ +# Recovered class layouts (`tools/serializers.py all`) + +Generated -- do not hand-edit. Offsets are absolute (object base). `sizeof` is quoted only where a second, independent line of evidence agrees with the field enumeration; otherwise a lower bound is given. + +## `Address` + +Write `0x008f63c0`, Read `0x008f6360`, IStreamable vftable `0x00a2dcbc` (COL offset +0x0). sizeof 0x58 (enumeration meets embedding). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x1c | string | `.` | | +| 0x1c | 0x4 | int | `.` | | +| 0x20 | 0x1c | string | `.` | | +| 0x3c | 0x1c | string | `.` | | + +## `Game::AIAutoPeaceRun` + +Write `0x00692cf0`, Read `0x00692c90`, IStreamable vftable `0x00a199b4` (COL offset +0x0). sizeof 0x10 (container stride). **verified** -- fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `sid` | | +| 0x8 | 0x4 | int | `tn0` | | +| 0xc | 0x4 | int | `tn1` | | + +## `Game::AICombatReport` + +Write `0x006986e0`, Read `0x0069c6d0`, IStreamable vftable `0x00a1a6f0` (COL offset +0x0). sizeof >= 0x30 (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `CRTrn` | | +| 0x4 | 0x1 | bool | `CRPce` | | +| 0x8 | 0x4 | enum | `CRSys` | enum:uint | +| 0xc | 0x24 | object | `CRPlSv2` | Game::CombatPlayerStats | + +## `Game::AIEncounterFlags` + +Write `0x0059dfe0`, Read `0x005a26b0`, IStreamable vftable `0x00a0622c` (COL offset +0x0). sizeof >= 0x10 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `Nas` | | + +Container-element fields (offsets are within the element / map node, not the object): `Fid`@+0xc, `Ast`@+0x10 + +## `Game::AIRebellionImpl` + +Write `0x00693b30`, Read `0x006a2320`, IStreamable vftable `0x00a1a9e4` (COL offset +0x0). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `St` | | +| 0xc | 0x4 | handle | `Plr` | | +| 0x10 | 0x4 | handle | `Reb` | | +| 0x14 | 0x10 | vector | `NSys` | | + +## `Game::AIRelationRecord` + +Write `0x00816b40`, Read `0x00816ab0`, IStreamable vftable `0x00a1a650` (COL offset +0x0). sizeof 0x18 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x4 | float | `.` | | +| 0x14 | 0x4 | float | `.` | | + +## `Game::AISituation` + +Write `0x0069a220`, Read `0x0069a160`, IStreamable vftable `0x00a1a670` (COL offset +0x0). sizeof >= 0x20 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x10 | 0x10 | object | `AISitWeapFams` | Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap | + +## `Game::AISystem` + +Write `0x006bda30`, Read `0x006bd960`, IStreamable vftable `0x00a1adf4` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Game::AllianceInvite` + +Write `0x006d5bf0`, Read `0x006d59d0`, IStreamable vftable `0x00a0a354` (COL offset +0x0). sizeof >= 0x4c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1 | bool | `.` | | +| 0x9 | 0x1 | bool | `.` | | +| 0xa | 0x1 | bool | `.` | | +| 0xb | 0x1 | bool | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x4 | int | `.` | | +| 0x14 | 0x4 | int | `.` | | +| 0x18 | 0x4 | int | `.` | | +| 0x1c | 0x10 | vector | `.` | Game::AllianceInvite::Response | +| 0x2c | 0x4 | int | `.` | | +| 0x30 | 0x4 | int | `.` | | +| 0x34 | 0x4 | int | `.` | | +| 0x38 | 0x10 | vector | `.` | Game::AllianceInvite::Response | +| 0x48 | 0x4 | int | `.` | | + +## `Game::AllianceInvite::Response` + +Write `0x006d2c60`, Read `0x006d2bf0`, IStreamable vftable `0x00a09e94` (COL offset +0x0). sizeof 0x10 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::AttribMap` + +Write `0x0059ee60`, Read `0x005a8a60`, IStreamable vftable `0x00a1a6a0` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::BackEngProject` + +Write `0x00853390`, Read `0x00853280`, IStreamable vftable `0x00a3185c` (COL offset +0x0). sizeof >= 0x54 (lower bound). **verified** -- fields exact; Read agrees on all 4 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x34 | object | `SPi` | Game::SpecialProject | +| 0x3c | 0x4 | int | `Stp` | | +| 0x40 | 0x4 | float | `AOdd` | | +| 0x44 | 0x4 | float | `AInc` | | +| 0x4c | 0x4 | int | `RCst` | | +| 0x50 | 0x4 | int | `RDn` | | + +## `Game::BerserkerEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1f10` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::BuildQueue` + +Write `0x0085f0a0`, Read `0x008451c0`, IStreamable vftable `0x00a31328` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Game::CNMClientNotResponding` + +Write `0x00451690`, Read `0x00451660`, IStreamable vftable `0x009e3e70` (COL offset +0x0). sizeof >= 0x9 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1 | bool | `.` | | + +## `Game::CNMPlayerJoined` + +Write `0x00451630`, Read `0x00451600`, IStreamable vftable `0x009e4148` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | + +## `Game::CNMPlayerLeft` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x009e3e5c` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::CNMUpdate` + +Write `0x004520c0`, Read `0x00452050`, IStreamable vftable `0x009e3ef4` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | object | `.` | Game::UpdateData | + +## `Game::CNMUpdateComplete` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x009e4014` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::CNMUserShips` + +Write `0x004521d0`, Read `0x00452120`, IStreamable vftable `0x009e4124` (COL offset +0x0). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::ShipParams | +| 0x14 | 0x4 | int | `.` | | + +## `Game::CivilianRatios` + +Write `0x0082c740`, Read `0x0082c6b0`, IStreamable vftable `0x00a23e7c` (COL offset +0x0). sizeof >= 0x8 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | float | `smx` | | +| 0x8 | ? | object | `spe` | Game::SpeciesRatios | + +## `Game::ClientEncounterResults` + +Write `0x00826750`, Read `0x008266a0`, IStreamable vftable `0x00a24f80` (COL offset +0x0). sizeof >= 0x30 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1 | bool | `.` | | +| 0xc | 0x24 | object | `.` | Game::CombatPlayerStats | + +## `Game::ClientSystem` + +Write `0x00727820`, Read `0x00727790`, IStreamable vftable `0x00a20144` (COL offset +0x8). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | + +## `Game::ClientTradeSector` + +Write `0x00727820`, Read `0x00727790`, IStreamable vftable `0x00a31b04` (COL offset +0x8). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | + +## `Game::CombatCommandCloak` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e26dc` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandDecloak` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e2700` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandFleetSetFacing` + +Write `0x0042c7f0`, Read `0x0042dd90`, IStreamable vftable `0x009e2550` (COL offset +0x4). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::CombatCommandFleetSetHoldFire` + +Write `0x00451690`, Read `0x00451660`, IStreamable vftable `0x009e2574` (COL offset +0x4). sizeof >= 0xd (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::CombatCommandFleetSetStance` + +Write `0x0042c7f0`, Read `0x0042dd90`, IStreamable vftable `0x009e252c` (COL offset +0x4). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::CombatCommandIntangOff` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e2748` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandIntangOn` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e2724` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandMoveReserves` + +Write `0x0042f720`, Read `0x00907e60`, IStreamable vftable `0x009e264c` (COL offset +0x4). sizeof >= 0x20 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x10 | vector | `.` | int | + +## `Game::CombatCommandPickReserve` + +Write `0x0042dd60`, Read `0x0042dd30`, IStreamable vftable `0x009e2598` (COL offset +0x4). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::CombatCommandRequestAsylumResponse` + +Write `0x004fb530`, Read `0x004fb4c0`, IStreamable vftable `0x009f3958` (COL offset +0x4). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x4 | int | `.` | | + +## `Game::CombatCommandSetAEAutoFire` + +Write `0x00451690`, Read `0x00451660`, IStreamable vftable `0x009e25bc` (COL offset +0x4). sizeof >= 0xd (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::CombatCommandSetPlanetAttackMode` + +Write `0x0042c7f0`, Read `0x0042dd90`, IStreamable vftable `0x009e25e0` (COL offset +0x4). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::CombatCommandSetPlayerAI` + +Write `0x00451690`, Read `0x00451660`, IStreamable vftable `0x009e2628` (COL offset +0x4). sizeof >= 0xd (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::CombatCommandSetWantEndCombat` + +Write `0x00451690`, Read `0x00451660`, IStreamable vftable `0x009e2604` (COL offset +0x4). sizeof >= 0xd (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::CombatCommandShipAllStop` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e2670` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandShipAttack` + +Write `0x0042f0b0`, Read `0x0042efa0`, IStreamable vftable `0x009e288c` (COL offset +0x4). sizeof >= 0x30 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | Game::CombatCommandShipAttack::ShipData | +| 0x18 | 0x4 | int | `.` | | +| 0x1c | 0xc | object | `.` | Vector3 | +| 0x28 | 0x4 | float | `.` | | +| 0x2c | 0x4 | int | `.` | | + +## `Game::CombatCommandShipClearTargets` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e2694` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandShipFireOnce` + +Write `0x0042f310`, Read `0x0042f250`, IStreamable vftable `0x009e2820` (COL offset +0x4). sizeof >= 0x20 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x8 | object | `.` | Game::GunBankSelection | + +## `Game::CombatCommandShipManeuver` + +Write `0x0042f6a0`, Read `0x0042f600`, IStreamable vftable `0x009e276c` (COL offset +0x4). sizeof >= 0x1c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandShipReleaseGrapple` + +Write `0x0042f5a0`, Read `0x0042f530`, IStreamable vftable `0x009e26b8` (COL offset +0x4). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | + +## `Game::CombatCommandShipSetFacing` + +Write `0x0042ec90`, Read `0x0042ebe0`, IStreamable vftable `0x009e27b4` (COL offset +0x4). sizeof >= 0x1c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x4 | int | `.` | | + +## `Game::CombatCommandShipSetHoldFire` + +Write `0x0042f190`, Read `0x0042f440`, IStreamable vftable `0x009e2844` (COL offset +0x4). sizeof >= 0x29 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x8 | object | `.` | Game::GunBankSelection | +| 0x28 | 0x1 | bool | `.` | | + +## `Game::CombatCommandShipSetOnlyMyTarget` + +Write `0x0042f190`, Read `0x0042f440`, IStreamable vftable `0x009e2868` (COL offset +0x4). sizeof >= 0x29 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x8 | object | `.` | Game::GunBankSelection | +| 0x28 | 0x1 | bool | `.` | | + +## `Game::CombatCommandShipSetStance` + +Write `0x0042ec90`, Read `0x0042ebe0`, IStreamable vftable `0x009e2790` (COL offset +0x4). sizeof >= 0x1c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x4 | int | `.` | | + +## `Game::CombatCommandShipSetWaypoint` + +Write `0x0042ee30`, Read `0x0042ed20`, IStreamable vftable `0x009e27d8` (COL offset +0x4). sizeof >= 0x39 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | Game::CombatCommandShipSetWaypoint::ShipData | +| 0x18 | 0x10 | object | `.` | Quaternion | +| 0x28 | 0x10 | vector | `.` | Vector2 | +| 0x38 | 0x1 | bool | `.` | | + +## `Game::CombatCommandShipToggleBank` + +Write `0x0042f190`, Read `0x0042f440`, IStreamable vftable `0x009e27fc` (COL offset +0x4). sizeof >= 0x29 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x8 | object | `.` | Game::GunBankSelection | +| 0x28 | 0x1 | bool | `.` | | + +## `Game::CombatDamageReport` + +Write `0x0059bbf0`, Read `0x005a6bc0`, IStreamable vftable `0x00a062d4` (COL offset +0x0). sizeof >= 0x30 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `did` | | +| 0x14 | 0x1c | string | `wep` | | + +## `Game::CombatLaunchParams` + +Write `0x00451dc0`, Read `0x00451a80`, IStreamable vftable `0x009e41b0` (COL offset +0x0). sizeof >= 0x194 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x1c | string | `.` | | +| 0x3c | 0x4 | int | `.` | | +| 0x40 | 0x4 | int | `.` | | +| 0x44 | 0x4 | int | `.` | | +| 0x48 | 0x10 | vector | `.` | Game::ShipParams | +| 0x58 | 0x1 | bool | `.` | | +| 0x5c | 0x10 | vector | `.` | Game::CombatPlayerInvariant | +| 0x84 | 0x1c | string | `.` | | +| 0xa0 | 0x4 | float | `.` | | +| 0xa4 | 0x10 | vector | `.` | Game::NodePointParams | +| 0xb4 | 0x10 | vector | `.` | Game::PlayerMessage | +| 0xc4 | 0x4 | int | `.` | | +| 0xc8 | 0x1 | bool | `.` | | +| 0xc9 | 0x1 | bool | `.` | | +| 0xcc | 0x4 | int | `.` | | +| 0xd0 | 0x1c | string | `.` | | +| 0xec | 0x1c | string | `.` | | +| 0x108 | 0x24 | object | `.` | Game::PlanetStats | +| 0x148 | 0x4 | int | `.` | | +| 0x14c | 0x1 | bool | `.` | | +| 0x150 | ? | object | `.` | Game::CombatEncounterParams | +| 0x178 | 0x1c | object | `.` | Game::DefenceLayout | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x0, `.`@+0x0 + +## `Game::CombatPlayerReport` + +Write `0x0059d6d0`, Read `0x0059d360`, IStreamable vftable `0x00a0623c` (COL offset +0x0). sizeof 0x54 (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `plr` | | +| 0x8 | 0x1 | bool | `ai` | | +| 0xc | 0x4 | int | `ally` | | +| 0x10 | 0x4 | int8 | `status` | | +| 0x14 | 0x4 | int | `mxeng` | | +| 0x18 | 0x4 | int | `mxcls` | | +| 0x1c | 0x4 | int | `mxmsl` | | +| 0x26 | 0x4 | int8 | `nsat` | | +| 0x36 | 0x4 | int8 | `nsatl` | | +| 0x3a | 0x2 | int16 | `ndam` | | +| 0x44 | 0x10 | vector | `srep` | Game::CombatShipReport | + +Container-element fields (offsets are within the element / map node, not the object): `nshp`@+0x-a, `nshfld`@+0x0, `nshlst`@+0x6, `nshp`@+0x0 + +## `Game::CombatPlayerStats` + +Write `0x00459140`, Read `0x00459070`, IStreamable vftable `0x009e4b74` (COL offset +0x0). sizeof 0x24 (container stride). **verified** -- fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `TacReports` | Game::TacReport | +| 0x14 | 0x4 | float | `RPBon` | | +| 0x18 | 0x4 | int | `RPBonT` | | +| 0x1c | 0x4 | int | `SavBonus` | | +| 0x20 | 0x1 | bool | `MaintHF` | | + +## `Game::CombatReport` + +Write `0x0059db30`, Read `0x0059d8f0`, IStreamable vftable `0x00a0624c` (COL offset +0x0). sizeof >= 0x5c (lower bound). **verified** -- fields exact; Read agrees on all 6 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `cid` | | +| 0x8 | 0x4 | int | `trn` | | +| 0xc | 0xc | object | `pos` | Vector3 | +| 0x18 | 0x4 | int | `sid` | | +| 0x1c | 0x1 | bool | `auto` | | +| 0x20 | 0x4 | float | `dur` | | +| 0x24 | 0x4 | int | `cow` | | +| 0x28 | 0x1 | bool | `cdst` | | +| 0x2c | 0x4 | int | `cpk` | | +| 0x30 | 0x4 | int | `cpt` | | +| 0x34 | 0x4 | float | `cdt` | | +| 0x38 | 0x4 | float | `cdi` | | +| 0x3c | 0x10 | vector | `prep` | Game::CombatPlayerReport | +| 0x4c | 0x10 | vector | `wrep` | Game::CombatWeaponReport | + +## `Game::CombatShipReport` + +Write `0x0059b960`, Read `0x0059c650`, IStreamable vftable `0x00a06064` (COL offset +0x0). sizeof 0x50 (container stride). **verified** -- fields exact; Read agrees on all 7 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `name` | | +| 0x20 | 0x4 | int | `did` | | +| 0x24 | 0x4 | int | `cls` | | +| 0x28 | 0x8 | int64 | `caps2` | | +| 0x30 | 0x4 | int | `nshp` | | +| 0x34 | 0x4 | int | `nfld` | | +| 0x38 | 0x4 | int | `nlst` | | +| 0x3c | 0x4 | int | `dtak` | | +| 0x40 | 0x4 | int | `dams` | | +| 0x44 | 0x4 | int | `damp` | | +| 0x48 | 0x4 | float | `dami` | | +| 0x4c | 0x4 | float | `damt` | | + +## `Game::CombatTechFlags` + +Write `0x004d9e10`, Read `0x004d9dc0`, IStreamable vftable `0x009e4620` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `.` | | +| 0x4 | 0x4 | int | `.` | | + +## `Game::CombatWeaponReport` + +Write `0x0059bb70`, Read `0x0059bad0`, IStreamable vftable `0x00a06074` (COL offset +0x0). sizeof 0x30 (container stride). **verified** -- fields exact; Read agrees on all 3 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `wep` | | +| 0x20 | 0x4 | int | `dams` | | +| 0x24 | 0x4 | int | `damp` | | +| 0x28 | 0x4 | float | `dami` | | +| 0x2c | 0x4 | float | `damt` | | + +## `Game::CommDeclareCurse` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e190` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareIDontWant` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e280` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareIHate` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e334` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareILike` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e370` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareISaw` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e2bc` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareISeveredAllianceWith` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e2f8` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareIWant` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e244` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareShareAllColonyStats` + +Write `0x00810990`, Read `0x00810850`, IStreamable vftable `0x00a2e76c` (COL offset +0x0). sizeof >= 0x14 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | + +## `Game::CommDeclareShareStats` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2f830` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareShareSystemNotes` + +Write `0x00810da0`, Read `0x00810d50`, IStreamable vftable `0x00a3157c` (COL offset +0x0). sizeof >= 0x34 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x1c | string | `notes` | | + +## `Game::CommDeclareShareSystemStats` + +Write `0x00810d00`, Read `0x008321a0`, IStreamable vftable `0x00a2e730` (COL offset +0x0). sizeof >= 0x18 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | + +## `Game::CommDeclareSorry` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e208` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommDeclareThanks` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e1cc` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommMessageContainer` + +Write `0x00825590`, Read `0x0084cc60`, IStreamable vftable `0x00a30630` (COL offset +0x0). sizeof >= 0x14 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `nmsg` | | + +Container-element fields (offsets are within the element / map node, not the object): `msgt`@+0x4, `msg`@+0x0 + +## `Game::CommRequestAttackSystem` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e58c` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestDefendSystem` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e5c8` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestDisposition` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e424` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestHarassPlayer` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e6b8` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestHarassSystem` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e604` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestMoney` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e3ac` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestRallyAtSystem` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e550` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestResearch` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e3e8` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestSeverAllianceWith` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e67c` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestShareSystemStats` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e514` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestStopColonizing` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e4d8` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestStopHarassingMe` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e460` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestStopHarassingPlayer` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e6f4` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestStopHarrassingSystem` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e640` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommRequestStopMining` + +Write `0x00810ca0`, Read `0x00810c40`, IStreamable vftable `0x00a2e49c` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x5 | 0x4 | int8 | `rcpt` | | +| 0x6 | 0x2 | int16 | `rcp` | | +| 0x8 | 0x4 | int | `cid2` | | +| 0xc | 0x2 | int16 | `sent` | | +| 0xe | 0x2 | int16 | `exp` | | +| 0x10 | 0x4 | int8 | `snd` | | +| 0x14 | 0x4 | int | `sys` | | +| 0x18 | 0x4 | int | `plr` | | + +## `Game::CommonPlague` + +Write `0x005360e0`, Read `0x005373e0`, IStreamable vftable `0x009f8b50` (COL offset +0x0). sizeof >= 0x44 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | handle | `PlgSys` | | +| 0xc | 0x4 | int | `PlgCByF` | | +| 0x10 | 0x4 | handle | `PlgCBy` | | +| 0x38 | 0x4 | int | `PlgCM` | | +| 0x3c | 0x4 | int | `PlgTurns` | | +| 0x40 | 0x4 | int | `PlgInf` | | + +## `Game::CrowDefendersEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f284c` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::CrowRuinsEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f285c` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::DefenceFleetAssignment` + +Write `0x008119d0`, Read `0x00832330`, IStreamable vftable `0x009e3c48` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `fid` | | +| 0x8 | 0x4 | int | `stnid` | | +| 0xc | 0x4 | float | `head2` | | +| 0x10 | 0x4 | float | `ori` | | +| 0x14 | 0x4 | int | `quota` | | + +## `Game::DefenceLayout` + +Write `0x00825650`, Read `0x0084e700`, IStreamable vftable `0x00a22280` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `sysid` | | +| 0x8 | 0x10 | vector | `ndsa` | | +| 0x18 | 0x4 | object (ptr) | `fa` | Game::DefenceFleetAssignment | + +Container-element fields (offsets are within the element / map node, not the object): `dsid`@+0x4 + +## `Game::DefenceSummary` + +Write `0x00825810`, Read `0x0084e9b0`, IStreamable vftable `0x00a313b8` (COL offset +0x0). sizeof >= 0x48 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `pid` | | +| 0x8 | 0x4 | int | `sid` | | +| 0xc | 0x10 | vector | `stac` | | +| 0x1c | 0x10 | vector | `satc` | | +| 0x2c | 0x1c | object | `dlay` | Game::DefenceLayout | + +## `Game::DerelictEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f12b8` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::DiplomacyStats` + +Write `0x00818cb0`, Read `0x00818b80`, IStreamable vftable `0x00a21430` (COL offset +0x0). sizeof 0x24 (container stride). **verified** -- fields exact; Read agrees on all 13 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `other` | | +| 0x8 | 0x2 | int16 | `lastnap` | | +| 0xa | 0x2 | int16 | `lastnapbty` | | +| 0xc | 0x2 | int16 | `bknnap` | | +| 0xe | 0x2 | int16 | `btynap` | | +| 0x10 | 0x2 | int16 | `lastally` | | +| 0x12 | 0x2 | int16 | `lastallybty` | | +| 0x14 | 0x2 | int16 | `bknally` | | +| 0x16 | 0x2 | int16 | `btyally` | | +| 0x18 | 0x2 | int16 | `lastcf` | | +| 0x1a | 0x2 | int16 | `lastcfbty` | | +| 0x1c | 0x2 | int16 | `bkncf` | | +| 0x1e | 0x2 | int16 | `btycf` | | +| 0x20 | 0x2 | int16 | `deadhome` | | + +## `Game::EncounterQuery` + +Write `0x008122f0`, Read `0x0084f190`, IStreamable vftable `0x00a313d8` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | | + +## `Game::EncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f0b58` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::EncounterResults` + +Write `0x008262b0`, Read `0x0083fb10`, IStreamable vftable `0x00a256ec` (COL offset +0x0). sizeof >= 0x174 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `.` | | +| 0x5 | 0x1 | bool | `.` | | +| 0x6 | 0x1 | bool | `.` | | +| 0x7 | 0x1 | bool | `.` | | +| 0x8 | 0x10 | vector | `.` | enum:uint | +| 0x18 | 0x10 | vector | `.` | Game::CombatPlayerStats | +| 0x28 | 0x10 | vector | `.` | int | +| 0x38 | 0x10 | vector | `.` | Game::EncounterResults::PrisonerShip | +| 0x48 | 0x10 | vector | `.` | Game::EncounterResults::DamagedShip | +| 0x58 | 0x10 | vector | `.` | Game::EncounterResults::BoardedShip | +| 0x68 | 0x10 | vector | `.` | Game::EncounterResults::RetreatingShip | +| 0x78 | 0x10 | vector | `.` | Game::EncounterResults::SpyShip | +| 0x88 | 0x10 | vector | `.` | enum:uint | +| 0x98 | 0x10 | vector | `.` | enum:uint | +| 0xa8 | 0x10 | vector | `.` | enum:uint | +| 0xb8 | 0x4 | int | `.` | | +| 0xbc | 0x30 | object | `.` | Game::CombatDamageReport | +| 0xe0 | 0x10 | vector | `.` | enum:uint | +| 0xf0 | 0x4 | int | `.` | | +| 0xf4 | 0x4 | float | `.` | | +| 0xf8 | 0x1 | bool | `.` | | +| 0xfc | 0x10 | vector | `.` | enum:uint | +| 0x10c | 0x1 | bool | `.` | | +| 0x110 | 0x24 | object | `.` | Game::PlanetStats | +| 0x150 | 0x14 | object | `.` | Game::PlagueStats | +| 0x164 | 0x10 | vector | `.` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x4, `.`@+0x0 + +## `Game::EncounterResults::BoardedShip` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a1cee8` (COL offset +0x0). sizeof 0xc (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::EncounterResults::DamagedShip` + +Write `0x008261d0`, Read `0x0084f560`, IStreamable vftable `0x00a1d050` (COL offset +0x0). sizeof 0x28 (container stride). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | ? | object | `.` | Game::ShipHealth | +| 0x18 | 0x10 | vector | `.` | | + +## `Game::EncounterResults::PrisonerShip` + +Write `0x00826150`, Read `0x008260c0`, IStreamable vftable `0x00a1ced8` (COL offset +0x0). sizeof 0x20 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x18 | object | `.` | Game::PrisonerHold | + +## `Game::EncounterResults::RetreatingShip` + +Write `0x008125d0`, Read `0x00812540`, IStreamable vftable `0x00a1cef8` (COL offset +0x0). sizeof 0x14 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x4 | int | `.` | | + +## `Game::EncounterResults::SpyShip` + +Write `0x008124a0`, Read `0x00812410`, IStreamable vftable `0x00a1cf08` (COL offset +0x0). sizeof 0x14 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | +| 0xd | 0x1 | bool | `.` | | +| 0x10 | 0x4 | float | `.` | | + +## `Game::EventStorage` + +Write `0x00825cc0`, Read `0x008850f0`, IStreamable vftable `0x00a313c8` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `Events` | Game::EventStorage::TurnEvents | +| 0x14 | 0x4 | int | `EvNxID` | | + +## `Game::EventStorage::Event` + +Write `0x00825ab0`, Read `0x00825970`, IStreamable vftable `0x00a21958` (COL offset +0x0). sizeof >= 0x74 (lower bound). **verified** -- fields exact; Read agrees on all 4 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `EvEID` | | +| 0x8 | 0x1c | string | `EvDsc` | | +| 0x24 | 0x1c | string | `EvMsg` | | +| 0x40 | 0x4 | int | `EvLoc` | | +| 0x44 | 0xc | object | `EvPos` | Vector3 | +| 0x50 | 0x1c | string | `EvImg` | | +| 0x6c | 0x4 | int | `EvAct` | | +| 0x70 | 0x4 | int | `EvCID` | | + +## `Game::EventStorage::TurnEvents` + +Write `0x00825c40`, Read `0x00825bb0`, IStreamable vftable `0x00a0f07c` (COL offset +0x0). sizeof 0x18 (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `EvTurn` | | +| 0x8 | 0x10 | vector | `Events` | Game::EventStorage::Event | + +## `Game::FieldTemplate` + +Write `0x0059e310`, Read `0x0059e2a0`, IStreamable vftable `0x009e4610` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Game::FieldTemplate::Point` + +Write `0x0059bfa0`, Read `0x0059bf10`, IStreamable vftable `0x00a05df8` (COL offset +0x0). sizeof 0x14 (container stride). **verified** -- fields exact; Read agrees on all 3 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `FTPShID` | | +| 0x4 | 0x4 | int | `FTPDesID` | | +| 0x8 | 0x4 | int | `FTPPosX` | | +| 0xc | 0x4 | int | `FTPPosY` | | +| 0x10 | 0x4 | int | `FTPSqd` | | + +## `Game::FleetLayout` + +Write `0x00700e20`, Read `0x007022b0`, IStreamable vftable `0x00a0f3dc` (COL offset +0x0). sizeof >= 0x24 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | Game::FieldTemplate | +| 0x14 | 0x10 | vector | `.` | | + +## `Game::FleetNameGenerator` + +Write `0x00817460`, Read `0x00817440`, IStreamable vftable `0x00a32760` (COL offset +0x0). sizeof >= 0x8 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `FNGNum` | | + +## `Game::FlightPlan` + +Write `0x00700f60`, Read `0x00704c70`, IStreamable vftable `0x00a1d50c` (COL offset +0x0). sizeof 0x38 (enumeration meets embedding). **verified** -- fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `wpts` | Game::FlightPlan::Waypoint | +| 0x14 | 0x4 | float | `FPsp2` | | +| 0x18 | 0x4 | int | `FPeta2` | | +| 0x1c | 0xc | object | `FPogn2` | Vector3 | +| 0x28 | 0xc | object | `FPdpos` | Vector3 | +| 0x34 | 0x4 | int | `pnd` | | + +## `Game::FlightPlan::Waypoint` + +Write `0x00700ed0`, Read `0x00701860`, IStreamable vftable `0x00a1d39c` (COL offset +0x0). sizeof >= 0x1c (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `Wpt` | | +| 0x8 | 0x4 | int | `Tp` | | +| 0xc | 0x10 | object | `nrt` | Game::NodeRoute | + +## `Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap` + +Write `0x0054e8d0`, Read `0x00557460`, IStreamable vftable `0x009fa5a4` (COL offset +0x0). sizeof >= 0xc (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `siz` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0xc, `.`@+0x10 + +## `Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap` + +Write `0x0050c5f0`, Read `0x0051c6c0`, IStreamable vftable `0x009f1e10` (COL offset +0x0). sizeof >= 0xc (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `siz` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0xc, `.`@+0x10 + +## `Game::Game::VLocustNestState::?$NetworkIDDataMap` + +Write `0x0050c4f0`, Read `0x0051c5f0`, IStreamable vftable `0x009f1e00` (COL offset +0x0). sizeof >= 0xc (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `siz` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0xc, `.`@+0x10 + +## `Game::Game::VShipSectionID::?$AIWeightMap` + +Write `0x00696b40`, Read `0x006bff00`, IStreamable vftable `0x00a1a680` (COL offset +0x0). sizeof >= 0x4 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | object (ptr) | `.` | Game::ShipSectionID | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x8 + +## `Game::GameTurnHistory` + +Write `0x0082c5a0`, Read `0x00894180`, IStreamable vftable `0x00a333a0` (COL offset +0x0). sizeof >= 0x10 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `nply` | | + +Container-element fields (offsets are within the element / map node, not the object): `ply`@+0xc, `hist`@+0x10 + +## `Game::GunBankSelection` + +Write `0x0056e950`, Read `0x0056e920`, IStreamable vftable `0x009e24f8` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::HeraldEncounterResult` + +Write `0x004f2ff0`, Read `0x004f2fc0`, IStreamable vftable `0x009efc90` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | float | `.` | | + +## `Game::IndependenceInfo` + +Write `0x00748ee0`, Read `0x00748df0`, IStreamable vftable `0x00a2005c` (COL offset +0x0). sizeof >= 0x70 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `indsp` | | +| 0x8 | 0x7 | object | `indcl` | Game::PlayerColorID | +| 0x1c | 0x1c | string | `indnm` | | +| 0x38 | 0x1c | string | `indav` | | +| 0x54 | 0x1c | string | `indba` | | + +## `Game::JewelsProject` + +Write `0x00548910`, Read `0x005488d0`, IStreamable vftable `0x009fa438` (COL offset +0x0). sizeof >= 0x4c (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x34 | object | `SPi` | Game::SpecialProject | +| 0x3c | 0x4 | int | `Stp` | | +| 0x44 | 0x4 | int | `einv` | | +| 0x48 | 0x4 | int | `eapp` | | + +## `Game::LocustEncounterParams` + +Write `0x00508be0`, Read `0x00508b70`, IStreamable vftable `0x009f56a8` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0xc | object | `.` | Game::Game::VLocustNestState::?$NetworkIDDataMap | + +## `Game::LocustEncounterResult` + +Write `0x00508ce0`, Read `0x00508c40`, IStreamable vftable `0x009f54e8` (COL offset +0x0). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0xc | object | `.` | Game::Game::VLocustNestState::?$NetworkIDDataMap | + +## `Game::LocustFleetLogistics` + +Write `0x00508e50`, Read `0x00508d60`, IStreamable vftable `0x009f1f00` (COL offset +0x0). sizeof >= 0x14 (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x1 | bool | `hav` | | +| 0x1 | 0x1 | bool | `don` | | +| 0x4 | 0x4 | int | `dsy` | | +| 0x8 | 0xc | object | `dst` | Vector3 | + +## `Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap` + +Write `0x0069b590`, Read `0x006c01a0`, IStreamable vftable `0x00a1a6b0` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x10 | vector | `.` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x0 + +## `Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap` + +Write `0x0069b4c0`, Read `0x006bffe0`, IStreamable vftable `0x00a1a690` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x10 | vector | `.` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x0 + +## `Game::Mars::I::U?$StreamableEnum::?$AIWeightMap` + +Write `0x00696c50`, Read `0x006b57c0`, IStreamable vftable `0x00a1a6c0` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x10 | vector | `.` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x0 + +## `Game::MeteorEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1424` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::MonitorEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1570` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::MonitorProject` + +Write `0x008287d0`, Read `0x00828740`, IStreamable vftable `0x00a3180c` (COL offset +0x0). sizeof >= 0x54 (lower bound). **verified** -- fields exact; Read agrees on all 4 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x34 | object | `SPi` | Game::SpecialProject | +| 0x3c | 0x4 | int | `Stp` | | +| 0x40 | 0x4 | int | `Sys` | | +| 0x44 | 0x4 | int | `RMn` | | +| 0x48 | 0x4 | int | `RMx` | | +| 0x4c | 0x4 | int | `RDn` | | +| 0x50 | 0x4 | float | `RMd` | | + +## `Game::Morale` + +Write `0x00744ea0`, Read `0x00744dd0`, IStreamable vftable `0x00a1f7c8` (COL offset +0x0). sizeof >= 0x8 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `mv` | | + +## `Game::MoraleEvent` + +Write `0x007491b0`, Read `0x007490b0`, IStreamable vftable `0x00a2003c` (COL offset +0x0). sizeof 0x50 (container stride). **verified** -- fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `mid` | | +| 0x8 | 0x4 | int | `mtr` | | +| 0xc | 0x4 | int | `mn` | | +| 0x10 | 0x4 | int | `mtp` | | +| 0x14 | 0x8 | object | `mfx` | Game::Morale | +| 0x34 | 0x1c | string | `mdsc` | | + +## `Game::NodePath` + +Write `0x006e1fd0`, Read `0x006e1e90`, IStreamable vftable `0x00a1cb50` (COL offset +0x0). sizeof 0x30 (container stride). **verified** -- fields exact; Read agrees on all 6 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `npt` | | +| 0x8 | 0x4 | int | `npid` | | +| 0xc | 0x4 | int | `npfr` | | +| 0x10 | 0x4 | int | `npto` | | +| 0x14 | 0x4 | int | `npctm` | | +| 0x18 | 0x4 | int | `npcby` | | +| 0x1c | 0x4 | int | `npdtn` | | +| 0x20 | 0x4 | int | `npdtf` | | +| 0x24 | 0x4 | int | `nptf` | | +| 0x28 | 0x4 | int | `npenp` | | +| 0x2c | 0x4 | int | `npuse` | | + +## `Game::NodePointParams` + +Write `0x00492aa0`, Read `0x004929d0`, IStreamable vftable `0x009e3ff4` (COL offset +0x0). sizeof >= 0x3c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | float | `.` | | +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | +| 0x24 | 0x4 | float | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x10 | vector | `.` | enum:uint | + +## `Game::NodeRoute` + +Write `0x006e22e0`, Read `0x006e2260`, IStreamable vftable `0x00a1cbdc` (COL offset +0x0). sizeof >= 0x10 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `nrp` | | +| 0x8 | 0x4 | int | `nrf` | | +| 0xc | 0x4 | int | `nrt` | | + +## `Game::Objective` + +Write `0x008505b0`, Read `0x00850430`, IStreamable vftable `0x00a2e0cc` (COL offset +0x0). sizeof 0x44 (container stride). **verified** -- fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `ID` | | +| 0x4 | 0x1 | bool | `Cmp` | | +| 0x40 | 0x4 | int | `NID` | | + +## `Game::ObservedDesign` + +Write `0x00817aa0`, Read `0x008179f0`, IStreamable vftable `0x00a23c64` (COL offset +0x0). sizeof 0x10 (container stride). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x2 | int16 | `otnF` | | +| 0x6 | 0x2 | int16 | `otnL` | | +| 0x8 | 0x4 | int | `odid` | | +| 0xc | 0x4 | int | `opid` | | + +## `Game::ObservedTech` + +Write `0x00817cf0`, Read `0x00817c40`, IStreamable vftable `0x00a2439c` (COL offset +0x0). sizeof 0x2c (container stride). **verified** -- fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x2 | int16 | `otnF` | | +| 0x6 | 0x2 | int16 | `otnL` | | +| 0x8 | 0x1 | bool | `odet` | | +| 0xc | 0x1c | string | `otch` | | +| 0x28 | 0x4 | int | `owith` | | + +## `Game::ObservedWeapon` + +Write `0x00817bc0`, Read `0x00817b10`, IStreamable vftable `0x00a2438c` (COL offset +0x0). sizeof 0x2c (container stride). **verified** -- fields exact; Read agrees on all 2 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x2 | int16 | `otnF` | | +| 0x6 | 0x2 | int16 | `otnL` | | +| 0x8 | 0x1 | bool | `odet` | | +| 0xc | 0x1c | string | `owep` | | +| 0x28 | 0x4 | int | `owith` | | + +## `Game::OrtgayEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f0e80` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::PirateEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f159c` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::PlagueHit` + +Write `0x00536710`, Read `0x005366b0`, IStreamable vftable `0x009f8d10` (COL offset +0x0). sizeof 0x10 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::PlagueStats` + +Write `0x00537e90`, Read `0x00537e20`, IStreamable vftable `0x009eef70` (COL offset +0x0). sizeof 0x14 (enumeration meets embedding). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::PlagueHit | + +## `Game::PlanetClientContext` + +Write `0x005369a0`, Read `0x005368c0`, IStreamable vftable `0x009e3c38` (COL offset +0x0). sizeof >= 0x1c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | float | `.` | | +| 0x8 | 0x4 | float | `.` | | +| 0xc | 0x4 | float | `.` | | +| 0x10 | 0x4 | float | `.` | | +| 0x14 | 0x4 | int | `.` | | +| 0x18 | 0x4 | int | `.` | | + +## `Game::PlanetStats` + +Write `0x00536810`, Read `0x00536760`, IStreamable vftable `0x009e3f84` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | float | `.` | | +| 0x4 | 0x4 | float | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0x10 | 0x8 | int64 | `.` | | +| 0x18 | 0x8 | int64 | `.` | | +| 0x20 | 0x4 | float | `.` | | + +## `Game::PlayerAid` + +Write `0x00818dc0`, Read `0x008207b0`, IStreamable vftable `0x00a286dc` (COL offset +0x0). sizeof 0x18 (container stride). **verified** -- fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `aidto` | | +| 0x8 | 0x4 | int | `aidrai` | | +| 0xc | 0x4 | int | `aidrt` | | +| 0x10 | 0x4 | int | `aidsa` | | +| 0x14 | 0x4 | int | `aidst` | | + +## `Game::PlayerAlliances` + +Write `0x006d2e10`, Read `0x006d2d20`, IStreamable vftable `0x00a2dd5c` (COL offset +0x0). sizeof 0x10 (container stride). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `ALid` | | +| 0x4 | 0x4 | int | `AL` | | +| 0x8 | 0x4 | int | `NA` | | +| 0xc | 0x4 | int | `CF` | | + +## `Game::PlayerColorID` + +Write `0x0053c080`, Read `0x0053c880`, IStreamable vftable `0x009e4630` (COL offset +0x0). sizeof >= 0x7 (lower bound). **partial** -- 4 field(s) via an untyped sub-writer + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | opaque | `.` | | +| 0x1 | 0x4 | opaque | `.` | | +| 0x2 | 0x4 | opaque | `.` | | +| 0x3 | 0x4 | opaque | `.` | | + +## `Game::PlayerEncounterProgress` + +Write `0x004fa040`, Read `0x004fa000`, IStreamable vftable `0x009f0b68` (COL offset +0x0). sizeof 0x10 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1 | bool | `.` | | +| 0xc | 0x4 | float | `.` | | + +## `Game::PlayerMessage` + +Write `0x0053cc50`, Read `0x0053cb80`, IStreamable vftable `0x009e3cd8` (COL offset +0x0). sizeof >= 0x38 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1c | string | `.` | | +| 0x28 | 0x10 | vector | `.` | String | + +## `Game::PlayerNotes` + +Write `0x008132b0`, Read `0x00813250`, IStreamable vftable `0x00a21948` (COL offset +0x0). sizeof >= 0x28 (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `NtSys` | | +| 0x8 | 0x1c | string | `NtTxt` | | +| 0x24 | 0x4 | int | `NtTrn` | | + +## `Game::PlayerReport` + +Write `0x00817480`, Read `0x008200a0`, IStreamable vftable `0x00a21440` (COL offset +0x0). sizeof 0x30 (container stride). **verified** -- fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `oid` | | +| 0x8 | 0x4 | int | `pid` | | +| 0xc | 0x4 | int | `flds` | | +| 0x10 | 0x4 | int | `sav` | | +| 0x14 | 0x4 | int | `home` | | +| 0x18 | 0x4 | int | `ncol` | | +| 0x1c | 0x4 | int | `mpwr` | | +| 0x20 | 0x4 | int | `mcls` | | +| 0x24 | 0x4 | int | `mmsl` | | +| 0x28 | 0x4 | int | `nshp` | | +| 0x2c | 0x4 | int | `nsat` | | + +## `Game::PlayerTurnHistory` + +Write `0x0082c4a0`, Read `0x00885450`, IStreamable vftable `0x00a32c90` (COL offset +0x0). sizeof >= 0x8 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `ply` | | + +Container-element fields (offsets are within the element / map node, not the object): `stats`@+0x18 + +## `Game::PlayerTurnStats` + +Write `0x0082c290`, Read `0x00833360`, IStreamable vftable `0x00a3145c` (COL offset +0x0). sizeof >= 0x70 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x2 | int16 | `trn` | | +| 0x8 | 0x4 | int | `almem` | | +| 0xc | 0x4 | int | `inc` | | +| 0x10 | 0x4 | int | `tdinc` | | +| 0x14 | 0x4 | int | `sav` | | +| 0x18 | 0x2 | int16 | `col` | | +| 0x1a | 0x2 | int16 | `bat` | | +| 0x20 | 0x8 | int64 | `pop` | | +| 0x28 | 0x2 | int16 | `tch` | | +| 0x50 | 0x10 | vector | `sacq` | Game::SystemEvent | +| 0x60 | 0x10 | vector | `slost` | Game::SystemEvent | + +Container-element fields (offsets are within the element / map node, not the object): `shpt`@+0x-c, `shpl`@+0x0, `shpk`@+0x6, `satt`@+0x-6, `satl`@+0xc, `satk`@+0x12 + +## `Game::Population` + +Write `0x00537ef0`, Read `0x005390c0`, IStreamable vftable `0x009f90f0` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Game::PopulationGroup` + +Write `0x00536af0`, Read `0x00536a80`, IStreamable vftable `0x009f8d50` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `PopT` | | +| 0x8 | 0x4 | int | `PopS` | | +| 0x10 | 0x8 | int64 | `PopC` | | + +## `Game::PrisonerHold` + +Write `0x0056ec00`, Read `0x0056eb00`, IStreamable vftable `0x009fe130` (COL offset +0x0). sizeof 0x18 (enumeration meets embedding). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x14 | 0x4 | handle | `PrMax` | | + +Container-element fields (offsets are within the element / map node, not the object): `PrSp`@+0x0, `PrNum`@+0x0 + +## `Game::PuppetMasterEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f16f8` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::RaidTargets` + +Write `0x00818ec0`, Read `0x0083a090`, IStreamable vftable `0x00a21968` (COL offset +0x0). sizeof >= 0x20 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `rds` | | +| 0x8 | 0x4 | int | `rdv` | | +| 0xc | 0x10 | vector | `dsc` | | +| 0x1c | 0x4 | int | `rdt` | | + +## `Game::RefugeesEncounterParams` + +Write `0x004fbff0`, Read `0x004fbfd0`, IStreamable vftable `0x009f11dc` (COL offset +0x0). sizeof >= 0x9 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x1 | bool | `.` | | + +## `Game::RefugeesEncounterResult` + +Write `0x004fc070`, Read `0x004fc010`, IStreamable vftable `0x009f11ec` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::SNMAIRelationValues` + +Write `0x0082a650`, Read `0x0082a5e0`, IStreamable vftable `0x00a319d8` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::AIRelationRecord | + +## `Game::SNMAllCombatDone` + +Write `0x0082a170`, Read `0x0082a100`, IStreamable vftable `0x00a24758` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::EncounterResults | + +## `Game::SNMAllianceInvite` + +Write `0x00817290`, Read `0x00816f30`, IStreamable vftable `0x00a2d768` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::SNMAllianceInviteChat` + +Write `0x00816c20`, Read `0x00816ba0`, IStreamable vftable `0x00a319ec` (COL offset +0x0). sizeof >= 0x2c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1c | string | `.` | | +| 0x28 | 0x4 | int | `.` | | + +## `Game::SNMAllianceInviteProgress` + +Write `0x0082a9e0`, Read `0x0082a940`, IStreamable vftable `0x00a3233c` (COL offset +0x0). sizeof >= 0x54 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4c | object | `.` | Game::AllianceInvite | + +## `Game::SNMAllianceNotify` + +Write `0x00817290`, Read `0x00816f30`, IStreamable vftable `0x00a2d790` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::SNMAllianceReply` + +Write `0x00817030`, Read `0x00816fb0`, IStreamable vftable `0x00a2d77c` (COL offset +0x0). sizeof >= 0x11 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x1 | bool | `.` | | + +## `Game::SNMCancelAllianceInvite` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a2d7cc` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMChat` + +Write `0x00816d30`, Read `0x00816c80`, IStreamable vftable `0x00a241c4` (COL offset +0x0). sizeof >= 0x30 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x1c | string | `.` | | +| 0x2c | 0x4 | int | `.` | | + +## `Game::SNMCombatTimeRemaining` + +Write `0x00816980`, Read `0x00816950`, IStreamable vftable `0x00a2d704` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | float | `.` | | + +## `Game::SNMCommMessage` + +Write `0x0082a4f0`, Read `0x00855690`, IStreamable vftable `0x00a2d740` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | object (ptr) | `.` | Game::ICommMessage | + +## `Game::SNMDemandEmpireSurrender` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a2164c` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMDemandEmpireSurrenderResponse` + +Write `0x00764ac0`, Read `0x00764a90`, IStreamable vftable `0x00a21660` (COL offset +0x0). sizeof >= 0xd (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::SNMDoEncounterQuery` + +Write `0x00816f10`, Read `0x00816ee0`, IStreamable vftable `0x00a23d54` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMEncounterProgress` + +Write `0x0082a240`, Read `0x0082a1d0`, IStreamable vftable `0x00a319c4` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::PlayerEncounterProgress | + +## `Game::SNMEncounterQueryResults` + +Write `0x0082a330`, Read `0x0082a2a0`, IStreamable vftable `0x00a31424` (COL offset +0x0). sizeof >= 0x1c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x14 | object | `.` | Game::EncounterQuery | + +## `Game::SNMEncounterResults` + +Write `0x0082a460`, Read `0x0082a3b0`, IStreamable vftable `0x00a32a54` (COL offset +0x0). sizeof >= 0x184 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x174 | object | `.` | Game::EncounterResults | +| 0x180 | 0x4 | int | `.` | | + +## `Game::SNMEndTurn` + +Write `0x0082a770`, Read `0x0082a6b0`, IStreamable vftable `0x00a229e0` (COL offset +0x0). sizeof >= 0x1c8 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | Game::TurnCommands | +| 0x1b8 | 0x10 | object | `.` | Game::AIEncounterFlags | + +## `Game::SNMGenericEvent` + +Write `0x00451630`, Read `0x00451600`, IStreamable vftable `0x00a31a50` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | + +## `Game::SNMGenericGameMessage` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a2d7f4` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMHostCombat` + +Write `0x00816870`, Read `0x008167f0`, IStreamable vftable `0x00a31974` (COL offset +0x0). sizeof >= 0x32 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1c | string | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x4 | float | `.` | | +| 0x30 | 0x1 | bool | `.` | | +| 0x31 | 0x1 | bool | `.` | | + +## `Game::SNMHostCombatReply` + +Write `0x00829df0`, Read `0x00829d40`, IStreamable vftable `0x00a31988` (COL offset +0x0). sizeof >= 0x7c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `.` | | +| 0x8 | 0x58 | object | `.` | Address | +| 0x60 | 0x1c | string | `.` | | + +## `Game::SNMJoin` + +Write `0x008167b0`, Read `0x00816770`, IStreamable vftable `0x00a31960` (COL offset +0x0). sizeof >= 0x25 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | +| 0x24 | 0x1 | bool | `.` | | + +## `Game::SNMJoinCombat` + +Write `0x0082a040`, Read `0x00829f70`, IStreamable vftable `0x00a3199c` (COL offset +0x0). sizeof >= 0x9c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x58 | object | `.` | Address | +| 0x5c | 0x1c | string | `.` | | +| 0x78 | 0x1c | string | `.` | | +| 0x94 | 0x4 | int | `.` | | +| 0x98 | 0x4 | int | `.` | | + +## `Game::SNMJoinCombatReply` + +Write `0x00816920`, Read `0x008168f0`, IStreamable vftable `0x00a319b0` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `.` | | +| 0x8 | 0x1c | string | `.` | | + +## `Game::SNMJoinReply` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x00a2d6f0` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMKillAI` + +Write `0x00816f10`, Read `0x00816ee0`, IStreamable vftable `0x00a2d754` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMLaunchCombat` + +Write `0x00829e90`, Read `0x0087acf0`, IStreamable vftable `0x00a3274c` (COL offset +0x0). sizeof >= 0x2c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x10 | vector | `.` | | +| 0x18 | 0x14 | object | `.` | Game::EncounterQuery | + +## `Game::SNMLeaveAlliance` + +Write `0x00816f10`, Read `0x00816ee0`, IStreamable vftable `0x00a212c0` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMLeaveCeaseFire` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a2d7b8` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMLeaveNonAggression` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a2d7a4` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMLobbyChat` + +Write `0x00816e00`, Read `0x00816da0`, IStreamable vftable `0x00a31a00` (COL offset +0x0). sizeof >= 0x40 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | +| 0x24 | 0x1c | string | `.` | | + +## `Game::SNMMakePlayerAI` + +Write `0x00816a00`, Read `0x008169b0`, IStreamable vftable `0x00a2d72c` (COL offset +0x0). sizeof >= 0x9 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1 | bool | `.` | | + +## `Game::SNMPendingAlliances` + +Write `0x0082abf0`, Read `0x0082ab80`, IStreamable vftable `0x00a31438` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::PlayerAlliances | + +## `Game::SNMPlaySpeechEvent` + +Write `0x00817290`, Read `0x00816f30`, IStreamable vftable `0x00a2d808` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::SNMProgressionWarsConvoyShips` + +Write `0x008172e0`, Read `0x00838eb0`, IStreamable vftable `0x00a307bc` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMRefreshSlots` + +Write `0x00828290`, Read `0x00828220`, IStreamable vftable `0x00a317b0` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::SNMRefreshSlots::SlotData | + +## `Game::SNMRefreshSlots::SlotData` + +Write `0x008145b0`, Read `0x00814570`, IStreamable vftable `0x00a23c74` (COL offset +0x0). sizeof 0x10 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1 | bool | `.` | | + +## `Game::SNMRemoveCommMessage` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a2141c` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMRunAI` + +Write `0x00816ea0`, Read `0x00816e40`, IStreamable vftable `0x00a31a14` (COL offset +0x0). sizeof >= 0x25 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | +| 0x24 | 0x1 | bool | `.` | | + +## `Game::SNMSetAIPolicy` + +Write `0x00812500`, Read `0x00817120`, IStreamable vftable `0x00a21408` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMSetPlayerStatus` + +Write `0x0042c7f0`, Read `0x0042dd90`, IStreamable vftable `0x00a2d718` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMSetSlotPassword` + +Write `0x008170e0`, Read `0x00817090`, IStreamable vftable `0x00a31a3c` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | + +## `Game::SNMSetTimers` + +Write `0x00617bc0`, Read `0x00617b50`, IStreamable vftable `0x00a0c08c` (COL offset +0x0). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x14 | object | `.` | Game::StrategyTimerParams | + +## `Game::SNMSlotInit` + +Write `0x00827e80`, Read `0x00827d40`, IStreamable vftable `0x00a3256c` (COL offset +0x0). sizeof >= 0x40 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `.` | | +| 0x5 | 0x1 | bool | `.` | | +| 0x6 | 0x1 | bool | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x10 | vector | `.` | Game::Slot | +| 0x1c | 0x4 | int | `.` | | +| 0x20 | 0x1 | bool | `.` | | +| 0x24 | 0x4 | int | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x14 | object | `.` | Game::StrategyPlayerGameSettings | + +## `Game::SNMSlotInsertClient` + +Write `0x008143b0`, Read `0x00814370`, IStreamable vftable `0x00a31774` (COL offset +0x0). sizeof >= 0x28 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1c | string | `.` | | + +## `Game::SNMSlotMoveClient` + +Write `0x00814430`, Read `0x008143f0`, IStreamable vftable `0x00a2d594` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::SNMSlotPWAttempt` + +Write `0x0076c680`, Read `0x008d1ad0`, IStreamable vftable `0x00a3179c` (COL offset +0x0). sizeof >= 0x20 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | + +## `Game::SNMSlotPWRejected` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x00a2d5e4` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMSlotRemoveClient` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x00a2d580` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMSlotReqPW` + +Write `0x00814540`, Read `0x00814510`, IStreamable vftable `0x00a2d5a8` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | float | `.` | | +| 0x8 | 0x4 | int | `.` | | + +## `Game::SNMSlotSetData` + +Write `0x008280f0`, Read `0x00827fa0`, IStreamable vftable `0x00a31760` (COL offset +0x0). sizeof >= 0x94 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x1c | string | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x4 | int | `.` | | +| 0x30 | 0x7 | object | `.` | Game::PlayerColorID | +| 0x44 | 0x1c | string | `.` | | +| 0x60 | 0x1c | string | `.` | | +| 0x7c | 0x1 | bool | `.` | | +| 0x80 | 0x14 | object | `.` | Game::StrategyPlayerGameSettings | + +## `Game::SNMSlotSetForcedSpecies` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x00a2d558` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::SNMSlotSetPW` + +Write `0x008144c0`, Read `0x00814470`, IStreamable vftable `0x00a31788` (COL offset +0x0). sizeof >= 0x26 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x1c | string | `.` | | +| 0x24 | 0x1 | bool | `.` | | +| 0x25 | 0x1 | bool | `.` | | + +## `Game::SNMSlotSetState` + +Write `0x00814330`, Read `0x008142e0`, IStreamable vftable `0x00a2d56c` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::SNMTechOffer` + +Write `0x00817220`, Read `0x00817180`, IStreamable vftable `0x00a21914` (COL offset +0x0). sizeof >= 0x2d (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x1c | string | `.` | | +| 0x2c | 0x1 | bool | `.` | | + +## `Game::SNMTransferProgress` + +Write `0x007910d0`, Read `0x00791060`, IStreamable vftable `0x00a241d8` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | char | + +## `Game::SNMTurnInfo` + +Write `0x0078da60`, Read `0x0078d9f0`, IStreamable vftable `0x00a23a8c` (COL offset +0x0). sizeof >= 0x38 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x34 | object | `.` | Game::StrategyTurnInfo | + +## `Game::SNMUpdate` + +Write `0x00829c40`, Read `0x00829ad0`, IStreamable vftable `0x00a24744` (COL offset +0x0). sizeof >= 0x54 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::PlayerAlliances | +| 0x14 | 0x10 | vector | `.` | enum:uint | +| 0x24 | 0x10 | vector | `.` | enum:uint | +| 0x34 | 0x10 | vector | `.` | enum:uint | +| 0x44 | 0x10 | vector | `.` | Game::TechOffer | + +## `Game::SNMUpdateAlliances` + +Write `0x0082ab00`, Read `0x0082aa60`, IStreamable vftable `0x00a2d7e0` (COL offset +0x0). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x10 | object | `.` | Game::PlayerAlliances | + +## `Game::SNMUpdateComplete` + +Write `0x0076c680`, Read `0x008d1ad0`, IStreamable vftable `0x00a21ad0` (COL offset +0x0). sizeof >= 0x20 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | + +## `Game::SNMUserNames` + +Write `0x0082a8b0`, Read `0x0082a810`, IStreamable vftable `0x00a31a28` (COL offset +0x0). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `.` | Game::StrategyUserInfo | +| 0x14 | 0x4 | int | `.` | | + +## `Game::SVSOAntiquarians` + +Write `0x0054bb40`, Read `0x00551e90`, IStreamable vftable `0x009fab94` (COL offset +0x0). sizeof >= 0x20 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `narts` | | +| 0x18 | 0x4 | int | `wpid` | | +| 0x1c | 0x4 | int | `wpturn` | | + +Container-element fields (offsets are within the element / map node, not the object): `art`@+0x0 + +## `Game::SVSOAntiquarians::Artifact` + +Write `0x005477e0`, Read `0x00547760`, IStreamable vftable `0x009fa410` (COL offset +0x0). sizeof >= 0x14 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `shipid` | | +| 0x8 | 0x4 | handle | `salsid` | | +| 0xc | 0x4 | int | `salpid` | | +| 0x10 | 0x4 | int | `pvis` | | + +## `Game::SVSOBrokenEmpire` + +Write `0x0054bd50`, Read `0x0054bcc0`, IStreamable vftable `0x009fb134` (COL offset +0x0). sizeof >= 0x14 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0xc | object | `pcs` | Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap | + +## `Game::SVSOCrowDefenders` + +Write `0x004f8c90`, Read `0x0050fe90`, IStreamable vftable `0x009f5904` (COL offset +0x0). sizeof >= 0x3c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `sys` | | +| 0x8 | 0x10 | vector | `ndsys` | | +| 0x18 | 0x10 | vector | `ndes` | | +| 0x38 | 0x4 | float | `drad` | | + +## `Game::SVSOCrowRuins` + +Write `0x00502730`, Read `0x005241d0`, IStreamable vftable `0x009f4d44` (COL offset +0x0). sizeof >= 0x28 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `NAsg` | | +| 0x18 | 0x10 | vector | `NWD` | | + +Container-element fields (offsets are within the element / map node, not the object): `Esys`@+0x4 + +## `Game::SVSODerelict` + +Write `0x004fc2b0`, Read `0x0051f2a0`, IStreamable vftable `0x009f4664` (COL offset +0x0). sizeof >= 0x28 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `Eflt` | | +| 0x18 | 0x10 | vector | `NDsn` | | + +Container-element fields (offsets are within the element / map node, not the object): `NAsg`@+0x4, `Esys`@+0x4 + +## `Game::SVSOGrandMenaceTrigger` + +Write `0x004fca00`, Read `0x004fc9d0`, IStreamable vftable `0x009f1204` (COL offset +0x0). sizeof >= 0x8 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `gmch` | | + +## `Game::SVSOJewelsOfTheCrown` + +Write `0x0054c740`, Read `0x0054c5f0`, IStreamable vftable `0x009fb1f4` (COL offset +0x0). sizeof >= 0x30 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `JEWELLOCATIONID` | | +| 0xc | 0x4 | int | `JEWELSHIPID` | | +| 0x10 | 0x4 | int | `JEWELLOCATIONID` | | +| 0x14 | 0x10 | vector | `prjdone` | enum:uint | +| 0x2c | 0x4 | int | `PREVJEWELSHIPID` | | + +## `Game::SVSOLandGrab` + +Write `0x00548f70`, Read `0x0054a9e0`, IStreamable vftable `0x009fa92c` (COL offset +0x0). sizeof >= 0x8c (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `nwt` | | +| 0x88 | 0x4 | float | `winr` | | + +## `Game::SVSOLocust` + +Write `0x00508ef0`, Read `0x0050d380`, IStreamable vftable `0x009f56bc` (COL offset +0x0). sizeof >= 0x3c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `ini2` | | +| 0x8 | 0xc | object | `nst` | Game::Game::VLocustNestState::?$NetworkIDDataMap | +| 0x18 | 0xc | object | `flt` | Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap | +| 0x28 | 0x4 | int | `des` | | +| 0x2c | 0x10 | vector | `vis` | enum:uint | + +## `Game::SVSOMasterVoice` + +Write `0x0054cd10`, Read `0x0054cc40`, IStreamable vftable `0x009fb094` (COL offset +0x0). sizeof >= 0x28 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `hom` | enum:uint | +| 0x18 | 0x10 | vector | `hmd` | enum:HomeState | + +## `Game::SVSOMonitor` + +Write `0x004fd810`, Read `0x0052b440`, IStreamable vftable `0x009f5854` (COL offset +0x0). sizeof >= 0x44 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `Eflt` | | +| 0x18 | 0x10 | vector | `NDsn` | | +| 0x28 | 0x1c | string | `scnm` | | + +Container-element fields (offsets are within the element / map node, not the object): `NAsg`@+0x4, `Esys`@+0x4 + +## `Game::SVSOOrtgay` + +Write `0x00509510`, Read `0x00509390`, IStreamable vftable `0x009f0e94` (COL offset +0x0). sizeof >= 0x38 (lower bound). **verified** -- fields exact; Read agrees on all 5 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `init` | | +| 0x8 | 0x4 | int | `design` | | +| 0xc | 0x4 | int | `state` | | +| 0x10 | 0xc | object | `origin` | Vector3 | +| 0x1c | 0xc | object | `center` | Vector3 | +| 0x28 | 0x4 | int | `turnLv` | | +| 0x2c | 0x4 | int | `turnAn` | | +| 0x30 | 0x4 | int | `spawnturn` | | +| 0x34 | 0x4 | int | `spawnodds` | | + +## `Game::SVSOProgressionWars` + +Write `0x0054cdb0`, Read `0x00553490`, IStreamable vftable `0x009fb34c` (COL offset +0x0). sizeof >= 0x50 (lower bound). **verified** -- fields exact; Read agrees on all 8 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `stg` | | +| 0xc | 0x4 | int | `sft` | | +| 0x10 | 0x4 | int | `snt` | | +| 0x14 | 0x4 | int | `snec` | | +| 0x18 | 0x4 | int | `ses` | | +| 0x1c | 0x4 | int | `snet` | | +| 0x20 | 0x4 | int | `snep` | | +| 0x24 | 0x4 | int | `srsi` | | +| 0x28 | 0x4 | int | `srs` | | +| 0x40 | 0x10 | vector | `lts` | String | + +## `Game::SVSOPuppetMaster` + +Write `0x00509f80`, Read `0x00511b80`, IStreamable vftable `0x009f3dcc` (COL offset +0x0). sizeof >= 0x2c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | handle | `Flt` | | +| 0xc | 0x1 | bool | `Init2` | | +| 0x10 | 0x10 | vector | `NSys` | | +| 0x20 | 0xc | object | `End` | Vector3 | + +## `Game::SVSORefugees` + +Write `0x00509640`, Read `0x00526420`, IStreamable vftable `0x009f575c` (COL offset +0x0). sizeof >= 0x28 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `rsuc` | | +| 0x14 | 0x1 | bool | `ini` | | +| 0x18 | 0x10 | vector | `didc` | | + +Container-element fields (offsets are within the element / map node, not the object): `pid`@+0xc, `rsu`@+0x10 + +## `Game::SVSORefugees::PlayerStatus` + +Write `0x004fbf50`, Read `0x004fbeb0`, IStreamable vftable `0x009f11cc` (COL offset +0x0). sizeof >= 0x12 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `lr` | | +| 0x8 | 0x4 | int | `lrt` | | +| 0xc | 0x4 | int | `llc` | | +| 0x10 | 0x1 | bool | `atr` | | +| 0x11 | 0x1 | bool | `asy` | | + +## `Game::SVSOSlaversRefuel` + +Write `0x004fdf80`, Read `0x00520b00`, IStreamable vftable `0x009f4834` (COL offset +0x0). sizeof >= 0x3c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `NAsg` | | +| 0x18 | 0x10 | vector | `NTD` | | +| 0x28 | 0x10 | vector | `NAD` | | +| 0x38 | 0x4 | int | `CDiff` | | + +Container-element fields (offsets are within the element / map node, not the object): `Esys`@+0x4 + +## `Game::SVSOSots` + +Write `0x0059ddf0`, Read `0x005a7a40`, IStreamable vftable `0x00a063c4` (COL offset +0x0). sizeof >= 0x38 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `ScnID` | | +| 0x8 | 0x4 | object (ptr) | `ScnObj` | Game::SVSOScenarioBase | +| 0xc | 0x10 | vector | `NEncObjs` | | +| 0x34 | 0x4 | int | `numx` | | + +Container-element fields (offsets are within the element / map node, not the object): `xscn`@+0xc, `xsc`@+0x28, `EncObj`@+0x4 + +## `Game::SVSOSwarm` + +Write `0x0050a0c0`, Read `0x00520d50`, IStreamable vftable `0x009f48dc` (COL offset +0x0). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `NAsg` | | +| 0x20 | 0x4 | vector (ptr) | `infest` | Game::SVSOSwarm::Infestation | + +Container-element fields (offsets are within the element / map node, not the object): `Esys`@+0x4 + +## `Game::SVSOSwarm::Infestation` + +Write `0x004fe0e0`, Read `0x00504bd0`, IStreamable vftable `0x009f1720` (COL offset +0x0). sizeof >= 0x19 (lower bound). **verified** -- fields exact; Read agrees on all 4 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `sysid` | | +| 0x8 | 0x4 | int | `stg` | | +| 0xc | 0x4 | int | `strn` | | +| 0x10 | 0x4 | int | `mtrn` | | +| 0x14 | 0x4 | int | `trgtrn` | | +| 0x18 | 0x1 | bool | `canh` | | + +## `Game::SVSOSwarmQueen` + +Write `0x0050ac70`, Read `0x0050dea0`, IStreamable vftable `0x009f49e4` (COL offset +0x0). sizeof >= 0x40 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x10 | 0x10 | vector | `Hives` | Game::SVSOSwarmQueen::HiveInfo | +| 0x20 | 0x10 | vector | `Queens` | Game::SVSOSwarmQueen::QueenInfo | +| 0x30 | 0x10 | vector | `SysMem` | enum:uint | + +## `Game::SVSOSwarmQueen::HiveInfo` + +Write `0x004fe730`, Read `0x004fe6f0`, IStreamable vftable `0x009f1a68` (COL offset +0x0). sizeof 0x10 (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `HiveID` | | +| 0x8 | 0x4 | int | `NextQ` | | +| 0xc | 0x4 | handle | `QueenID` | | + +## `Game::SVSOSwarmQueen::QueenInfo` + +Write `0x004f6680`, Read `0x004fe780`, IStreamable vftable `0x009f1a78` (COL offset +0x0). sizeof 0xc (container stride). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `QueenID` | | +| 0x8 | 0x4 | handle | `QDstID` | | + +## `Game::SVSOSystemKiller` + +Write `0x0050af20`, Read `0x00511f90`, IStreamable vftable `0x009f3e6c` (COL offset +0x0). sizeof >= 0x2c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | handle | `Flt` | | +| 0xc | 0x1 | bool | `Init2` | | +| 0x10 | 0x10 | vector | `NSys` | | +| 0x20 | 0xc | object | `End` | Vector3 | + +## `Game::SVSOTraps` + +Write `0x00509a70`, Read `0x005099e0`, IStreamable vftable `0x009f5bcc` (COL offset +0x0). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x14 | 0x10 | vector | `traps` | Game::SVSOTraps::Trap | + +## `Game::SVSOTraps::Trap` + +Write `0x004fca20`, Read `0x005042c0`, IStreamable vftable `0x009f12a0` (COL offset +0x0). sizeof 0x14 (container stride). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `sys` | | +| 0x8 | 0x4 | int | `pid` | | +| 0xc | 0x4 | int | `trenc` | | +| 0x10 | 0x4 | int | `trgenc` | | + +## `Game::SVSOUpstartApes` + +Write `0x0054d1b0`, Read `0x00563850`, IStreamable vftable `0x009fb4cc` (COL offset +0x0). sizeof >= 0x48 (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `EMPIREFLAGS` | | +| 0x10 | 0x4 | int | `EMPIRESTANDING` | | +| 0x30 | 0x4 | int | `NEXTORDERTURN` | | +| 0x44 | 0x4 | int | `EARTHID` | | + +Container-element fields (offsets are within the element / map node, not the object): `EMPIREORDERID`@+0x4, `EMPIREORDER`@+0x0 + +## `Game::SVSOUpstartApes_EO_DEMANDS_SHIPS` + +Write `0x0054cfe0`, Read `0x0054cef0`, IStreamable vftable `0x009fb290` (COL offset +0x0). sizeof >= 0x30 (lower bound). **verified** -- fields exact; Read agrees on all 5 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x14 | 0x10 | vector | `REQUESTS` | Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest | +| 0x24 | 0x4 | int | `LASTTURN` | | +| 0x28 | 0x4 | int | `SUCCESSSTANDING` | | +| 0x2c | 0x4 | int | `FAILURESTANDING` | | + +## `Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest` + +Write `0x0055d120`, Read `0x0055d040`, IStreamable vftable `0x009fa614` (COL offset +0x0). sizeof 0x20 (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x1c | 0x4 | int | `NUMREQUIRED` | | + +## `Game::SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS` + +Write `0x00548ce0`, Read `0x00548c90`, IStreamable vftable `0x009fa564` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x14 | 0x4 | int | `LASTTURN` | | + +## `Game::SVSOUpstartApes_EO_DEMANDS_VICTORY` + +Write `0x00548ce0`, Read `0x00548c90`, IStreamable vftable `0x009fa534` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x14 | 0x4 | int | `LASTTURN` | | + +## `Game::SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT` + +Write `0x00548ce0`, Read `0x00548c90`, IStreamable vftable `0x009fa504` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x14 | 0x4 | int | `LASTTURN` | | + +## `Game::SVSOUpstartApes_EO_FEARS_YOUR_POWER` + +Write `0x00548ce0`, Read `0x00548c90`, IStreamable vftable `0x009fa4d4` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x14 | 0x4 | int | `LASTTURN` | | + +## `Game::SVSOUpstartApes_EO_GIFTS` + +Write `0x00548c50`, Read `0x00548c10`, IStreamable vftable `0x009fa54c` (COL offset +0x0). sizeof >= 0x14 (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | + +## `Game::SVSOUpstartApes_EO_MUST_EXPAND` + +Write `0x00548bb0`, Read `0x00548b50`, IStreamable vftable `0x009fa51c` (COL offset +0x0). sizeof >= 0x1c (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x18 | 0x4 | int | `LASTTURN` | | + +## `Game::SVSOUpstartApes_EO_REQUIRES_CASH` + +Write `0x00548ce0`, Read `0x00548c90`, IStreamable vftable `0x009fa4ec` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `OBJECTIVEID` | | +| 0x10 | 0x4 | int | `TURNCREATED` | | +| 0x14 | 0x4 | int | `LASTTURN` | | + +## `Game::SVSOVonNeumann` + +Write `0x0052b8d0`, Read `0x0050e130`, IStreamable vftable `0x009f59cc` (COL offset +0x0). sizeof >= 0x90 (lower bound). **verified** -- fields exact; Read agrees on all 14 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x10 | vector | `dfts` | Game::SVSOVonNeumann::DefeatRecord | +| 0x24 | 0x4 | int | `rusav` | | +| 0x28 | 0x4 | int | `nenc` | | +| 0x2c | 0x4 | int | `nmb` | | +| 0x30 | 0x4 | int | `nml` | | +| 0x34 | 0x4 | int | `nbb` | | +| 0x38 | 0x4 | int | `nbl` | | +| 0x3c | 0x4 | int | `nskb` | | +| 0x40 | 0x4 | int | `nskl` | | +| 0x44 | 0x4 | handle | `vnhw` | | +| 0x48 | 0x8 | int64 | `vnhp` | | +| 0x50 | 0x4 | int | `mbid` | | +| 0x54 | 0x4 | int | `mbgid` | | +| 0x58 | 0x4 | int | `skgid` | | +| 0x5c | 0x4 | int | `ntm` | | +| 0x60 | 0x10 | vector | `mts` | enum:uint | +| 0x70 | 0x4 | int | `ntb` | | +| 0x74 | 0x1 | bool | `sken` | | +| 0x78 | 0x4 | int | `skdid` | | +| 0x7c | 0x4 | int | `skhid` | | +| 0x80 | 0x4 | int | `skfid` | | +| 0x84 | 0x4 | int | `sktq` | | +| 0x88 | 0x4 | int | `skt` | | +| 0x8c | 0x4 | int | `sktc` | | + +## `Game::SVSOVonNeumann::DefeatRecord` + +Write `0x004ff7f0`, Read `0x005051f0`, IStreamable vftable `0x009f1c9c` (COL offset +0x0). sizeof 0x18 (container stride). **verified** -- fields exact; Read agrees on all 4 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `sys` | | +| 0x8 | 0x4 | int | `ndft` | | +| 0xc | 0x4 | int | `lstd` | | +| 0x10 | 0x4 | int | `nxrv` | | +| 0x14 | 0x1 | bool | `bkdf` | | + +## `Game::ServerNodeGraph` + +Write `0x006e3530`, Read `0x006e61e0`, IStreamable vftable `0x00a1cc4c` (COL offset +0x44). sizeof >= 0x4c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `paths` | Game::NodePath | +| 0x48 | 0x4 | int | `nextid` | | + +## `Game::ServerNodeGraph::Params` + +Write `0x006e3480`, Read `0x006e33a0`, IStreamable vftable `0x00a1cc6c` (COL offset +0x0). sizeof >= 0x28 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `RSeed` | | +| 0x8 | 0x10 | vector | `PSeed` | Game::SimpleNodePath | +| 0x18 | 0x10 | vector | `SSeed` | int | + +## `Game::ServerPlayer` + +Write `0x008563e0`, Read `0x008804d0`, IStreamable vftable `0x00a32794` (COL offset +0x3a0). sizeof >= 0x3e0 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x28 | 0x4 | int | `PlyrIdx` | | +| 0x2c | 0x4 | handle | `HomeSys` | | +| 0x30 | 0x10 | vector | `NumOwn` | | +| 0x34 | 0x4 | handle | `OwnId` | | +| 0x40 | 0x1c | string | `PlryName` | | +| 0x5c | 0x4 | int | `Species` | | +| 0x60 | 0x7 | object | `ClrID` | Game::PlayerColorID | +| 0x74 | 0x1c | string | `Bdg` | | +| 0x90 | 0x1c | string | `Avt` | | +| 0xac | 0x4 | int | `Team` | | +| 0xb0 | 0x4 | float | `IdealSuit` | | +| 0xb4 | 0x4 | float | `SuitTol` | | +| 0xb8 | 0x4 | float | `MaxOH` | | +| 0xbc | 0x4 | float | `ResRate` | | +| 0xc0 | 0x4 | float | `ResMod` | | +| 0xc4 | 0x4 | float | `ResScl` | | +| 0xd0 | 0x4 | float | `TRM` | | +| 0xd4 | 0x4 | int | `TRA` | | +| 0xd8 | 0x4 | int | `TRP` | | +| 0xe4 | 0x10 | vector | `NumDes` | | +| 0xf4 | 0x4 | object (ptr) | `TechTree` | Game::TechTree | +| 0xf8 | 0x1 | bool | `Elim` | | +| 0xfb | 0x1 | bool | `NPC` | | +| 0xfc | 0x1 | bool | `RebAI` | | +| 0xfd | 0x1 | bool | `ReqCL` | | +| 0xfe | 0x1 | bool | `AIBn` | | +| 0xff | 0x1 | bool | `CnTrd` | | +| 0x100 | 0x1 | bool | `CnRad` | | +| 0x101 | 0x1 | bool | `CnVItl` | | +| 0x102 | 0x1 | bool | `hgs` | | +| 0x103 | 0x1 | bool | `hadvs` | | +| 0x104 | 0x1 | bool | `harcc` | | +| 0x108 | 0x4 | float | `pddm` | | +| 0x118 | 0x4 | float | `SavMod` | | +| 0x124 | 0x4 | float | `OutMod` | | +| 0x128 | 0x4 | float | `RebOutMod` | | +| 0x12c | 0x4 | float | `ScOutMod` | | +| 0x130 | 0x4 | float | `PopMod` | | +| 0x134 | 0x4 | float | `TerraMod` | | +| 0x138 | 0x1 | bool | `AMine` | | +| 0x13c | 0x4 | float | `MinPure` | | +| 0x140 | 0x4 | float | `MinRate` | | +| 0x144 | 0x4 | int | `NGts` | | +| 0x148 | 0x4 | int | `PrGtTrf` | | +| 0x14c | 0x4 | int | `GTraf` | | +| 0x150 | 0x4 | float | `CstR` | | +| 0x154 | 0x4 | float | `CstE` | | +| 0x158 | 0x4 | float | `CstT` | | +| 0x15c | 0x4 | int | `Maint` | | +| 0x160 | 0x4 | float | `shrm` | | +| 0x164 | 0x4 | int | `Status` | | +| 0x168 | 0x10 | object | `Team` | Game::PlayerAlliances | +| 0x178 | 0x10 | vector | `NumLeg` | | +| 0x17c | 0x4 | handle | `DesID` | | +| 0x188 | 0x4 | int | `PvSav` | | +| 0x18c | 0x1 | bool | `PvMA` | | +| 0x19c | 0x4 | int | `HasDisc` | | +| 0x1a0 | 0x4 | int | `HasDiscSp` | | +| 0x1a4 | 0x4 | int | `HasDiscCl` | | +| 0x1a8 | 0x4 | int | `HasEnc` | | +| 0x1ac | 0x4 | int | `HasEng` | | +| 0x1b0 | 0x38 | object | `ShipRecs` | Game::ShipRecords | +| 0x1f4 | 0x10 | vector | `Ojvs` | Game::Objective | +| 0x204 | 0x10 | vector | `Nexp` | | +| 0x214 | 0x10 | vector | `NWeapXcl` | | +| 0x230 | 0x10 | vector | `dipstats` | Game::DiplomacyStats | +| 0x240 | 0x4 | object (ptr) | `comms` | Game::CommMessageContainer | +| 0x244 | 0x10 | vector | `preps` | Game::PlayerReport | +| 0x254 | 0x10 | vector | `odes` | Game::ObservedDesign | +| 0x264 | 0x10 | vector | `owep` | Game::ObservedWeapon | +| 0x274 | 0x10 | vector | `otch` | Game::ObservedTech | +| 0x284 | 0x4 | int | `Sav` | | +| 0x288 | 0x4 | int | `HasImm` | | +| 0x28c | 0x4 | int | `HasVac` | | +| 0x290 | 0x4 | int | `NPTrk` | | +| 0x298 | 0x4 | object (ptr) | `FNG` | Game::FleetNameGenerator | +| 0x29c | 0x18 | object | `Events` | Game::EventStorage | +| 0x2bc | 0x4 | int | `NumNotes` | | +| 0x2c4 | 0x4 | int | `BnkWrn` | | +| 0x2c8 | 0x4 | int | `BnkTrn` | | +| 0x2cc | 0x4 | int | `BnkEl` | | +| 0x2d0 | 0x4 | int | `BnkPr` | | +| 0x2d8 | 0x4 | int | `plcy` | | +| 0x2dc | 0x1c | string | `pswd` | | +| 0x2f8 | 0x1 | bool | `Srn` | | +| 0x2fc | 0x4 | handle | `SrnTo` | | +| 0x300 | 0x4 | int | `lboid` | | +| 0x304 | 0x4 | int | `lcid2` | | +| 0x30c | 0x4 | float | `IncMod` | | +| 0x310 | 0x10 | vector | `aid` | Game::PlayerAid | +| 0x320 | 0x10 | vector | `ndeflay` | | +| 0x330 | 0x1 | bool | `cdp` | | +| 0x334 | 0x4 | object (ptr) | `spy2` | Game::SpyReport | +| 0x338 | 0x10 | vector | `rdtc` | | +| 0x368 | 0x4 | int | `aidf` | | +| 0x370 | ? | object | `civr` | Game::CivilianRatios | +| 0x3a4 | 0x10 | vector | `NumPR` | | +| 0x3b4 | 0x1 | bool | `ResErrRoll` | | +| 0x3b5 | 0x1 | bool | `cta` | | +| 0x3b8 | 0x4 | object (ptr) | `AIR` | Game::AIRebellion | +| 0x3bc | 0x4 | object (ptr) | `AIEnf` | Game::AIEncounterFlags | +| 0x3c0 | 0x10 | vector | `NSprj` | | +| 0x3d0 | 0x4 | int | `NextPrjID` | | +| 0x3d4 | 0x4 | int | `lret` | | +| 0x3dc | 0x4 | int | `nmeid` | | + +Container-element fields (offsets are within the element / map node, not the object): `ConMod`@+0x-c, `DesID`@+0x4, `Des`@+0x0, `Des`@+0x0, `Nts`@+0x10, `SprjT`@+0x3c, `Sprj`@+0x0, `WeapXcl`@+0x0, `deflay`@+0x0 + +## `Game::ServerSpyManager` + +Write `0x00828a40`, Read `0x008381b0`, IStreamable vftable `0x00a30728` (COL offset +0x4). sizeof >= 0x20 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xc | 0x4 | int | `xsid` | | +| 0x10 | 0x10 | vector | `nspy` | | + +Container-element fields (offsets are within the element / map node, not the object): `spy`@+0x0 + +## `Game::ServerSystem` + +Write `0x00749630`, Read `0x0075d4b0`, IStreamable vftable `0x00a2043c` (COL offset +0x8). sizeof >= 0x2d8 (lower bound). **partial** -- 4 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | +| 0x4c | 0x4 | float | `R` | | +| 0x50 | 0x4 | float | `G` | | +| 0x54 | 0x4 | float | `B` | | +| 0x58 | 0x4 | float | `A` | | +| 0x5c | 0x4 | int | `Idx` | | +| 0x60 | 0x4 | int | `Size` | | +| 0x64 | 0x4 | float | `Suit` | | +| 0x68 | 0x4 | int | `Res` | | +| 0x6c | 0x4 | int | `ARes2` | | +| 0x70 | 0x4 | int | `MRes` | | +| 0x74 | 0x4 | int | `TRes` | | +| 0x78 | 0x1 | bool | `haltv` | | +| 0x7c | 0x4 | float | `OutMod` | | +| 0x80 | 0x4 | int | `TAcq` | | +| 0x84 | 0x4 | int | `TFAcq` | | +| 0x88 | 0x1c | object | `Rts` | Game::StarSystem::OutputRates | +| 0xa4 | 0x4 | object (ptr) | `BQ` | Game::BuildQueue | +| 0xa8 | 0x1c | string | `Name` | | +| 0xc4 | 0x1 | bool | `Abdn` | | +| 0xc5 | 0x1 | bool | `Dstyd` | | +| 0xc6 | 0x1 | bool | `vnh` | | +| 0xc7 | 0x1 | bool | `vnd` | | +| 0xc8 | 0x1 | bool | `vnex3` | | +| 0xc9 | 0x1 | bool | `vnpex3` | | +| 0xcc | 0x4 | int | `VFlags` | | +| 0xd0 | 0x4 | int | `EFlags` | | +| 0xd4 | 0x4 | int | `AFlags` | | +| 0xd8 | 0x4 | int | `FFlags` | | +| 0xdc | 0x4 | int | `GFlags` | | +| 0xe0 | 0x4 | int | `MnRFlags` | | +| 0xe4 | 0x4 | int | `RfRFlags` | | +| 0xe8 | 0x4 | int | `ClkFlags` | | +| 0xf0 | 0x8 | int64 | `Bats2` | | +| 0xf8 | 0x8 | int64 | `rcex` | | +| 0x100 | 0x4 | handle | `PID` | | +| 0x104 | ? | object | `dcs` | Game::Population | +| 0x118 | 0x4 | float | `dsu` | | +| 0x11c | 0x8 | object | `cm` | Game::Morale | +| 0x13c | 0x10 | vector | `cme2` | Game::MoraleEvent | +| 0x14c | 0x8 | object | `PvCM` | Game::Morale | +| 0x16c | 0x10 | vector | `NumFlts` | | +| 0x17c | 0x4 | float | `RepCur` | | +| 0x180 | 0x4 | float | `RepMax` | | +| 0x184 | 0x4 | int | `EggScio` | | +| 0x188 | 0x1 | bool | `NoRebAI` | | +| 0x189 | 0x1 | bool | `PvNoRebAI` | | +| 0x18c | 0x4 | int | `Pop` | | +| 0x190 | 0x4 | float | `Infra` | | +| 0x194 | 0x4 | int | `pbon` | | +| 0x198 | 0x4 | float | `ibon` | | +| 0x19c | 0x4 | int | `TerrFl` | | +| 0x1a0 | ? | object | `Pop2` | Game::Population | +| 0x1b4 | ? | object | `pbon2` | Game::Population | +| 0x1c8 | 0x4 | object (ptr) | `indi` | Game::IndependenceInfo | +| 0x1cc | 0x10 | vector | `spies2` | int | +| 0x1dc | 0x4 | int | `rbfl` | | +| 0x1e0 | 0x1 | bool | `hsrg` | | +| 0x1e4 | 0x4 | int | `adt` | | +| 0x200 | 0x4 | int | `PvPop` | | +| 0x204 | 0x4 | float | `PvInfra` | | +| 0x208 | 0x4 | float | `PvSuit` | | +| 0x20c | 0x4 | int | `PvRes` | | +| 0x210 | 0x4 | int | `PvARes2` | | +| 0x214 | 0x4 | int | `PvMRes` | | +| 0x218 | ? | object | `PvPop2` | Game::Population | +| 0x238 | 0x4 | handle | `DefF` | | +| 0x23c | 0x4 | handle | `DefSF` | | +| 0x240 | 0x10 | vector | `NumGFs` | | +| 0x250 | 0x10 | vector | `NumSnF` | | +| 0x260 | 0x10 | vector | `NumMnF` | | +| 0x274 | 0x4 | handle | `PID` | | +| 0x278 | 0x4 | int | `NVO` | | +| 0x288 | 0x4 | int | `NVE` | | +| 0x298 | 0x4 | int | `NVs` | | +| 0x2a8 | 0x10 | vector | `NumPlgs2` | | +| 0x2b8 | 0x4 | int | `TnsOH` | | +| 0x2bc | 0x4 | int | `TDst` | | +| 0x2c4 | 0x4 | int | `ntdev` | | +| 0x2c8 | 0x4 | int | `ltis` | | +| 0x2cc | 0x4 | int | `rbtn` | | +| 0x2d0 | 0x4 | int | `rbfr` | | +| 0x2d4 | 0x4 | int | `rbwn` | | + +Container-element fields (offsets are within the element / map node, not the object): `Plg`@+0x0, `TShn`@+0x12, `OID`@+0x14, `isind`@+0x18, `indi`@+0x1c, `EPid`@+0x0, `ETS`@+0x12, `Eid`@+0x14, `PID`@+0x0, `pview`@+0x10 + +## `Game::ServerTradeManagerImpl` + +Write `0x0082cb60`, Read `0x00858a10`, IStreamable vftable `0x00a31b64` (COL offset +0x4c). sizeof >= 0x2c (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | float | `SctSize` | | +| 0x1c | 0x10 | vector | `NumTradeSectors` | | + +Container-element fields (offsets are within the element / map node, not the object): `TradeID`@+0x4, `Trade`@+0x0, `rt`@+0x0 + +## `Game::ServerTradeSector` + +Write `0x0082c8c0`, Read `0x00858290`, IStreamable vftable `0x00a31b30` (COL offset +0x8). sizeof >= 0xb4 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | +| 0x68 | 0x4 | int | `tsgridID` | | +| 0x6c | 0xc | object | `tsctr` | Vector3 | +| 0x78 | 0x10 | vector | `tsnumsys` | | +| 0x88 | 0x4 | int | `tssec` | | +| 0x8c | 0x4 | int | `tsct` | | +| 0x90 | 0x4 | int | `tscr` | | +| 0x94 | 0x4 | int | `ptssec` | | +| 0x98 | 0x4 | int | `ptsct` | | +| 0x9c | 0x4 | int | `ptscr` | | +| 0xa0 | 0x10 | vector | `tsnumflt` | | +| 0xb0 | 0x4 | vector (ptr) | `fwarn` | Game::ServerTradeSector::FreighterWarning | + +Container-element fields (offsets are within the element / map node, not the object): `tssys`@+0x4 + +## `Game::ServerTradeSector::FreighterWarning` + +Write `0x008197d0`, Read `0x00819780`, IStreamable vftable `0x00a2d858` (COL offset +0x0). sizeof 0xc (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `pid` | | +| 0x8 | 0x4 | int | `ntrns` | | + +## `Game::ShipBuildOrder` + +Write `0x00813800`, Read `0x00813770`, IStreamable vftable `0x00a0c160` (COL offset +0x0). sizeof >= 0x18 (lower bound). **verified** -- fields exact; Read agrees on all 3 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `desID` | | +| 0x8 | 0x4 | int | `con` | | +| 0xc | 0x4 | int | `sav` | | +| 0x10 | 0x4 | int | `conleft` | | +| 0x14 | 0x4 | int | `ordID` | | + +## `Game::ShipBuildOrderDef` + +Write `0x00813800`, Read `0x00813770`, IStreamable vftable `0x00a0ad08` (COL offset +0x0). sizeof 0x18 (container stride). **verified** -- fields exact; Read agrees on all 3 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `desID` | | +| 0x8 | 0x4 | int | `con` | | +| 0xc | 0x4 | int | `sav` | | +| 0x10 | 0x4 | int | `conleft` | | +| 0x14 | 0x4 | int | `ordID` | | + +## `Game::ShipDesignDef::LegacyGunBank` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x00a2db3c` (COL offset +0x0). sizeof 0x8 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Game::ShipDesignDef::LegacyWeaponDef` + +Write `0x00813950`, Read `0x00846260`, IStreamable vftable `0x00a2df7c` (COL offset +0x0). sizeof >= 0x20 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x1c | 0x4 | int | `DWi` | | + +## `Game::ShipDesignDef::Section` + +Write `0x00827180`, Read `0x0087e390`, IStreamable vftable `0x00a2db4c` (COL offset +0x0). sizeof >= 0x28 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x10 | vector | `DGbnk2` | Game::ShipDesignDef::GunBank | +| 0x18 | 0x10 | vector | `DOpts` | String | + +## `Game::ShipHealth` + +Write `0x00813e50`, Read `0x00813df0`, IStreamable vftable `0x009f1e50` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Game::ShipParams` + +Write `0x005700a0`, Read `0x005717d0`, IStreamable vftable `0x009e3d88` (COL offset +0x0). sizeof >= 0xa4 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | +| 0x24 | 0x10 | vector | `.` | Game::ShipParams::Section | +| 0x34 | 0x10 | vector | `.` | | +| 0x44 | 0x4 | int | `.` | | +| 0x48 | 0x4 | int | `.` | | +| 0x4c | 0x4 | int | `.` | | +| 0x50 | 0x4 | int | `.` | | +| 0x54 | 0x4 | int | `.` | | +| 0x58 | 0x4 | int | `.` | | +| 0x5c | ? | object | `.` | Game::ShipHealth | +| 0x6c | 0x18 | object | `.` | Game::PrisonerHold | +| 0x84 | 0x1 | bool | `.` | | +| 0x85 | 0x1 | bool | `.` | | +| 0x86 | 0x1 | bool | `.` | | +| 0x88 | 0x4 | int | `.` | | +| 0x8c | 0x4 | float | `.` | | +| 0x90 | 0x4 | int | `.` | | +| 0x94 | 0x1 | bool | `.` | | +| 0x98 | 0xc | object | `.` | Game::WeaponGroups | + +## `Game::ShipParams::Section` + +Write `0x0056fff0`, Read `0x0056ff20`, IStreamable vftable `0x009fdcec` (COL offset +0x0). sizeof 0x50 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x1c | string | `.` | | +| 0x38 | 0x10 | vector | `.` | Game::ShipParams::GunBank | +| 0x48 | 0x8 | object | `.` | Game::CombatTechFlags | + +## `Game::ShipRecords` + +Write `0x008176a0`, Read `0x008560d0`, IStreamable vftable `0x00a3144c` (COL offset +0x0). sizeof >= 0x38 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x10 | 0x4 | int | `srl` | | +| 0x34 | 0x4 | handle | `srd` | | + +Container-element fields (offsets are within the element / map node, not the object): `srb`@+0x-c, `srk`@+0xc, `sri`@+0x18 + +## `Game::ShipSectionID` + +Write `0x0056ed50`, Read `0x0056ed10`, IStreamable vftable `0x00a1a720` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `.` | | +| 0x4 | 0x4 | int | `.` | | + +## `Game::ShipWeapon` + +Write `0x0056f450`, Read `0x00571130`, IStreamable vftable `0x009fdc8c` (COL offset +0x0). sizeof >= 0x24 (lower bound). **verified** -- fields exact; Read agrees on all 2 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x1c | string | `wfn` | | +| 0x1c | 0x4 | int | `wid` | | +| 0x20 | 0x4 | int | `did` | | + +## `Game::SimpleNodePath` + +Write `0x006e2390`, Read `0x006e2330`, IStreamable vftable `0x009f1dd0` (COL offset +0x0). sizeof 0x8 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x2 | int16 | `.` | | +| 0x6 | 0x2 | int16 | `.` | | + +## `Game::SlaversRefuelEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1708` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::Slot` + +Write `0x00827c30`, Read `0x00827b40`, IStreamable vftable `0x00a2e03c` (COL offset +0x0). sizeof >= 0x164 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0xbc | 0xa1 | object | `.` | Game::SlotUser | +| 0x160 | 0x4 | int | `.` | | + +## `Game::SlotDef` + +Write `0x008276d0`, Read `0x00832790`, IStreamable vftable `0x00a2db6c` (COL offset +0x0). sizeof 0xbc (enumeration meets embedding). **verified** -- fields exact; Read agrees on all 15 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x1 | bool | `IsPlay` | | +| 0x1 | 0x1 | bool | `IsDead` | | +| 0x2 | 0x1 | bool | `IsReq` | | +| 0x3 | 0x1 | bool | `IsRec` | | +| 0x4 | 0x1 | bool | `IsFxNm` | | +| 0x8 | 0x1c | string | `FxNm` | | +| 0x24 | 0x1 | bool | `IsFxSp` | | +| 0x28 | 0x4 | int | `FxSp` | | +| 0x2c | 0x1 | bool | `IsFxCr` | | +| 0x30 | 0x7 | object | `FxCrID` | Game::PlayerColorID | +| 0x44 | 0x1 | bool | `IsFxBd` | | +| 0x48 | 0x1c | string | `FxBd` | | +| 0x64 | 0x1 | bool | `IsFxAv` | | +| 0x68 | 0x1c | string | `FxAv` | | +| 0x84 | 0x4 | int | `Team` | | +| 0x88 | 0x4 | int | `Tag` | | +| 0x8c | 0x1c | string | `Pwd` | | +| 0xa8 | 0x14 | object | `Settings` | Game::StrategyPlayerGameSettings | + +## `Game::SlotUser` + +Write `0x00827a00`, Read `0x008278a0`, IStreamable vftable `0x00a2db7c` (COL offset +0x0). sizeof 0xa4 (enumeration meets embedding). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `.` | | +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x1c | string | `.` | | +| 0x2c | 0x4 | int | `.` | | +| 0x30 | 0x4 | int | `.` | | +| 0x34 | 0x7 | object | `.` | Game::PlayerColorID | +| 0x48 | 0x1c | string | `.` | | +| 0x64 | 0x1c | string | `.` | | +| 0x80 | 0x1 | bool | `.` | | +| 0x84 | 0x1c | string | `.` | | +| 0xa0 | 0x1 | bool | `.` | | + +## `Game::SpecialProject` + +Write `0x00814760`, Read `0x008146c0`, IStreamable vftable `0x00a21938` (COL offset +0x0). sizeof 0x34 (enumeration meets embedding). **verified** -- fields exact; Read agrees on all 5 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `SPid` | | +| 0x8 | 0x4 | int | `Sts` | | +| 0xc | 0x4 | float | `Cst` | | +| 0x10 | 0x4 | int | `MxC` | | +| 0x14 | 0x1c | string | `Nm` | | +| 0x30 | 0x4 | int | `Trns` | | + +## `Game::SpecialProjectImpl` + +Write `0x008285d0`, Read `0x00828530`, IStreamable vftable `0x00a306f0` (COL offset +0x0). sizeof >= 0x40 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x34 | object | `SPi` | Game::SpecialProject | +| 0x3c | 0x4 | int | `Stp` | | + +## `Game::SpecialProjectNameGen` + +Write `0x008147e0`, Read `0x00852960`, IStreamable vftable `0x00a32730` (COL offset +0x0). sizeof >= 0x8 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | handle | `Nm` | | + +## `Game::SpeciesRatios` + +Write `0x0053c5e0`, Read `0x0053d220`, IStreamable vftable `0x009f9714` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +Container-element fields (offsets are within the element / map node, not the object): `nv`@+0x1, `va2`@+0x0 + +## `Game::SpyCraft` + +Write `0x00814940`, Read `0x00837dc0`, IStreamable vftable `0x00a30718` (COL offset +0x0). sizeof >= 0x44 (lower bound). **verified** -- fields exact; Read agrees on all 5 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `sid` | | +| 0x8 | 0x4 | int | `sown` | | +| 0xc | 0x4 | int | `atto` | | +| 0x10 | 0x4 | int | `deat` | | +| 0x14 | 0x4 | int | `tdep` | | +| 0x18 | 0x4 | float | `cbh` | | +| 0x1c | 0x4 | int | `spyon` | | +| 0x20 | 0x4 | int | `spyat` | | +| 0x24 | 0x4 | int | `cm` | | +| 0x28 | 0x4 | float | `cmo` | | +| 0x2c | 0x10 | vector | `ncp` | | +| 0x3c | 0x4 | float | `sdo` | | +| 0x40 | 0x4 | int | `sdet` | | + +## `Game::SpyReport` + +Write `0x00828ec0`, Read `0x008843d0`, IStreamable vftable `0x00a32b2c` (COL offset +0x0). sizeof >= 0x30 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `defc2` | | +| 0x14 | 0x4 | int | `rtc` | | +| 0x20 | 0x4 | int | `evc` | | +| 0x2c | 0x4 | int | `ttc` | | + +Container-element fields (offsets are within the element / map node, not the object): `def`@+0x8, `strd`@+0x8, `evs`@+0x8, `tt`@+0x8 + +## `Game::SpyReportDefences` + +Write `0x00828ba0`, Read `0x00828b10`, IStreamable vftable `0x00a313e8` (COL offset +0x0). sizeof >= 0x50 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `stn` | | +| 0x8 | 0x48 | object | `sdef` | Game::DefenceSummary | + +## `Game::SpyReportEvents` + +Write `0x00828e40`, Read `0x00828da0`, IStreamable vftable `0x00a307ac` (COL offset +0x0). sizeof >= 0x18 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `spl` | | +| 0x8 | 0x10 | vector | `ste` | int | + +## `Game::SpyReportTechTree` + +Write `0x00814ba0`, Read `0x00814b40`, IStreamable vftable `0x00a318b4` (COL offset +0x0). sizeof >= 0xc (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `stn` | | +| 0x8 | 0x4 | int | `spl` | | + +Container-element fields (offsets are within the element / map node, not the object): `St`@+0x4, `TResCost`@+0x8, `TResDone`@+0xc, `TAcq`@+0x14, `TiAcq`@+0x18, `Tbd`@+0x1c, `Tfc`@+0x20, `TUnlck`@+0x10 + +## `Game::SpyReportTrade` + +Write `0x00828cf0`, Read `0x00828c20`, IStreamable vftable `0x00a313f8` (COL offset +0x0). sizeof >= 0x20 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `stn` | | +| 0x8 | 0x4 | int | `spl` | | +| 0xc | 0x4 | int | `sctr` | | +| 0x10 | 0x10 | vector | `srt` | Game::SpyReportTradeRoute | + +## `Game::SpyReportTradeRoute` + +Write `0x00814aa0`, Read `0x00838980`, IStreamable vftable `0x00a3079c` (COL offset +0x0). sizeof 0x20 (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `stn` | | +| 0x8 | 0x4 | int | `sctr` | | +| 0xc | 0x4 | int | `spl` | | +| 0x10 | 0x10 | vector | `sdgc` | | + +## `Game::StarFleet` + +Write `0x00701070`, Read `0x00702470`, IStreamable vftable `0x00a1d5f8` (COL offset +0x8). sizeof >= 0x120 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | +| 0x4c | 0xc | object | `PrvPos` | Vector3 | +| 0x58 | 0x4 | handle | `PID` | | +| 0x5c | 0x1c | string | `FtName` | | +| 0x78 | 0x1 | bool | `Perm` | | +| 0x7c | ? | object | `Lay` | Game::FleetLayout | +| 0xa0 | 0x4 | handle | `LocID` | | +| 0xa4 | 0x10 | vector | `NShips` | | +| 0xc4 | 0x38 | object | `FPlan` | Game::FlightPlan | +| 0xfc | 0x4 | int | `FtTrans` | | +| 0x100 | 0xc | object | `FtOrig` | Vector3 | +| 0x10c | 0x4 | int | `FtFlg` | | +| 0x110 | 0x4 | int | `Ftae` | | +| 0x114 | 0x4 | int | `Ftpae` | | +| 0x118 | 0x4 | int | `FtEnc` | | +| 0x11c | 0x4 | int | `FtMS` | | + +Container-element fields (offsets are within the element / map node, not the object): `Ship`@+0x0 + +## `Game::StarMapNode` + +Write `0x00727820`, Read `0x00727790`, IStreamable vftable `0x00a1e620` (COL offset +0x8). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | + +## `Game::StarMapParams` + +Write `0x00727a10`, Read `0x00739510`, IStreamable vftable `0x009fb2a8` (COL offset +0x0). sizeof 0x38 (enumeration meets embedding). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x10 | vector | `.` | Game::SystemParams | +| 0x18 | 0x10 | vector | `.` | | +| 0x28 | 0x10 | vector | `.` | Game::SimpleNodePath | + +## `Game::StarShip` + +Write `0x008291f0`, Read `0x00853fa0`, IStreamable vftable `0x00a31408` (COL offset +0x8). sizeof >= 0xb0 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x10 | 0x4 | handle | `PlrID` | | +| 0x14 | 0x4 | handle | `DesID` | | +| 0x20 | 0x4 | float | `Range` | | +| 0x24 | ? | object | `Health` | Game::ShipHealth | +| 0x34 | 0x4 | int | `MineCap` | | +| 0x38 | 0x10 | vector | `NTH` | | +| 0x48 | 0x4 | int | `Plg` | | +| 0x4c | 0x4 | int | `Act` | | +| 0x50 | 0x1 | bool | `Dep` | | +| 0x51 | 0x1 | bool | `Atq` | | +| 0x5c | 0x4 | int | `LCT` | | +| 0x60 | 0x4 | int | `tsd` | | +| 0x64 | 0x4 | handle | `FltID` | | +| 0x68 | 0x4 | int | `ConCap` | | +| 0x6c | 0x4 | float | `RefCap` | | +| 0x70 | 0x4 | float | `RepCap` | | +| 0x7c | 0x4 | int | `EncID` | | +| 0x80 | 0x18 | object | `PrisH` | Game::PrisonerHold | +| 0x98 | 0x4 | object (ptr) | `BQ2` | Game::BuildQueue | +| 0x9c | 0x4 | object (ptr) | `pop` | Game::Population | +| 0xa0 | 0x4 | object (ptr) | `ppop` | Game::Population | +| 0xa8 | 0x4 | int | `atsp` | | +| 0xac | 0x4 | int | `tblt` | | + +## `Game::StarSystem` + +Write `0x00727820`, Read `0x00727790`, IStreamable vftable `0x00a200d4` (COL offset +0x8). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | + +## `Game::StarSystem::OutputRates` + +Write `0x00745190`, Read `0x007472a0`, IStreamable vftable `0x00a1f884` (COL offset +0x0). sizeof 0x1c (enumeration meets embedding). **verified** -- fields exact; Read agrees on all 7 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | float | `SRt` | | +| 0x4 | 0x4 | float | `SRsc` | | +| 0x8 | 0x4 | float | `SRtf` | | +| 0xc | 0x4 | float | `SRi` | | +| 0x10 | 0x4 | float | `SRoh` | | +| 0x14 | 0x4 | float | `SRs` | | +| 0x18 | 0x4 | int | `SRnr` | | + +## `Game::StarSystem::PlayerView` + +Write `0x007492d0`, Read `0x00752af0`, IStreamable vftable `0x00a201ac` (COL offset +0x0). sizeof >= 0x5c (lower bound). **partial** -- 2 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `VTrn` | | +| 0xc | 0x4 | int | `Pop` | | +| 0x10 | ? | object | `Pop2` | Game::Population | +| 0x24 | 0x4 | float | `Infra` | | +| 0x28 | 0x4 | float | `Suit` | | +| 0x2c | 0x4 | int | `Res` | | +| 0x30 | 0x4 | int | `ARes2` | | +| 0x34 | 0x4 | int | `MRes` | | +| 0x38 | 0x1 | bool | `NoRebAI` | | +| 0x3c | 0x4 | int | `pbon` | | +| 0x40 | ? | object | `pbon2` | Game::Population | +| 0x54 | 0x4 | float | `ibon` | | +| 0x58 | 0x4 | int | `TerrFl` | | + +## `Game::StrategyAIAgent::DesignNameGen` + +Write `0x006c77a0`, Read `0x006ccc70`, IStreamable vftable `0x00a1b124` (COL offset +0x0). sizeof >= 0x8 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | object (ptr) | `dnid` | Game::ShipSectionID | + +## `Game::StrategyAIAgent::Streamable` + +Write `0x006c6f00`, Read `0x006c8fd0`, IStreamable vftable `0x00a1a61c` (COL offset +0x0). sizeof >= 0x8 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | vector (ptr) | `prs2` | Game::AIPlayerRequestStamp | + +Container-element fields (offsets are within the element / map node, not the object): `AIAttr`@+0x24, `pid`@+0xc, `trns`@+0x10, `NBStab`@+0x38, `BStabTn`@+0x4, `NMBlst`@+0x48, `MBlstTn`@+0x4, `AIDNG`@+0x344, `AISysID`@+0x4, `AISys`@+0x10, `NCmbR`@+0x28, `CmbR`@+0x0, `CLSyID`@+0x0, `CLPlID`@+0x0, `NPrv`@+0x32c, `NPrvId`@+0x0, `NPrvVa`@+0x4, `NTecS`@+0x13c, `TecS`@+0x0 + +## `Game::StrategyGameCreateParams` + +Write `0x0082ae40`, Read `0x00832cc0`, IStreamable vftable `0x00a25574` (COL offset +0x0). sizeof >= 0xf0 (lower bound). **verified** -- fields exact; Read agrees on all 19 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `Name` | | +| 0x20 | 0x4 | int | `ID` | | +| 0x24 | 0x4 | int | `RSeed` | | +| 0x28 | 0x1c | string | `Key` | | +| 0x44 | 0x38 | object | `MapP` | Game::StarMapParams | +| 0x7c | 0x4 | int | `MapS` | | +| 0x80 | 0x1c | string | `MapF` | | +| 0x9c | 0x4 | int | `NSys` | | +| 0xa0 | 0x4 | float | `REnc` | | +| 0xa4 | 0x4 | float | `SDist` | | +| 0xa8 | 0x4 | float | `SSize` | | +| 0xac | 0x4 | float | `SRes` | | +| 0xb0 | 0x4 | float | `SSuit` | | +| 0xb4 | 0x4 | int | `MaxP` | | +| 0xb8 | 0x4 | int | `ASpec` | | +| 0xbc | 0x1 | bool | `bAlly` | | +| 0xc0 | 0x4 | int | `NTeam` | | +| 0xc4 | 0x1 | bool | `tmgrp` | | +| 0xcc | 0x4 | int | `PSav` | | +| 0xd0 | 0x4 | int | `PCol` | | +| 0xd4 | 0x4 | int | `PTech` | | +| 0xd8 | 0x4 | int | `AID` | | +| 0xdc | 0x4 | float | `IncM` | | +| 0xe0 | 0x4 | float | `ResM` | | +| 0xe4 | 0xc | object | `scrp` | Game::StrategyScriptParams | + +## `Game::StrategyGameInfo` + +Write `0x00829960`, Read `0x00875cb0`, IStreamable vftable `0x00a07ba0` (COL offset +0x0). sizeof >= 0x9c (lower bound). **verified** -- fields exact; Read agrees on all 10 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x20 | 0x1c | string | `GameName` | | +| 0x3c | 0x4 | int | `Turn` | | +| 0x40 | 0x4 | int | `NumSys` | | +| 0x44 | 0x4 | int | `Checksum` | | +| 0x48 | 0x4 | int | `MapShape` | | +| 0x4c | 0x10 | vector | `Players` | Game::StrategyPlayerInfo | +| 0x5c | 0x18 | object | `Session` | Game::StrategySessionParams | +| 0x74 | 0x4 | float | `IncMod` | | +| 0x78 | 0x4 | float | `ResMod` | | +| 0x7c | 0x1 | bool | `Alliances` | | +| 0x7d | 0x1 | bool | `Teams` | | +| 0x7e | 0x1 | bool | `Encounters` | | +| 0x80 | 0x1c | string | `Scenario` | | + +## `Game::StrategyGameLoadParams` + +Write `0x0076c680`, Read `0x008d1ad0`, IStreamable vftable `0x00a241b4` (COL offset +0x0). sizeof >= 0x20 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | + +## `Game::StrategyGameLoader::CustomDataTable` + +Write `0x0086a9d0`, Read `0x008709a0`, IStreamable vftable `0x00a323d0` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Game::StrategyGameParams` + +Write `0x0082b1d0`, Read `0x0082b0d0`, IStreamable vftable `0x00a256fc` (COL offset +0x0). sizeof >= 0x1f4 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x104 | 0xf0 | object | `.` | Game::StrategyGameCreateParams | + +## `Game::StrategyHostParams` + +Write `0x0082b4b0`, Read `0x0082b3c0`, IStreamable vftable `0x00a25790` (COL offset +0x0). sizeof >= 0x244 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x2c | 0x1 | bool | `.` | | +| 0x30 | 0x1c | string | `.` | | +| 0x4c | 0x1 | bool | `.` | | +| 0x50 | 0x1f4 | object | `.` | Game::StrategyGameParams | +| 0x16c | 0x18 | object | `.` | Game::StrategySessionParams | + +## `Game::StrategyLaunchParams` + +Write `0x0082acd0`, Read `0x0082ac50`, IStreamable vftable `0x00a22a20` (COL offset +0x0). sizeof >= 0x22c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x20c | object | `.` | Game::StrategySimParams | + +## `Game::StrategyPlayerGameSettings` + +Write `0x00817390`, Read `0x00817330`, IStreamable vftable `0x00a07344` (COL offset +0x0). sizeof >= 0x14 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x4 | int | `.` | | + +## `Game::StrategyPlayerInfo` + +Write `0x008298d0`, Read `0x00829820`, IStreamable vftable `0x00a077d8` (COL offset +0x0). sizeof 0xc4 (container stride). **verified** -- fields exact; Read agrees on all 1 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0xbc | object | `Slot` | Game::SlotDef | +| 0xc0 | 0x4 | int | `Rank` | | + +## `Game::StrategyPlayerParams` + +Write `0x0082b6d0`, Read `0x0082b580`, IStreamable vftable `0x00a2e0bc` (COL offset +0x0). sizeof 0xac (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `.` | | +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x1 | bool | `.` | | +| 0x24 | 0x1c | string | `.` | | +| 0x40 | 0x4 | int | `.` | | +| 0x44 | 0x4 | int | `.` | | +| 0x48 | 0x7 | object | `.` | Game::PlayerColorID | +| 0x5c | 0x1c | string | `.` | | +| 0x78 | 0x1c | string | `.` | | +| 0x94 | 0x1 | bool | `.` | | +| 0x98 | 0x14 | object | `.` | Game::StrategyPlayerGameSettings | + +## `Game::StrategyScriptParams` + +Write `0x0082ad40`, Read `0x00870ac0`, IStreamable vftable `0x00a25370` (COL offset +0x0). sizeof >= 0xc (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `spc` | | + +Container-element fields (offsets are within the element / map node, not the object): `spsn`@+0x8, `sppn`@+0x24, `sppv`@+0x40 + +## `Game::StrategyServer` + +Write `0x0079fa70`, Read `0x007d27a0`, IStreamable vftable `0x00a26084` (COL offset +0x0). sizeof >= 0x320 (lower bound). **verified** -- fields exact; Read agrees on all 18 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `ModCount` | | +| 0xc | 0x4 | int | `Frame` | | +| 0x10 | 0x4 | int | `GOTurn` | | +| 0x14 | 0x4 | int | `GameID` | | +| 0x18 | 0x10 | vector | `GOWinPly` | enum:uint | +| 0x28 | 0x1c | string | `GameName` | | +| 0x44 | 0x10 | vector | `NumSys` | | +| 0x54 | 0x10 | vector | `NumPlrs` | | +| 0x64 | 0x10 | vector | `NumFlts` | | +| 0x74 | 0x10 | vector | `NumActs` | | +| 0x9c | 0x4 | int | `NMLc` | | +| 0xbc | 0x4 | int | `Map` | | +| 0xc0 | 0x4 | float | `IncMod` | | +| 0xc4 | 0x4 | float | `ResMod` | | +| 0xc8 | 0x1 | bool | `EnAl` | | +| 0xc9 | 0x1 | bool | `EnTm` | | +| 0x134 | 0x1c | string | `KeyPath` | | +| 0x154 | 0x4 | object (ptr) | `NdGr2` | Game::ServerNodeGraph | +| 0x158 | 0x4 | object (ptr) | `trdmgr` | Game::ServerTradeManager | +| 0x15c | 0x4 | object (ptr) | `spymgr` | Game::IServerSpyManager | +| 0x160 | 0x4 | object (ptr) | `sprjs` | Game::SpecialProjectNameGen | +| 0x164 | 0x4 | object (ptr) | `Attrib` | Game::AttribMap | +| 0x16c | 0x4 | object (ptr) | `RNG` | RNG | +| 0x1a0 | 0x4 | float | `RandEncAdj` | | +| 0x1b4 | 0x4 | object (ptr) | `SvSctOb` | Game::SVScriptObject | +| 0x1b8 | 0x4 | int | `NPCm` | | +| 0x1bc | 0x4 | int | `NPCo` | | +| 0x1c0 | 0x4 | int | `NPCi` | | +| 0x1c4 | 0x4 | int | `NPCv` | | +| 0x1c8 | 0x4 | int | `NPCa` | | +| 0x1cc | 0x4 | float | `szadj` | | +| 0x1d0 | 0x4 | float | `rsadj` | | +| 0x1d4 | 0x4 | float | `suadj` | | +| 0x1f8 | 0x4 | int | `cmbtid` | | +| 0x1fc | 0x4 | handle | `numcreps` | | +| 0x200 | 0x4 | object (ptr) | `turnstats` | Game::GameTurnHistory | +| 0x2c8 | 0x10 | vector | `ninv` | | +| 0x31c | 0x4 | int | `zdsc` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x4, `.`@+0x4, `.`@+0x4, `.`@+0x4, `.`@+0x4, `.`@+0x4, `crep`@+0x8, `AllExc`@+0x0, `AllExc`@+0x4, `AllExc`@+0x0, `AllExc`@+0x4, `AllExcCFp`@+0x0, `AllExcCFp`@+0x4, `Player`@+0x0, `Sys`@+0x0, `Flt`@+0x0 + +## `Game::StrategySessionParams` + +Write `0x0082b360`, Read `0x0082b280`, IStreamable vftable `0x00a075a4` (COL offset +0x0). sizeof 0x18 (enumeration meets embedding). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x14 | object | `TMRS` | Game::StrategyTimerParams | + +## `Game::StrategySimParams` + +Write `0x0082b8f0`, Read `0x0082b800`, IStreamable vftable `0x00a2dd6c` (COL offset +0x0). sizeof >= 0x20c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0x1f4 | object | `.` | Game::StrategyGameParams | +| 0x134 | 0x10 | vector | `.` | Game::StrategyPlayerParams | + +## `Game::StrategyTimerParams` + +Write `0x008173e0`, Read `0x00820040`, IStreamable vftable `0x00a07334` (COL offset +0x0). sizeof >= 0x14 (lower bound). **verified** -- fields exact; Read agrees on all 4 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | float | `TSTL` | | +| 0x8 | 0x4 | float | `TCTL` | | +| 0xc | 0x4 | float | `TQTL` | | +| 0x10 | 0x4 | float | `TQTLE` | | + +## `Game::StrategyTurnInfo` + +Write `0x00816370`, Read `0x008162c0`, IStreamable vftable `0x00a2d6e0` (COL offset +0x0). sizeof >= 0x34 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x14 | 0x4 | float | `.` | | +| 0x18 | 0x4 | int | `.` | | +| 0x1c | 0x4 | int | `.` | | +| 0x20 | 0x4 | int | `.` | | +| 0x30 | 0x4 | int | `.` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x8, `.`@+0xc + +## `Game::StrategyUserInfo` + +Write `0x00816450`, Read `0x00816410`, IStreamable vftable `0x00a21928` (COL offset +0x0). sizeof 0x24 (container stride). **partial** -- 2 field(s) via an untyped sub-writer + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | opaque | `.` | | +| 0x21 | 0x4 | opaque | `.` | | + +## `Game::SwarmEncounterParams` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f174c` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::SwarmEncounterResult` + +Write `0x0050a420`, Read `0x0050a360`, IStreamable vftable `0x009f175c` (COL offset +0x0). sizeof >= 0x10 (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | ? | object | `.` | Game::ShipHealth | + +## `Game::SwarmQueenEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1a98` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::SystemEvent` + +Write `0x008189a0`, Read `0x00839e30`, IStreamable vftable `0x00a243ac` (COL offset +0x0). sizeof 0x24 (container stride). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `ses` | | +| 0x8 | 0x4 | int | `set` | | +| 0xc | 0x4 | int | `seop` | | +| 0x10 | 0x4 | int | `senp` | | +| 0x14 | 0x10 | vector | `seno2` | | + +## `Game::SystemKillerEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1c20` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::SystemParams` + +Write `0x00727950`, Read `0x00727880`, IStreamable vftable `0x00a1d9ec` (COL offset +0x0). sizeof >= 0x38 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0xc | object | `.` | Vector3 | +| 0x10 | 0x1c | string | `.` | | +| 0x2c | 0x4 | int | `.` | | +| 0x30 | 0x4 | int | `.` | | +| 0x34 | 0x4 | float | `.` | | + +## `Game::TacReport` + +Write `0x00458e60`, Read `0x00458c00`, IStreamable vftable `0x009e4600` (COL offset +0x0). sizeof >= 0x91 (lower bound). **verified** -- fields exact; Read agrees on all 13 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `TRid` | | +| 0x8 | 0x4 | int | `TRal` | | +| 0xc | 0x1d | object | `TRby` | Game::TacReportEvents | +| 0x2c | 0x1d | object | `TRto` | Game::TacReportEvents | +| 0x58 | 0x4 | int | `TRsats` | | +| 0x70 | 0x4 | int | `TRbal` | | +| 0x74 | 0x4 | int | `TRlas` | | +| 0x78 | 0x4 | int | `TRmis` | | +| 0x7c | 0x4 | int | `TRmin` | | +| 0x80 | 0x4 | int | `TRnrg` | | +| 0x84 | 0x4 | int | `TRbio` | | +| 0x88 | 0x4 | int | `TRbrd` | | +| 0x8c | 0x1 | bool | `TRsld` | | +| 0x8d | 0x1 | bool | `TRsldd` | | +| 0x8e | 0x1 | bool | `TRsldc` | | +| 0x8f | 0x1 | bool | `TRsldi` | | +| 0x90 | 0x1 | bool | `TRsldr` | | + +Container-element fields (offsets are within the element / map node, not the object): `TRships`@+0x-c, `TRshipsL`@+0xc + +## `Game::TacReportEvents` + +Write `0x004565d0`, Read `0x00456540`, IStreamable vftable `0x009e45f0` (COL offset +0x0). sizeof 0x20 (enumeration meets embedding). **verified** -- fields exact; Read agrees on all 7 comparable offsets; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `TREhd` | | +| 0x8 | 0x4 | int | `TREhi` | | +| 0xc | 0x4 | float | `TREd` | | +| 0x10 | 0x4 | float | `TREdp` | | +| 0x14 | 0x4 | float | `TREdi` | | +| 0x18 | 0x4 | float | `TREdt` | | +| 0x1c | 0x1 | bool | `TREb` | | + +## `Game::TechOffer` + +Write `0x00853900`, Read `0x008537f0`, IStreamable vftable `0x00a23d44` (COL offset +0x0). sizeof 0x10 (container stride). **clean** -- fields exact; sizeof corroborated + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `giv` | | +| 0x8 | 0x4 | int | `rcp` | | + +## `Game::TechOfferProject` + +Write `0x008535c0`, Read `0x00853530`, IStreamable vftable `0x00a31884` (COL offset +0x0). sizeof >= 0x5d (lower bound). **verified** -- fields exact; Read agrees on all 5 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x34 | object | `SPi` | Game::SpecialProject | +| 0x3c | 0x4 | int | `Stp` | | +| 0x40 | 0x4 | float | `AOdd` | | +| 0x44 | 0x4 | float | `AInc` | | +| 0x4c | 0x4 | int | `RCst` | | +| 0x50 | 0x4 | int | `RDn` | | +| 0x54 | 0x4 | int | `giv` | | +| 0x58 | 0x4 | int | `rcp` | | +| 0x5c | 0x1 | bool | `rcpd2` | | + +## `Game::TechProject` + +Write `0x00853390`, Read `0x00853280`, IStreamable vftable `0x00a31834` (COL offset +0x0). sizeof >= 0x54 (lower bound). **verified** -- fields exact; Read agrees on all 4 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x34 | object | `SPi` | Game::SpecialProject | +| 0x3c | 0x4 | int | `Stp` | | +| 0x40 | 0x4 | float | `AOdd` | | +| 0x44 | 0x4 | float | `AInc` | | +| 0x4c | 0x4 | int | `RCst` | | +| 0x50 | 0x4 | int | `RDn` | | + +## `Game::TechTree` + +Write `0x005890a0`, Read `0x00588910`, IStreamable vftable `0x00a003a8` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +Container-element fields (offsets are within the element / map node, not the object): `NumBrs`@+0x4 + +## `Game::TradeRoute` + +Write `0x00819650`, Read `0x008208d0`, IStreamable vftable `0x00a2d848` (COL offset +0x0). sizeof >= 0x24 (lower bound). **verified** -- fields exact; Read agrees on all 5 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `tro` | | +| 0x8 | 0x4 | int | `trfow` | | +| 0xc | 0x4 | int | `trfr` | | +| 0x10 | 0x4 | int | `trfrs` | | +| 0x14 | 0x4 | int | `trtow` | | +| 0x18 | 0x4 | int | `trto` | | +| 0x1c | 0x4 | int | `trtos` | | +| 0x20 | 0x4 | int | `trtc` | | + +## `Game::TradeSector` + +Write `0x00727820`, Read `0x00727790`, IStreamable vftable `0x00a30cac` (COL offset +0x8). sizeof >= 0x24 (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x18 | 0xc | object | `Pos` | Vector3 | + +## `Game::TurnCommands` + +Write `0x00842540`, Read `0x00892ae0`, IStreamable vftable `0x00a25e00` (COL offset +0x0). sizeof >= 0x6d (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | float | `.` | | +| 0xc | 0x1 | bool | `.` | | +| 0x10 | 0x4 | int | `.` | | +| 0x14 | 0x1 | bool | `.` | | +| 0x18 | 0x4 | int | `.` | | +| 0x1c | 0x4 | float | `.` | | +| 0x20 | 0x1 | bool | `.` | | +| 0x24 | 0x1 | bool | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x1 | bool | `.` | | +| 0x30 | 0x4 | float | `.` | | +| 0x34 | 0x4 | float | `.` | | +| 0x38 | 0x4 | float | `.` | | +| 0x3c | 0x1 | bool | `.` | | +| 0x40 | ? | object | `.` | Game::CivilianRatios | +| 0x6c | 0x1 | bool | `.` | | + +Container-element fields (offsets are within the element / map node, not the object): `.`@+0x4, `.`@+0x8, `.`@+0x4, `.`@+0x8, `.`@+0xc, `.`@+0x4, `.`@+0x8, `.`@+0xc, `.`@+0x0, `.`@+0x4, `.`@+0x8, `.`@+0xc, `.`@+0x4, `.`@+0x8, `.`@+0xc, `.`@+0x10, `.`@+0x4, `.`@+0x8, `.`@+0xc, `.`@+0x10, `.`@+0x4, `.`@+0x8, `.`@+0x4, `.`@+0x8, `.`@+0xc, `.`@+0x4, `.`@+0x8 + +## `Game::UpdateData` + +Write `0x004515b0`, Read `0x00451570`, IStreamable vftable `0x009e3ee4` (COL offset +0x0). sizeof >= 0x10 (lower bound). **partial** -- 1 field(s) via an untyped sub-writer + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | float | `.` | | +| 0xc | 0x4 | opaque | `.` | | + +## `Game::VNFinsolEncounterResult` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1d00` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::VNHomeEncounterParams` + +Write `0x00500390`, Read `0x005002c0`, IStreamable vftable `0x009f1d38` (COL offset +0x0). sizeof >= 0x28 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | +| 0x10 | 0x4 | int | `.` | | +| 0x14 | 0x4 | int | `.` | | +| 0x18 | 0x4 | int | `.` | | +| 0x20 | 0x8 | int64 | `.` | | + +## `Game::VNHomeEncounterResult` + +Write `0x00500460`, Read `0x00500410`, IStreamable vftable `0x009f1d48` (COL offset +0x0). sizeof >= 0x18 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0x10 | 0x8 | int64 | `.` | | + +## `Game::VonNeumannEncounterParams` + +Write `0x004f9fe0`, Read `0x004fdd20`, IStreamable vftable `0x009f1d18` (COL offset +0x0). sizeof >= 0xc (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | + +## `Game::VonNeumannEncounterResult` + +Write `0x00500280`, Read `0x00500230`, IStreamable vftable `0x009f1d28` (COL offset +0x0). sizeof >= 0x10 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x4 | int | `.` | | + +## `Game::WeaponGroups` + +Write `0x0056fd10`, Read `0x0056fbf0`, IStreamable vftable `0x009e3c60` (COL offset +0x0). sizeof >= 0xc (lower bound). **clean** -- fields exact; sizeof is a lower bound only + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x8 | object | `wgb` | Game::GunBankSelection | + +## `Game::XenoTechsPerSpecies` + +Write `0x0053d1f0`, Read `0x0053d1a0`, IStreamable vftable `0x009e4650` (COL offset +0x0). sizeof >= 0x4 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | int | `.` | | + +## `Game::ZuulInfestation` + +Write `0x005361e0`, Read `0x00536160`, IStreamable vftable `0x009f8cb0` (COL offset +0x0). sizeof >= 0x24 (lower bound). **verified** -- fields exact; Read agrees on all 1 comparable offsets + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x8 | 0x4 | handle | `PlgSys` | | +| 0xc | 0x4 | int | `PlgCByF` | | +| 0x10 | 0x4 | handle | `PlgCBy` | | +| 0x18 | 0x8 | int64 | `PlgNZ` | | +| 0x20 | 0x4 | float | `PlgZdr` | | + +## `Mars::FNMBase` + +Write `0x009047c0`, Read `0x00904590`, IStreamable vftable `0x00a41a44` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | + +## `Mars::FNMChunk` + +Write `0x009048d0`, Read `0x009046d0`, IStreamable vftable `0x00a41a30` (COL offset +0x0). sizeof >= 0x30 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | +| 0x24 | 0x4 | int | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x4 | raw | `.` | | + +## `Mars::FNMChunkReply` + +Write `0x009047c0`, Read `0x00904590`, IStreamable vftable `0x00a41aa8` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | + +## `Mars::FNMDone` + +Write `0x00904920`, Read `0x00904610`, IStreamable vftable `0x00a41a6c` (COL offset +0x0). sizeof >= 0x2c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | +| 0x24 | 0x4 | int | `.` | | +| 0x28 | 0x4 | int | `.` | | + +## `Mars::FNMDoneReply` + +Write `0x009047c0`, Read `0x00904590`, IStreamable vftable `0x00a41abc` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | + +## `Mars::FNMError` + +Write `0x00904960`, Read `0x00904690`, IStreamable vftable `0x00a41a80` (COL offset +0x0). sizeof >= 0x40 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | +| 0x24 | 0x1c | string | `.` | | + +## `Mars::FNMSendNotify` + +Write `0x00904840`, Read `0x009045c0`, IStreamable vftable `0x00a41a58` (COL offset +0x0). sizeof >= 0x28 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | +| 0x24 | 0x4 | int | `.` | | + +## `Mars::FNMSendReply` + +Write `0x009047c0`, Read `0x00904590`, IStreamable vftable `0x00a41a94` (COL offset +0x0). sizeof >= 0x24 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | +| 0x20 | 0x4 | int | `.` | | + +## `Mars::LaunchParams` + +Write `0x0076c680`, Read `0x008d1ad0`, IStreamable vftable `0x009e4138` (COL offset +0x0). sizeof >= 0x20 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1c | string | `.` | | + +## `Mars::NMCommand` + +Write `0x008d1ec0`, Read `0x008d1e20`, IStreamable vftable `0x00a39678` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | object (ptr) | `.` | Command | + +## `Mars::NMLoad` + +Write `0x008d1d60`, Read `0x008d1c70`, IStreamable vftable `0x00a396b4` (COL offset +0x0). sizeof >= 0x3c (lower bound). **partial** -- 1 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | SyncParams | +| 0x34 | 0x4 | object (ptr) | `.` | LaunchParams | +| 0x38 | 0x4 | int | `.` | | + +## `Mars::NMSyncCheck` + +Write `0x008d2000`, Read `0x008d1f50`, IStreamable vftable `0x00a3968c` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | object (ptr) | `.` | SyncChecksumBuffer | + +## `Mars::NMSyncError` + +Write `0x008d1ab0`, Read `0x008d1a90`, IStreamable vftable `0x00a396a0` (COL offset +0x0). sizeof >= 0x8 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | + +## `Mars::RNG` + +Write `0x008e6ca0`, Read `0x008e6c30`, IStreamable vftable `0x009e9aec` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- only container elements / computed values recovered + +## `Mars::SyncChecksumBuffer` + +Write `0x0042f720`, Read `0x00907e60`, IStreamable vftable `0x00a41e54` (COL offset +0x0). sizeof >= 0x1c (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x4 | int | `.` | | +| 0x8 | 0x4 | int | `.` | | +| 0xc | 0x10 | vector | `.` | int | + +## `Mars::SyncParams` + +Write `0x00907d40`, Read `0x00907cd0`, IStreamable vftable `0x00a41e64` (COL offset +0x0). sizeof >= 0x30 (lower bound). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | 0x1 | bool | `.` | | +| 0x5 | 0x1 | bool | `.` | | +| 0x8 | 0x1c | string | `.` | | +| 0x24 | 0x4 | int | `.` | | +| 0x28 | 0x4 | int | `.` | | +| 0x2c | 0x4 | int | `.` | | + +## `Mars::TNMConnect` + +Write `0x008fd880`, Read `0x008fd7c0`, IStreamable vftable `0x00a40dd0` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- 4 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | TNID | +| 0xc | ? | object | `.` | TNID | +| 0x14 | ? | object | `.` | TNID | +| 0x1c | ? | object | `.` | TNID | + +## `Mars::TNMDisconnect` + +Write `0x008fd750`, Read `0x008fd920`, IStreamable vftable `0x00a40dbc` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- 3 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | TNID | +| 0xc | ? | object | `.` | TNID | +| 0x14 | ? | object | `.` | TNID | + +## `Mars::TNMHost` + +Write `0x008fd750`, Read `0x008fd920`, IStreamable vftable `0x00a40da8` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- 3 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | TNID | +| 0xc | ? | object | `.` | TNID | +| 0x14 | ? | object | `.` | TNID | + +## `Mars::TNMMessage` + +Write `0x008fd9d0`, Read `0x008fd9a0`, IStreamable vftable `0x00a40c4c` (COL offset +0x0). sizeof >= 0x1c (lower bound). **partial** -- 2 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | TNID | +| 0xc | ? | object | `.` | TNID | +| 0x14 | 0x1 | bool | `.` | | +| 0x18 | 0x4 | object (ptr) | `.` | NetMessage | + +## `Mars::TNMessage` + +Write `0x008fd6b0`, Read `0x008fd5f0`, IStreamable vftable `0x00a40d94` (COL offset +0x0). sizeof >= 0x0 (lower bound). **partial** -- 2 nested field(s) of unknown size + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x4 | ? | object | `.` | TNID | +| 0xc | ? | object | `.` | TNID | + +## `Quaternion` + +Write `0x008a7aa0`, Read `0x008a7a50`, IStreamable vftable `0x009e2458` (COL offset +0x0). sizeof 0x10 (enumeration meets embedding). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | float | `.` | | +| 0x4 | 0x4 | float | `.` | | +| 0x8 | 0x4 | float | `.` | | +| 0xc | 0x4 | float | `.` | | + +## `Vector2` + +Write `0x008b9e30`, Read `0x008b9e00`, IStreamable vftable `0x009e24d8` (COL offset +0x0). sizeof 0x8 (container stride). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | float | `.` | | +| 0x4 | 0x4 | float | `.` | | + +## `Vector3` + +Write `0x008a60d0`, Read `0x008a6090`, IStreamable vftable `0x009e2498` (COL offset +0x0). sizeof 0xc (enumeration meets embedding). **unnamed** -- offsets and types recovered; the writer passes a NULL name so the fields have no on-disk names and cannot be matched against Read by name + +| offset | size | kind | tag | type | +|---|---|---|---|---| +| 0x0 | 0x4 | float | `.` | | +| 0x4 | 0x4 | float | `.` | | +| 0x8 | 0x4 | float | `.` | | + diff --git a/tools/rtti_map.py b/tools/rtti_map.py new file mode 100644 index 0000000..87f25ee --- /dev/null +++ b/tools/rtti_map.py @@ -0,0 +1,261 @@ +#!/usr/bin/env python3 +"""MSVC RTTI walker for the SOTS1 exe: type descriptors -> COLs -> vftables. + +Why this exists +--------------- +`findings/objects/00-inventory.md` has 1,924 type-descriptor *names* but no +addresses, so a recovered function can be named "a serializer" but not "*whose* +serializer". Every serializable class in this binary reaches its `Read`/`Write` +through an `IStreamable` sub-vftable, and MSVC puts a Complete Object Locator at +`vftable[-1]`. Walking + + type descriptor <- COL.pTypeDescriptor <- vftable[-1] + +gives, for every vftable in the image: the owning class name, the sub-object +offset (`COL.offset` -- the this-adjustment that turns a decompiled offset into +an absolute member offset), and the slot functions. + +Structures (32-bit MSVC): + TypeDescriptor { void* pVFTable; void* spare; char name[]; } name at +8 + COL { u32 signature; u32 offset; u32 cdOffset; + TypeDescriptor* pTypeDescriptor; + ClassHierarchyDescriptor* pClassDescriptor; } 20 bytes + vftable[-1] = COL* + +Usage: + uv run python3 tools/rtti_map.py build # -> dumps/rtti.json + uv run python3 tools/rtti_map.py show ObservedTech + uv run python3 tools/rtti_map.py vftable 0x00a2439c + uv run python3 tools/rtti_map.py stats +""" +import json +import os +import re +import struct +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +REPO = os.path.dirname(HERE) +EXE = os.path.join(REPO, "dumps", "sots.exe") +FUNCS = os.path.join(REPO, "dumps", "functions.json") +RTTI = os.path.join(REPO, "dumps", "rtti.json") + + +# ----------------------------------------------------------------- PE image +class Image: + """Whole-image VA reader (all sections, not just executable ones).""" + + def __init__(self, path=EXE): + data = open(path, "rb").read() + pe = struct.unpack_from(" len(buf): + return None + return struct.unpack_from(" len(buf): + return None + return struct.unpack_from(" str: + """`.?AVObservedTech@Game@@` -> `Game::ObservedTech`. + + Templates keep their raw inner text (`?$StreamableHelper@...`) because a + full MSVC template demangler is not needed here -- only a stable key. + """ + m = mangled + for p in (".?AV", ".?AU", ".?AW", ".?AT"): + if m.startswith(p): + m = m[len(p):] + break + if m.endswith("@@"): + m = m[:-2] + # A template argument list can itself contain '@'; split only the trailing + # namespace chain, which is everything after the outermost template body. + if m.startswith("?$"): + return m # template: keep raw + parts = m.split("@") + return "::".join(reversed([p for p in parts if p])) + + +# --------------------------------------------------------------------- build +def build(): + img = Image() + funcs = json.load(open(FUNCS)) + fstarts = {int(k, 16) for k in funcs} + fnames = {int(k, 16): v[0] for k, v in funcs.items()} + + # 1. type descriptors: the mangled name lives at TD+8 + tds = {} # td_va -> mangled + pat = re.compile(rb"\.\?A[VUWT][\x20-\x7e]{0,300}?@@\x00") + for sva, n, buf, name, ex in img.secs: + if ex: + continue + for m in pat.finditer(buf): + nva = sva + m.start() + td = nva - 8 + if img.in_image(td): + tds[td] = m.group()[:-1].decode("latin1") + + # 2. COLs: any aligned dword equal to a TD address, at COL+0xC + cols = {} # col_va -> dict + for sva, n, buf, name, ex in img.secs: + if ex: + continue + for o in range(0, n - 3, 4): + v = struct.unpack_from(" 0x10000 or cd is None or cd > 0x10000: + continue + if not img.in_image(chd): + continue + # Class Hierarchy Descriptor -> base class list. This is the only + # exact test for "is this class an IStreamable?": a 3-slot vftable + # on its own also matches TacAISquadRule_*, the row parsers and any + # other class that happens to have three virtuals. + bases = [] + nb = img.u32(chd + 8) + arr = img.u32(chd + 0xC) + if nb and nb < 64 and img.in_image(arr): + for b in range(nb): + bcd = img.u32(arr + 4 * b) + if not img.in_image(bcd): + break + btd = img.u32(bcd) + if btd in tds: + bases.append(demangle(tds[btd])) + cols[col] = {"td": v, "offset": off, "cdOffset": cd, + "mangled": tds[v], "name": demangle(tds[v]), + "bases": bases} + + # 3. vftables: any aligned dword equal to a COL address; table starts at +4 + vfts = {} + for sva, n, buf, name, ex in img.secs: + if ex: + continue + for o in range(0, n - 3, 4): + v = struct.unpack_from(" 400: + break + if not slots: + continue + c = cols[v] + vfts[vf] = {"col": v, "class": c["name"], "mangled": c["mangled"], + "offset": c["offset"], "slots": slots, + "bases": c["bases"], + "slotNames": [fnames.get(s, "") for s in slots]} + + out = {"typeDescriptors": {hex(k): v for k, v in tds.items()}, + "cols": {hex(k): v for k, v in cols.items()}, + "vftables": {hex(k): v for k, v in vfts.items()}} + with open(RTTI, "w") as fh: + json.dump(out, fh) + print(f"type descriptors : {len(tds)}") + print(f"COLs : {len(cols)}") + print(f"vftables : {len(vfts)}") + ns = {} + for v in vfts.values(): + ns[v["class"].split("::")[0]] = ns.get(v["class"].split("::")[0], 0) + 1 + print("vftables by top-level namespace:", + ", ".join(f"{k}={v}" for k, v in + sorted(ns.items(), key=lambda x: -x[1])[:6])) + + +def load(): + with open(RTTI) as fh: + r = json.load(fh) + return ({int(k, 16): v for k, v in r["typeDescriptors"].items()}, + {int(k, 16): v for k, v in r["cols"].items()}, + {int(k, 16): v for k, v in r["vftables"].items()}) + + +def main(): + if len(sys.argv) < 2 or sys.argv[1] == "build": + return build() + cmd = sys.argv[1] + tds, cols, vfts = load() + if cmd == "show": + pat = sys.argv[2] + for va, v in sorted(vfts.items()): + if pat.lower() in v["class"].lower(): + print(f"vftable 0x{va:08x} COL 0x{v['col']:08x} " + f"offset +0x{v['offset']:x} {v['class']}") + for i, (s, nm) in enumerate(zip(v["slots"], v["slotNames"])): + print(f" [{i}] 0x{s:08x} {nm}") + elif cmd == "vftable": + va = int(sys.argv[2], 0) + v = vfts.get(va) + print(json.dumps(v, indent=2) if v else "not a vftable") + elif cmd == "stats": + print(f"tds={len(tds)} cols={len(cols)} vftables={len(vfts)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main() or 0) diff --git a/tools/serializers.py b/tools/serializers.py new file mode 100644 index 0000000..bb2929f --- /dev/null +++ b/tools/serializers.py @@ -0,0 +1,1425 @@ +#!/usr/bin/env python3 +"""Automated struct recovery from the `Mars::IStreamable` serializers. + +The idea +-------- +Lane S's rule: never size a struct member from the offsets the code *touches* -- +size it from an **enumeration**. `std::allocator` is an empty class; it +occupies a word and is never loaded or stored, so a touch-scan undercounts every +`std::string` by exactly 4 and every `std::vector` by exactly 4. An enumeration +can show *absence*; a touch-scan cannot. + +Every serializable class in this exe carries such an enumeration: its +`Write(Stream&)`, which walks the class's fields in order, each with a 4-char +name tag. `ObservedTech::Write` @0x00817cf0 gave the complete field list, tags +and all, and it matched `save_reader.py`'s on-disk order exactly. This tool does +that mechanically for every serializer in the binary. + +The idioms it decodes +--------------------- +Writer side, two calling conventions, one shape: + + push 0xff ; default-value argument + ; lea r,[this+D] | mov r,[this+D] | movzx ... + push r + push ; -> .rdata "otch", "pswd", ... + push / mov ecx, + call WriteString / WriteBool / ... | call [streamvft+slot] + +so the push immediately before the tag push is always the member. Wrapper +helpers are direct `call rel32`; the compiler also inlines them as +`call [[stream]+slot]`, and the slot is what names the type: + + +0x18 string +0x1c bool +0x20 float +0x24 int +0x28 nested + +0x30 raw bytes (n=8 -> int64) + +Nested members go through a `StreamableHelper` / `VectorHelper` built on +the stack as `{vptr, 0, T*}`; the vptr is an RTTI'd vftable, so the *type* of the +nested member is recovered by name, not guessed. + +Sizes are then assigned from the kind, never from the touched offsets: + bool 1 | int16 2 | int/float/enum/handle 4 | int64 8 + std::string 0x1c (allocator-last, invisible to a touch scan) + std::vector 0x10 (allocator-last, likewise) + nested T sizeof(T), resolved recursively when T is itself serializable + +Usage +----- + uv run python3 tools/serializers.py find # enumerate serializers + uv run python3 tools/serializers.py dump 0x00817cf0 + uv run python3 tools/serializers.py validate # known layouts, first + uv run python3 tools/serializers.py all # -> objects/layouts.json +""" +import bisect +import json +import os +import struct +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +REPO = os.path.dirname(HERE) +sys.path.insert(0, HERE) +import x86disp # noqa: E402 +from x86disp import decode, Desync, EXE, FUNCS # noqa: E402 +from rtti_map import Image, load as load_rtti # noqa: E402 + +OUT = os.path.join(REPO, "objects") + +R32 = ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"] +PREFIX = {0x66, 0x67, 0xF0, 0xF2, 0xF3, 0x2E, 0x36, 0x3E, 0x26, 0x64, 0x65} + +# Stream vftable slots (derived by disassembling the wrappers below, not assumed) +SLOT_KIND = {0x18: "string", 0x1c: "bool", 0x20: "float", 0x24: "int", + 0x28: "nested", 0x2c: "nested2", 0x30: "raw"} + +# Wrapper helpers: VA -> (kind, fixed width or None) +HELPERS = { + 0x008b9d70: ("string", 0x1c), 0x008b9d90: ("string", 0x1c), + 0x008b9c20: ("bool", 1), 0x008b9c00: ("bool", 1), + 0x008b9be0: ("float", 4), 0x008b9bc0: ("float", 4), + 0x008b9d50: ("int", 4), 0x008b9d20: ("int", 4), + 0x008b9d00: ("int16", 2), 0x008b9cd0: ("int16", 2), + 0x008b9c60: ("int64", 8), 0x008b9c40: ("int64", 8), + 0x00816490: ("handle", 4), 0x008164d0: ("handle", 4), +} +READ_HELPERS = {0x008b9d90, 0x008b9c00, 0x008b9bc0, 0x008b9d20, + 0x008b9cd0, 0x008b9c40, 0x008164d0} +KIND_SIZE = {"string": 0x1c, "bool": 1, "float": 4, "int": 4, "int16": 2, + "int64": 8, "handle": 4, "enum": 4, "vector": 0x10} + + +# ------------------------------------------------------------------ anatomy +def _has_modrm(raw): + """Return (op2, opcode, modrm_index or None) for one instruction's bytes.""" + j = 0 + while j < len(raw) and raw[j] in PREFIX: + j += 1 + if j >= len(raw): + return False, None, None + op2 = False + op = raw[j] + j += 1 + if op == 0x0F: + op2 = True + op = raw[j] + j += 1 + ent = x86disp._TWO.get(op) + else: + ent = x86disp._ONE.get(op) + if ent is None: + return op2, op, None + return op2, op, (j if ent[0] else None) + + +class Insn: + __slots__ = ("va", "raw", "info", "op", "op2", "modrm", "mod", "reg", "rm") + + def __init__(self, va, raw, info): + self.va, self.raw, self.info = va, raw, info + self.op2, self.op, mi = _has_modrm(raw) + if mi is not None and mi < len(raw): + self.modrm = raw[mi] + self.mod = self.modrm >> 6 + self.reg = (self.modrm >> 3) & 7 + self.rm = self.modrm & 7 + # x86disp only reports operands that carry a *displacement*, so a + # `mov eax,[edi]` -- member at offset 0 -- is invisible to it. For + # a plain struct (`.?AU...`, no vptr) offset 0 is a real field, so + # synthesise the mod=0 case here. + if self.info is None and self.mod == 0 and self.rm != 5: + if self.rm == 4: + sib = raw[mi + 1] if mi + 1 < len(raw) else None + if sib is not None and (sib & 7) != 5: + idx = (sib >> 3) & 7 + self.info = {"base": R32[sib & 7], + "index": None if idx == 4 else R32[idx], + "scale": 1 << (sib >> 6), "disp": 0, + "dispsize": 0, "reg": R32[self.reg], + "lea": (not self.op2 and self.op == 0x8D), + "mnem": ""} + else: + self.info = {"base": R32[self.rm], "index": None, + "scale": 1, "disp": 0, "dispsize": 0, + "reg": R32[self.reg], + "lea": (not self.op2 and self.op == 0x8D), + "mnem": ""} + else: + self.modrm = self.mod = self.reg = self.rm = None + + +def body(img, funcs_sorted, starts, fva): + """Decode a function body, sweeping to the next function start.""" + j = bisect.bisect_right(starts, fva) + limit = starts[j] if j < len(starts) else None + buf, off, _ = img.find(fva) + if buf is None: + return [] + end = len(buf) if limit is None else min(len(buf), off + (limit - fva)) + out, i = [], off + while i < end: + try: + ln, info = decode(buf, i, end) + except Desync: + break + out.append(Insn(fva + (i - off), buf[i:i + ln], info)) + i += ln + if len(out) > 60000: + break + return out + + +# -------------------------------------------------------------- extraction +class Extractor: + def __init__(self, img, rtti_vfts, fnames, funcs_sorted, starts): + self.img = img + self.vfts = rtti_vfts + self.fnames = fnames + self.funcs = funcs_sorted + self.starts = starts + self.extra = {} # discovered forwarding sub-writers + + # -- tag strings ------------------------------------------------------ + def tag(self, va): + if va == 0: + return "." + buf, o, sec = self.img.find(va) + if buf is None or sec not in (".rdata", ".data"): + return None + e = buf.find(b"\0", o, o + 24) + if e < 0: + return None + s = buf[o:e] + if not (1 <= len(s) <= 16): + return None + try: + t = s.decode("ascii") + except UnicodeDecodeError: + return None + return t if t.isprintable() and not t.isspace() else None + + # -- one serializer --------------------------------------------------- + def run(self, fva, debug=False): + ins = body(self.img, self.funcs, self.starts, fva) + if not ins: + return None + n = len(ins) + + this_regs = {"ecx"} + this_spill = set() + regdef = {} # reg -> record + stkdef = {} # (base, disp) -> record + prov = {} # reg -> (this-base, disp, insn idx) + pushes = [] # records since the last call + side = [0, 0] # [write-side calls, read-side calls] + containers = {} # (base, disp) -> element stride + fields = [] + calls = [] # non-helper calls (base-class Write, etc.) + notes = [] + + def mem_rec(info, width, kind): + b = info["base"] + return {"k": kind, "base": b, "disp": info["disp"], "width": width, + "this": b in this_regs, "index": info["index"]} + + for k, x in enumerate(ins): + info, raw = x.info, x.raw + op, op2, mod = x.op, x.op2, x.mod + + # ---- calls ------------------------------------------------- + is_call = (op == 0xE8 and not op2) or \ + (op == 0xFF and not op2 and x.reg == 2) + if is_call: + self._call(x, k, ins, pushes, regdef, stkdef, fields, calls, + this_regs, notes, debug, prov, k, side) + pushes = [] + for r in ("eax", "ecx", "edx"): + regdef.pop(r, None) + this_regs.discard(r) + prov.pop(r, None) + continue + + # ---- pushes ------------------------------------------------ + if not op2 and op == 0x68 and len(raw) == 5: + pushes.append({"k": "imm", + "v": struct.unpack_from("id` / `member->name`, so + # the member is the pointer at the remembered + # this-offset. This is the `NetworkObject id @+4` + # handle idiom, and it is why a plain "which offset + # was pushed" read misses every handle field. + regdef[dst]["prov"] = base_prov[:2] + r = regdef.get(dst, {}) + if r.get("k") == "load" and r.get("this"): + prov[dst] = (r["base"], r["disp"], k) + elif "prov" not in r: + prov.pop(dst, None) + else: + regdef.pop(dst, None) + this_regs.discard(dst) + continue + if op2 and op in (0xB6, 0xB7, 0xBE, 0xBF) and info: # movzx/movsx + dst = R32[x.reg] + w = 1 if op in (0xB6, 0xBE) else 2 + regdef[dst] = mem_rec(info, w, "load") + regdef[dst]["signed"] = op in (0xBE, 0xBF) + this_regs.discard(dst) + continue + if not op2 and 0xB8 <= op <= 0xBF and len(raw) >= 5: # mov r,imm32 + dst = R32[op - 0xB8] + regdef[dst] = {"k": "imm", + "v": struct.unpack_from("= 4: + stkdef[key] = {"k": "imm", + "v": struct.unpack_from(" edx:eax. The MSVC magic-number divide by a + # non-power-of-two stride runs the span through this. + src = regdef.get(R32[x.rm], {}) + if src.get("k") == "vecspan": + m = regdef.get("eax", {}) + src = dict(src) + if m.get("k") == "imm": + src["magic"] = m["v"] + regdef["edx"] = dict(src) + regdef["eax"] = dict(src) + else: + regdef.pop("edx", None) + regdef.pop("eax", None) + this_regs.discard("eax") + this_regs.discard("edx") + continue + # add/sub reg,imm on a this-pointer: a sub-object adjustment + if not op2 and op in (0x83, 0x81) and mod == 3 and x.reg in (0, 5): + dst = R32[x.rm] + imm = struct.unpack_from("= 2 else None + if nb and nb.get("k") == "imm": + rec["bytes"] = nb["v"] + if nb["v"] == 8: + kind = rec["kind"] = "int64" + m = pushes[ti - 1] + + # `WriteInt`/`WriteFloat`/... take a *pointer*, so a computed value (a + # container count, a NULL-test gate) is spilled to a stack local whose + # address is pushed -- sometimes stored after the push, before the call. + if m.get("k") == "addr" and m.get("base") in ("ebp", "esp") \ + and kind not in ("nested", "nested2"): + sp = stkdef.get((m["base"], m["disp"])) + if sp is not None: + m = sp + + if kind in ("nested", "nested2"): + self._nested(rec, m, stkdef) + elif m.get("k") == "vecspan": + # the argument was a container *count*, computed as + # (_Mylast - _Myfirst)/stride -- so the member is the container + rec["kind"] = "vector" + rec["base"] = m.get("base") + rec["off"] = m.get("disp") + rec["this"] = bool(m.get("this")) + rec["size"] = 0x10 + rec["count_of"] = True + elif m.get("prov") and not m.get("this"): + # a pointer member, serialised through what it points at + rec["kind"] = "handle" + rec["base"] = m["prov"][0] + rec["off"] = m["prov"][1] + rec["this"] = True + rec["size"] = 4 + rec["via"] = "deref" + elif m.get("k") in ("addr", "load"): + rec["base"] = m.get("base") + rec["off"] = m.get("disp") + rec["this"] = bool(m.get("this")) + if kind == "int" and m.get("k") == "load" and m.get("width"): + w = m["width"] + if w == 2: + rec["kind"] = "int16" + elif w == 1: + rec["kind"] = "int8" + rec["size"] = KIND_SIZE.get(rec["kind"], 4) + elif m.get("k") == "imm": + rec["kind"] = "const" + rec["const"] = m["v"] + else: + rec["kind"] = rec["kind"] + "?" + rec["unresolved"] = True + fields.append(rec) + + def _nested(self, rec, m, stkdef): + """A nested member goes through {vptr, 0, T*} built on the stack.""" + if m.get("k") != "addr" or m.get("base") not in ("ebp", "esp"): + rec["unresolved"] = True + return + b, d = m["base"], m["disp"] + vp = stkdef.get((b, d)) + tp = stkdef.get((b, d + 8)) + if vp and vp.get("k") == "imm" and vp["v"] in self.vfts: + hv = self.vfts[vp["v"]] + rec["helper_vftable"] = vp["v"] + rec["type"] = hv["class"] + inner, isvec = helper_inner(hv["mangled"]) + rec["inner"] = inner + if isvec: + rec["kind"], rec["size"] = "vector", 0x10 + elif inner.startswith("enum:"): + rec["kind"], rec["size"] = "enum", 4 + else: + rec["kind"] = "object" + if tp and tp.get("k") == "addr": + rec["base"] = tp.get("base") + rec["off"] = tp.get("disp") + rec["this"] = bool(tp.get("this")) + elif tp and tp.get("k") == "load": + rec["base"] = tp.get("base") + rec["off"] = tp.get("disp") + rec["this"] = bool(tp.get("this")) + rec["ptr"] = True + rec["size"] = 4 + else: + rec["unresolved"] = True + + +def stride_from_magic(magic, shift): + """MSVC emits `n / s` as `(n * ceil(2^(32+k)/s)) >> (32+k)`; invert it. + + This is the container-stride enumeration: it reads `sizeof(element)` off + the divide the compiler emitted, so an element's size comes from the code + rather than from adding up the offsets the code happens to touch. + """ + if not magic: + return None + for s in range(1, 8192): + n = 1 << (32 + shift) + if -(-n // s) == magic: + return s + return None + + +def helper_inner(mangled): + """`.?AU?$StreamableHelper@VObservedTech@Game@@@Mars@@` -> (Game::ObservedTech, False) + `?$VectorHelper@V...` -> (T, True)""" + m = mangled + for p in (".?AV", ".?AU", ".?AW", ".?AT"): + if m.startswith(p): + m = m[len(p):] + isvec = m.startswith("?$VectorHelper@") + if isvec: + m = m[len("?$VectorHelper@"):] + elif m.startswith("?$StreamableHelper@"): + m = m[len("?$StreamableHelper@"):] + else: + return mangled, False + if m.endswith("@Mars@@@Mars@@"): + m = m[:-len("@Mars@@@Mars@@")] + elif m.endswith("@Mars@@"): + m = m[:-len("@Mars@@")] + if m[:1] in ("V", "U", "W", "T") and m[1:2] == "?": + m = m[1:] + if m.startswith("?$StreamableEnum@"): + inner = m[len("?$StreamableEnum@"):].rstrip("@") + return "enum:" + BUILTIN.get(inner, inner.split("@")[0].lstrip("W4V")), \ + isvec + # MSVC builtin type codes (a template argument that is not a class) + if m in BUILTIN: + return BUILTIN[m], isvec + if m[:1] in ("V", "U", "W", "T") and not m.startswith("?$"): + m = m[1:] + parts = [p for p in m.split("@") if p] + return "::".join(reversed(parts)), isvec + + +BUILTIN = {"C": "int8", "D": "char", "E": "uint8", "F": "int16", "G": "uint16", + "H": "int", "I": "uint", "J": "long", "K": "ulong", "M": "float", + "N": "double", "_N": "bool", "X": "void", "PAX": "void*", + "PAD": "char*"} + + +# ------------------------------------------------------------------ driver +class Lab: + def __init__(self): + self.img = Image() + _, _, self.vfts = load_rtti() + raw = json.load(open(FUNCS)) + self.funcs = sorted((int(a, 16), n, sz) for a, (n, sz) in raw.items()) + self.starts = [f[0] for f in self.funcs] + self.fnames = {f[0]: f[1] for f in self.funcs} + self.ex = Extractor(self.img, self.vfts, self.fnames, self.funcs, + self.starts) + + self._cache = {} + self.writers = self.writer_set() + self.forwarders = self.find_forwarders() + self.ex.extra = self.forwarders + self._cache = {} # re-extract knowing the forwarders + self.infos = self.classes() + for i in self.infos.values(): # base-class splicing needs these + self.writers.setdefault(i["write"], []).append( + (i["class"], i["col_offset"], i["vftable"])) + + def find_forwarders(self): + """Sub-writers `f(stream, name, member)` that pass the tag through. + + Without these, every field they write is invisible: the caller's + `push "PlayerIDs"; call f` looks like an ordinary call. Discovered, not + listed by hand -- a hand list is exactly the kind of thing that silently + under-reports on the 1,600 classes nobody has read. + """ + cand = set() + for wva in self.writers: + r = self.raw(wva) + if r: + cand.update(c["tgt"] for c in r["calls"]) + out = {} + for va in sorted(cand): + if va in HELPERS or va in self.writers: + continue + r = self.raw(va) + if r and "FORWARDER" in r["notes"]: + out[va] = ("opaque", None) + return out + + # -- the serializer set ---------------------------------------------- + def serializer_vftables(self): + """IStreamable sub-vftables: 3 slots {dtor, Read, Write}, on a class + whose RTTI base list actually contains `Mars::IStreamable`. + + The 3-slot shape alone is not a test: TacAISquadRule_*, the CSV row + parsers and ~100 other classes have three virtuals and no relation to + the stream at all. The class hierarchy descriptor settles it.""" + return [(va, v) for va, v in self.vfts.items() + if len(v["slots"]) == 3 and + ("Mars::IStreamable" in v.get("bases", []) or + v["class"] == "Mars::IStreamable")] + + def writer_set(self): + """VA -> [class names] for every slot-2 function of a 3-slot vftable.""" + w = {} + for va, v in self.serializer_vftables(): + w.setdefault(v["slots"][2], []).append((v["class"], v["offset"], va)) + return w + + def thunk_target(self, va): + """`push ebp; mov ebp,esp; mov ecx,[ecx+8]; pop ebp; jmp writer`. + + A POD type (Vector3, OutputRates, ...) has no vftable of its own; its + serializer is reached only through this specialised StreamableHelper + thunk, so without resolving it those classes are invisible. + """ + buf, o, _ = self.img.find(va) + if buf is None or o + 12 > len(buf): + return None + # Write thunk loads the helper's T* from +8, the Read thunk from +4. + if buf[o:o + 4] != b"\x55\x8b\xec\x8b" or buf[o + 4] != 0x49 or \ + buf[o + 5] not in (4, 8) or buf[o + 6] != 0x5D or \ + buf[o + 7] != 0xE9: + return None + return (va + 12 + struct.unpack_from(" writer VA, for the POD helper thunks.""" + out = {} + for va, v in self.vfts.items(): + if len(v["slots"]) != 3 or \ + "?$StreamableHelper@" not in v["mangled"]: + continue + t = self.thunk_target(v["slots"][2]) + if t is None: + continue + inner, isvec = helper_inner(v["mangled"]) + if isvec: + continue + out[inner] = {"write": t, "read": self.thunk_target(v["slots"][1]), + "helper_vftable": va} + return out + + def raw(self, fva): + if fva not in self._cache: + self._cache[fva] = self.ex.run(fva) + return self._cache[fva] + + def layout(self, fva, depth=0, seen=None): + """Fields of one serializer, with base-class serializers spliced in.""" + seen = seen or set() + if fva in seen or depth > 6: + return [] + seen = seen | {fva} + r = self.raw(fva) + if r is None: + return [] + # A base-class Write is emitted at its call site, so splice in program + # order -- that order is the on-disk order. + ev = [(f["va"], 0, f) for f in r["fields"]] + for c in r["calls"]: + if c["adj"] is None or c["tgt"] == fva: + continue + # (a) a base-class Write, reached through its own vftable, or + # (b) a private sub-writer of the same class -- e.g. StrategyServer + # writes its six id lists in FUN_00794cd0, and without this the + # six `PlayerIDs`-style fields are simply absent. + if c["tgt"] in self.writers or \ + (self.raw(c["tgt"]) and self.raw(c["tgt"])["fields"]): + ev.append((c["va"], 1, c)) + out = [] + for va, kind, item in sorted(ev, key=lambda e: e[0]): + if kind == 0: + out.append(item) + continue + for f in self.layout(item["tgt"], depth + 1, seen): + g = dict(f) + if g.get("this") and isinstance(g.get("off"), int): + g["off"] += item["adj"] + g["from"] = item["tgt"] + out.append(g) + return out + + + # -- sizeof oracle ---------------------------------------------------- + def sizeof_from_vectorhelper(self): + """sizeof(T) read off `VectorHelper::Write`'s element divide. + + This is the container-stride enumeration applied binary-wide: the + helper iterates `(_Mylast - _Myfirst)/sizeof(T)`, so the divisor MSVC + compiled in *is* sizeof(T) -- independent of which offsets any code + touches, and therefore able to see the trailing allocator words that a + touch-scan cannot. + """ + out = {} + for va, v in self.vfts.items(): + if len(v["slots"]) != 3 or "?$VectorHelper@" not in v["mangled"]: + continue + inner, _ = helper_inner(v["mangled"]) + r = self.raw(v["slots"][2]) + if not r: + continue + st = {c["stride"] for c in r["containers"]} + if len(st) == 1: + s = st.pop() + if inner in out and out[inner] != s: + out[inner] = None # contradiction: report it + elif inner not in out: + out[inner] = s + return {k: v for k, v in out.items() if v} + + # -- assembled layouts ------------------------------------------------- + def classes(self): + """class name -> {write, read, vftable, col_offset}. One entry per + (class, IStreamable sub-object).""" + out = {} + for va, v in self.serializer_vftables(): + if v["mangled"].startswith(".?AU?$") or \ + v["mangled"].startswith(".?AV?$"): + continue # template adaptors, not classes + cur = out.get(v["class"]) + if cur and cur["write"] == v["slots"][2]: + continue + r = self.raw(v["slots"][2]) + nf = len(r["fields"]) if r else 0 + if cur and cur["nfields"] >= nf: + continue + out[v["class"]] = {"class": v["class"], "vftable": va, + "col_offset": v["offset"], + "dtor": v["slots"][0], "read": v["slots"][1], + "write": v["slots"][2], "nfields": nf} + # When IStreamable is the FIRST base the compiler merges its three + # slots into the class's primary vftable, so there is no 3-slot table + # to find and ~170 classes would silently go missing. Take slots + # [1]/[2] there, but only after confirming that [2] really is + # write-side and [1] read-side -- guessing the slot is how you publish + # a layout built from the wrong function. + for va, v in self.vfts.items(): + c = v["class"] + if c in out or c.startswith("?$") or len(v["slots"]) < 3: + continue + if "Mars::IStreamable" not in v.get("bases", []): + continue + w, rd = self.raw(v["slots"][2]), self.raw(v["slots"][1]) + if not w or w["side"][0] == 0 or w["side"][0] <= w["side"][1]: + continue + out[c] = {"class": c, "vftable": va, "col_offset": v["offset"], + "dtor": v["slots"][0], "read": v["slots"][1], + "write": v["slots"][2], "nfields": len(w["fields"]), + "merged_vftable": True, + "read_side_ok": bool(rd and rd["side"][1] >= rd["side"][0])} + return out + + def build(self, info, sizes): + """One class -> a layout record, with fields at absolute offsets.""" + adj = info["col_offset"] + fields, elems, extern = [], [], [] + for f in self.layout(info["write"]): + g = dict(f) + if g.get("this") and isinstance(g.get("off"), int): + g["off_abs"] = g["off"] + adj + if g.get("kind") in ("object",) and not g.get("ptr"): + g["size"] = sizes.get(g.get("inner")) + fields.append(g) + elif isinstance(g.get("off"), int) and \ + g.get("base") not in ("ebp", "esp"): + elems.append(g) # container element / iterator + else: + extern.append(g) + fields.sort(key=lambda x: (x["off_abs"], x["va"])) + # merge duplicate offsets (a field written twice, e.g. legacy tags) + seen, uniq = {}, [] + for f in fields: + k = f["off_abs"] + if k in seen: + seen[k].setdefault("alt_tags", []).append(f["tag"]) + continue + seen[k] = f + uniq.append(f) + lower = 0 + unknown = 0 + for f in uniq: + if isinstance(f.get("size"), int): + lower = max(lower, f["off_abs"] + f["size"]) + else: + unknown += 1 + gaps = [] + for a, b in zip(uniq, uniq[1:]): + if isinstance(a.get("size"), int): + d = b["off_abs"] - (a["off_abs"] + a["size"]) + if d > 3: + gaps.append({"after": a["tag"], "at": a["off_abs"], + "bytes": d}) + # Independent cross-check: the class's Read must land on the same + # member addresses as its Write. Read reaches by-value ints through a + # stack temporary, so only the pointer-passed fields are comparable -- + # but where they are comparable, disagreement means the layout is wrong + # or the wrong function was taken for the Write. + ragree = rtotal = 0 + if info.get("read"): + # Only *named* tags are cross-checkable. A NULL writer name is + # "." on disk and carries no identity, so matching those between + # Read and Write would be positional -- and one side resolving a + # field the other did not then shifts every later position and + # manufactures disagreements that are not real. + rl = {} + for f in self.layout(info["read"]): + if f.get("this") and isinstance(f.get("off"), int) \ + and f["tag"] != ".": + rl.setdefault(f["tag"], set()).add(f["off"] + adj) + dup = {t for t in [f["tag"] for f in uniq] + if [f["tag"] for f in uniq].count(t) > 1} + for f in uniq: + # `ServerPlayer` writes two different members as `Team`; a tag + # used twice cannot be matched by name, so skip it rather than + # report a conflict that is really a name collision. + if f["tag"] != "." and f["tag"] in rl and f["tag"] not in dup: + rtotal += 1 + ragree += (f["off_abs"] in rl[f["tag"]]) + return {"class": info["class"], "write": info["write"], + "read_agree": ragree, "read_comparable": rtotal, + "read": info["read"], "vftable": info["vftable"], + "col_offset": adj, "fields": uniq, "elements": elems, + "computed": extern, "sizeof_lower": lower, + "sizeof_stride": sizes.get(info["class"]), + "unsized_fields": unknown, "gaps": gaps, + "strides": self.raw(info["write"])["strides"]} + + + # -- the whole binary ------------------------------------------------- + def run_all(self): + sizes = dict(self.sizeof_from_vectorhelper()) + infos = dict(self.infos) + for t, h in self.helper_writers().items(): + if t in infos or not h["write"]: + continue + infos[t] = {"class": t, "vftable": h["helper_vftable"], + "col_offset": 0, "dtor": None, "read": h["read"], + "write": h["write"], "nfields": 0, "pod": True} + # fixpoint: nested object sizes feed each other's lower bounds + lay = {} + for _ in range(6): + lay = {c: self.build(i, sizes) for c, i in infos.items()} + changed = False + for c, L in lay.items(): + if c not in sizes and L["sizeof_lower"] and \ + not L["unsized_fields"]: + sizes[c] = L["sizeof_lower"] + changed = True + if not changed: + break + # upper bounds from embeddings: an object at +D followed by a field at + # +D' cannot be larger than D'-D + ub = {} + for L in lay.values(): + fs = L["fields"] + for a, b in zip(fs, fs[1:]): + t = a.get("inner") + if a["kind"] == "object" and not a.get("ptr") and t: + d = b["off_abs"] - a["off_abs"] + if d > 0: + ub[t] = min(ub.get(t, 1 << 30), d) + for c, L in lay.items(): + L["sizeof_upper"] = ub.get(c) + L["sizeof_vectorstride"] = self.sizeof_from_vectorhelper().get(c) + lo, up = L["sizeof_lower"], L["sizeof_upper"] + st = L["sizeof_vectorstride"] + if st: + L["sizeof"], L["sizeof_by"] = st, "container stride" + elif lo and up and lo <= up < lo + 4 and not L["unsized_fields"]: + L["sizeof"], L["sizeof_by"] = up, "enumeration meets embedding" + else: + L["sizeof"], L["sizeof_by"] = None, None + L["grade"], L["why"] = grade(L) + return lay + + +def grade(L): + """Tier + why. The failure classes are the point of this function.""" + fs = L["fields"] + if not fs and not L["elements"] and not L["computed"]: + return "empty", "serializer writes no tagged field (default/stub Write)" + if not fs: + return "partial", "only container elements / computed values recovered" + bad = [f for f in fs if f.get("unresolved")] + unsized = [f for f in fs if not isinstance(f.get("size"), int)] + opaque = [f for f in fs if f["kind"] == "opaque"] + if bad: + return "partial", f"{len(bad)} field(s) unresolved (value built across " \ + f"a branch, or a non-stack helper)" + if opaque: + return "partial", f"{len(opaque)} field(s) via an untyped sub-writer" + if unsized: + return "partial", f"{len(unsized)} nested field(s) of unknown size" + if L["read_comparable"] and L["read_agree"] < L["read_comparable"]: + return "conflict", (f"Read disagrees on " + f"{L['read_comparable'] - L['read_agree']} of " + f"{L['read_comparable']} comparable field offset(s)") + anon = sum(1 for f in fs if f["tag"] == ".") + if anon > len(fs) // 2: + return "unnamed", ("offsets and types recovered; the writer passes a " + "NULL name so the fields have no on-disk names and " + "cannot be matched against Read by name") + if L["read_comparable"] and L["read_agree"] == L["read_comparable"]: + return "verified", (f"fields exact; Read agrees on all " + f"{L['read_comparable']} comparable offsets" + + ("; sizeof corroborated" if L["sizeof"] else "")) + if L["sizeof"]: + return "clean", "fields exact; sizeof corroborated" + return "clean", "fields exact; sizeof is a lower bound only" + + +def fmt_field(f): + off = f.get("off") + o = f"+0x{off:x}" if isinstance(off, int) and off >= 0 else \ + (f"-0x{-off:x}" if isinstance(off, int) else "?") + sz = f.get("size") + s = f"0x{sz:x}" if isinstance(sz, int) else "?" + extra = "" + if f.get("inner"): + extra = f" <{f['inner']}>" + if f.get("ptr"): + extra += " (ptr)" + if not f.get("this", True): + extra += f" [base={f.get('base')}]" + if f.get("unresolved"): + extra += " UNRESOLVED" + return f" {o:>8} {s:>5} {f['kind']:<10} {f['tag']!r}{extra}" + + +def validate(lab, verbose=False): + """Reproduce, exactly, the layouts the campaign already had. + + Nothing new is claimed until this passes: a recovered layout that disagrees + with `save_reader.py` or with `struct-recovery.md` is a finding to + investigate, not a number to publish. + """ + from serializers_golden import GOLDEN, GOLDEN_SIZEOF, DISK_ORDER + sizes = lab.sizeof_from_vectorhelper() + hw = lab.helper_writers() + ok = miss = wrong = 0 + print("=" * 72) + print("A. field offsets and kinds vs struct-recovery.md / observedtech-append.md") + print("=" * 72) + for cls, g in sorted(GOLDEN.items()): + info = {"class": cls, "write": g["write"], "read": 0, "vftable": 0, + "col_offset": None} + vf = [v for v in lab.vfts.values() + if len(v["slots"]) == 3 and v["slots"][2] == g["write"]] + if vf: + info["col_offset"] = vf[0]["offset"] + elif cls in hw: + info["col_offset"] = 0 # POD helper thunk: no sub-object + else: + print(f" {cls}: no 3-slot vftable for 0x{g['write']:08x}") + continue + lay = lab.build(info, sizes) + got = {} + for f in lay["fields"]: + got.setdefault(f["tag"], []).append(f) + c_ok = c_miss = c_wrong = 0 + bad = [] + for tag, off, kind in g["fields"]: + cands = got.get(tag, []) + hit = [f for f in cands if f["off_abs"] == off] + if hit: + k = hit[0]["kind"] + if k == kind or (kind == "object" and k in ("object", "vector")) \ + or (kind == "handle" and k in ("handle", "int")) \ + or (kind == "int" and k in ("int", "handle", "enum")): + c_ok += 1 + else: + c_wrong += 1 + bad.append(f" {tag} +0x{off:x}: kind {k} != {kind}") + elif cands: + c_wrong += 1 + bad.append(f" {tag}: at +0x{cands[0]['off_abs']:x}, " + f"expected +0x{off:x}") + else: + c_miss += 1 + bad.append(f" {tag} +0x{off:x}: not recovered") + ok, miss, wrong = ok + c_ok, miss + c_miss, wrong + c_wrong + n = len(g["fields"]) + flag = "OK " if c_wrong == 0 and c_miss == 0 else \ + ("MISS" if c_wrong == 0 else "FAIL") + print(f" [{flag}] {cls:38s} {c_ok:3d}/{n:<3d} exact" + f"{'' if not c_miss else f' {c_miss} missing'}" + f"{'' if not c_wrong else f' {c_wrong} WRONG'}") + if bad and (verbose or c_wrong): + print("\n".join(bad)) + tot = ok + miss + wrong + print(f"\n fields: {ok}/{tot} exact, {miss} not recovered, {wrong} WRONG") + + print() + print("=" * 72) + print("B. sizeof, from the container-stride divides") + print("=" * 72) + for cls, want in sorted(GOLDEN_SIZEOF.items()): + got = sizes.get(cls) + print(f" [{'OK ' if got == want else 'FAIL'}] {cls:38s} " + f"got 0x{got:x}" if got else + f" [-- ] {cls:38s} no VectorHelper stride " + f"(expected 0x{want:x})") + + print() + print("=" * 72) + print("C. on-disk tag order vs save_reader.py") + print("=" * 72) + exp = disk_expectations() + agree = disagree = 0 + for va, name in sorted(DISK_ORDER.items()): + want = exp.get(name) + if not want: + continue + r = lab.raw(va) + if not r: + continue + got = [f["tag"] for f in lab.layout(va)] + i, missing = 0, [] + for t in want: + j = got.index(t, i) if t in got[i:] else -1 + if j < 0: + missing.append(t) + else: + i = j + 1 + if missing: + disagree += 1 + print(f" [FAIL] {name:22s} 0x{va:08x} {len(want)-len(missing)}" + f"/{len(want)} in order; not found in order: " + f"{missing[:8]}{'...' if len(missing) > 8 else ''}") + else: + agree += 1 + print(f" [OK ] {name:22s} 0x{va:08x} {len(want)} tags, " + f"same relative order as the save oracle") + print(f"\n {agree} shapes agree, {disagree} disagree") + return 0 if (wrong == 0 and disagree == 0) else 1 + + +def disk_expectations(): + """Top-level tag sequence of each save_reader.py Shape.""" + sys.path.insert(0, os.path.join(REPO, "verify", "save-reader")) + import save_reader as SR + out = {} + + def tags(shape): + seq = [] + fields = shape.fields if isinstance(shape, (SR.Shape, SR.Seq)) else [] + for f in fields: + nm = getattr(f, "name", None) + cls = type(f).__name__ + if cls in ("Opt", "If", "Rest", "Repeat"): + continue # legacy / conditional / open-ended + if not getattr(f, "auth", False): + continue # R(): community field name, not a disk tag + if nm and nm != ".": + seq.append(nm) + return seq + + for nm in dir(SR): + v = getattr(SR, nm) + if isinstance(v, SR.Shape): + out[nm] = tags(v) + return out + + +CNAME = {"bool": "bool", "int": "int", "int16": "short", "int8": "char", + "float": "float", "int64": "longlong", "enum": "int"} + + +C_KEYWORDS = { + "auto", "break", "case", "char", "const", "continue", "default", "do", + "double", "else", "enum", "extern", "float", "for", "goto", "if", "inline", + "int", "long", "register", "restrict", "return", "short", "signed", + "sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", + "void", "volatile", "while", "bool", "class", "new", "delete", "this", + "operator", "template", "typename", "namespace", "public", "private"} + + +def cident(s, used): + out = "".join(c if (c.isalnum() or c == "_") else "_" for c in s) + if not out or out[0].isdigit(): + out = "f_" + out + if out in C_KEYWORDS: + out += "_" + base, n = out, 1 + while out in used: + out = f"{base}_{n}" + n += 1 + used.add(out) + return out + + +VALID_ID = __import__("re").compile(r"^[A-Za-z_]\w*$") + + +def emit_c(cls, L, sizes, emitted): + """One recovered layout as a C struct, gaps made explicit as padding.""" + nm = cls.replace("::", "_") + if not VALID_ID.match(nm): + return None + lines, used, cur, k = [], set(), 0, 0 + for f in L["fields"]: + off, kind = f["off_abs"], f["kind"] + sz = f.get("size") + if kind in ("object", "vector") and f.get("ptr"): + ctype, sz = "void *", 4 + elif kind == "vector": + ctype, sz = "Mars_vector", 0x10 + elif kind == "string": + ctype, sz = "Mars_string", 0x1C + elif kind == "handle": + ctype, sz = "void *", 4 + elif kind == "object": + t = (f.get("inner") or "").replace("::", "_") + if t in emitted and VALID_ID.match(t) and sizes.get(f.get("inner")): + ctype, sz = t, sizes[f["inner"]] + elif isinstance(sz, int) and sz > 0: + ctype = f"char[{sz}]" + else: + return None # unsized nested member + elif kind in CNAME: + ctype = CNAME[kind] + else: + return None + if not isinstance(sz, int) or sz <= 0 or off < cur: + return None + if off > cur: + lines.append(f" char _pad{k}[{off - cur}];") + k += 1 + fname = cident(f["tag"] if f["tag"] != "." else f"f{off:x}", used) + if ctype.endswith("]"): + base, n = ctype.split("[") + lines.append(f" {base} {fname}[{n};") + else: + lines.append(f" {ctype} {fname};") + cur = off + sz + if not lines: + return None + total = L["sizeof"] or L["sizeof_lower"] + if total and total > cur: + lines.append(f" char _pad{k}[{total - cur}];") + return f"struct {nm} {{\n" + "\n".join(lines) + "\n};" + + +def build_c_header(lay, sizes): + """All emittable layouts, nested types first.""" + order, emitted, out = [], set(), [] + todo = [c for c, L in lay.items() + if L["grade"] in ("verified", "clean", "unnamed")] + for _ in range(8): + progress = False + for c in list(todo): + L = lay[c] + deps = {(f.get("inner") or "") for f in L["fields"] + if f["kind"] == "object" and not f.get("ptr")} + if any(d in lay and d.replace("::", "_") not in emitted and d != c + for d in deps): + continue + s = emit_c(c, L, sizes, emitted) + todo.remove(c) + if s: + emitted.add(c.replace("::", "_")) + order.append(c) + out.append(s) + progress = True + if not progress: + break + return order, out + + +def write_markdown(lay): + p = os.path.join(OUT, "layouts.md") + with open(p, "w") as fh: + fh.write("# Recovered class layouts (`tools/serializers.py all`)\n\n" + "Generated -- do not hand-edit. Offsets are absolute (object " + "base). `sizeof` is quoted only where a second, independent " + "line of evidence agrees with the field enumeration; " + "otherwise a lower bound is given.\n\n") + for c in sorted(lay): + L = lay[c] + if L["grade"] == "empty": + continue + sz = (f"0x{L['sizeof']:x} ({L['sizeof_by']})" if L["sizeof"] + else f">= 0x{L['sizeof_lower']:x} (lower bound)") + fh.write(f"## `{c}`\n\n" + f"Write `0x{L['write']:08x}`, Read " + f"`{('0x%08x' % L['read']) if L['read'] else '-'}`, " + f"IStreamable vftable `0x{L['vftable']:08x}` " + f"(COL offset +0x{L['col_offset']:x}). " + f"sizeof {sz}. **{L['grade']}** -- {L['why']}\n\n") + if L["fields"]: + fh.write("| offset | size | kind | tag | type |\n" + "|---|---|---|---|---|\n") + for f in L["fields"]: + s = f"0x{f['size']:x}" if isinstance(f.get("size"), int) \ + else "?" + fh.write(f"| 0x{f['off_abs']:x} | {s} | {f['kind']}" + f"{' (ptr)' if f.get('ptr') else ''} | " + f"`{f['tag']}` | {f.get('inner', '')} |\n") + fh.write("\n") + if L["elements"]: + fh.write("Container-element fields (offsets are within the " + "element / map node, not the object): " + + ", ".join(f"`{f['tag']}`@+0x{f['off']:x}" + for f in L["elements"]) + "\n\n") + print(f"wrote {p}") + + +def main(): + cmd = sys.argv[1] if len(sys.argv) > 1 else "find" + lab = Lab() + if cmd == "validate": + return validate(lab, "-v" in sys.argv) + if cmd == "dump": + va = int(sys.argv[2], 0) + owners = lab.writers.get(va, []) + print(f"0x{va:08x} {lab.fnames.get(va,'')} " + f"{[o[0] for o in owners]}") + for f in lab.layout(va): + print(fmt_field(f)) + r = lab.raw(va) + for n in r["notes"]: + print(" note: " + n) + elif cmd == "all": + lay = lab.run_all() + os.makedirs(OUT, exist_ok=True) + with open(os.path.join(OUT, "layouts.json"), "w") as fh: + json.dump(lay, fh, indent=1, sort_keys=True) + by = {} + for c, L in lay.items(): + by.setdefault(L["grade"], []).append(c) + nf = sum(len(L["fields"]) for L in lay.values()) + print(f"serializable classes with a Write : {len(lay)}") + for g in ("verified", "clean", "unnamed", "partial", "conflict", + "empty"): + print(f" {g:8s}: {len(by.get(g, []))}") + print(f"member fields recovered : {nf}") + print(f"classes with a corroborated sizeof: " + f"{sum(1 for L in lay.values() if L['sizeof'])}") + ra = sum(L["read_agree"] for L in lay.values()) + rt = sum(L["read_comparable"] for L in lay.values()) + bad = [c for c, L in lay.items() + if L["read_comparable"] and L["read_agree"] < L["read_comparable"]] + print(f"Read/Write cross-check : {ra}/{rt} fields agree " + f"({len(bad)} class(es) with any disagreement)") + for c in bad[:12]: + L = lay[c] + print(f" {c}: {L['read_agree']}/{L['read_comparable']}") + why = {} + for L in lay.values(): + if L["grade"] not in ("verified", "clean"): + why[L["why"]] = why.get(L["why"], 0) + 1 + print("\nwhy not clean:") + for w, n in sorted(why.items(), key=lambda x: -x[1]): + print(f" {n:4d} {w}") + write_markdown(lay) + sizes = {c: (L["sizeof"] or L["sizeof_lower"]) for c, L in lay.items()} + order, defs = build_c_header(lay, sizes) + hdr = ("// GENERATED by tools/serializers.py -- do not hand-edit.\n" + "// Layouts recovered from the Mars::IStreamable serializers.\n" + "// `Mars_string` is 0x1c and `Mars_vector` 0x10 -- allocator-LAST\n" + "// in this build's STL, which is why a touch-scan undercounts\n" + "// both by exactly 4 (findings/objects/struct-recovery.md 0).\n" + "struct Mars_string { char _bx[16]; unsigned int size; " + "unsigned int res; void* alval; };\n" + "struct Mars_vector { void* first; void* last; void* end; " + "void* alval; };\n\n" + "\n\n".join(defs) + "\n") + with open(os.path.join(OUT, "layouts.h"), "w") as fh: + fh.write(hdr) + print(f"wrote {OUT}/layouts.h ({len(defs)} structs)") + elif cmd == "find": + vs = lab.serializer_vftables() + print(f"3-slot vftables : {len(vs)}") + print(f"distinct Write slots : {len(lab.writers)}") + classes = {c for o in lab.writers.values() for c, _, _ in o} + print(f"distinct classes : {len(classes)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main() or 0) diff --git a/tools/serializers_ghidra.py b/tools/serializers_ghidra.py new file mode 100644 index 0000000..c073835 --- /dev/null +++ b/tools/serializers_ghidra.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +"""Push the recovered layouts into Ghidra so later lanes inherit them. + +Reads `objects/layouts.json` + `objects/layouts.h` (produced by +`tools/serializers.py all`) and, through `tools/reva_call.py`: + + * `parse-c-structure` for every emittable struct, dependencies first + * `create-label` for every serializer `Write` / `Read` entry point + +Idempotent: re-running replaces the structures and re-applies the labels. +Progress is written to `objects/.ghidra_pushed` so an interrupted run resumes. + + uv run python3 tools/serializers_ghidra.py structs + uv run python3 tools/serializers_ghidra.py labels +""" +import json +import os +import re +import subprocess +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +REPO = os.path.dirname(HERE) +OUT = os.path.join(REPO, "objects") +PROG = "/Sword of the Stars.exe" +STATE = os.path.join(OUT, ".ghidra_pushed") + + +def reva(tool, payload): + r = subprocess.run( + ["uv", "run", "python3", os.path.join(HERE, "reva_call.py"), tool, + json.dumps(payload)], + cwd=REPO, capture_output=True, text=True, timeout=180) + return r.returncode, (r.stdout or r.stderr).strip() + + +def done_set(): + if not os.path.exists(STATE): + return set() + return set(open(STATE).read().split("\n")) + + +def mark(key): + with open(STATE, "a") as fh: + fh.write(key + "\n") + + +def structs(): + text = open(os.path.join(OUT, "layouts.h")).read() + defs = re.findall(r"struct \w+ \{.*?\};", text, re.S) + have = done_set() + ok = fail = skip = 0 + for d in defs: + name = d.split()[1] + key = "struct:" + name + if key in have: + skip += 1 + continue + rc, out = reva("parse-c-structure", + {"programPath": PROG, "cDefinition": d}) + if rc == 0 and '"message"' in out: + ok += 1 + mark(key) + else: + fail += 1 + print(f" FAIL {name}: {out[:160]}") + if (ok + fail) % 25 == 0: + print(f" {ok} ok, {fail} failed, {skip} already there") + print(f"structures: {ok} pushed, {fail} failed, {skip} skipped") + + +def labels(): + lay = json.load(open(os.path.join(OUT, "layouts.json"))) + have = done_set() + ok = fail = skip = 0 + for c, L in sorted(lay.items()): + if L["grade"] not in ("verified", "clean"): + continue + nm = c.replace("::", "_") + for kind in ("write", "read"): + va = L.get(kind) + if not va: + continue + label = f"{nm}_{kind.capitalize()}" + key = f"label:{label}:{va:x}" + if key in have: + skip += 1 + continue + rc, out = reva("create-label", + {"programPath": PROG, "labelName": label, + "address": f"0x{va:08x}"}) + if rc == 0: + ok += 1 + mark(key) + else: + fail += 1 + print(f" FAIL {label}: {out[:120]}") + print(f"labels: {ok} created, {fail} failed, {skip} skipped") + + +def addresses(): + """Merge the verified-tier serializers and corroborated sizeofs into + ghidra/addresses.json (then run tools/gen_addresses.py -- never hand-edit + the header).""" + path = os.path.join(REPO, "ghidra", "addresses.json") + j = json.load(open(path)) + base = int(j["image_base"], 16) + have = {e["name"] for e in j["entries"]} + lay = json.load(open(os.path.join(OUT, "layouts.json"))) + added = 0 + for c, L in sorted(lay.items()): + if L["grade"] != "verified": + continue + nm = c.replace("::", "_") + cr = f"{L['read_agree']}/{L['read_comparable']} field offsets agree " \ + f"between Read and Write" + for kind in ("write", "read"): + va = L.get(kind) + name = f"{nm}_{kind.capitalize()}" + if not va or name in have or not (base <= va < base + 0x1000000): + continue + j["entries"].append({ + "name": name, "addr": f"0x{va:08x}", "convention": "thiscall", + "prototype": f"void ({nm}* this, Mars::Stream* s) " + f"/* IStreamable slot {2 if kind == 'write' else 1}" + f", vftable 0x{L['vftable']:08x}, COL offset " + f"+0x{L['col_offset']:x}; {len(L['fields'])} " + f"member fields; {cr} */", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md"}) + have.add(name) + added += 1 + if L["sizeof"]: + name = f"sizeof_{nm}" + if name not in have: + j["entries"].append({ + "name": name, "offset": f"0x{L['sizeof']:x}", + "convention": "layout", + "prototype": f"sizeof({c}) -- {L['sizeof_by']}", + "status": "verified", + "source": "findings/objects/serializer-struct-recovery.md"}) + have.add(name) + added += 1 + with open(path, "w") as fh: + json.dump(j, fh, indent=1, ensure_ascii=False) + fh.write("\n") + print(f"addresses.json: +{added} entries, {len(j['entries'])} total") + + +if __name__ == "__main__": + cmd = sys.argv[1] if len(sys.argv) > 1 else "structs" + {"structs": structs, "labels": labels, "addresses": addresses}[cmd]() diff --git a/tools/serializers_golden.py b/tools/serializers_golden.py new file mode 100644 index 0000000..f7dea1c --- /dev/null +++ b/tools/serializers_golden.py @@ -0,0 +1,275 @@ +#!/usr/bin/env python3 +"""Golden layouts for `tools/serializers.py --validate`. + +Transcribed by hand from the layouts this campaign had already recovered and +cross-checked against real saves *before* this tool existed: + + * `findings/objects/struct-recovery.md` sections 1-4 (member tables read out + of the decompiled `Write`/`Read` pairs, COL offsets from RTTI) + * `findings/subsystems/observedtech-append.md` section 4 + 9 (`ObservedTech`, + `sizeof` pinned three independent ways) + * `verify/save-reader/SAVE_FORMAT.md` / `save_reader.py` (on-disk tag order, + `--strict` clean against three real saves, 36 tests) + +Offsets are **absolute** (object base), i.e. the decompiled `this`-relative +offset plus the IStreamable COL offset. Kinds use the tool's vocabulary. +Nothing here is derived from the tool: it is the independent answer the tool +has to reproduce. +""" + +# tag, absolute offset, kind +GOLDEN = { + "Game::ObservedTech": { + "write": 0x00817CF0, "sizeof": 0x2C, + "fields": [("otnF", 0x04, "int16"), ("otnL", 0x06, "int16"), + ("odet", 0x08, "bool"), ("otch", 0x0C, "string"), + ("owith", 0x28, "int")], + }, + "Game::ObservedWeapon": { + "write": 0x00817BC0, "sizeof": 0x2C, + "fields": [("otnF", 0x04, "int16"), ("otnL", 0x06, "int16"), + ("odet", 0x08, "bool"), ("owep", 0x0C, "string"), + ("owith", 0x28, "int")], + }, + "Game::StarSystem::OutputRates": { + "write": 0x00745190, "sizeof": 0x1C, + "fields": [("SRt", 0x00, "float"), ("SRsc", 0x04, "float"), + ("SRtf", 0x08, "float"), ("SRi", 0x0C, "float"), + ("SRoh", 0x10, "float"), ("SRs", 0x14, "float"), + ("SRnr", 0x18, "int")], + }, + "Game::ServerSystem": { + "write": 0x00749630, "sizeof": None, + "fields": [ + ("Pos", 0x18, "object"), + ("R", 0x4C, "float"), ("G", 0x50, "float"), ("B", 0x54, "float"), + ("A", 0x58, "float"), ("Idx", 0x5C, "int"), ("Size", 0x60, "int"), + ("Suit", 0x64, "float"), ("Res", 0x68, "int"), + ("ARes2", 0x6C, "int"), ("MRes", 0x70, "int"), + ("TRes", 0x74, "int"), ("haltv", 0x78, "bool"), + ("OutMod", 0x7C, "float"), ("TAcq", 0x80, "int"), + ("TFAcq", 0x84, "int"), ("Rts", 0x88, "object"), + ("BQ", 0xA4, "object"), ("Name", 0xA8, "string"), + ("Abdn", 0xC4, "bool"), ("Dstyd", 0xC5, "bool"), + ("vnh", 0xC6, "bool"), ("vnd", 0xC7, "bool"), + ("vnex3", 0xC8, "bool"), ("vnpex3", 0xC9, "bool"), + ("VFlags", 0xCC, "int"), ("EFlags", 0xD0, "int"), + ("AFlags", 0xD4, "int"), ("FFlags", 0xD8, "int"), + ("GFlags", 0xDC, "int"), ("MnRFlags", 0xE0, "int"), + ("RfRFlags", 0xE4, "int"), ("ClkFlags", 0xE8, "int"), + ("Bats2", 0xF0, "int64"), ("rcex", 0xF8, "int64"), + ("PID", 0x100, "handle"), ("dcs", 0x104, "object"), + ("dsu", 0x118, "float"), ("cm", 0x11C, "object"), + ("cme2", 0x13C, "vector"), ("PvCM", 0x14C, "object"), + ("NumFlts", 0x16C, "vector"), ("RepCur", 0x17C, "float"), + ("RepMax", 0x180, "float"), ("EggScio", 0x184, "int"), + ("NoRebAI", 0x188, "bool"), ("PvNoRebAI", 0x189, "bool"), + ("Pop", 0x18C, "int"), ("Infra", 0x190, "float"), + ("pbon", 0x194, "int"), ("ibon", 0x198, "float"), + ("TerrFl", 0x19C, "int"), ("Pop2", 0x1A0, "object"), + ("pbon2", 0x1B4, "object"), ("indi", 0x1C8, "object"), + ("spies2", 0x1CC, "vector"), ("rbfl", 0x1DC, "int"), + ("hsrg", 0x1E0, "bool"), ("adt", 0x1E4, "int"), + ("PvPop", 0x200, "int"), ("PvInfra", 0x204, "float"), + ("PvSuit", 0x208, "float"), ("PvRes", 0x20C, "int"), + ("PvARes2", 0x210, "int"), ("PvMRes", 0x214, "int"), + ("PvPop2", 0x218, "object"), ("DefF", 0x238, "handle"), + ("DefSF", 0x23C, "handle"), ("NumGFs", 0x240, "vector"), + ("NumSnF", 0x250, "vector"), ("NumMnF", 0x260, "vector"), + ("NumPlgs2", 0x2A8, "vector"), ("TnsOH", 0x2B8, "int"), + ("TDst", 0x2BC, "int"), ("ntdev", 0x2C4, "int"), + ("ltis", 0x2C8, "int"), ("rbtn", 0x2CC, "int"), + ("rbfr", 0x2D0, "int"), ("rbwn", 0x2D4, "int"), + ], + }, + "Game::StarSystem::PlayerView": { + "write": 0x007492D0, "sizeof": None, + "fields": [("VTrn", 0x08, "int"), ("Pop", 0x0C, "int"), + ("Pop2", 0x10, "object"), ("Infra", 0x24, "float"), + ("Suit", 0x28, "float"), ("Res", 0x2C, "int"), + ("ARes2", 0x30, "int"), ("MRes", 0x34, "int"), + ("NoRebAI", 0x38, "bool"), ("pbon", 0x3C, "int"), + ("pbon2", 0x40, "object"), ("ibon", 0x54, "float"), + ("TerrFl", 0x58, "int")], + }, + "Game::PopulationGroup": { + "write": 0x00536AF0, "sizeof": 0x18, + "fields": [("PopT", 0x04, "int"), ("PopS", 0x08, "int"), + ("PopC", 0x10, "int64")], + }, + "Game::IndependenceInfo": { + "write": 0x00748EE0, "sizeof": 0x70, + "fields": [("indsp", 0x04, "int"), ("indcl", 0x08, "object"), + ("indnm", 0x1C, "string"), ("indav", 0x38, "string"), + ("indba", 0x54, "string")], + }, + "Game::MoraleEvent": { + "write": 0x007491B0, "sizeof": 0x50, + "fields": [("mid", 0x04, "int"), ("mtr", 0x08, "int"), + ("mn", 0x0C, "int"), ("mtp", 0x10, "int"), + ("mfx", 0x14, "object"), ("mdsc", 0x34, "string")], + }, + "Game::ShipBuildOrder": { + "write": 0x00813800, "sizeof": None, + "fields": [("desID", 0x04, "int"), ("con", 0x08, "int"), + ("sav", 0x0C, "int"), ("conleft", 0x10, "int"), + ("ordID", 0x14, "int")], + }, + "Game::DiplomacyStats": { + "write": 0x00818CB0, "sizeof": 0x24, + "fields": [("other", 0x04, "int"), + ("lastnap", 0x08, "int16"), ("lastnapbty", 0x0A, "int16"), + ("bknnap", 0x0C, "int16"), ("btynap", 0x0E, "int16"), + ("lastally", 0x10, "int16"), ("lastallybty", 0x12, "int16"), + ("bknally", 0x14, "int16"), ("btyally", 0x16, "int16"), + ("lastcf", 0x18, "int16"), ("lastcfbty", 0x1A, "int16"), + ("bkncf", 0x1C, "int16"), ("btycf", 0x1E, "int16"), + ("deadhome", 0x20, "int16")], + }, + "Game::PlayerReport": { + "write": 0x00817480, "sizeof": 0x30, + "fields": [("oid", 0x04, "int"), ("pid", 0x08, "int"), + ("flds", 0x0C, "int"), ("sav", 0x10, "int"), + ("home", 0x14, "int"), ("ncol", 0x18, "int"), + ("mpwr", 0x1C, "int"), ("mcls", 0x20, "int"), + ("mmsl", 0x24, "int"), ("nshp", 0x28, "int"), + ("nsat", 0x2C, "int")], + }, + "Game::FlightPlan": { + "write": 0x00700F60, "sizeof": 0x38, + "fields": [("wpts", 0x04, "vector"), ("FPsp2", 0x14, "float"), + ("FPeta2", 0x18, "int"), ("FPogn2", 0x1C, "object"), + ("FPdpos", 0x28, "object"), ("pnd", 0x34, "int")], + }, + "Game::FlightPlan::Waypoint": { + "write": 0x00700ED0, "sizeof": None, + "fields": [("Wpt", 0x04, "int"), ("Tp", 0x08, "int"), + ("nrt", 0x0C, "object")], + }, + "Game::NodeRoute": { + "write": 0x006E22E0, "sizeof": None, + "fields": [("nrp", 0x04, "int"), ("nrf", 0x08, "int"), + ("nrt", 0x0C, "int")], + }, + "Game::StarFleet": { + "write": 0x00701070, "sizeof": None, + "fields": [("Pos", 0x18, "object"), ("PrvPos", 0x4C, "object"), + ("PID", 0x58, "handle"), ("FtName", 0x5C, "string"), + ("Perm", 0x78, "bool"), ("Lay", 0x7C, "object"), + ("LocID", 0xA0, "handle"), ("NShips", 0xA4, "vector"), + ("FPlan", 0xC4, "object"), ("FtTrans", 0xFC, "int"), + ("FtOrig", 0x100, "object"), ("FtFlg", 0x10C, "int"), + ("Ftae", 0x110, "int"), ("Ftpae", 0x114, "int"), + ("FtEnc", 0x118, "int"), ("FtMS", 0x11C, "int")], + }, + "Game::StarShip": { + "write": 0x008291F0, "sizeof": None, + "fields": [("PlrID", 0x10, "handle"), ("DesID", 0x14, "int"), + ("Range", 0x20, "float"), ("Health", 0x24, "object"), + ("MineCap", 0x34, "int"), ("NTH", 0x38, "vector"), + ("Plg", 0x48, "int"), ("Act", 0x4C, "int"), + ("Dep", 0x50, "bool"), ("Atq", 0x51, "bool"), + ("LCT", 0x5C, "int"), ("tsd", 0x60, "int"), + ("FltID", 0x64, "handle"), ("ConCap", 0x68, "int"), + ("RefCap", 0x6C, "float"), ("RepCap", 0x70, "float"), + ("EncID", 0x7C, "int"), ("PrisH", 0x80, "object"), + ("BQ2", 0x98, "object"), ("pop", 0x9C, "object"), + ("ppop", 0xA0, "object"), ("atsp", 0xA8, "int"), + ("tblt", 0xAC, "int")], + }, + "Game::ServerPlayer": { + "write": 0x008563E0, "sizeof": None, + "fields": [ + ("PlyrIdx", 0x28, "int"), ("HomeSys", 0x2C, "handle"), + ("NumOwn", 0x30, "vector"), ("PlryName", 0x40, "string"), + ("Species", 0x5C, "int"), ("ClrID", 0x60, "object"), + ("Bdg", 0x74, "string"), ("Avt", 0x90, "string"), + ("Team", 0xAC, "int"), ("IdealSuit", 0xB0, "float"), + ("SuitTol", 0xB4, "float"), ("MaxOH", 0xB8, "float"), + ("ResRate", 0xBC, "float"), ("ResMod", 0xC0, "float"), + ("ResScl", 0xC4, "float"), ("TRM", 0xD0, "float"), + ("TRA", 0xD4, "int"), ("TRP", 0xD8, "int"), + ("NumDes", 0xE4, "vector"), ("TechTree", 0xF4, "object"), + ("Elim", 0xF8, "bool"), ("NPC", 0xFB, "bool"), + ("RebAI", 0xFC, "bool"), ("ReqCL", 0xFD, "bool"), + ("AIBn", 0xFE, "bool"), ("CnTrd", 0xFF, "bool"), + ("CnRad", 0x100, "bool"), ("CnVItl", 0x101, "bool"), + ("hgs", 0x102, "bool"), ("hadvs", 0x103, "bool"), + ("harcc", 0x104, "bool"), ("pddm", 0x108, "float"), + ("OutMod", 0x124, "float"), ("RebOutMod", 0x128, "float"), + ("ScOutMod", 0x12C, "float"), ("PopMod", 0x130, "float"), + ("TerraMod", 0x134, "float"), ("AMine", 0x138, "bool"), + ("MinPure", 0x13C, "float"), ("MinRate", 0x140, "float"), + ("NGts", 0x144, "int"), ("PrGtTrf", 0x148, "int"), + ("GTraf", 0x14C, "int"), ("CstR", 0x150, "float"), + ("CstE", 0x154, "float"), ("CstT", 0x158, "float"), + ("Maint", 0x15C, "int"), ("shrm", 0x160, "float"), + ("Status", 0x164, "int"), ("Team", 0x168, "object"), + ("NumLeg", 0x178, "vector"), ("PvSav", 0x188, "int"), + ("PvMA", 0x18C, "bool"), ("HasDisc", 0x19C, "int"), + ("HasDiscSp", 0x1A0, "int"), ("HasDiscCl", 0x1A4, "int"), + ("HasEnc", 0x1A8, "int"), ("HasEng", 0x1AC, "int"), + ("ShipRecs", 0x1B0, "object"), ("Ojvs", 0x1F4, "vector"), + ("Nexp", 0x204, "vector"), ("NWeapXcl", 0x214, "vector"), + ("dipstats", 0x230, "vector"), ("comms", 0x240, "object"), + ("preps", 0x244, "vector"), ("odes", 0x254, "vector"), + ("owep", 0x264, "vector"), ("otch", 0x274, "vector"), + ("Sav", 0x284, "int"), ("HasImm", 0x288, "int"), + ("HasVac", 0x28C, "int"), ("NPTrk", 0x290, "int"), + ("ResTNm", 0x294, "object"), ("FNG", 0x298, "object"), + ("Events", 0x29C, "object"), ("BnkWrn", 0x2C4, "int"), + ("BnkTrn", 0x2C8, "int"), ("BnkEl", 0x2CC, "int"), + ("BnkPr", 0x2D0, "int"), ("plcy", 0x2D8, "int"), + ("pswd", 0x2DC, "string"), ("Srn", 0x2F8, "bool"), + ("SrnTo", 0x2FC, "handle"), ("lboid", 0x300, "int"), + ("lcid2", 0x304, "int"), ("IncMod", 0x30C, "float"), + ("aid", 0x310, "vector"), ("ndeflay", 0x320, "vector"), + ("cdp", 0x330, "bool"), ("spy2", 0x334, "object"), + ("rdtc", 0x338, "vector"), ("aidf", 0x368, "int"), + ("civr", 0x370, "object"), ("tnc", 0x39C, "int"), + ("NumPR", 0x3A4, "vector"), ("ResErrRoll", 0x3B4, "bool"), + ("cta", 0x3B5, "bool"), ("AIR", 0x3B8, "object"), + ("AIEnf", 0x3BC, "object"), ("NSprj", 0x3C0, "vector"), + ("NextPrjID", 0x3D0, "int"), ("lret", 0x3D4, "int"), + ("nmeid", 0x3DC, "int"), + ], + }, +} + +# sizeof values the campaign pinned independently of any serializer walk +GOLDEN_SIZEOF = { + "Game::ObservedTech": 0x2C, # magic divide + imul + search stride + "Game::ObservedWeapon": 0x2C, + "Game::PopulationGroup": 0x18, # Population's own vector stride + "Game::MoraleEvent": 0x50, + "Game::PlayerReport": 0x30, + "Game::DiplomacyStats": 0x24, + "Game::StarSystem::OutputRates": 0x1C, +} + +# on-disk tag order, from save_reader.py shapes -> the serializer that writes it +DISK_ORDER = { + 0x00829960: "Summary", # StrategyGameInfo::Write + 0x008276D0: "Slot", # SlotDef::Write + 0x0082AE40: "CreateParams", # StrategyGameCreateParams::Write + 0x0082AD40: "Scrp", # StrategyScriptParams::Write + 0x0056EC00: "PrisonerHold", + 0x008189A0: "SystemEvent", + 0x0082C290: "PlayerTurnStats", + 0x0082C4A0: "PlayerTurnHistory", + 0x0082C5A0: "TurnStats", + 0x0079FA70: "Sim", # StrategyServer::Write + 0x00749630: "Sys", # ServerSystem::Write + 0x008563E0: "Player", # ServerPlayer::Write + 0x00701070: "Flt", # StarFleet::Write + 0x008291F0: "Ship", # StarShip::Write + 0x00700F60: "FlightPlan", + 0x00817CF0: "Otch", + 0x00817BC0: "Owep", + 0x00745190: "Rts", + 0x00748EE0: "IndependenceInfo", + 0x00813800: "BuildOrder", + 0x00817480: "Prep", + 0x00818CB0: "DipStat", + 0x007492D0: "PlayerView", +}