From 5bae56a3974a722e745e97fe93554b6718e3f25d Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 8 Sep 2026 06:30:35 -0400 Subject: [PATCH] G: wire schema channel + widen the save codec to 97% typed coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The serializer recovery reaches this repo as a generated wire schema (include/generated/sots_stream_schema.h, 386 classes / 2042 items): for each class, the ordered sequence of items its Write puts on the stream. Facts only — no field offsets, no sizeof, no strides. This engine reads and writes the on-disk format; it does not inherit the original's memory layout. The table is a specification, not a program: the recovery is a linear pass over Write, so it cannot see Write's branches (StarShip's BQ2 is gated on hbq but listed unconditionally) and it flattens container loops. A codec driven off it would desynchronise. The hand-written io() shapes stay the codec; SchemaProbe (probe.h) walks them with every branch taken and test_wire_schema LCS-aligns that against the table — 56 shapes bound, 657 items matched, 0 mismatches. Four defects the check found, all invisible to a round-trip test: - SystemParams field 1 is a string, not an int. It is the empty string in every save, and an empty string is four zero bytes — byte-identical to the int 0, so it round-tripped by luck. A named planet would have desynced. - ObservedTech/ObservedWeapon odet is a bool, not an int. Byte-safe only because a 4-char tag makes a bool item and an int item both 12 bytes. - SpeciesRatios nv and ShipRecords srbd are counts, not fields. CoverageArchive separates items a field names from items a Node merely carries, because a byte-identical round trip is not a coverage claim. Typed coverage of a real save goes 37.9% -> 97.1% (97.2/97.2/97.6 on the others) with the round trip still byte-identical, by typing TechTree (both NumTechs sections), Events, ShipRecs, sprjs, civr, comms, spy2, spymgr, aid, Ojvs, AIEnf, FNG, trdmgr and the Des section/gun-bank tree. Ratchet at 95%. trdmgr resolves a recorded trap: ServerTradeManager's Read/Write really are the inherited no-op, but the call is virtual and ServerTradeManagerImpl has the real serializer. Same shape resolves IServerSpyManager -> ServerSpyManager. ctest 34/34, clean_room_check OK, test_save skips cleanly with SOTS_SAVES_DIR unset. --- docs/G-wire-schema.md | 78 + include/generated/sots_stream_schema.h | 3292 ++++++++++++++++++++++++ src/mars/stream/probe.h | 270 ++ src/mars/stream/shapes.h | 467 +++- tests/mars_stream/CMakeLists.txt | 9 + tests/mars_stream/test_save.cpp | 22 + tests/mars_stream/test_wire_schema.cpp | 245 ++ 7 files changed, 4351 insertions(+), 32 deletions(-) create mode 100644 docs/G-wire-schema.md create mode 100644 include/generated/sots_stream_schema.h create mode 100644 src/mars/stream/probe.h create mode 100644 tests/mars_stream/test_wire_schema.cpp diff --git a/docs/G-wire-schema.md b/docs/G-wire-schema.md new file mode 100644 index 0000000..968aa09 --- /dev/null +++ b/docs/G-wire-schema.md @@ -0,0 +1,78 @@ +# G — the wire schema channel + +`include/generated/sots_stream_schema.h` is the second generated channel into this repo, alongside +`include/generated/sots_addresses.h`. Both carry **facts about the original binary and nothing +else**, both are produced by a script in the `sots-re` notes repo, and neither is ever hand-edited. + +``` +sots-re objects/layouts.json (the serializer recovery, memory-layout view) + | tools/streams.py -> objects/streams.json (wire view) + | tools/gen_stream_schema.py + v +sots-engine include/generated/sots_stream_schema.h +``` + +Regenerate after any change on the notes side: + +```sh +cd ~/sots-re +uv run python3 tools/streams.py +uv run python3 tools/gen_stream_schema.py ../sots-engine/include/generated/sots_stream_schema.h +``` + +## What crosses, and what deliberately does not + +What crosses is the **wire schema**: for each serializable class, the ordered sequence of items its +`Write` puts on the stream — on-disk tag, on-disk primitive, and how the item is framed. + +What does **not** cross is every memory fact in the recovery: field offsets, `sizeof`, gaps, +container strides. This engine is our own C++, not a byte-for-byte decompilation. It has to read and +write the on-disk *format* faithfully; it must not inherit the original's ABI in its runtime types, +and `shapes.h` is free to lay its structs out however C++ likes. + +The shim is the one component that legitimately needs the original's ABI, because it reads the +running game's memory. Those offsets have their own home: `offset` entries in `addresses.json`, +which arrive through `sots_addresses.h`. + +Note the primitive in the table is the **disk** type. A member the original holds as `int16` or +`int8` is written by `Stream::WriteInt` and is four bytes on the wire; nothing narrow reaches the +stream. + +## Why it is a check, not a generator + +The table is a **specification, not a program**. The recovery is a linear pass over the game's +`Write`, so: + +* **It cannot see branches.** `StarShip` writes `BQ2` only when `hbq` is set; the table lists it + unconditionally. The sequence is a *superset* of what any single record contains. +* **Container loops are flattened.** A count item is followed by its element items as siblings + (`member == false`), not nested inside the container. + +A codec driven straight off the table would desynchronise on the first branch. So the hand-written +`io(Ar&)` shapes stay the codec — they express the conditionals and the nesting the binary facts +cannot supply — and the table is what proves they agree with the binary. + +## The two extra archives + +`src/mars/stream/probe.h` adds two archives to the three in `archive.h`: + +* **`SchemaProbe`** walks a shape's `io()` with **every branch taken** — the same "all branches" view + the recovery has — and records the item sequence. `tests/mars_stream/test_wire_schema.cpp` + LCS-aligns that against the generated table. A tag both sides name with different disk primitives + is a **hard failure**; a wire-only item is a conditional or coverage debt and is reported only. + Run with `SOTS_WIRE_VERBOSE=1` to list every gap. +* **`CoverageArchive`** walks a *populated* shape's `io()` and separates items a field **names** + (`typed`) from items only a generic `Node` **carried** (`opaque`). This matters because a + byte-identical round trip is not a coverage claim: `ar.any` and the `ar.rest` tail round-trip + perfectly by copying bytes they do not understand. `test_save` prints the split and the worst + offenders, and carries a ratchet so typing a body can never silently regress. + +## Adding a shape + +1. `uv run python3 ~/sots-re/tools/streams.py Game::TheClass` — the item list, in disk order. +2. Write the `io()` in `shapes.h`. Watch for two things the table shows but does not spell out: an + item marked `[element]` is a **loop body**, so the item before it is a **count**, not a field; and + an item the game writes conditionally will be listed anyway. +3. Add a `check("Shape", "Game::TheClass")` line to `test_wire_schema.cpp`. +4. `ctest` — the conformance test fails on a type disagreement, and `test_save` fails if the round + trip breaks or coverage regresses. diff --git a/include/generated/sots_stream_schema.h b/include/generated/sots_stream_schema.h new file mode 100644 index 0000000..858dd66 --- /dev/null +++ b/include/generated/sots_stream_schema.h @@ -0,0 +1,3292 @@ +// GENERATED -- do not edit. Wire schema of Sword of the Stars.exe (GOG 1.8.1). +// Source: sots-re objects/streams.json @ 48fcc3f, generated 2026-09-08 by tools/gen_stream_schema.py +// +// For each serializable class, the ordered sequence of items its Mars::IStreamable +// Write() puts on the stream. Recovered mechanically from the serializers; the +// order is the program order of Write, with base-class and sub-writer calls spliced +// in at their call site, which is the on-disk order. +// +// FACTS ONLY. No field offsets, no sizeof, no struct strides: this header describes +// the on-disk FORMAT, never the original's memory layout. The engine's own types are +// free to be laid out however they like. +// +// SOTS_WIRE_UNCONDITIONAL -- read this before treating the table as a program. +// The recovery is a linear pass over Write, so it cannot see Write's branches. A +// field the game emits only under a condition (StarShip's BQ2, gated by hbq) is +// listed unconditionally here. The sequence is therefore a SUPERSET of what any +// single record contains, and a codec driven straight off it would desynchronise. +// Container loops are flattened the same way: a count item is followed by its +// element items as siblings, with `member == false` marking the elements, rather +// than nested inside the container. Use this table to CHECK a hand-written codec, +// not to generate one. +// +// `grade` is the recovery tier (verified / clean / unnamed / partial / empty) and +// read_agree/read_comparable is the class's Read-vs-Write offset cross-check. +#pragma once +#include +#include + +namespace sots::wire { + +// On-disk primitive, from the Stream vftable slot the writer called: +// +0x18 str +0x1c bool +0x20 f32 +0x24 i32 +0x28 frame +0x30 raw (n=8 -> i64) +// NOTE this is the DISK type. A member held as int16 or int8 in the original is +// written by WriteInt and is I32 on the wire. +enum class Prim : uint8_t { Unknown, I32, I64, F32, Bool, Str, Frame, Raw }; + +// How the item is framed on the stream. +// Scalar [len][tag][value], padded to 4 +// Frame [len][tag][pad] BEEFBEEF ... 41104110 +// CArr a Frame whose first item is a "." count, then that many elements +// NArr a bare count item at this level, then that many elements follow it +// Raw opaque payload whose length only the writer knows +enum class Shape : uint8_t { Scalar, Frame, CArr, NArr, Raw }; + +struct Field { + const char* tag; // on-disk tag; "." when the writer passed NULL + Prim prim; + Shape shape; + const char* of; // frame contents class name, or nullptr + bool member; // false: a container element / loop-body write + bool computed; // not a member: a count or a constant the writer derived + bool unresolved; // the recovery could not type this item +}; + +struct Class { + const char* name; + const Field* fields; + uint16_t count; + uint16_t anon; // items whose tag is "." + const char* grade; + uint16_t read_agree; + uint16_t read_comparable; +}; + +inline constexpr Field k_Address[] = { // Address + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__AIAutoPeaceRun[] = { // Game::AIAutoPeaceRun + {"sid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tn0", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tn1", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__AICombatReport[] = { // Game::AICombatReport + {"CRTrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"CRPce", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"CRSys", Prim::Frame, Shape::Frame, "enum:uint", true, false, false}, + {"CRPlSv2", Prim::Frame, Shape::Frame, "Game::CombatPlayerStats", true, false, false}, +}; +inline constexpr Field k_Game__AIEncounterFlags[] = { // Game::AIEncounterFlags + {"Nas", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Fid", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Ast", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__AIRebellion[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Game::AIRebellion: Write emits no item +inline constexpr Field k_Game__AIRebellionImpl[] = { // Game::AIRebellionImpl + {"St", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Reb", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NSys", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"Sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__AIRelationRecord[] = { // Game::AIRelationRecord + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__AISituation[] = { // Game::AISituation + {"AISitSecs", Prim::Frame, Shape::Frame, "Game::Game::VShipSectionID::?$AIWeightMap", false, false, true}, + {"AISitWeapFams", Prim::Frame, Shape::Frame, "Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap", true, false, false}, +}; +inline constexpr Field k_Game__AISystem[] = { // Game::AISystem + {"AISysSit", Prim::Frame, Shape::Frame, "Game::AISituation", false, false, false}, +}; +inline constexpr Field k_Game__AllianceInvite[] = { // Game::AllianceInvite + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::AllianceInvite::Response", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::AllianceInvite::Response", true, false, false}, +}; +inline constexpr Field k_Game__AllianceInvite__Response[] = { // Game::AllianceInvite::Response + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__AttribMap[] = { // Game::AttribMap + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__BackEngProject[] = { // Game::BackEngProject + {"Stp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SPi", Prim::Frame, Shape::Frame, "Game::SpecialProject", true, false, false}, + {"AOdd", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"AInc", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Tch", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"RCst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RDn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__BerserkerEncounterResult[] = { // Game::BerserkerEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__BuildQueue[] = { // Game::BuildQueue + {"ords", Prim::Frame, Shape::CArr, "Game::ShipBuildOrderDef", false, false, false}, +}; +inline constexpr Field k_Game__CNMClientNotResponding[] = { // Game::CNMClientNotResponding + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CNMPlayerJoined[] = { // Game::CNMPlayerJoined + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CNMPlayerLeft[] = { // Game::CNMPlayerLeft + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CNMUpdate[] = { // Game::CNMUpdate + {".", Prim::Frame, Shape::Frame, "Game::UpdateData", true, false, false}, +}; +inline constexpr Field k_Game__CNMUpdateComplete[] = { // Game::CNMUpdateComplete + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CNMUserShips[] = { // Game::CNMUserShips + {".", Prim::Frame, Shape::CArr, "Game::ShipParams", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CivilianRatios[] = { // Game::CivilianRatios + {"smx", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"spe", Prim::Frame, Shape::Frame, "Game::SpeciesRatios", true, false, false}, +}; +inline constexpr Field k_Game__ClientEncounterResults[] = { // Game::ClientEncounterResults + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::CombatPlayerStats", true, false, false}, +}; +inline constexpr Field k_Game__ClientSystem[] = { // Game::ClientSystem + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, +}; +inline constexpr Field k_Game__ClientTradeSector[] = { // Game::ClientTradeSector + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandCloak[] = { // Game::CombatCommandCloak + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandDecloak[] = { // Game::CombatCommandDecloak + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandFleetSetFacing[] = { // Game::CombatCommandFleetSetFacing + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandFleetSetHoldFire[] = { // Game::CombatCommandFleetSetHoldFire + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandFleetSetStance[] = { // Game::CombatCommandFleetSetStance + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandIntangOff[] = { // Game::CombatCommandIntangOff + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandIntangOn[] = { // Game::CombatCommandIntangOn + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandMoveReserves[] = { // Game::CombatCommandMoveReserves + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "int", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandNull[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Game::CombatCommandNull: Write emits no item +inline constexpr Field k_Game__CombatCommandPickReserve[] = { // Game::CombatCommandPickReserve + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandRequestAsylumResponse[] = { // Game::CombatCommandRequestAsylumResponse + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandSetAEAutoFire[] = { // Game::CombatCommandSetAEAutoFire + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandSetPlanetAttackMode[] = { // Game::CombatCommandSetPlanetAttackMode + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandSetPlayerAI[] = { // Game::CombatCommandSetPlayerAI + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandSetWantEndCombat[] = { // Game::CombatCommandSetWantEndCombat + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipAllStop[] = { // Game::CombatCommandShipAllStop + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipAttack[] = { // Game::CombatCommandShipAttack + {".", Prim::Frame, Shape::CArr, "Game::CombatCommandShipAttack::ShipData", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipClearTargets[] = { // Game::CombatCommandShipClearTargets + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipFireOnce[] = { // Game::CombatCommandShipFireOnce + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::GunBankSelection", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipManeuver[] = { // Game::CombatCommandShipManeuver + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipReleaseGrapple[] = { // Game::CombatCommandShipReleaseGrapple + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipSetFacing[] = { // Game::CombatCommandShipSetFacing + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipSetHoldFire[] = { // Game::CombatCommandShipSetHoldFire + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::GunBankSelection", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipSetOnlyMyTarget[] = { // Game::CombatCommandShipSetOnlyMyTarget + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::GunBankSelection", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipSetStance[] = { // Game::CombatCommandShipSetStance + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipSetWaypoint[] = { // Game::CombatCommandShipSetWaypoint + {".", Prim::Frame, Shape::CArr, "Game::CombatCommandShipSetWaypoint::ShipData", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Quaternion", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Vector2", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatCommandShipToggleBank[] = { // Game::CombatCommandShipToggleBank + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::GunBankSelection", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatDamageReport[] = { // Game::CombatDamageReport + {"nshp", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"did", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dtak", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dams", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"damp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dami", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"damt", Prim::F32, Shape::Scalar, nullptr, false, false, true}, + {"nshp", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"wep", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"dams", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"damp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dami", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"damt", Prim::F32, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__CombatLaunchParams[] = { // Game::CombatLaunchParams + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::ShipParams", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::CombatPlayerInvariant", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::NodePointParams", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::PlayerMessage", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlanetStats", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::CombatEncounterParams", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::DefenceLayout", true, false, false}, +}; +inline constexpr Field k_Game__CombatPlayerReport[] = { // Game::CombatPlayerReport + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ai", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"ally", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"status", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mxeng", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mxcls", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mxmsl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ncls", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"cls", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"nshp", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"nsat", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nshfld", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"nshlst", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"nsatl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nsec", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"ssec", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"nshp", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"ndam", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srep", Prim::Frame, Shape::CArr, "Game::CombatShipReport", true, false, false}, +}; +inline constexpr Field k_Game__CombatPlayerStats[] = { // Game::CombatPlayerStats + {"RPBon", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"RPBonT", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SavBonus", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"MaintHF", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TacReports", Prim::Frame, Shape::CArr, "Game::TacReport", true, false, false}, +}; +inline constexpr Field k_Game__CombatReport[] = { // Game::CombatReport + {"cid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"sid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"auto", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"dur", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"cow", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cdst", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"cpk", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cdt", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"cdi", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"prep", Prim::Frame, Shape::CArr, "Game::CombatPlayerReport", true, false, false}, + {"wrep", Prim::Frame, Shape::CArr, "Game::CombatWeaponReport", true, false, false}, +}; +inline constexpr Field k_Game__CombatShipReport[] = { // Game::CombatShipReport + {"name", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"did", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cls", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"caps2", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {"nshp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nfld", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nlst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dtak", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dams", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"damp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dami", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"damt", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatTechFlags[] = { // Game::CombatTechFlags + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CombatWeaponReport[] = { // Game::CombatWeaponReport + {"wep", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"dams", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"damp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dami", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"damt", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareCurse[] = { // Game::CommDeclareCurse + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareIDontWant[] = { // Game::CommDeclareIDontWant + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareIHate[] = { // Game::CommDeclareIHate + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareILike[] = { // Game::CommDeclareILike + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareISaw[] = { // Game::CommDeclareISaw + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareISeveredAllianceWith[] = { // Game::CommDeclareISeveredAllianceWith + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareIWant[] = { // Game::CommDeclareIWant + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareShareAllColonyStats[] = { // Game::CommDeclareShareAllColonyStats + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareShareStats[] = { // Game::CommDeclareShareStats + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareShareSystemNotes[] = { // Game::CommDeclareShareSystemNotes + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"notes", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareShareSystemStats[] = { // Game::CommDeclareShareSystemStats + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareSorry[] = { // Game::CommDeclareSorry + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommDeclareThanks[] = { // Game::CommDeclareThanks + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommMessageContainer[] = { // Game::CommMessageContainer + {"nmsg", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"msgt", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"msg", Prim::Frame, Shape::Frame, "Game::ICommMessage", false, false, false}, +}; +inline constexpr Field k_Game__CommRequestAttackSystem[] = { // Game::CommRequestAttackSystem + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestDefendSystem[] = { // Game::CommRequestDefendSystem + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestDisposition[] = { // Game::CommRequestDisposition + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestHarassPlayer[] = { // Game::CommRequestHarassPlayer + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestHarassSystem[] = { // Game::CommRequestHarassSystem + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestMoney[] = { // Game::CommRequestMoney + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestRallyAtSystem[] = { // Game::CommRequestRallyAtSystem + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestResearch[] = { // Game::CommRequestResearch + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestSeverAllianceWith[] = { // Game::CommRequestSeverAllianceWith + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestShareSystemStats[] = { // Game::CommRequestShareSystemStats + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestStopColonizing[] = { // Game::CommRequestStopColonizing + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestStopHarassingMe[] = { // Game::CommRequestStopHarassingMe + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestStopHarassingPlayer[] = { // Game::CommRequestStopHarassingPlayer + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestStopHarrassingSystem[] = { // Game::CommRequestStopHarrassingSystem + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommRequestStopMining[] = { // Game::CommRequestStopMining + {"cid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"exp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sent", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CommonPlague[] = { // Game::CommonPlague + {"PlgSys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgCBy", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgCByF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgCM", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgTurns", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgInf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CrowDefendersEncounterResult[] = { // Game::CrowDefendersEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__CrowRuinsEncounterResult[] = { // Game::CrowRuinsEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__DefenceFleetAssignment[] = { // Game::DefenceFleetAssignment + {"fid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"stnid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"head2", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ori", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"quota", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__DefenceLayout[] = { // Game::DefenceLayout + {"sysid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ndsa", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"stnid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dsid", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"nfa", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"fa", Prim::Frame, Shape::Frame, "Game::DefenceFleetAssignment", true, false, false}, +}; +inline constexpr Field k_Game__DefenceSummary[] = { // Game::DefenceSummary + {"pid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dlay", Prim::Frame, Shape::Frame, "Game::DefenceLayout", true, false, false}, + {"stac", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"stid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"stt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"satc", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"said", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sasc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__DerelictEncounterResult[] = { // Game::DerelictEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__DiplomacyStats[] = { // Game::DiplomacyStats + {"other", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lastnap", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lastnapbty", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bknnap", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"btynap", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lastally", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lastallybty", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bknally", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"btyally", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lastcf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lastcfbty", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bkncf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"btycf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"deadhome", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EncounterQuery[] = { // Game::EncounterQuery + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EncounterResult[] = { // Game::EncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EncounterResults[] = { // Game::EncounterResults + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::CombatPlayerStats", true, false, false}, + {".", Prim::Frame, Shape::CArr, "int", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::EncounterResults::PrisonerShip", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::EncounterResults::DamagedShip", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::EncounterResults::BoardedShip", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::EncounterResults::RetreatingShip", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::EncounterResults::SpyShip", true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::CombatDamageReport", true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::EncounterResult", false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlanetStats", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlagueStats", true, false, false}, +}; +inline constexpr Field k_Game__EncounterResults__BoardedShip[] = { // Game::EncounterResults::BoardedShip + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EncounterResults__DamagedShip[] = { // Game::EncounterResults::DamagedShip + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::ShipHealth", true, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EncounterResults__PrisonerShip[] = { // Game::EncounterResults::PrisonerShip + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PrisonerHold", true, false, false}, +}; +inline constexpr Field k_Game__EncounterResults__RetreatingShip[] = { // Game::EncounterResults::RetreatingShip + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EncounterResults__SpyShip[] = { // Game::EncounterResults::SpyShip + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EventStorage[] = { // Game::EventStorage + {"EvNxID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Events", Prim::Frame, Shape::CArr, "Game::EventStorage::TurnEvents", true, false, false}, +}; +inline constexpr Field k_Game__EventStorage__Event[] = { // Game::EventStorage::Event + {"EvEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EvDsc", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"EvMsg", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"EvImg", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"EvLoc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EvPos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"EvAct", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EvCID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__EventStorage__TurnEvents[] = { // Game::EventStorage::TurnEvents + {"EvTurn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Events", Prim::Frame, Shape::CArr, "Game::EventStorage::Event", true, false, false}, +}; +inline constexpr Field k_Game__FieldTemplate[] = { // Game::FieldTemplate + {"FTPnts", Prim::Frame, Shape::CArr, "Game::FieldTemplate::Point", false, false, true}, +}; +inline constexpr Field k_Game__FieldTemplate__Point[] = { // Game::FieldTemplate::Point + {"FTPShID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FTPDesID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FTPPosX", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FTPPosY", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FTPSqd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__FleetLayout[] = { // Game::FleetLayout + {".", Prim::Frame, Shape::Frame, "Game::FieldTemplate", true, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__FleetNameGenerator[] = { // Game::FleetNameGenerator + {"FNGNum", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__FlightPlan[] = { // Game::FlightPlan + {"wpts", Prim::Frame, Shape::CArr, "Game::FlightPlan::Waypoint", true, false, false}, + {"FPsp2", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"FPeta2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FPogn2", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"FPdpos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"pnd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__FlightPlan__Waypoint[] = { // Game::FlightPlan::Waypoint + {"Wpt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Tp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nrt", Prim::Frame, Shape::Frame, "Game::NodeRoute", true, false, false}, +}; +inline constexpr Field k_Game__Game__SVSOBrokenEmpire__VPCStat____NetworkIDDataMap[] = { // Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap + {"siz", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::SVSOBrokenEmpire::PCStat", false, false, false}, +}; +inline constexpr Field k_Game__Game__VLocustFleetLogistics____NetworkIDDataMap[] = { // Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap + {"siz", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::LocustFleetLogistics", false, false, false}, +}; +inline constexpr Field k_Game__Game__VLocustNestState____NetworkIDDataMap[] = { // Game::Game::VLocustNestState::?$NetworkIDDataMap + {"siz", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::LocustNestState", false, false, false}, +}; +inline constexpr Field k_Game__Game__VShipSectionID____AIWeightMap[] = { // Game::Game::VShipSectionID::?$AIWeightMap + {".", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::Frame, Shape::Frame, "Game::ShipSectionID", true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__GameTurnHistory[] = { // Game::GameTurnHistory + {"nply", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ply", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"hist", Prim::Frame, Shape::Frame, "Game::PlayerTurnHistory", false, false, false}, +}; +inline constexpr Field k_Game__GunBankSelection[] = { // Game::GunBankSelection + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__HeraldEncounterResult[] = { // Game::HeraldEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__IndependenceInfo[] = { // Game::IndependenceInfo + {"indsp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"indcl", Prim::Frame, Shape::Frame, "Game::PlayerColorID", true, false, false}, + {"indnm", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"indav", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"indba", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__JewelsProject[] = { // Game::JewelsProject + {"Stp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SPi", Prim::Frame, Shape::Frame, "Game::SpecialProject", true, false, false}, + {"einv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"eapp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__LocustEncounterParams[] = { // Game::LocustEncounterParams + {".", Prim::Frame, Shape::Frame, "Game::Game::VLocustNestState::?$NetworkIDDataMap", true, false, false}, +}; +inline constexpr Field k_Game__LocustEncounterResult[] = { // Game::LocustEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::Game::VLocustNestState::?$NetworkIDDataMap", true, false, false}, +}; +inline constexpr Field k_Game__LocustFleetLogistics[] = { // Game::LocustFleetLogistics + {"hav", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"don", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"dsy", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dst", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, +}; +inline constexpr Field k_Game__Mars__Game__W4AIPurposeID__U__StreamableEnum____AIWeightMap[] = { // Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "enum:AIPurposeID", false, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__Mars__Game__W4WeaponFamilyID__U__StreamableEnum____AIWeightMap[] = { // Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "enum:eaponFamilyID", false, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__Mars__I__U__StreamableEnum____AIWeightMap[] = { // Game::Mars::I::U?$StreamableEnum::?$AIWeightMap + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "enum:uint", false, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__MeteorEncounterResult[] = { // Game::MeteorEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__MonitorEncounterResult[] = { // Game::MonitorEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__MonitorProject[] = { // Game::MonitorProject + {"Stp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SPi", Prim::Frame, Shape::Frame, "Game::SpecialProject", true, false, false}, + {"Sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RMn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RMx", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RDn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RMd", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__Morale[] = { // Game::Morale + {"mnsp", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"msp", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"mv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__MoraleEvent[] = { // Game::MoraleEvent + {"mid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mtr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mtp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mfx", Prim::Frame, Shape::Frame, "Game::Morale", true, false, false}, + {"mdsc", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__NodePath[] = { // Game::NodePath + {"npt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npfr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npto", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npctm", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npcby", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npdtn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npdtf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npenp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"npuse", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nptf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__NodePointParams[] = { // Game::NodePointParams + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__NodeRoute[] = { // Game::NodeRoute + {"nrp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nrf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nrt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__Objective[] = { // Game::Objective + {"ID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Cmp", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Spr", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"Dsc", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"NID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ObservedDesign[] = { // Game::ObservedDesign + {"otnF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"otnL", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"odid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"opid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ObservedTech[] = { // Game::ObservedTech + {"otnF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"otnL", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"odet", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"otch", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"owith", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ObservedWeapon[] = { // Game::ObservedWeapon + {"otnF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"otnL", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"odet", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"owep", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"owith", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__OrtgayEncounterResult[] = { // Game::OrtgayEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PirateEncounterResult[] = { // Game::PirateEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlagueHit[] = { // Game::PlagueHit + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlagueStats[] = { // Game::PlagueStats + {".", Prim::Frame, Shape::CArr, "Game::PlagueHit", true, false, false}, +}; +inline constexpr Field k_Game__PlanetClientContext[] = { // Game::PlanetClientContext + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlanetStats[] = { // Game::PlanetStats + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlayerAid[] = { // Game::PlayerAid + {"aidto", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"aidsa", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"aidst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"aidrai", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"aidrt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlayerAlliances[] = { // Game::PlayerAlliances + {"ALid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"AL", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NA", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"CF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlayerColorID[] = { // Game::PlayerColorID + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, +}; +inline constexpr Field k_Game__PlayerEncounterProgress[] = { // Game::PlayerEncounterProgress + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlayerMessage[] = { // Game::PlayerMessage + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "String", true, false, false}, +}; +inline constexpr Field k_Game__PlayerNotes[] = { // Game::PlayerNotes + {"NtSys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NtTxt", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"NtTrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlayerReport[] = { // Game::PlayerReport + {"oid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"flds", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"home", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ncol", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mpwr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mcls", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mmsl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nshp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nsat", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PlayerTurnHistory[] = { // Game::PlayerTurnHistory + {"ply", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"stats", Prim::Frame, Shape::Frame, "Game::PlayerTurnStats", false, false, false}, +}; +inline constexpr Field k_Game__PlayerTurnStats[] = { // Game::PlayerTurnStats + {"pop", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {"sacq", Prim::Frame, Shape::CArr, "Game::SystemEvent", true, false, false}, + {"slost", Prim::Frame, Shape::CArr, "Game::SystemEvent", true, false, false}, + {"trn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"almem", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"inc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tdinc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"col", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bat", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tch", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ncls", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"cls", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"shpt", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"shpl", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"shpk", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"satt", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"satl", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"satk", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__Population[] = { // Game::Population + {"PopNG", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"PopG", Prim::Frame, Shape::Frame, "Game::PopulationGroup", false, false, true}, +}; +inline constexpr Field k_Game__PopulationGroup[] = { // Game::PopulationGroup + {"PopT", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PopS", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PopC", Prim::I64, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__PrisonerHold[] = { // Game::PrisonerHold + {"PrMax", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PrNSp", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"PrSp", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"PrNum", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__PuppetMasterEncounterResult[] = { // Game::PuppetMasterEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__RaidTargets[] = { // Game::RaidTargets + {"rds", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rdv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rdt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dsc", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"did", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__RefugeesEncounterParams[] = { // Game::RefugeesEncounterParams + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__RefugeesEncounterResult[] = { // Game::RefugeesEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMAIRelationValues[] = { // Game::SNMAIRelationValues + {".", Prim::Frame, Shape::CArr, "Game::AIRelationRecord", true, false, false}, +}; +inline constexpr Field k_Game__SNMAllCombatDone[] = { // Game::SNMAllCombatDone + {".", Prim::Frame, Shape::CArr, "Game::EncounterResults", true, false, false}, +}; +inline constexpr Field k_Game__SNMAllianceInvite[] = { // Game::SNMAllianceInvite + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMAllianceInviteChat[] = { // Game::SNMAllianceInviteChat + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMAllianceInviteProgress[] = { // Game::SNMAllianceInviteProgress + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::AllianceInvite", true, false, false}, +}; +inline constexpr Field k_Game__SNMAllianceNotify[] = { // Game::SNMAllianceNotify + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMAllianceReply[] = { // Game::SNMAllianceReply + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMCancelAllianceInvite[] = { // Game::SNMCancelAllianceInvite + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMChat[] = { // Game::SNMChat + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMCombatTimeRemaining[] = { // Game::SNMCombatTimeRemaining + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMCommMessage[] = { // Game::SNMCommMessage + {".", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {".", Prim::Frame, Shape::Frame, "Game::ICommMessage", true, false, false}, +}; +inline constexpr Field k_Game__SNMDemandEmpireSurrender[] = { // Game::SNMDemandEmpireSurrender + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMDemandEmpireSurrenderResponse[] = { // Game::SNMDemandEmpireSurrenderResponse + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMDoEncounterQuery[] = { // Game::SNMDoEncounterQuery + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMEncounterProgress[] = { // Game::SNMEncounterProgress + {".", Prim::Frame, Shape::CArr, "Game::PlayerEncounterProgress", true, false, false}, +}; +inline constexpr Field k_Game__SNMEncounterQueryResults[] = { // Game::SNMEncounterQueryResults + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::EncounterQuery", true, false, false}, +}; +inline constexpr Field k_Game__SNMEncounterResults[] = { // Game::SNMEncounterResults + {".", Prim::Frame, Shape::Frame, "Game::EncounterResults", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMEndTurn[] = { // Game::SNMEndTurn + {".", Prim::Frame, Shape::Frame, "Game::TurnCommands", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::AIEncounterFlags", true, false, false}, +}; +inline constexpr Field k_Game__SNMGenericEvent[] = { // Game::SNMGenericEvent + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMGenericGameMessage[] = { // Game::SNMGenericGameMessage + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMHostCombat[] = { // Game::SNMHostCombat + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMHostCombatReply[] = { // Game::SNMHostCombatReply + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Address", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMJoin[] = { // Game::SNMJoin + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMJoinCombat[] = { // Game::SNMJoinCombat + {".", Prim::Frame, Shape::Frame, "Address", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMJoinCombatReply[] = { // Game::SNMJoinCombatReply + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMJoinReply[] = { // Game::SNMJoinReply + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMKillAI[] = { // Game::SNMKillAI + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMLaunchCombat[] = { // Game::SNMLaunchCombat + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::EncounterQuery", true, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__SNMLeaveAlliance[] = { // Game::SNMLeaveAlliance + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMLeaveCeaseFire[] = { // Game::SNMLeaveCeaseFire + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMLeaveNonAggression[] = { // Game::SNMLeaveNonAggression + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMLobbyChat[] = { // Game::SNMLobbyChat + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMMakePlayerAI[] = { // Game::SNMMakePlayerAI + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMPendingAlliances[] = { // Game::SNMPendingAlliances + {".", Prim::Frame, Shape::CArr, "Game::PlayerAlliances", true, false, false}, +}; +inline constexpr Field k_Game__SNMPlaySpeechEvent[] = { // Game::SNMPlaySpeechEvent + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMProgressionWarsConvoyShips[] = { // Game::SNMProgressionWarsConvoyShips + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMRefreshSlots[] = { // Game::SNMRefreshSlots + {".", Prim::Frame, Shape::CArr, "Game::SNMRefreshSlots::SlotData", true, false, false}, +}; +inline constexpr Field k_Game__SNMRefreshSlots__SlotData[] = { // Game::SNMRefreshSlots::SlotData + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMRemoveCommMessage[] = { // Game::SNMRemoveCommMessage + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMRunAI[] = { // Game::SNMRunAI + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSetAIPolicy[] = { // Game::SNMSetAIPolicy + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSetPlayerStatus[] = { // Game::SNMSetPlayerStatus + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSetSlotPassword[] = { // Game::SNMSetSlotPassword + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSetTimers[] = { // Game::SNMSetTimers + {".", Prim::Frame, Shape::Frame, "Game::StrategyTimerParams", true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotInit[] = { // Game::SNMSlotInit + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::Slot", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategyPlayerGameSettings", true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotInsertClient[] = { // Game::SNMSlotInsertClient + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotMoveClient[] = { // Game::SNMSlotMoveClient + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotPWAttempt[] = { // Game::SNMSlotPWAttempt + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotPWRejected[] = { // Game::SNMSlotPWRejected + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotRemoveClient[] = { // Game::SNMSlotRemoveClient + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotReqPW[] = { // Game::SNMSlotReqPW + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotSetData[] = { // Game::SNMSlotSetData + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlayerColorID", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategyPlayerGameSettings", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotSetForcedSpecies[] = { // Game::SNMSlotSetForcedSpecies + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotSetPW[] = { // Game::SNMSlotSetPW + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMSlotSetState[] = { // Game::SNMSlotSetState + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMTechOffer[] = { // Game::SNMTechOffer + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMTransferProgress[] = { // Game::SNMTransferProgress + {".", Prim::Frame, Shape::CArr, "char", true, false, false}, +}; +inline constexpr Field k_Game__SNMTurnInfo[] = { // Game::SNMTurnInfo + {".", Prim::Frame, Shape::Frame, "Game::StrategyTurnInfo", true, false, false}, +}; +inline constexpr Field k_Game__SNMUpdate[] = { // Game::SNMUpdate + {".", Prim::Frame, Shape::CArr, "Game::PlayerAlliances", true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::TechOffer", true, false, false}, +}; +inline constexpr Field k_Game__SNMUpdateAlliances[] = { // Game::SNMUpdateAlliances + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlayerAlliances", true, false, false}, +}; +inline constexpr Field k_Game__SNMUpdateComplete[] = { // Game::SNMUpdateComplete + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SNMUserNames[] = { // Game::SNMUserNames + {".", Prim::Frame, Shape::CArr, "Game::StrategyUserInfo", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOAntiquarians[] = { // Game::SVSOAntiquarians + {"wpid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"wpturn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"narts", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"art", Prim::Frame, Shape::Frame, "Game::SVSOAntiquarians::Artifact", false, false, false}, +}; +inline constexpr Field k_Game__SVSOAntiquarians__Artifact[] = { // Game::SVSOAntiquarians::Artifact + {"shipid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"salsid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"salpid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pvis", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOBrokenEmpire[] = { // Game::SVSOBrokenEmpire + {"pcs", Prim::Frame, Shape::Frame, "Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap", true, false, false}, +}; +inline constexpr Field k_Game__SVSOCrowDefenders[] = { // Game::SVSOCrowDefenders + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ndsys", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"dsys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ndes", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"des", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"drad", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOCrowRuins[] = { // Game::SVSOCrowRuins + {"NAsg", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"Eflt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Esys", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"NWD", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"wid", Prim::I32, Shape::Scalar, nullptr, false, true, false}, +}; +inline constexpr Field k_Game__SVSODerelict[] = { // Game::SVSODerelict + {"NDsn", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"DsnID", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"Dwght", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"NAsg", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"Eflt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Esys", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__SVSOGrandMenaceTrigger[] = { // Game::SVSOGrandMenaceTrigger + {"gmch", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOHolyLands[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Game::SVSOHolyLands: Write emits no item +inline constexpr Field k_Game__SVSOHolyLands__PlayerState[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Game::SVSOHolyLands::PlayerState: Write emits no item +inline constexpr Field k_Game__SVSOJewelsOfTheCrown[] = { // Game::SVSOJewelsOfTheCrown + {"JEWELLOCATIONID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"JEWELSHIPID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PREVJEWELSHIPID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"JEWELLOCATIONID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"prjdone", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__SVSOLandGrab[] = { // Game::SVSOLandGrab + {"winr", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"nplayers", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"nwt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOLocust[] = { // Game::SVSOLocust + {"ini2", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"nst", Prim::Frame, Shape::Frame, "Game::Game::VLocustNestState::?$NetworkIDDataMap", true, false, false}, + {"flt", Prim::Frame, Shape::Frame, "Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap", true, false, false}, + {"vis", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {"des", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOMasterVoice[] = { // Game::SVSOMasterVoice + {"hom", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {"hmd", Prim::Frame, Shape::CArr, "enum:HomeState", true, false, false}, +}; +inline constexpr Field k_Game__SVSOMonitor[] = { // Game::SVSOMonitor + {"NDsn", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"DsnID", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"Dwght", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"NAsg", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"Eflt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Esys", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"nt", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"scnm", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"spwt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rsmd", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"dsgn", Prim::I32, Shape::Scalar, nullptr, false, true, false}, +}; +inline constexpr Field k_Game__SVSOOrtgay[] = { // Game::SVSOOrtgay + {"state", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"init", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"design", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"origin", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"center", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"turnLv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"turnAn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spawnturn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spawnodds", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOProgressionWars[] = { // Game::SVSOProgressionWars + {"stg", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sft", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snec", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ses", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snet", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"snep", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srsi", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srs", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lts", Prim::Frame, Shape::CArr, "String", true, false, false}, +}; +inline constexpr Field k_Game__SVSOPuppetMaster[] = { // Game::SVSOPuppetMaster + {"Init2", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"End", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"Des", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"Flt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NSys", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"SID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSORefugees[] = { // Game::SVSORefugees + {"rsuc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pid", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"rsu", Prim::Frame, Shape::Frame, "Game::SVSORefugees::PlayerStatus", false, false, false}, + {"didc", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"did", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ini", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSORefugees__PlayerStatus[] = { // Game::SVSORefugees::PlayerStatus + {"lr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lrt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"llc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"atr", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"asy", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOSlaversRefuel[] = { // Game::SVSOSlaversRefuel + {"NAsg", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"Eflt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Esys", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"CDiff", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NTD", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"TDID", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"NAD", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"ADID", Prim::I32, Shape::Scalar, nullptr, false, true, false}, +}; +inline constexpr Field k_Game__SVSOSots[] = { // Game::SVSOSots + {"ScnID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ScnObj", Prim::Frame, Shape::Frame, "Game::SVSOScenarioBase", true, false, false}, + {"numx", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"xscn", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"xsc", Prim::Frame, Shape::Frame, "Game::SVScriptObject", false, false, false}, + {"NEncObjs", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"EncID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EncObj", Prim::Frame, Shape::Frame, "Game::SVScriptObject", false, false, false}, +}; +inline constexpr Field k_Game__SVSOSwarm[] = { // Game::SVSOSwarm + {"NAsg", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"Eflt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Esys", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"infest", Prim::Frame, Shape::CArr, "Game::SVSOSwarm::Infestation", true, false, false}, + {"deshive", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"deslarva", Prim::I32, Shape::Scalar, nullptr, false, true, false}, +}; +inline constexpr Field k_Game__SVSOSwarm__Infestation[] = { // Game::SVSOSwarm::Infestation + {"sysid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"stg", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"strn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mtrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trgtrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"canh", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOSwarmQueen[] = { // Game::SVSOSwarmQueen + {"QDesignID", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"Hives", Prim::Frame, Shape::CArr, "Game::SVSOSwarmQueen::HiveInfo", true, false, false}, + {"Queens", Prim::Frame, Shape::CArr, "Game::SVSOSwarmQueen::QueenInfo", true, false, false}, + {"SysMem", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, +}; +inline constexpr Field k_Game__SVSOSwarmQueen__HiveInfo[] = { // Game::SVSOSwarmQueen::HiveInfo + {"HiveID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"QueenID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NextQ", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOSwarmQueen__QueenInfo[] = { // Game::SVSOSwarmQueen::QueenInfo + {"QueenID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"QDstID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOSystemKiller[] = { // Game::SVSOSystemKiller + {"Des", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"Flt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Init2", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"End", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"NSys", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"SID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOTraps[] = { // Game::SVSOTraps + {"traps", Prim::Frame, Shape::CArr, "Game::SVSOTraps::Trap", true, false, false}, +}; +inline constexpr Field k_Game__SVSOTraps__Trap[] = { // Game::SVSOTraps::Trap + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trenc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trgenc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes[] = { // Game::SVSOUpstartApes + {"EMPIREFLAGS", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EMPIRESTANDING", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NUMSHIPCLASSES", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"SHIPCLASS", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"NEXTORDERTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EMPIREORDERID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"EMPIREORDER", Prim::Frame, Shape::Frame, "Game::SVSOUpstartApes_EmpireOrder", false, false, false}, + {"EARTHID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_DEMANDS_SHIPS[] = { // Game::SVSOUpstartApes_EO_DEMANDS_SHIPS + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"REQUESTS", Prim::Frame, Shape::CArr, "Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest", true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SUCCESSSTANDING", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FAILURESTANDING", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_DEMANDS_SHIPS__ShipRequest[] = { // Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest + {"MISSIONSECTION", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"NUMREQUIRED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS[] = { // Game::SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_DEMANDS_VICTORY[] = { // Game::SVSOUpstartApes_EO_DEMANDS_VICTORY + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT[] = { // Game::SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_FEARS_YOUR_POWER[] = { // Game::SVSOUpstartApes_EO_FEARS_YOUR_POWER + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_GIFTS[] = { // Game::SVSOUpstartApes_EO_GIFTS + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_MUST_EXPAND[] = { // Game::SVSOUpstartApes_EO_MUST_EXPAND + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOUpstartApes_EO_REQUIRES_CASH[] = { // Game::SVSOUpstartApes_EO_REQUIRES_CASH + {"OBJECTIVEID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TURNCREATED", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LASTTURN", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SVSOVonNeumann[] = { // Game::SVSOVonNeumann + {"dfts", Prim::Frame, Shape::CArr, "Game::SVSOVonNeumann::DefeatRecord", true, false, false}, + {"rusav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nenc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nmb", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nml", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nbb", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nbl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nskb", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nskl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mts", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {"ntm", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ntb", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sken", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"skdid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"skhid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"skfid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sktq", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"skt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sktc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mbid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"mbgid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"skgid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"vnhp", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {"vnhw", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trev", Prim::Frame, Shape::CArr, "String", false, false, false}, +}; +inline constexpr Field k_Game__SVSOVonNeumann__DefeatRecord[] = { // Game::SVSOVonNeumann::DefeatRecord + {"sys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ndft", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nxrv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lstd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bkdf", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ServerNodeGraph[] = { // Game::ServerNodeGraph + {"paths", Prim::Frame, Shape::CArr, "Game::NodePath", true, false, false}, + {"nextid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ServerNodeGraph__Params[] = { // Game::ServerNodeGraph::Params + {"RSeed", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SSeed", Prim::Frame, Shape::CArr, "int", true, false, false}, + {"PSeed", Prim::Frame, Shape::CArr, "Game::SimpleNodePath", true, false, false}, +}; +inline constexpr Field k_Game__ServerPlayer[] = { // Game::ServerPlayer + {"TechTree", Prim::Frame, Shape::Frame, "Game::TechTree", true, false, false}, + {"HomeSys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlyrIdx", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlryName", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Species", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ClrID", Prim::Frame, Shape::Frame, "Game::PlayerColorID", true, false, false}, + {"Bdg", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Avt", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Team", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Sav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"IdealSuit", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SuitTol", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"MaxOH", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ResRate", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ResMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ResScl", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TRM", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TRP", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRA", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"OutMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"RebOutMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ScOutMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"IncMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"PopMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TerraMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"AMine", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"MinPure", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"MinRate", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"NGts", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PrGtTrf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"GTraf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"CstR", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"CstE", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"CstT", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Maint", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"shrm", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Status", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Elim", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"NPC", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"RebAI", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"ReqCL", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Team", Prim::Frame, Shape::Frame, "Game::PlayerAlliances", true, false, false}, + {"HasVac", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HasImm", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NPTrk", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HasDisc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HasDiscSp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HasDiscCl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HasEnc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HasEng", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Events", Prim::Frame, Shape::Frame, "Game::EventStorage", true, false, false}, + {"FNG", Prim::Frame, Shape::Frame, "Game::FleetNameGenerator", true, false, false}, + {"PvSav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PvMA", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"AIBn", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"CnTrd", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"CnRad", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"hgs", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"hadvs", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"harcc", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"CnVItl", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"pddm", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"BnkWrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"BnkTrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"BnkPr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"BnkEl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ShipRecs", Prim::Frame, Shape::Frame, "Game::ShipRecords", true, false, false}, + {"NextPrjID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"plcy", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pswd", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"lret", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nmeid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cdp", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"spy2", Prim::Frame, Shape::Frame, "Game::SpyReport", true, false, false}, + {"civr", Prim::Frame, Shape::Frame, "Game::CivilianRatios", true, false, false}, + {"aidf", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Srn", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"SrnTo", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lboid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"lcid2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ResTNm", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"ResErrRoll", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"ConMod", Prim::F32, Shape::Scalar, nullptr, false, false, false}, + {"SavMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"NumOwn", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"OwnId", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumDes", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"DesID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Des", Prim::Frame, Shape::Frame, "Game::ShipDesign", false, false, false}, + {"NumLeg", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"DesID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Des", Prim::Frame, Shape::Frame, "Game::ShipDesign", false, false, false}, + {"NumNotes", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Nts", Prim::Frame, Shape::Frame, "Game::PlayerNotes", false, false, false}, + {"NumPR", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"PRm", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"PRBt", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"HasAIR", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"AIR", Prim::Frame, Shape::Frame, "Game::AIRebellion", true, false, false}, + {"cta", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"AIEnf", Prim::Frame, Shape::Frame, "Game::AIEncounterFlags", true, false, false}, + {"NSprj", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"SprjT", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Sprj", Prim::Frame, Shape::Frame, "Game::SpecialProjectImpl", false, false, false}, + {"Nexp", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"xid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"xmin", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"xmax", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"xper", Prim::F32, Shape::Scalar, nullptr, false, false, true}, + {"NWeapXcl", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"WeapXcl", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Ojvs", Prim::Frame, Shape::CArr, "Game::Objective", true, false, false}, + {"dipstats", Prim::Frame, Shape::CArr, "Game::DiplomacyStats", true, false, false}, + {"comms", Prim::Frame, Shape::Frame, "Game::CommMessageContainer", true, false, false}, + {"preps", Prim::Frame, Shape::CArr, "Game::PlayerReport", true, false, false}, + {"odes", Prim::Frame, Shape::CArr, "Game::ObservedDesign", true, false, false}, + {"owep", Prim::Frame, Shape::CArr, "Game::ObservedWeapon", true, false, false}, + {"otch", Prim::Frame, Shape::CArr, "Game::ObservedTech", true, false, false}, + {"aid", Prim::Frame, Shape::CArr, "Game::PlayerAid", true, false, false}, + {"ndeflay", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"deflay", Prim::Frame, Shape::Frame, "Game::DefenceLayout", false, false, false}, + {"rdtc", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"rdt", Prim::Frame, Shape::Frame, "Game::RaidTargets", true, false, false}, + {"tnc", Prim::I32, Shape::Scalar, nullptr, false, true, false}, +}; +inline constexpr Field k_Game__ServerSpyManager[] = { // Game::ServerSpyManager + {"xsid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nspy", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"spy", Prim::Frame, Shape::Frame, "Game::SpyCraft", false, false, false}, +}; +inline constexpr Field k_Game__ServerSystem[] = { // Game::ServerSystem + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"R", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"G", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"B", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"A", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Idx", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Size", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Suit", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Res", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ARes2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"MRes", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NoRebAI", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TRes", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Pop", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Pop2", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"Infra", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"PvPop", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PvPop2", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"PvInfra", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"PvSuit", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"PvRes", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PvARes2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PvMRes", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PvNoRebAI", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Rts", Prim::Frame, Shape::Frame, "Game::StarSystem::OutputRates", true, false, false}, + {"Abdn", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Dstyd", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TnsOH", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"OutMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"RepCur", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"RepMax", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ntdev", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pbon", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pbon2", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"ibon", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ltis", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rbfl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rbtn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rbfr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rbwn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"hsrg", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"haltc", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"haltt", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"haltv", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"vnh", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"vnd", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"vnex3", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"vnpex3", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Name", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"VFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"AFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"GFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Bats2", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {"rcex", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {"MnRFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RfRFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ClkFlags", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EggScio", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TerrFl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TAcq", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TFAcq", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TDst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"dcs", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"dsu", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"cm", Prim::Frame, Shape::Frame, "Game::Morale", true, false, false}, + {"PvCM", Prim::Frame, Shape::Frame, "Game::Morale", true, false, false}, + {"cme2", Prim::Frame, Shape::CArr, "Game::MoraleEvent", true, false, false}, + {"spies2", Prim::Frame, Shape::CArr, "int", true, false, false}, + {"PID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"DefF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"DefSF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"BQ", Prim::Frame, Shape::Frame, "Game::BuildQueue", true, false, false}, + {"nadct", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"ads", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"adt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumPlgs2", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"PlgT", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Plg", Prim::Frame, Shape::Frame, "Game::Plague", false, false, false}, + {"NumFlts", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"Flt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumGFs", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"GF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumSnF", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"SnF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumMnF", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"MnF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NVO", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TShn", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"OID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"isind", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"indi", Prim::Frame, Shape::Frame, "Game::IndependenceInfo", false, false, false}, + {"NVE", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"EPid", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"ETS", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Eid", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"NVs", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"pview", Prim::Frame, Shape::Frame, "Game::StarSystem::PlayerView", false, false, false}, + {"hindi", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"indi", Prim::Frame, Shape::Frame, "Game::IndependenceInfo", true, false, false}, +}; +inline constexpr Field k_Game__ServerTradeManager[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Game::ServerTradeManager: Write emits no item +inline constexpr Field k_Game__ServerTradeManagerImpl[] = { // Game::ServerTradeManagerImpl + {"NumTradeSectors", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"TradeID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Trade", Prim::Frame, Shape::Frame, "Game::TradeSector", false, false, false}, + {"SctSize", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"rt", Prim::Frame, Shape::Frame, "Game::TradeRoute", false, false, false}, +}; +inline constexpr Field k_Game__ServerTradeSector[] = { // Game::ServerTradeSector + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"tsgridID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tsctr", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"tssec", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tsct", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tscr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ptssec", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ptsct", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ptscr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"fwarn", Prim::Frame, Shape::CArr, "Game::ServerTradeSector::FreighterWarning", true, false, false}, + {"tsnumsys", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"tssys", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"tsnumflt", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"tsflt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ServerTradeSector__FreighterWarning[] = { // Game::ServerTradeSector::FreighterWarning + {"pid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ntrns", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ShipBuildOrder[] = { // Game::ShipBuildOrder + {"desID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"con", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"conleft", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ordID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ShipBuildOrderDef[] = { // Game::ShipBuildOrderDef + {"desID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"con", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"conleft", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ordID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ShipDesign[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Game::ShipDesign: Write emits no item +inline constexpr Field k_Game__ShipDesignDef__LegacyGunBank[] = { // Game::ShipDesignDef::LegacyGunBank + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ShipDesignDef__LegacyWeaponDef[] = { // Game::ShipDesignDef::LegacyWeaponDef + {"DWu", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"DWi", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"DWu", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"DWf", Prim::Str, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__ShipDesignDef__Section[] = { // Game::ShipDesignDef::Section + {"DSec", Prim::Frame, Shape::Frame, "Game::ShipSectionID", false, false, true}, + {"DGbnk2", Prim::Frame, Shape::CArr, "Game::ShipDesignDef::GunBank", true, false, false}, + {"DOpts", Prim::Frame, Shape::CArr, "String", true, false, false}, +}; +inline constexpr Field k_Game__ShipHealth[] = { // Game::ShipHealth + {".", Prim::F32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__ShipParams[] = { // Game::ShipParams + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::ShipParams::Section", true, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::ShipHealth", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PrisonerHold", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::WeaponGroups", true, false, false}, +}; +inline constexpr Field k_Game__ShipParams__Section[] = { // Game::ShipParams::Section + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::ShipParams::GunBank", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::CombatTechFlags", true, false, false}, +}; +inline constexpr Field k_Game__ShipRecords[] = { // Game::ShipRecords + {"srnc", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"srb", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"srl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srk", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"sri", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"srbd", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"srd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"src", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srb", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sri", Prim::I32, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__ShipSectionID[] = { // Game::ShipSectionID + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ShipWeapon[] = { // Game::ShipWeapon + {"bID", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"wid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bID", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"wfn", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"did", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SimpleNodePath[] = { // Game::SimpleNodePath + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SlaversRefuelEncounterResult[] = { // Game::SlaversRefuelEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__Slot[] = { // Game::Slot + {".", Prim::Frame, Shape::Frame, "Game::SlotDef", false, false, true}, + {".", Prim::Frame, Shape::Frame, "Game::SlotUser", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SlotDef[] = { // Game::SlotDef + {"IsPlay", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"IsDead", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"IsReq", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"IsRec", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"IsFxNm", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"FxNm", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"IsFxSp", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"FxSp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"IsFxCr", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"FxCrID", Prim::Frame, Shape::Frame, "Game::PlayerColorID", true, false, false}, + {"IsFxBd", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"FxBd", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"IsFxAv", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"FxAv", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Tag", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Pwd", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Team", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Settings", Prim::Frame, Shape::Frame, "Game::StrategyPlayerGameSettings", true, false, false}, +}; +inline constexpr Field k_Game__SlotUser[] = { // Game::SlotUser + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlayerColorID", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SpecialProject[] = { // Game::SpecialProject + {"SPid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Sts", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Cst", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"MxC", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Nm", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Trns", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SpecialProjectImpl[] = { // Game::SpecialProjectImpl + {"Stp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SPi", Prim::Frame, Shape::Frame, "Game::SpecialProject", true, false, false}, +}; +inline constexpr Field k_Game__SpecialProjectNameGen[] = { // Game::SpecialProjectNameGen + {"NNms2", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"usnc", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"usp", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"usc", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"Nm", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Ntg", Prim::Str, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__SpeciesRatios[] = { // Game::SpeciesRatios + {"nv", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"sp", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"va2", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__SpyCraft[] = { // Game::SpyCraft + {"sid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sown", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"atto", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"deat", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tdep", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cbh", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"sdo", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"sdet", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spyon", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spyat", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cm", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"cmo", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ncp", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"cpl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SpyReport[] = { // Game::SpyReport + {"defc2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"def", Prim::Frame, Shape::Frame, "Game::SpyReportDefences", false, false, false}, + {"rtc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"strd", Prim::Frame, Shape::Frame, "Game::SpyReportTrade", false, false, false}, + {"evc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"evs", Prim::Frame, Shape::Frame, "Game::SpyReportEvents", false, false, false}, + {"ttc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tt", Prim::Frame, Shape::Frame, "Game::SpyReportTechTree", false, false, false}, +}; +inline constexpr Field k_Game__SpyReportDefences[] = { // Game::SpyReportDefences + {"stn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sdef", Prim::Frame, Shape::Frame, "Game::DefenceSummary", true, false, false}, +}; +inline constexpr Field k_Game__SpyReportEvents[] = { // Game::SpyReportEvents + {"spl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ste", Prim::Frame, Shape::CArr, "int", true, false, false}, +}; +inline constexpr Field k_Game__SpyReportTechTree[] = { // Game::SpyReportTechTree + {"stn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumTechs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"TNm", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"TNm", Prim::Str, Shape::Scalar, nullptr, false, false, true}, + {"St", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"TResCost", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"TResDone", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"TAcq", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"TiAcq", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Tbd", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"Tfc", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"TUnlck", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__SpyReportTrade[] = { // Game::SpyReportTrade + {"stn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sctr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"srt", Prim::Frame, Shape::CArr, "Game::SpyReportTradeRoute", true, false, false}, +}; +inline constexpr Field k_Game__SpyReportTradeRoute[] = { // Game::SpyReportTradeRoute + {"stn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sctr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"sdgc", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"sdg", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StarFleet[] = { // Game::StarFleet + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"PID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"LocID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"HFPlan", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"FPlan", Prim::Frame, Shape::Frame, "Game::FlightPlan", true, false, false}, + {"FtName", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"FtTrans", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FtOrig", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"FtFlg", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Ftae", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Ftpae", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FtEnc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FtMS", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Perm", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"PrvPos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {"HLay", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"Lay", Prim::Frame, Shape::Frame, "Game::FleetLayout", true, false, false}, + {"NShips", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"ShipID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Ship", Prim::Frame, Shape::Frame, "Game::StarShip", false, false, false}, +}; +inline constexpr Field k_Game__StarMapNode[] = { // Game::StarMapNode + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, +}; +inline constexpr Field k_Game__StarMapParams[] = { // Game::StarMapParams + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::SystemParams", true, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "int", true, false, false}, + {".", Prim::Frame, Shape::CArr, "Game::SimpleNodePath", true, false, false}, +}; +inline constexpr Field k_Game__StarShip[] = { // Game::StarShip + {"DesID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"FltID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlrID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Range", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Health", Prim::Frame, Shape::Frame, "Game::ShipHealth", true, false, false}, + {"ConCap", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RefCap", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"RepCap", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"MineCap", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Plg", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Act", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Dep", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Atq", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"EncID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PrisH", Prim::Frame, Shape::Frame, "Game::PrisonerHold", true, false, false}, + {"LCT", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tsd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"atsp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tblt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"hbq", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"BQ2", Prim::Frame, Shape::Frame, "Game::BuildQueue", true, false, false}, + {"hsp", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {"pop", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"ppop", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"NTH", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"TH", Prim::F32, Shape::Scalar, nullptr, false, false, false}, + {"THM", Prim::F32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__StarSystem[] = { // Game::StarSystem + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, +}; +inline constexpr Field k_Game__StarSystem__OutputRates[] = { // Game::StarSystem::OutputRates + {"SRs", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRt", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRsc", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRtf", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRi", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRoh", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRnr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StarSystem__PlayerView[] = { // Game::StarSystem::PlayerView + {"VTrn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Pop", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Pop2", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"Infra", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Suit", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Res", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ARes2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"MRes", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NoRebAI", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"pbon", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pbon2", Prim::Frame, Shape::Frame, "Game::Population", true, false, false}, + {"ibon", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TerrFl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"footer", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__StrategyAIAgent__DesignNameGen[] = { // Game::StrategyAIAgent::DesignNameGen + {"dnnc", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"dnid", Prim::Frame, Shape::Frame, "Game::ShipSectionID", true, false, false}, + {"dnnm", Prim::Str, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__StrategyAIAgent__Streamable[] = { // Game::StrategyAIAgent::Streamable + {"AIAttr", Prim::Frame, Shape::Frame, "Game::AttribMap", false, false, false}, + {"AITurnPris", Prim::Frame, Shape::Frame, "Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap", false, false, true}, + {"AISit", Prim::Frame, Shape::Frame, "Game::AISituation", false, false, true}, + {"AIPlyHat", Prim::Frame, Shape::Frame, "Game::Mars::I::U?$StreamableEnum::?$AIWeightMap", false, false, true}, + {"prs2", Prim::Frame, Shape::CArr, "Game::AIPlayerRequestStamp", true, false, false}, + {"dsh", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"pid", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"trns", Prim::Frame, Shape::CArr, "int", false, false, false}, + {"NBStab", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"BStabPl", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"BStabTn", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"NMBlst", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"MBlstSy", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"MBlstTn", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AIDNG", Prim::Frame, Shape::Frame, "Game::StrategyAIAgent::DesignNameGen", false, false, false}, + {"AIHivJ", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SDFlT", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"nalat", Prim::Frame, Shape::CArr, "enum:uint", false, false, false}, + {"lnat", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"lat", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"AINumSys", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"AISysID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AISys", Prim::Frame, Shape::Frame, "Game::AISystem", false, false, false}, + {"NCmbR", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"CmbR", Prim::Frame, Shape::Frame, "Game::AICombatReport", false, false, false}, + {"NumCL", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"CLTn", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"CLSyID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"CLPlID", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"NPrv", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"NPrvId", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"NPrvVa", Prim::F32, Shape::Scalar, nullptr, false, false, false}, + {"NTecS", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"TecS", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"fct", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"apr", Prim::Frame, Shape::CArr, "Game::AIAutoPeaceRun", false, false, true}, +}; +inline constexpr Field k_Game__StrategyGameCreateParams[] = { // Game::StrategyGameCreateParams + {"Name", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"ID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RSeed", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"AID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Key", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"MapP", Prim::Frame, Shape::Frame, "Game::StarMapParams", true, false, false}, + {"MapS", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"MapF", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"NSys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"REnc", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SDist", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SSize", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SRes", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"SSuit", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"MaxP", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ASpec", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"bAlly", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"NTeam", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tmgrp", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"PSav", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PCol", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PTech", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"IncM", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ResM", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"scrp", Prim::Frame, Shape::Frame, "Game::StrategyScriptParams", true, false, false}, +}; +inline constexpr Field k_Game__StrategyGameInfo[] = { // Game::StrategyGameInfo + {"GameName", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Turn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NumSys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Checksum", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Players", Prim::Frame, Shape::CArr, "Game::StrategyPlayerInfo", true, false, false}, + {"Session", Prim::Frame, Shape::Frame, "Game::StrategySessionParams", true, false, false}, + {"MapShape", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"IncMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ResMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Alliances", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Teams", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Encounters", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"Scenario", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategyGameLoadParams[] = { // Game::StrategyGameLoadParams + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategyGameLoader__CustomDataTable[] = { // Game::StrategyGameLoader::CustomDataTable + {"NumIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"ID", Prim::Str, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__StrategyGameParams[] = { // Game::StrategyGameParams + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategyGameCreateParams", true, false, false}, +}; +inline constexpr Field k_Game__StrategyHostParams[] = { // Game::StrategyHostParams + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategyGameParams", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategySessionParams", true, false, false}, +}; +inline constexpr Field k_Game__StrategyLaunchParams[] = { // Game::StrategyLaunchParams + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategySimParams", true, false, false}, +}; +inline constexpr Field k_Game__StrategyPlayerGameSettings[] = { // Game::StrategyPlayerGameSettings + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategyPlayerInfo[] = { // Game::StrategyPlayerInfo + {"Slot", Prim::Frame, Shape::Frame, "Game::SlotDef", true, false, false}, + {"Rank", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategyPlayerParams[] = { // Game::StrategyPlayerParams + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::PlayerColorID", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategyPlayerGameSettings", true, false, false}, +}; +inline constexpr Field k_Game__StrategyScriptParams[] = { // Game::StrategyScriptParams + {"spc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"spsn", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"sppn", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"sppv", Prim::Str, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__StrategyServer[] = { // Game::StrategyServer + {"KeyPath", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"NMSz", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"NMLc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NMnx", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"PlayerIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"DesignIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"SystemIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"FleetIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"ShipIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"TradeIDs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"ModCount", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Frame", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"GameID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Attrib", Prim::Frame, Shape::Frame, "Game::AttribMap", true, false, false}, + {"RNG", Prim::Frame, Shape::Frame, "RNG", true, false, false}, + {"GameName", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {"Map", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"IncMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"ResMod", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"EnAl", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"EnTm", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"GOTurn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"GOWinPly", Prim::Frame, Shape::CArr, "enum:uint", true, false, false}, + {"NPCm", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NPCo", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NPCi", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NPCv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"NPCa", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"szadj", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"rsadj", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"suadj", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"sprjs", Prim::Frame, Shape::Frame, "Game::SpecialProjectNameGen", true, false, false}, + {"RandEncAdj", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"cmbtid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"turnstats", Prim::Frame, Shape::Frame, "Game::GameTurnHistory", true, false, false}, + {"numcreps", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"crep", Prim::Frame, Shape::Frame, "Game::CombatReport", false, false, false}, + {"ninv", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"invs", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"inve", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"invt", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"invtb", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"AllExc", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"AllExc", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AllExc", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AllExc", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"AllExc", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AllExc", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AllExcCF", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"AllExcCFp", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"AllExcCFp", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"NumPlrs", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"PlayerID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Player", Prim::Frame, Shape::Frame, "Game::ServerPlayer", false, false, false}, + {"ISsp", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"ISsu", Prim::F32, Shape::Scalar, nullptr, false, false, false}, + {"NumSys", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"SysID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Sys", Prim::Frame, Shape::Frame, "Game::StarSystem", false, false, false}, + {"NdGr2", Prim::Frame, Shape::Frame, "Game::ServerNodeGraph", true, false, false}, + {"trdmgr", Prim::Frame, Shape::Frame, "Game::ServerTradeManager", true, false, false}, + {"spymgr", Prim::Frame, Shape::Frame, "Game::IServerSpyManager", true, false, false}, + {"NumFlts", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"FltID", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"Flt", Prim::Frame, Shape::Frame, "Game::StarFleet", false, false, false}, + {"NumActs", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"Act", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SvSctOb", Prim::Frame, Shape::Frame, "Game::SVScriptObject", true, false, false}, + {"zdsc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"zdsi", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"zdst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategySessionParams[] = { // Game::StrategySessionParams + {"TMRS", Prim::Frame, Shape::Frame, "Game::StrategyTimerParams", true, false, false}, +}; +inline constexpr Field k_Game__StrategySimParams[] = { // Game::StrategySimParams + {".", Prim::Frame, Shape::Frame, "Game::StrategyGameParams", true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StrategySessionParams", false, false, true}, + {".", Prim::Frame, Shape::CArr, "Game::StrategyPlayerParams", true, false, false}, +}; +inline constexpr Field k_Game__StrategyTimerParams[] = { // Game::StrategyTimerParams + {"TSTL", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TCTL", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TQTL", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TQTLE", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategyTurnInfo[] = { // Game::StrategyTurnInfo + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__StrategyUserInfo[] = { // Game::StrategyUserInfo + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, +}; +inline constexpr Field k_Game__SwarmEncounterParams[] = { // Game::SwarmEncounterParams + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SwarmEncounterResult[] = { // Game::SwarmEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::ShipHealth", true, false, false}, +}; +inline constexpr Field k_Game__SwarmQueenEncounterResult[] = { // Game::SwarmQueenEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SystemEvent[] = { // Game::SystemEvent + {"set", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"ses", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"seop", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"senp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"seno2", Prim::I32, Shape::NArr, nullptr, true, false, false}, + {"seot2", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SystemKillerEncounterResult[] = { // Game::SystemKillerEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__SystemParams[] = { // Game::SystemParams + {".", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__TacReport[] = { // Game::TacReport + {"TRby", Prim::Frame, Shape::Frame, "Game::TacReportEvents", true, false, false}, + {"TRto", Prim::Frame, Shape::Frame, "Game::TacReportEvents", true, false, false}, + {"TRid", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRal", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRbal", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRlas", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRmis", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRmin", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRnrg", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRbio", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRbrd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRsld", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TRsldd", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TRsldc", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TRsldi", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TRsldr", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {"TRnc", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"TRships", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {"TRsats", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TRshipsL", Prim::I32, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__TacReportEvents[] = { // Game::TacReportEvents + {"TREhd", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TREhi", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"TREd", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TREdp", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TREdi", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TREdt", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"TREb", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__TechOffer[] = { // Game::TechOffer + {"giv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"tch", Prim::Str, Shape::Scalar, nullptr, false, false, false}, +}; +inline constexpr Field k_Game__TechOfferProject[] = { // Game::TechOfferProject + {"Stp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SPi", Prim::Frame, Shape::Frame, "Game::SpecialProject", true, false, false}, + {"AOdd", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"AInc", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Tch", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"RCst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RDn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"giv", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"rcpd2", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__TechProject[] = { // Game::TechProject + {"Stp", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"SPi", Prim::Frame, Shape::Frame, "Game::SpecialProject", true, false, false}, + {"AOdd", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"AInc", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {"Tch", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"RCst", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"RDn", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__TechTree[] = { // Game::TechTree + {"NumTechs", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {"TNm", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"TNm", Prim::Str, Shape::Scalar, nullptr, false, false, true}, + {"NumBrs", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {"TNm", Prim::Str, Shape::Scalar, nullptr, false, false, false}, + {"TNm", Prim::Str, Shape::Scalar, nullptr, false, false, true}, +}; +inline constexpr Field k_Game__TradeRoute[] = { // Game::TradeRoute + {"tro", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trfow", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trfr", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trfrs", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trtow", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trto", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trtos", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"trtc", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__TradeSector[] = { // Game::TradeSector + {"Pos", Prim::Frame, Shape::Frame, "Vector3", true, false, false}, +}; +inline constexpr Field k_Game__TurnCommands[] = { // Game::TurnCommands + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::CivilianRatios", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::StarSystem::OutputRates", false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::NArr, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::Population", false, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, false}, + {".", Prim::Frame, Shape::Frame, "Game::RaidTargets", false, false, false}, +}; +inline constexpr Field k_Game__UpdateData[] = { // Game::UpdateData + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Unknown, Shape::Scalar, nullptr, true, false, true}, +}; +inline constexpr Field k_Game__VNFinsolEncounterResult[] = { // Game::VNFinsolEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__VNHomeEncounterParams[] = { // Game::VNHomeEncounterParams + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I64, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__VNHomeEncounterResult[] = { // Game::VNHomeEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I64, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__VonNeumannEncounterParams[] = { // Game::VonNeumannEncounterParams + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__VonNeumannEncounterResult[] = { // Game::VonNeumannEncounterResult + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__WeaponGroups[] = { // Game::WeaponGroups + {"wgng", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"wgid", Prim::I32, Shape::Scalar, nullptr, false, true, false}, + {"wgb", Prim::Frame, Shape::Frame, "Game::GunBankSelection", true, false, false}, +}; +inline constexpr Field k_Game__XenoTechsPerSpecies[] = { // Game::XenoTechsPerSpecies + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Game__ZuulInfestation[] = { // Game::ZuulInfestation + {"PlgSys", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgCBy", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgCByF", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {"PlgNZ", Prim::I64, Shape::Scalar, nullptr, true, false, false}, + {"PlgZdr", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__DecalFile[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::DecalFile: Write emits no item +inline constexpr Field k_Mars__DirectionAttractorProxy[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::DirectionAttractorProxy: Write emits no item +inline constexpr Field k_Mars__FNMBase[] = { // Mars::FNMBase + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMChunk[] = { // Mars::FNMChunk + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Raw, Shape::Raw, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMChunkReply[] = { // Mars::FNMChunkReply + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMDone[] = { // Mars::FNMDone + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMDoneReply[] = { // Mars::FNMDoneReply + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMError[] = { // Mars::FNMError + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMSendNotify[] = { // Mars::FNMSendNotify + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__FNMSendReply[] = { // Mars::FNMSendReply + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__IStreamable[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::IStreamable: Write emits no item +inline constexpr Field k_Mars__LaunchParams[] = { // Mars::LaunchParams + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__NMCommand[] = { // Mars::NMCommand + {".", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::Frame, Shape::Frame, "Command", true, false, false}, +}; +inline constexpr Field k_Mars__NMLoad[] = { // Mars::NMLoad + {".", Prim::Frame, Shape::Frame, "SyncParams", true, false, false}, + {".", Prim::Frame, Shape::Frame, "LaunchParams", true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__NMSyncCheck[] = { // Mars::NMSyncCheck + {".", Prim::Frame, Shape::Frame, "SyncChecksumBuffer", true, false, false}, +}; +inline constexpr Field k_Mars__NMSyncError[] = { // Mars::NMSyncError + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__ParticleAttractor[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::ParticleAttractor: Write emits no item +inline constexpr Field k_Mars__ParticleChannel[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::ParticleChannel: Write emits no item +inline constexpr Field k_Mars__ParticleEmitter[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::ParticleEmitter: Write emits no item +inline constexpr Field k_Mars__ParticleSystem[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::ParticleSystem: Write emits no item +inline constexpr Field k_Mars__ParticleTracker[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::ParticleTracker: Write emits no item +inline constexpr Field k_Mars__PointAttractorProxy[1] = {{nullptr, Prim::Unknown, Shape::Scalar, nullptr, false, false, false}}; // Mars::PointAttractorProxy: Write emits no item +inline constexpr Field k_Mars__RNG[] = { // Mars::RNG + {".", Prim::Raw, Shape::Raw, nullptr, false, false, false}, +}; +inline constexpr Field k_Mars__SyncChecksumBuffer[] = { // Mars::SyncChecksumBuffer + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Frame, Shape::CArr, "int", true, false, false}, +}; +inline constexpr Field k_Mars__SyncParams[] = { // Mars::SyncParams + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::Str, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Mars__TNMConnect[] = { // Mars::TNMConnect + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, +}; +inline constexpr Field k_Mars__TNMDisconnect[] = { // Mars::TNMDisconnect + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, +}; +inline constexpr Field k_Mars__TNMHost[] = { // Mars::TNMHost + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, +}; +inline constexpr Field k_Mars__TNMMessage[] = { // Mars::TNMMessage + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Bool, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::I32, Shape::Scalar, nullptr, false, false, true}, + {".", Prim::Frame, Shape::Frame, "NetMessage", true, false, false}, +}; +inline constexpr Field k_Mars__TNMessage[] = { // Mars::TNMessage + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, + {".", Prim::Frame, Shape::Frame, "TNID", true, false, false}, +}; +inline constexpr Field k_Quaternion[] = { // Quaternion + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Vector2[] = { // Vector2 + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; +inline constexpr Field k_Vector3[] = { // Vector3 + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, + {".", Prim::F32, Shape::Scalar, nullptr, true, false, false}, +}; + +inline constexpr Class kClasses[] = { + {"Address", k_Address, 4, 4, "unnamed", 0, 0}, + {"Game::AIAutoPeaceRun", k_Game__AIAutoPeaceRun, 3, 0, "verified", 2, 2}, + {"Game::AICombatReport", k_Game__AICombatReport, 4, 0, "verified", 2, 2}, + {"Game::AIEncounterFlags", k_Game__AIEncounterFlags, 3, 0, "clean", 0, 0}, + {"Game::AIRebellion", k_Game__AIRebellion, 0, 0, "empty", 0, 0}, + {"Game::AIRebellionImpl", k_Game__AIRebellionImpl, 5, 0, "clean", 0, 0}, + {"Game::AIRelationRecord", k_Game__AIRelationRecord, 5, 5, "unnamed", 0, 0}, + {"Game::AISituation", k_Game__AISituation, 2, 0, "clean", 0, 0}, + {"Game::AISystem", k_Game__AISystem, 1, 0, "partial", 0, 0}, + {"Game::AllianceInvite", k_Game__AllianceInvite, 15, 15, "unnamed", 0, 0}, + {"Game::AllianceInvite::Response", k_Game__AllianceInvite__Response, 3, 3, "unnamed", 0, 0}, + {"Game::AttribMap", k_Game__AttribMap, 3, 3, "unnamed", 0, 0}, + {"Game::BackEngProject", k_Game__BackEngProject, 7, 0, "verified", 4, 4}, + {"Game::BerserkerEncounterResult", k_Game__BerserkerEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::BuildQueue", k_Game__BuildQueue, 1, 0, "partial", 0, 0}, + {"Game::CNMClientNotResponding", k_Game__CNMClientNotResponding, 2, 2, "unnamed", 0, 0}, + {"Game::CNMPlayerJoined", k_Game__CNMPlayerJoined, 2, 2, "unnamed", 0, 0}, + {"Game::CNMPlayerLeft", k_Game__CNMPlayerLeft, 1, 1, "unnamed", 0, 0}, + {"Game::CNMUpdate", k_Game__CNMUpdate, 1, 1, "unnamed", 0, 0}, + {"Game::CNMUpdateComplete", k_Game__CNMUpdateComplete, 1, 1, "unnamed", 0, 0}, + {"Game::CNMUserShips", k_Game__CNMUserShips, 2, 2, "unnamed", 0, 0}, + {"Game::CivilianRatios", k_Game__CivilianRatios, 2, 0, "partial", 1, 1}, + {"Game::ClientEncounterResults", k_Game__ClientEncounterResults, 3, 3, "unnamed", 0, 0}, + {"Game::ClientSystem", k_Game__ClientSystem, 1, 0, "clean", 0, 0}, + {"Game::ClientTradeSector", k_Game__ClientTradeSector, 1, 0, "clean", 0, 0}, + {"Game::CombatCommandCloak", k_Game__CombatCommandCloak, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandDecloak", k_Game__CombatCommandDecloak, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandFleetSetFacing", k_Game__CombatCommandFleetSetFacing, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandFleetSetHoldFire", k_Game__CombatCommandFleetSetHoldFire, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandFleetSetStance", k_Game__CombatCommandFleetSetStance, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandIntangOff", k_Game__CombatCommandIntangOff, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandIntangOn", k_Game__CombatCommandIntangOn, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandMoveReserves", k_Game__CombatCommandMoveReserves, 3, 3, "unnamed", 0, 0}, + {"Game::CombatCommandNull", k_Game__CombatCommandNull, 0, 0, "empty", 0, 0}, + {"Game::CombatCommandPickReserve", k_Game__CombatCommandPickReserve, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandRequestAsylumResponse", k_Game__CombatCommandRequestAsylumResponse, 3, 3, "unnamed", 0, 0}, + {"Game::CombatCommandSetAEAutoFire", k_Game__CombatCommandSetAEAutoFire, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandSetPlanetAttackMode", k_Game__CombatCommandSetPlanetAttackMode, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandSetPlayerAI", k_Game__CombatCommandSetPlayerAI, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandSetWantEndCombat", k_Game__CombatCommandSetWantEndCombat, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandShipAllStop", k_Game__CombatCommandShipAllStop, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandShipAttack", k_Game__CombatCommandShipAttack, 5, 5, "unnamed", 0, 0}, + {"Game::CombatCommandShipClearTargets", k_Game__CombatCommandShipClearTargets, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandShipFireOnce", k_Game__CombatCommandShipFireOnce, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandShipManeuver", k_Game__CombatCommandShipManeuver, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandShipReleaseGrapple", k_Game__CombatCommandShipReleaseGrapple, 1, 1, "unnamed", 0, 0}, + {"Game::CombatCommandShipSetFacing", k_Game__CombatCommandShipSetFacing, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandShipSetHoldFire", k_Game__CombatCommandShipSetHoldFire, 3, 3, "unnamed", 0, 0}, + {"Game::CombatCommandShipSetOnlyMyTarget", k_Game__CombatCommandShipSetOnlyMyTarget, 3, 3, "unnamed", 0, 0}, + {"Game::CombatCommandShipSetStance", k_Game__CombatCommandShipSetStance, 2, 2, "unnamed", 0, 0}, + {"Game::CombatCommandShipSetWaypoint", k_Game__CombatCommandShipSetWaypoint, 4, 4, "unnamed", 0, 0}, + {"Game::CombatCommandShipToggleBank", k_Game__CombatCommandShipToggleBank, 3, 3, "unnamed", 0, 0}, + {"Game::CombatDamageReport", k_Game__CombatDamageReport, 13, 0, "clean", 0, 0}, + {"Game::CombatLaunchParams", k_Game__CombatLaunchParams, 25, 25, "partial", 0, 0}, + {"Game::CombatPlayerReport", k_Game__CombatPlayerReport, 19, 0, "verified", 1, 1}, + {"Game::CombatPlayerStats", k_Game__CombatPlayerStats, 5, 0, "verified", 4, 4}, + {"Game::CombatReport", k_Game__CombatReport, 14, 0, "verified", 6, 6}, + {"Game::CombatShipReport", k_Game__CombatShipReport, 12, 0, "verified", 7, 7}, + {"Game::CombatTechFlags", k_Game__CombatTechFlags, 2, 2, "unnamed", 0, 0}, + {"Game::CombatWeaponReport", k_Game__CombatWeaponReport, 5, 0, "verified", 3, 3}, + {"Game::CommDeclareCurse", k_Game__CommDeclareCurse, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareIDontWant", k_Game__CommDeclareIDontWant, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareIHate", k_Game__CommDeclareIHate, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareILike", k_Game__CommDeclareILike, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareISaw", k_Game__CommDeclareISaw, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareISeveredAllianceWith", k_Game__CommDeclareISeveredAllianceWith, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareIWant", k_Game__CommDeclareIWant, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareShareAllColonyStats", k_Game__CommDeclareShareAllColonyStats, 6, 0, "clean", 0, 0}, + {"Game::CommDeclareShareStats", k_Game__CommDeclareShareStats, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareShareSystemNotes", k_Game__CommDeclareShareSystemNotes, 8, 0, "verified", 1, 1}, + {"Game::CommDeclareShareSystemStats", k_Game__CommDeclareShareSystemStats, 7, 0, "clean", 0, 0}, + {"Game::CommDeclareSorry", k_Game__CommDeclareSorry, 8, 0, "clean", 0, 0}, + {"Game::CommDeclareThanks", k_Game__CommDeclareThanks, 8, 0, "clean", 0, 0}, + {"Game::CommMessageContainer", k_Game__CommMessageContainer, 3, 0, "clean", 0, 0}, + {"Game::CommRequestAttackSystem", k_Game__CommRequestAttackSystem, 8, 0, "clean", 0, 0}, + {"Game::CommRequestDefendSystem", k_Game__CommRequestDefendSystem, 8, 0, "clean", 0, 0}, + {"Game::CommRequestDisposition", k_Game__CommRequestDisposition, 8, 0, "clean", 0, 0}, + {"Game::CommRequestHarassPlayer", k_Game__CommRequestHarassPlayer, 8, 0, "clean", 0, 0}, + {"Game::CommRequestHarassSystem", k_Game__CommRequestHarassSystem, 8, 0, "clean", 0, 0}, + {"Game::CommRequestMoney", k_Game__CommRequestMoney, 8, 0, "clean", 0, 0}, + {"Game::CommRequestRallyAtSystem", k_Game__CommRequestRallyAtSystem, 8, 0, "clean", 0, 0}, + {"Game::CommRequestResearch", k_Game__CommRequestResearch, 8, 0, "clean", 0, 0}, + {"Game::CommRequestSeverAllianceWith", k_Game__CommRequestSeverAllianceWith, 8, 0, "clean", 0, 0}, + {"Game::CommRequestShareSystemStats", k_Game__CommRequestShareSystemStats, 8, 0, "clean", 0, 0}, + {"Game::CommRequestStopColonizing", k_Game__CommRequestStopColonizing, 8, 0, "clean", 0, 0}, + {"Game::CommRequestStopHarassingMe", k_Game__CommRequestStopHarassingMe, 8, 0, "clean", 0, 0}, + {"Game::CommRequestStopHarassingPlayer", k_Game__CommRequestStopHarassingPlayer, 8, 0, "clean", 0, 0}, + {"Game::CommRequestStopHarrassingSystem", k_Game__CommRequestStopHarrassingSystem, 8, 0, "clean", 0, 0}, + {"Game::CommRequestStopMining", k_Game__CommRequestStopMining, 8, 0, "clean", 0, 0}, + {"Game::CommonPlague", k_Game__CommonPlague, 6, 0, "verified", 3, 3}, + {"Game::CrowDefendersEncounterResult", k_Game__CrowDefendersEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::CrowRuinsEncounterResult", k_Game__CrowRuinsEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::DefenceFleetAssignment", k_Game__DefenceFleetAssignment, 5, 0, "verified", 3, 3}, + {"Game::DefenceLayout", k_Game__DefenceLayout, 6, 0, "clean", 0, 0}, + {"Game::DefenceSummary", k_Game__DefenceSummary, 9, 0, "clean", 0, 0}, + {"Game::DerelictEncounterResult", k_Game__DerelictEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::DiplomacyStats", k_Game__DiplomacyStats, 14, 0, "verified", 13, 13}, + {"Game::EncounterQuery", k_Game__EncounterQuery, 5, 5, "unnamed", 0, 0}, + {"Game::EncounterResult", k_Game__EncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::EncounterResults", k_Game__EncounterResults, 28, 28, "unnamed", 0, 0}, + {"Game::EncounterResults::BoardedShip", k_Game__EncounterResults__BoardedShip, 2, 2, "unnamed", 0, 0}, + {"Game::EncounterResults::DamagedShip", k_Game__EncounterResults__DamagedShip, 5, 5, "partial", 0, 0}, + {"Game::EncounterResults::PrisonerShip", k_Game__EncounterResults__PrisonerShip, 2, 2, "unnamed", 0, 0}, + {"Game::EncounterResults::RetreatingShip", k_Game__EncounterResults__RetreatingShip, 4, 4, "unnamed", 0, 0}, + {"Game::EncounterResults::SpyShip", k_Game__EncounterResults__SpyShip, 5, 5, "unnamed", 0, 0}, + {"Game::EventStorage", k_Game__EventStorage, 2, 0, "verified", 1, 1}, + {"Game::EventStorage::Event", k_Game__EventStorage__Event, 8, 0, "verified", 4, 4}, + {"Game::EventStorage::TurnEvents", k_Game__EventStorage__TurnEvents, 2, 0, "verified", 1, 1}, + {"Game::FieldTemplate", k_Game__FieldTemplate, 1, 0, "partial", 0, 0}, + {"Game::FieldTemplate::Point", k_Game__FieldTemplate__Point, 5, 0, "verified", 3, 3}, + {"Game::FleetLayout", k_Game__FleetLayout, 3, 3, "partial", 0, 0}, + {"Game::FleetNameGenerator", k_Game__FleetNameGenerator, 1, 0, "verified", 1, 1}, + {"Game::FlightPlan", k_Game__FlightPlan, 6, 0, "verified", 2, 2}, + {"Game::FlightPlan::Waypoint", k_Game__FlightPlan__Waypoint, 3, 0, "clean", 0, 0}, + {"Game::Game::SVSOBrokenEmpire::VPCStat::?$NetworkIDDataMap", k_Game__Game__SVSOBrokenEmpire__VPCStat____NetworkIDDataMap, 3, 2, "clean", 0, 0}, + {"Game::Game::VLocustFleetLogistics::?$NetworkIDDataMap", k_Game__Game__VLocustFleetLogistics____NetworkIDDataMap, 3, 2, "clean", 0, 0}, + {"Game::Game::VLocustNestState::?$NetworkIDDataMap", k_Game__Game__VLocustNestState____NetworkIDDataMap, 3, 2, "clean", 0, 0}, + {"Game::Game::VShipSectionID::?$AIWeightMap", k_Game__Game__VShipSectionID____AIWeightMap, 3, 3, "unnamed", 0, 0}, + {"Game::GameTurnHistory", k_Game__GameTurnHistory, 3, 0, "clean", 0, 0}, + {"Game::GunBankSelection", k_Game__GunBankSelection, 1, 1, "unnamed", 0, 0}, + {"Game::HeraldEncounterResult", k_Game__HeraldEncounterResult, 2, 2, "unnamed", 0, 0}, + {"Game::IndependenceInfo", k_Game__IndependenceInfo, 5, 0, "verified", 3, 3}, + {"Game::JewelsProject", k_Game__JewelsProject, 4, 0, "verified", 2, 2}, + {"Game::LocustEncounterParams", k_Game__LocustEncounterParams, 1, 1, "unnamed", 0, 0}, + {"Game::LocustEncounterResult", k_Game__LocustEncounterResult, 2, 2, "unnamed", 0, 0}, + {"Game::LocustFleetLogistics", k_Game__LocustFleetLogistics, 4, 0, "verified", 2, 2}, + {"Game::Mars::Game::W4AIPurposeID::U?$StreamableEnum::?$AIWeightMap", k_Game__Mars__Game__W4AIPurposeID__U__StreamableEnum____AIWeightMap, 3, 3, "unnamed", 0, 0}, + {"Game::Mars::Game::W4WeaponFamilyID::U?$StreamableEnum::?$AIWeightMap", k_Game__Mars__Game__W4WeaponFamilyID__U__StreamableEnum____AIWeightMap, 3, 3, "unnamed", 0, 0}, + {"Game::Mars::I::U?$StreamableEnum::?$AIWeightMap", k_Game__Mars__I__U__StreamableEnum____AIWeightMap, 3, 3, "unnamed", 0, 0}, + {"Game::MeteorEncounterResult", k_Game__MeteorEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::MonitorEncounterResult", k_Game__MonitorEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::MonitorProject", k_Game__MonitorProject, 7, 0, "verified", 4, 4}, + {"Game::Morale", k_Game__Morale, 3, 0, "verified", 1, 1}, + {"Game::MoraleEvent", k_Game__MoraleEvent, 6, 0, "verified", 4, 4}, + {"Game::NodePath", k_Game__NodePath, 11, 0, "verified", 6, 6}, + {"Game::NodePointParams", k_Game__NodePointParams, 6, 6, "unnamed", 0, 0}, + {"Game::NodeRoute", k_Game__NodeRoute, 3, 0, "clean", 0, 0}, + {"Game::Objective", k_Game__Objective, 5, 0, "verified", 2, 2}, + {"Game::ObservedDesign", k_Game__ObservedDesign, 4, 0, "clean", 0, 0}, + {"Game::ObservedTech", k_Game__ObservedTech, 5, 0, "verified", 2, 2}, + {"Game::ObservedWeapon", k_Game__ObservedWeapon, 5, 0, "verified", 2, 2}, + {"Game::OrtgayEncounterResult", k_Game__OrtgayEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::PirateEncounterResult", k_Game__PirateEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::PlagueHit", k_Game__PlagueHit, 3, 3, "unnamed", 0, 0}, + {"Game::PlagueStats", k_Game__PlagueStats, 1, 1, "unnamed", 0, 0}, + {"Game::PlanetClientContext", k_Game__PlanetClientContext, 6, 6, "unnamed", 0, 0}, + {"Game::PlanetStats", k_Game__PlanetStats, 6, 6, "unnamed", 0, 0}, + {"Game::PlayerAid", k_Game__PlayerAid, 5, 0, "verified", 4, 4}, + {"Game::PlayerAlliances", k_Game__PlayerAlliances, 4, 0, "clean", 0, 0}, + {"Game::PlayerColorID", k_Game__PlayerColorID, 4, 4, "partial", 0, 0}, + {"Game::PlayerEncounterProgress", k_Game__PlayerEncounterProgress, 3, 3, "unnamed", 0, 0}, + {"Game::PlayerMessage", k_Game__PlayerMessage, 4, 4, "unnamed", 0, 0}, + {"Game::PlayerNotes", k_Game__PlayerNotes, 3, 0, "verified", 2, 2}, + {"Game::PlayerReport", k_Game__PlayerReport, 11, 0, "verified", 4, 4}, + {"Game::PlayerTurnHistory", k_Game__PlayerTurnHistory, 2, 0, "clean", 0, 0}, + {"Game::PlayerTurnStats", k_Game__PlayerTurnStats, 19, 0, "clean", 0, 0}, + {"Game::Population", k_Game__Population, 2, 0, "partial", 0, 0}, + {"Game::PopulationGroup", k_Game__PopulationGroup, 3, 0, "verified", 1, 1}, + {"Game::PrisonerHold", k_Game__PrisonerHold, 4, 0, "clean", 0, 0}, + {"Game::PuppetMasterEncounterResult", k_Game__PuppetMasterEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::RaidTargets", k_Game__RaidTargets, 5, 0, "verified", 1, 1}, + {"Game::RefugeesEncounterParams", k_Game__RefugeesEncounterParams, 1, 1, "unnamed", 0, 0}, + {"Game::RefugeesEncounterResult", k_Game__RefugeesEncounterResult, 2, 2, "unnamed", 0, 0}, + {"Game::SNMAIRelationValues", k_Game__SNMAIRelationValues, 1, 1, "unnamed", 0, 0}, + {"Game::SNMAllCombatDone", k_Game__SNMAllCombatDone, 1, 1, "unnamed", 0, 0}, + {"Game::SNMAllianceInvite", k_Game__SNMAllianceInvite, 3, 3, "unnamed", 0, 0}, + {"Game::SNMAllianceInviteChat", k_Game__SNMAllianceInviteChat, 4, 4, "unnamed", 0, 0}, + {"Game::SNMAllianceInviteProgress", k_Game__SNMAllianceInviteProgress, 2, 2, "unnamed", 0, 0}, + {"Game::SNMAllianceNotify", k_Game__SNMAllianceNotify, 3, 3, "unnamed", 0, 0}, + {"Game::SNMAllianceReply", k_Game__SNMAllianceReply, 4, 4, "unnamed", 0, 0}, + {"Game::SNMCancelAllianceInvite", k_Game__SNMCancelAllianceInvite, 2, 2, "unnamed", 0, 0}, + {"Game::SNMChat", k_Game__SNMChat, 5, 5, "unnamed", 0, 0}, + {"Game::SNMCombatTimeRemaining", k_Game__SNMCombatTimeRemaining, 2, 2, "unnamed", 0, 0}, + {"Game::SNMCommMessage", k_Game__SNMCommMessage, 2, 2, "unnamed", 0, 0}, + {"Game::SNMDemandEmpireSurrender", k_Game__SNMDemandEmpireSurrender, 2, 2, "unnamed", 0, 0}, + {"Game::SNMDemandEmpireSurrenderResponse", k_Game__SNMDemandEmpireSurrenderResponse, 3, 3, "unnamed", 0, 0}, + {"Game::SNMDoEncounterQuery", k_Game__SNMDoEncounterQuery, 1, 1, "unnamed", 0, 0}, + {"Game::SNMEncounterProgress", k_Game__SNMEncounterProgress, 1, 1, "unnamed", 0, 0}, + {"Game::SNMEncounterQueryResults", k_Game__SNMEncounterQueryResults, 2, 2, "unnamed", 0, 0}, + {"Game::SNMEncounterResults", k_Game__SNMEncounterResults, 2, 2, "unnamed", 0, 0}, + {"Game::SNMEndTurn", k_Game__SNMEndTurn, 2, 2, "partial", 0, 0}, + {"Game::SNMGenericEvent", k_Game__SNMGenericEvent, 2, 2, "unnamed", 0, 0}, + {"Game::SNMGenericGameMessage", k_Game__SNMGenericGameMessage, 2, 2, "unnamed", 0, 0}, + {"Game::SNMHostCombat", k_Game__SNMHostCombat, 7, 7, "unnamed", 0, 0}, + {"Game::SNMHostCombatReply", k_Game__SNMHostCombatReply, 3, 3, "unnamed", 0, 0}, + {"Game::SNMJoin", k_Game__SNMJoin, 3, 3, "unnamed", 0, 0}, + {"Game::SNMJoinCombat", k_Game__SNMJoinCombat, 5, 5, "unnamed", 0, 0}, + {"Game::SNMJoinCombatReply", k_Game__SNMJoinCombatReply, 2, 2, "unnamed", 0, 0}, + {"Game::SNMJoinReply", k_Game__SNMJoinReply, 1, 1, "unnamed", 0, 0}, + {"Game::SNMKillAI", k_Game__SNMKillAI, 1, 1, "unnamed", 0, 0}, + {"Game::SNMLaunchCombat", k_Game__SNMLaunchCombat, 5, 5, "unnamed", 0, 0}, + {"Game::SNMLeaveAlliance", k_Game__SNMLeaveAlliance, 1, 1, "unnamed", 0, 0}, + {"Game::SNMLeaveCeaseFire", k_Game__SNMLeaveCeaseFire, 2, 2, "unnamed", 0, 0}, + {"Game::SNMLeaveNonAggression", k_Game__SNMLeaveNonAggression, 2, 2, "unnamed", 0, 0}, + {"Game::SNMLobbyChat", k_Game__SNMLobbyChat, 3, 3, "unnamed", 0, 0}, + {"Game::SNMMakePlayerAI", k_Game__SNMMakePlayerAI, 2, 2, "unnamed", 0, 0}, + {"Game::SNMPendingAlliances", k_Game__SNMPendingAlliances, 1, 1, "unnamed", 0, 0}, + {"Game::SNMPlaySpeechEvent", k_Game__SNMPlaySpeechEvent, 3, 3, "unnamed", 0, 0}, + {"Game::SNMProgressionWarsConvoyShips", k_Game__SNMProgressionWarsConvoyShips, 1, 1, "unnamed", 0, 0}, + {"Game::SNMRefreshSlots", k_Game__SNMRefreshSlots, 1, 1, "unnamed", 0, 0}, + {"Game::SNMRefreshSlots::SlotData", k_Game__SNMRefreshSlots__SlotData, 3, 3, "unnamed", 0, 0}, + {"Game::SNMRemoveCommMessage", k_Game__SNMRemoveCommMessage, 2, 2, "unnamed", 0, 0}, + {"Game::SNMRunAI", k_Game__SNMRunAI, 3, 3, "unnamed", 0, 0}, + {"Game::SNMSetAIPolicy", k_Game__SNMSetAIPolicy, 2, 2, "unnamed", 0, 0}, + {"Game::SNMSetPlayerStatus", k_Game__SNMSetPlayerStatus, 2, 2, "unnamed", 0, 0}, + {"Game::SNMSetSlotPassword", k_Game__SNMSetSlotPassword, 2, 2, "unnamed", 0, 0}, + {"Game::SNMSetTimers", k_Game__SNMSetTimers, 1, 1, "unnamed", 0, 0}, + {"Game::SNMSlotInit", k_Game__SNMSlotInit, 10, 10, "unnamed", 0, 0}, + {"Game::SNMSlotInsertClient", k_Game__SNMSlotInsertClient, 3, 3, "unnamed", 0, 0}, + {"Game::SNMSlotMoveClient", k_Game__SNMSlotMoveClient, 3, 3, "unnamed", 0, 0}, + {"Game::SNMSlotPWAttempt", k_Game__SNMSlotPWAttempt, 1, 1, "unnamed", 0, 0}, + {"Game::SNMSlotPWRejected", k_Game__SNMSlotPWRejected, 1, 1, "unnamed", 0, 0}, + {"Game::SNMSlotRemoveClient", k_Game__SNMSlotRemoveClient, 1, 1, "unnamed", 0, 0}, + {"Game::SNMSlotReqPW", k_Game__SNMSlotReqPW, 2, 2, "unnamed", 0, 0}, + {"Game::SNMSlotSetData", k_Game__SNMSlotSetData, 10, 10, "unnamed", 0, 0}, + {"Game::SNMSlotSetForcedSpecies", k_Game__SNMSlotSetForcedSpecies, 1, 1, "unnamed", 0, 0}, + {"Game::SNMSlotSetPW", k_Game__SNMSlotSetPW, 4, 4, "unnamed", 0, 0}, + {"Game::SNMSlotSetState", k_Game__SNMSlotSetState, 3, 3, "unnamed", 0, 0}, + {"Game::SNMTechOffer", k_Game__SNMTechOffer, 5, 5, "unnamed", 0, 0}, + {"Game::SNMTransferProgress", k_Game__SNMTransferProgress, 1, 1, "unnamed", 0, 0}, + {"Game::SNMTurnInfo", k_Game__SNMTurnInfo, 1, 1, "unnamed", 0, 0}, + {"Game::SNMUpdate", k_Game__SNMUpdate, 5, 5, "unnamed", 0, 0}, + {"Game::SNMUpdateAlliances", k_Game__SNMUpdateAlliances, 2, 2, "unnamed", 0, 0}, + {"Game::SNMUpdateComplete", k_Game__SNMUpdateComplete, 1, 1, "unnamed", 0, 0}, + {"Game::SNMUserNames", k_Game__SNMUserNames, 2, 2, "unnamed", 0, 0}, + {"Game::SVSOAntiquarians", k_Game__SVSOAntiquarians, 4, 0, "verified", 1, 1}, + {"Game::SVSOAntiquarians::Artifact", k_Game__SVSOAntiquarians__Artifact, 4, 0, "clean", 0, 0}, + {"Game::SVSOBrokenEmpire", k_Game__SVSOBrokenEmpire, 1, 0, "clean", 0, 0}, + {"Game::SVSOCrowDefenders", k_Game__SVSOCrowDefenders, 6, 0, "verified", 1, 1}, + {"Game::SVSOCrowRuins", k_Game__SVSOCrowRuins, 5, 0, "clean", 0, 0}, + {"Game::SVSODerelict", k_Game__SVSODerelict, 6, 0, "clean", 0, 0}, + {"Game::SVSOGrandMenaceTrigger", k_Game__SVSOGrandMenaceTrigger, 1, 0, "clean", 0, 0}, + {"Game::SVSOHolyLands", k_Game__SVSOHolyLands, 0, 0, "empty", 0, 0}, + {"Game::SVSOHolyLands::PlayerState", k_Game__SVSOHolyLands__PlayerState, 0, 0, "empty", 0, 0}, + {"Game::SVSOJewelsOfTheCrown", k_Game__SVSOJewelsOfTheCrown, 5, 0, "clean", 0, 0}, + {"Game::SVSOLandGrab", k_Game__SVSOLandGrab, 3, 0, "verified", 2, 2}, + {"Game::SVSOLocust", k_Game__SVSOLocust, 5, 0, "verified", 1, 1}, + {"Game::SVSOMasterVoice", k_Game__SVSOMasterVoice, 2, 0, "clean", 0, 0}, + {"Game::SVSOMonitor", k_Game__SVSOMonitor, 11, 0, "clean", 0, 0}, + {"Game::SVSOOrtgay", k_Game__SVSOOrtgay, 9, 0, "verified", 5, 5}, + {"Game::SVSOProgressionWars", k_Game__SVSOProgressionWars, 10, 0, "verified", 8, 8}, + {"Game::SVSOPuppetMaster", k_Game__SVSOPuppetMaster, 6, 0, "verified", 1, 1}, + {"Game::SVSORefugees", k_Game__SVSORefugees, 6, 0, "verified", 1, 1}, + {"Game::SVSORefugees::PlayerStatus", k_Game__SVSORefugees__PlayerStatus, 5, 0, "verified", 3, 3}, + {"Game::SVSOSlaversRefuel", k_Game__SVSOSlaversRefuel, 8, 0, "verified", 1, 1}, + {"Game::SVSOSots", k_Game__SVSOSots, 8, 0, "clean", 0, 0}, + {"Game::SVSOSwarm", k_Game__SVSOSwarm, 6, 0, "clean", 0, 0}, + {"Game::SVSOSwarm::Infestation", k_Game__SVSOSwarm__Infestation, 6, 0, "verified", 4, 4}, + {"Game::SVSOSwarmQueen", k_Game__SVSOSwarmQueen, 4, 0, "clean", 0, 0}, + {"Game::SVSOSwarmQueen::HiveInfo", k_Game__SVSOSwarmQueen__HiveInfo, 3, 0, "verified", 1, 1}, + {"Game::SVSOSwarmQueen::QueenInfo", k_Game__SVSOSwarmQueen__QueenInfo, 2, 0, "clean", 0, 0}, + {"Game::SVSOSystemKiller", k_Game__SVSOSystemKiller, 6, 0, "verified", 1, 1}, + {"Game::SVSOTraps", k_Game__SVSOTraps, 1, 0, "clean", 0, 0}, + {"Game::SVSOTraps::Trap", k_Game__SVSOTraps__Trap, 4, 0, "clean", 0, 0}, + {"Game::SVSOUpstartApes", k_Game__SVSOUpstartApes, 8, 0, "verified", 2, 2}, + {"Game::SVSOUpstartApes_EO_DEMANDS_SHIPS", k_Game__SVSOUpstartApes_EO_DEMANDS_SHIPS, 6, 0, "verified", 5, 5}, + {"Game::SVSOUpstartApes_EO_DEMANDS_SHIPS::ShipRequest", k_Game__SVSOUpstartApes_EO_DEMANDS_SHIPS__ShipRequest, 2, 0, "verified", 1, 1}, + {"Game::SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS", k_Game__SVSOUpstartApes_EO_DEMANDS_TRADE_GOODS, 3, 0, "verified", 3, 3}, + {"Game::SVSOUpstartApes_EO_DEMANDS_VICTORY", k_Game__SVSOUpstartApes_EO_DEMANDS_VICTORY, 3, 0, "verified", 3, 3}, + {"Game::SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT", k_Game__SVSOUpstartApes_EO_ENERGY_WEAPONS_DECADENT, 3, 0, "verified", 3, 3}, + {"Game::SVSOUpstartApes_EO_FEARS_YOUR_POWER", k_Game__SVSOUpstartApes_EO_FEARS_YOUR_POWER, 3, 0, "verified", 3, 3}, + {"Game::SVSOUpstartApes_EO_GIFTS", k_Game__SVSOUpstartApes_EO_GIFTS, 2, 0, "verified", 2, 2}, + {"Game::SVSOUpstartApes_EO_MUST_EXPAND", k_Game__SVSOUpstartApes_EO_MUST_EXPAND, 3, 0, "verified", 3, 3}, + {"Game::SVSOUpstartApes_EO_REQUIRES_CASH", k_Game__SVSOUpstartApes_EO_REQUIRES_CASH, 3, 0, "verified", 3, 3}, + {"Game::SVSOVonNeumann", k_Game__SVSOVonNeumann, 25, 0, "verified", 14, 14}, + {"Game::SVSOVonNeumann::DefeatRecord", k_Game__SVSOVonNeumann__DefeatRecord, 5, 0, "verified", 4, 4}, + {"Game::ServerNodeGraph", k_Game__ServerNodeGraph, 2, 0, "verified", 1, 1}, + {"Game::ServerNodeGraph::Params", k_Game__ServerNodeGraph__Params, 3, 0, "clean", 0, 0}, + {"Game::ServerPlayer", k_Game__ServerPlayer, 124, 0, "partial", 56, 56}, + {"Game::ServerSpyManager", k_Game__ServerSpyManager, 3, 0, "verified", 1, 1}, + {"Game::ServerSystem", k_Game__ServerSystem, 103, 0, "partial", 43, 43}, + {"Game::ServerTradeManager", k_Game__ServerTradeManager, 0, 0, "empty", 0, 0}, + {"Game::ServerTradeManagerImpl", k_Game__ServerTradeManagerImpl, 5, 0, "verified", 1, 1}, + {"Game::ServerTradeSector", k_Game__ServerTradeSector, 14, 0, "verified", 1, 1}, + {"Game::ServerTradeSector::FreighterWarning", k_Game__ServerTradeSector__FreighterWarning, 2, 0, "verified", 1, 1}, + {"Game::ShipBuildOrder", k_Game__ShipBuildOrder, 5, 0, "verified", 3, 3}, + {"Game::ShipBuildOrderDef", k_Game__ShipBuildOrderDef, 5, 0, "verified", 3, 3}, + {"Game::ShipDesign", k_Game__ShipDesign, 0, 0, "empty", 0, 0}, + {"Game::ShipDesignDef::LegacyGunBank", k_Game__ShipDesignDef__LegacyGunBank, 1, 1, "unnamed", 0, 0}, + {"Game::ShipDesignDef::LegacyWeaponDef", k_Game__ShipDesignDef__LegacyWeaponDef, 4, 0, "verified", 1, 1}, + {"Game::ShipDesignDef::Section", k_Game__ShipDesignDef__Section, 3, 0, "clean", 0, 0}, + {"Game::ShipHealth", k_Game__ShipHealth, 1, 1, "partial", 0, 0}, + {"Game::ShipParams", k_Game__ShipParams, 22, 22, "partial", 0, 0}, + {"Game::ShipParams::Section", k_Game__ShipParams__Section, 3, 3, "unnamed", 0, 0}, + {"Game::ShipRecords", k_Game__ShipRecords, 11, 0, "verified", 1, 1}, + {"Game::ShipSectionID", k_Game__ShipSectionID, 2, 2, "unnamed", 0, 0}, + {"Game::ShipWeapon", k_Game__ShipWeapon, 5, 0, "verified", 2, 2}, + {"Game::SimpleNodePath", k_Game__SimpleNodePath, 2, 2, "unnamed", 0, 0}, + {"Game::SlaversRefuelEncounterResult", k_Game__SlaversRefuelEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::Slot", k_Game__Slot, 3, 3, "unnamed", 0, 0}, + {"Game::SlotDef", k_Game__SlotDef, 18, 0, "verified", 15, 15}, + {"Game::SlotUser", k_Game__SlotUser, 13, 13, "unnamed", 0, 0}, + {"Game::SpecialProject", k_Game__SpecialProject, 6, 0, "verified", 5, 5}, + {"Game::SpecialProjectImpl", k_Game__SpecialProjectImpl, 2, 0, "clean", 0, 0}, + {"Game::SpecialProjectNameGen", k_Game__SpecialProjectNameGen, 6, 0, "clean", 0, 0}, + {"Game::SpeciesRatios", k_Game__SpeciesRatios, 3, 0, "partial", 0, 0}, + {"Game::SpyCraft", k_Game__SpyCraft, 14, 0, "verified", 5, 5}, + {"Game::SpyReport", k_Game__SpyReport, 8, 0, "clean", 0, 0}, + {"Game::SpyReportDefences", k_Game__SpyReportDefences, 2, 0, "verified", 1, 1}, + {"Game::SpyReportEvents", k_Game__SpyReportEvents, 2, 0, "clean", 0, 0}, + {"Game::SpyReportTechTree", k_Game__SpyReportTechTree, 13, 0, "verified", 1, 1}, + {"Game::SpyReportTrade", k_Game__SpyReportTrade, 4, 0, "verified", 1, 1}, + {"Game::SpyReportTradeRoute", k_Game__SpyReportTradeRoute, 5, 0, "verified", 1, 1}, + {"Game::StarFleet", k_Game__StarFleet, 20, 0, "partial", 2, 2}, + {"Game::StarMapNode", k_Game__StarMapNode, 1, 0, "clean", 0, 0}, + {"Game::StarMapParams", k_Game__StarMapParams, 5, 5, "unnamed", 0, 0}, + {"Game::StarShip", k_Game__StarShip, 27, 0, "partial", 10, 10}, + {"Game::StarSystem", k_Game__StarSystem, 1, 0, "clean", 0, 0}, + {"Game::StarSystem::OutputRates", k_Game__StarSystem__OutputRates, 7, 0, "verified", 7, 7}, + {"Game::StarSystem::PlayerView", k_Game__StarSystem__PlayerView, 14, 0, "partial", 10, 10}, + {"Game::StrategyAIAgent::DesignNameGen", k_Game__StrategyAIAgent__DesignNameGen, 3, 0, "clean", 0, 0}, + {"Game::StrategyAIAgent::Streamable", k_Game__StrategyAIAgent__Streamable, 36, 0, "clean", 0, 0}, + {"Game::StrategyGameCreateParams", k_Game__StrategyGameCreateParams, 25, 0, "verified", 19, 19}, + {"Game::StrategyGameInfo", k_Game__StrategyGameInfo, 13, 0, "verified", 10, 10}, + {"Game::StrategyGameLoadParams", k_Game__StrategyGameLoadParams, 1, 1, "unnamed", 0, 0}, + {"Game::StrategyGameLoader::CustomDataTable", k_Game__StrategyGameLoader__CustomDataTable, 2, 0, "partial", 0, 0}, + {"Game::StrategyGameParams", k_Game__StrategyGameParams, 2, 2, "unnamed", 0, 0}, + {"Game::StrategyHostParams", k_Game__StrategyHostParams, 5, 5, "unnamed", 0, 0}, + {"Game::StrategyLaunchParams", k_Game__StrategyLaunchParams, 2, 2, "unnamed", 0, 0}, + {"Game::StrategyPlayerGameSettings", k_Game__StrategyPlayerGameSettings, 4, 4, "unnamed", 0, 0}, + {"Game::StrategyPlayerInfo", k_Game__StrategyPlayerInfo, 2, 0, "verified", 1, 1}, + {"Game::StrategyPlayerParams", k_Game__StrategyPlayerParams, 11, 11, "unnamed", 0, 0}, + {"Game::StrategyScriptParams", k_Game__StrategyScriptParams, 4, 0, "clean", 0, 0}, + {"Game::StrategyServer", k_Game__StrategyServer, 77, 6, "verified", 18, 18}, + {"Game::StrategySessionParams", k_Game__StrategySessionParams, 1, 0, "clean", 0, 0}, + {"Game::StrategySimParams", k_Game__StrategySimParams, 3, 3, "unnamed", 0, 0}, + {"Game::StrategyTimerParams", k_Game__StrategyTimerParams, 4, 0, "verified", 4, 4}, + {"Game::StrategyTurnInfo", k_Game__StrategyTurnInfo, 8, 8, "unnamed", 0, 0}, + {"Game::StrategyUserInfo", k_Game__StrategyUserInfo, 3, 3, "partial", 0, 0}, + {"Game::SwarmEncounterParams", k_Game__SwarmEncounterParams, 1, 1, "unnamed", 0, 0}, + {"Game::SwarmEncounterResult", k_Game__SwarmEncounterResult, 3, 3, "partial", 0, 0}, + {"Game::SwarmQueenEncounterResult", k_Game__SwarmQueenEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::SystemEvent", k_Game__SystemEvent, 6, 0, "clean", 0, 0}, + {"Game::SystemKillerEncounterResult", k_Game__SystemKillerEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::SystemParams", k_Game__SystemParams, 5, 5, "unnamed", 0, 0}, + {"Game::TacReport", k_Game__TacReport, 20, 0, "verified", 13, 13}, + {"Game::TacReportEvents", k_Game__TacReportEvents, 7, 0, "verified", 7, 7}, + {"Game::TechOffer", k_Game__TechOffer, 3, 0, "clean", 0, 0}, + {"Game::TechOfferProject", k_Game__TechOfferProject, 10, 0, "verified", 5, 5}, + {"Game::TechProject", k_Game__TechProject, 7, 0, "verified", 4, 4}, + {"Game::TechTree", k_Game__TechTree, 6, 0, "partial", 0, 0}, + {"Game::TradeRoute", k_Game__TradeRoute, 8, 0, "verified", 5, 5}, + {"Game::TradeSector", k_Game__TradeSector, 1, 0, "clean", 0, 0}, + {"Game::TurnCommands", k_Game__TurnCommands, 44, 44, "partial", 0, 0}, + {"Game::UpdateData", k_Game__UpdateData, 3, 3, "partial", 0, 0}, + {"Game::VNFinsolEncounterResult", k_Game__VNFinsolEncounterResult, 1, 1, "unnamed", 0, 0}, + {"Game::VNHomeEncounterParams", k_Game__VNHomeEncounterParams, 6, 6, "unnamed", 0, 0}, + {"Game::VNHomeEncounterResult", k_Game__VNHomeEncounterResult, 2, 2, "unnamed", 0, 0}, + {"Game::VonNeumannEncounterParams", k_Game__VonNeumannEncounterParams, 1, 1, "unnamed", 0, 0}, + {"Game::VonNeumannEncounterResult", k_Game__VonNeumannEncounterResult, 2, 2, "unnamed", 0, 0}, + {"Game::WeaponGroups", k_Game__WeaponGroups, 3, 0, "clean", 0, 0}, + {"Game::XenoTechsPerSpecies", k_Game__XenoTechsPerSpecies, 1, 1, "unnamed", 0, 0}, + {"Game::ZuulInfestation", k_Game__ZuulInfestation, 5, 0, "verified", 1, 1}, + {"Mars::DecalFile", k_Mars__DecalFile, 0, 0, "empty", 0, 0}, + {"Mars::DirectionAttractorProxy", k_Mars__DirectionAttractorProxy, 0, 0, "empty", 0, 0}, + {"Mars::FNMBase", k_Mars__FNMBase, 2, 2, "unnamed", 0, 0}, + {"Mars::FNMChunk", k_Mars__FNMChunk, 5, 5, "unnamed", 0, 0}, + {"Mars::FNMChunkReply", k_Mars__FNMChunkReply, 2, 2, "unnamed", 0, 0}, + {"Mars::FNMDone", k_Mars__FNMDone, 4, 4, "unnamed", 0, 0}, + {"Mars::FNMDoneReply", k_Mars__FNMDoneReply, 2, 2, "unnamed", 0, 0}, + {"Mars::FNMError", k_Mars__FNMError, 3, 3, "unnamed", 0, 0}, + {"Mars::FNMSendNotify", k_Mars__FNMSendNotify, 3, 3, "unnamed", 0, 0}, + {"Mars::FNMSendReply", k_Mars__FNMSendReply, 2, 2, "unnamed", 0, 0}, + {"Mars::IStreamable", k_Mars__IStreamable, 0, 0, "empty", 0, 0}, + {"Mars::LaunchParams", k_Mars__LaunchParams, 1, 1, "unnamed", 0, 0}, + {"Mars::NMCommand", k_Mars__NMCommand, 2, 2, "unnamed", 0, 0}, + {"Mars::NMLoad", k_Mars__NMLoad, 3, 3, "partial", 0, 0}, + {"Mars::NMSyncCheck", k_Mars__NMSyncCheck, 1, 1, "unnamed", 0, 0}, + {"Mars::NMSyncError", k_Mars__NMSyncError, 1, 1, "unnamed", 0, 0}, + {"Mars::ParticleAttractor", k_Mars__ParticleAttractor, 0, 0, "empty", 0, 0}, + {"Mars::ParticleChannel", k_Mars__ParticleChannel, 0, 0, "empty", 0, 0}, + {"Mars::ParticleEmitter", k_Mars__ParticleEmitter, 0, 0, "empty", 0, 0}, + {"Mars::ParticleSystem", k_Mars__ParticleSystem, 0, 0, "empty", 0, 0}, + {"Mars::ParticleTracker", k_Mars__ParticleTracker, 0, 0, "empty", 0, 0}, + {"Mars::PointAttractorProxy", k_Mars__PointAttractorProxy, 0, 0, "empty", 0, 0}, + {"Mars::RNG", k_Mars__RNG, 1, 1, "partial", 0, 0}, + {"Mars::SyncChecksumBuffer", k_Mars__SyncChecksumBuffer, 3, 3, "unnamed", 0, 0}, + {"Mars::SyncParams", k_Mars__SyncParams, 6, 6, "unnamed", 0, 0}, + {"Mars::TNMConnect", k_Mars__TNMConnect, 4, 4, "partial", 0, 0}, + {"Mars::TNMDisconnect", k_Mars__TNMDisconnect, 3, 3, "partial", 0, 0}, + {"Mars::TNMHost", k_Mars__TNMHost, 3, 3, "partial", 0, 0}, + {"Mars::TNMMessage", k_Mars__TNMMessage, 5, 5, "partial", 0, 0}, + {"Mars::TNMessage", k_Mars__TNMessage, 2, 2, "partial", 0, 0}, + {"Quaternion", k_Quaternion, 4, 4, "unnamed", 0, 0}, + {"Vector2", k_Vector2, 2, 2, "unnamed", 0, 0}, + {"Vector3", k_Vector3, 3, 3, "unnamed", 0, 0}, +}; +inline constexpr size_t kClassCount = 386; + +// Linear lookup by class name. The table is sorted, but it is small and this is +// only ever called from tests and tools. +inline const Class* find(const char* name) { + for (const Class& c : kClasses) { + const char* a = c.name; + const char* b = name; + while (*a && *a == *b) { ++a; ++b; } + if (!*a && !*b) return &c; + } + return nullptr; +} + +inline const char* prim_name(Prim p) { + switch (p) { + case Prim::Unknown: return "?"; + case Prim::I32: return "i32"; + case Prim::I64: return "i64"; + case Prim::F32: return "f32"; + case Prim::Bool: return "bool"; + case Prim::Str: return "str"; + case Prim::Frame: return "frame"; + case Prim::Raw: return "raw"; + } + return "?"; +} + +inline const char* shape_name(Shape s) { + switch (s) { + case Shape::Scalar: return "scalar"; + case Shape::Frame: return "frame"; + case Shape::CArr: return "carr"; + case Shape::NArr: return "narr"; + case Shape::Raw: return "raw"; + } + return "?"; +} + +} // namespace sots::wire diff --git a/src/mars/stream/probe.h b/src/mars/stream/probe.h new file mode 100644 index 0000000..d8a9a33 --- /dev/null +++ b/src/mars/stream/probe.h @@ -0,0 +1,270 @@ +// mars::stream — SchemaProbe: a fourth archive that records what a shape's +// io() puts on the stream, so the shape can be checked against the wire schema +// recovered from the game's own serializers (include/generated/sots_stream_schema.h). +// +// The three working archives read, write and build hints. This one executes +// nothing: it walks io() and appends one Item per stream item, in order. Two +// choices make its output directly comparable to the generated table: +// +// * `when(cond, body)` runs the body **unconditionally**. The recovery is a +// linear pass over the game's Write and cannot see Write's branches either, +// so both sides list every branch. Comparing "all branches taken" against +// "all branches taken" is the only alignment that means anything. +// * `narr` emits the count item and then the element fields as *siblings* +// (member == false), which is exactly how the flattened recovery presents a +// container loop. +// +// `any()` / `raw_frame()` — the escape hatch shapes.h uses for bodies it does +// not model — record Opaque. Opaque items are the coverage debt: the shape +// round-trips them byte-for-byte by carrying the Node, but it does not +// understand them. Counting Opaque against the wire schema is how this +// codebase measures how much of the save it actually reads. +#pragma once + +#include +#include +#include +#include +#include + +#include "archive.h" + +namespace mars::stream { + +class SchemaProbe { +public: + static constexpr bool reading = false, writing = false, building = false; + + enum class P : uint8_t { Unknown, I32, I64, F32, Bool, Str, Frame, Raw }; + enum class S : uint8_t { Scalar, Frame, CArr, NArr, Raw }; + + struct Item { + std::string tag; // on-disk tag ("." when the game writes a NULL name) + P prim = P::Unknown; + S shape = S::Scalar; + bool member = true; // false: a container element + bool optional = false; // the shape consumes it only if the tag matches + bool opaque = false; // carried as a Node: round-tripped, not understood + }; + + std::vector items; + bool has_rest = false; // the shape absorbs a trailing tail into `extra` + + // --- scalars ------------------------------------------------------------ + void i32(Tag t, int32_t&) { add(t, P::I32, S::Scalar); } + void f32(Tag t, float&) { add(t, P::F32, S::Scalar); } + void b(Tag t, bool&) { add(t, P::Bool, S::Scalar); } + void i64(Tag t, int64_t&) { add(t, P::I64, S::Scalar); } + void str(Tag t, std::string&) { add(t, P::Str, S::Scalar); } + void vec3(Tag t, Vec3&) { add(t, P::Frame, S::Frame); } // written as a Vector3 frame + + void any(Tag t, Node&) { add(t, P::Unknown, S::Frame).opaque = true; } + // raw_frame is a *framed* item (the RNG block) whose body is one opaque + // payload, so on the wire it is a frame like any other nested object. + void raw_frame(Tag t, Node&) { add(t, P::Frame, S::Frame).opaque = true; } + + // --- optional named items ------------------------------------------------ + void opt_i32(Tag t, std::optional&) { add(t, P::I32, S::Scalar).optional = true; } + void opt_f32(Tag t, std::optional&) { add(t, P::F32, S::Scalar).optional = true; } + void opt_b(Tag t, std::optional&) { add(t, P::Bool, S::Scalar).optional = true; } + void opt_any(Tag t, std::optional&) { + Item& i = add(t, P::Unknown, S::Frame); + i.optional = true; + i.opaque = true; + } + template + void opt_obj(Tag t, std::optional&) { + add(t, P::Frame, S::Frame).optional = true; + } + + // --- framed struct / arrays ------------------------------------------------ + // A nested shape is one item here; the nested class is its own wire entry. + template + void obj(Tag t, T&) { + add(t, P::Frame, S::Frame); + } + template + void obj_flex(Tag t, T& v, bool&) { + obj(t, v); + } + template + void carr(Tag t, std::vector&) { + add(t, P::Frame, S::CArr); + } + template + void carr_flex(Tag t, std::vector& v, bool&) { + carr(t, v); + } + template + void narr(Tag t, std::vector&, F elem) { + add(t, P::I32, S::NArr); + T tmp{}; + size_t first = items.size(); + elem(*this, tmp); + for (size_t i = first; i < items.size(); ++i) items[i].member = false; + } + + // --- control flow: both sides list every branch ------------------------------ + template + void when(bool, F body) { + body(*this); + } + template + void repeat(const char*, std::vector&, F elem) { + T tmp{}; + size_t first = items.size(); + elem(*this, tmp); + for (size_t i = first; i < items.size(); ++i) items[i].member = false; + } + void rest(std::vector&) { has_rest = true; } + + // Run one shape's io() and return its item sequence. + template + static SchemaProbe of() { + SchemaProbe p; + T tmp{}; + tmp.io(p); + return p; + } + +private: + Item& add(Tag t, P prim, S shape) { + Item i; + i.tag = t.disk; // what actually goes on the wire, not the schema name + i.prim = prim; + i.shape = shape; + items.push_back(std::move(i)); + return items.back(); + } +}; + +// --------------------------------------------------------------------------- +// CoverageArchive — how much of a real save the shapes actually understand. +// +// A byte-identical round trip is not a coverage claim. shapes.h reaches it +// partly by typing fields and partly by carrying whole bodies as generic Nodes +// (`ar.any`, `ar.raw_frame`, and the `ar.rest` tail): a Node round-trips +// trivially because it is copied verbatim. This archive runs a *populated* +// shape's io() and separates the two — every item a field names is `typed`, +// every item that only survives because a Node carried it is `opaque`. +// +// Unlike SchemaProbe this one honours `when()`, because it walks real data. +class CoverageArchive { +public: + static constexpr bool reading = false, writing = false, building = false; + + size_t typed = 0, opaque = 0; + std::map opaque_by_tag; // where the untyped items are + + static size_t count(const Node& n) { + size_t c = 1; + for (const Node& k : n.children) c += count(k); + return c; + } + + void i32(Tag, int32_t&) { ++typed; } + void f32(Tag, float&) { ++typed; } + void b(Tag, bool&) { ++typed; } + void i64(Tag, int64_t&) { ++typed; } + void str(Tag, std::string&) { ++typed; } + void vec3(Tag, Vec3&) { typed += 4; } // the frame plus three floats + + void any(Tag t, Node& v) { charge(t.name, count(v)); } + void raw_frame(Tag t, Node& v) { charge(t.name, count(v)); } + + void opt_i32(Tag, std::optional& v) { typed += v.has_value(); } + void opt_f32(Tag, std::optional& v) { typed += v.has_value(); } + void opt_b(Tag, std::optional& v) { typed += v.has_value(); } + void opt_any(Tag t, std::optional& v) { + if (v) charge(t.name, count(*v)); + } + template + void opt_obj(Tag t, std::optional& v) { + if (v) obj(t, *v); + } + + template + void obj(Tag t, T& v) { + ++typed; // the frame item itself + const char* save = cur_; + cur_ = *t.name ? t.name : (*T::kStreamName ? T::kStreamName : cur_); + v.io(*this); + cur_ = save; + } + template + void obj_flex(Tag t, T& v, bool&) { + obj(t, v); + } + template + void carr(Tag t, std::vector& v) { + typed += 2; // the frame item and its "." count + for (T& e : v) elem_of(t.name, e); + } + template + void carr_flex(Tag t, std::vector& v, bool&) { + carr(t, v); + } + template + void narr(Tag, std::vector& v, F fn) { + ++typed; // the count item + for (T& e : v) fn(*this, e); + } + // A tag for the tail is not available here; `rest` is charged to "". + template + void when(bool cond, F body) { + if (cond) body(*this); + } + template + void repeat(const char*, std::vector& v, F fn) { + for (T& e : v) fn(*this, e); + } + void rest(std::vector& v) { + for (const Node& n : v) charge(std::string("", count(n)); + } + +private: + const char* cur_ = "root"; + void charge(const std::string& tag, size_t n) { + opaque += n; + if (n) opaque_by_tag[tag] += n; + } + void elem_of(const char* tag, Node& n) { charge(tag, count(n)); } + void elem_of(const char*, int32_t&) { ++typed; } + void elem_of(const char*, float&) { ++typed; } + void elem_of(const char*, std::string&) { ++typed; } + template + void elem_of(const char* tag, T& v) { + ++typed; // the element's own frame + const char* save = cur_; + cur_ = *tag ? tag : cur_; + v.io(*this); + cur_ = save; + } +}; + +inline const char* probe_prim_name(SchemaProbe::P p) { + switch (p) { + case SchemaProbe::P::Unknown: return "?"; + case SchemaProbe::P::I32: return "i32"; + case SchemaProbe::P::I64: return "i64"; + case SchemaProbe::P::F32: return "f32"; + case SchemaProbe::P::Bool: return "bool"; + case SchemaProbe::P::Str: return "str"; + case SchemaProbe::P::Frame: return "frame"; + case SchemaProbe::P::Raw: return "raw"; + } + return "?"; +} + +inline const char* probe_shape_name(SchemaProbe::S s) { + switch (s) { + case SchemaProbe::S::Scalar: return "scalar"; + case SchemaProbe::S::Frame: return "frame"; + case SchemaProbe::S::CArr: return "carr"; + case SchemaProbe::S::NArr: return "narr"; + case SchemaProbe::S::Raw: return "raw"; + } + return "?"; +} + +} // namespace mars::stream diff --git a/src/mars/stream/shapes.h b/src/mars/stream/shapes.h index b468012..ca13ed3 100644 --- a/src/mars/stream/shapes.h +++ b/src/mars/stream/shapes.h @@ -165,13 +165,20 @@ struct Summary { struct Planet { // SystemParams element, all tags "." static constexpr const char* kStreamName = ""; Vec3 pos; - int32_t p1 = 0, p2 = 0, p3 = 0; + // p1 is a std::string, not an int: SystemParams::Write calls the string + // writer for it (sots-re objects/streams.json, Game::SystemParams item 1). + // It is the empty string in every real save, and an empty string is four + // zero bytes -- byte-identical to the int 0 the community reader assumed, + // which is why reading it as an int has never broken a round trip. A save + // carrying a non-empty name here would have desynchronised the parse. + std::string p1; + int32_t p2 = 0, p3 = 0; float p4 = 0; std::vector extra; template void io(Ar& ar) { ar.vec3(R("pos"), pos); - ar.i32(R("p1"), p1); + ar.str(R("p1"), p1); ar.i32(R("p2"), p2); ar.i32(R("p3"), p3); ar.f32(R("p4"), p4); @@ -711,9 +718,16 @@ struct Odes { ar.rest(extra); } }; +// `odet` is a bool. ObservedWeapon::Write / ObservedTech::Write call the bool +// writer, and the campaign's hand-recovered struct table agrees (odet @+0x08, +// bool). The community reader models it as an int; that is byte-safe here only +// by coincidence -- with a 4-char tag a bool item and an int item both occupy 12 +// bytes, and the bool's three pad bytes are zeroed, so the two encodings are +// identical. A shorter tag would not have been so forgiving. struct Owep { static constexpr const char* kStreamName = ""; - int32_t ontF = 0, otnL = 0, odet = 0; + int32_t ontF = 0, otnL = 0; + bool odet = false; std::string owep; int32_t owith = 0; std::vector extra; @@ -721,15 +735,16 @@ struct Owep { void io(Ar& ar) { ar.i32(R("ontF", "otnF"), ontF); ar.i32(R("otnL", "otnL"), otnL); - ar.i32(R("odet", "odet"), odet); + ar.b(R("odet", "odet"), odet); ar.str(R("owep", "owep"), owep); ar.i32(R("owith", "owith"), owith); ar.rest(extra); } }; -struct Otch { +struct Otch { // see the note on Owep::odet static constexpr const char* kStreamName = ""; - int32_t ontF = 0, otnL = 0, odet = 0; + int32_t ontF = 0, otnL = 0; + bool odet = false; std::string otch; int32_t owith = 0; std::vector extra; @@ -737,7 +752,7 @@ struct Otch { void io(Ar& ar) { ar.i32(R("ontF", "otnF"), ontF); ar.i32(R("otnL", "otnL"), otnL); - ar.i32(R("odet", "odet"), odet); + ar.b(R("odet", "odet"), odet); ar.str(R("otch", "otch"), otch); ar.i32(R("owith", "owith"), owith); ar.rest(extra); @@ -759,19 +774,79 @@ struct Note { } }; +struct ShipSectionID { // Game::ShipSectionID: two "." ints + static constexpr const char* kStreamName = ""; + int32_t a = 0, b = 0; + std::vector extra; + template + void io(Ar& ar) { + ar.i32(R("a"), a); + ar.i32(R("b"), b); + ar.rest(extra); + } +}; +struct GunWeapon { // DW2: the weapon in a gun bank, named either by id or by name + static constexpr const char* kStreamName = "DW2"; + bool bID = false; // true: the weapon is identified by id, false: by family name + int32_t wid = 0; + std::string wfn; + int32_t did = 0; + std::vector extra; + template + void io(Ar& ar) { + ar.b(A("bID"), bID); + ar.when(bID, [&](Ar& a) { a.i32(A("wid"), wid); }); + ar.when(!bID, [&](Ar& a) { a.str(A("wfn"), wfn); }); + ar.i32(A("did"), did); + ar.rest(extra); + } +}; +struct GunBank { // one DGbnk2 element: an anonymous frame holding one DW2 + static constexpr const char* kStreamName = ""; + GunWeapon w; + std::vector extra; + template + void io(Ar& ar) { + ar.obj(A("DW2"), w); + ar.rest(extra); + } +}; +struct DesignSection { // Game::ShipDesignDef::Section, one DSec of a Des frame + static constexpr const char* kStreamName = "DSec"; + ShipSectionID sec; + std::vector gunBanks; + std::vector opts; // DOpts: the recovery says carr + std::vector extra; + template + void io(Ar& ar) { + ar.obj(A("DSec"), sec); + ar.carr(A("DGbnk2"), gunBanks); + ar.carr(A("DOpts"), opts); + ar.rest(extra); + } +}; struct Design { // on-disk tags are case variants of the reference names (FAIDes, DHide, DWep, DName) static constexpr const char* kStreamName = "Des"; bool faiDes = false, dHide = false; int32_t dWep = 0; std::string dName; - std::vector sections; + // The DSec run is uncounted -- it ends when the next tag stops being DSec. + // Game::ShipDesign::Write makes no stream call at all, so there is no recovered + // serializer for the Des frame itself; the section body is + // Game::ShipDesignDef::Section, which there is, and Dtc/Dwgv are from the saves. + std::vector sections; + int32_t dtc = 0, dwgv = 0; + std::vector extra; template void io(Ar& ar) { ar.b(R("faiDes", "FAIDes"), faiDes); ar.b(R("dHide", "DHide"), dHide); ar.i32(R("dWep", "DWep"), dWep); ar.str(R("dName", "DName"), dName); - ar.rest(sections); + ar.repeat("DSec", sections, [](Ar& a, DesignSection& e) { a.obj(A("DSec"), e); }); + ar.i32(A("Dtc"), dtc); + ar.i32(A("Dwgv"), dwgv); + ar.rest(extra); } }; @@ -828,9 +903,334 @@ struct NexpEntry { } }; +// ---- bodies typed from the recovered wire schema --------------------------------- +// Each of these was an `ar.any` blob until the serializer recovery named its items. +// The class each shape corresponds to is in the comment; tests/mars_stream/test_wire_schema.cpp +// checks the field list against include/generated/sots_stream_schema.h. + +struct EventRec { // Game::EventStorage::Event + static constexpr const char* kStreamName = ""; + int32_t evEID = 0; + std::string evDsc, evMsg, evImg; + int32_t evLoc = 0; + Vec3 evPos; + int32_t evAct = 0, evCID = 0; + std::vector extra; + template + void io(Ar& ar) { + ar.i32(A("EvEID"), evEID); + ar.str(A("EvDsc"), evDsc); + ar.str(A("EvMsg"), evMsg); + ar.str(A("EvImg"), evImg); + ar.i32(A("EvLoc"), evLoc); + ar.vec3(A("EvPos"), evPos); + ar.i32(A("EvAct"), evAct); + ar.i32(A("EvCID"), evCID); + ar.rest(extra); + } +}; +struct TurnEvents { // Game::EventStorage::TurnEvents + static constexpr const char* kStreamName = ""; + int32_t evTurn = 0; + std::vector events; + std::vector extra; + template + void io(Ar& ar) { + ar.i32(A("EvTurn"), evTurn); + ar.carr(A("Events"), events); + ar.rest(extra); + } +}; +struct EventStorage { // Game::EventStorage + static constexpr const char* kStreamName = "Events"; + int32_t evNxID = 0; + std::vector turns; + std::vector extra; + template + void io(Ar& ar) { + ar.i32(A("EvNxID"), evNxID); + ar.carr(A("Events"), turns); + ar.rest(extra); + } +}; +struct FleetNameGen { // Game::FleetNameGenerator + static constexpr const char* kStreamName = "FNG"; + int32_t fngNum = 0; + std::vector extra; + template + void io(Ar& ar) { + ar.i32(A("FNGNum"), fngNum); + ar.rest(extra); + } +}; +struct SpeciesRatios { // Game::SpeciesRatios + static constexpr const char* kStreamName = "spe"; + // `nv` is the count, not a field: the recovery marks sp and va2 as loop-body + // writes, and the saves agree -- nv==1 frames carry one (sp, va2) pair and + // nv==0 frames carry nothing at all. + struct Entry { + int32_t sp = 0, va2 = 0; + template + void io(Ar& ar) { + ar.i32(A("sp"), sp); + ar.i32(A("va2"), va2); + } + }; + std::vector ratios; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("nv"), ratios, [](Ar& a, Entry& e) { e.io(a); }); + ar.rest(extra); + } +}; +struct CivilianRatios { // Game::CivilianRatios + static constexpr const char* kStreamName = "civr"; + float smx = 0; + SpeciesRatios spe; + std::vector extra; + template + void io(Ar& ar) { + ar.f32(A("smx"), smx); + ar.obj(A("spe"), spe); + ar.rest(extra); + } +}; +struct TechNode { // one entry of Game::TechTree: a name and its branch names + int32_t numBrs = 0; + std::string tNm; + std::vector branches; + template + void io(Ar& ar) { + ar.str(A("TNm"), tNm); + ar.narr(A("NumBrs"), branches, [](Ar& a, std::string& e) { a.str(A("TNm"), e); }); + } +}; +struct TechState { // per-tech state, second NumTechs section of Game::TechTree + std::string tNm; + int32_t st = 0, tResCost = 0, tResDone = 0, tAcq = 0, tiAcq = 0, tbd = 0; + bool tfc = false; + int32_t tUnlck = 0; + template + void io(Ar& ar) { + ar.str(A("TNm"), tNm); + ar.i32(A("St"), st); + ar.i32(A("TResCost"), tResCost); + ar.i32(A("TResDone"), tResDone); + ar.i32(A("TAcq"), tAcq); + ar.i32(A("TiAcq"), tiAcq); + ar.i32(A("Tbd"), tbd); + ar.b(A("Tfc"), tfc); + ar.i32(A("TUnlck"), tUnlck); + } +}; +struct TechTree { // Game::TechTree + static constexpr const char* kStreamName = "TechTree"; + // TechTree::Write emits *two* NumTechs-counted sections: the tree topology + // (each tech's name and its branch names) and then the per-tech state. The + // recovery sees only the first under Game::TechTree; the second section's + // field list and types are the ones Game::SpyReportTechTree names -- the spy + // report streams the same per-tech record -- which is where Tfc being a bool + // rather than an int comes from. + std::vector techs; + std::vector state; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("NumTechs"), techs, [](Ar& a, TechNode& e) { e.io(a); }); + ar.narr(A("NumTechs"), state, [](Ar& a, TechState& e) { e.io(a); }); + ar.rest(extra); + } +}; +struct ShipRecord { // one entry of Game::ShipRecords + int32_t srb = 0, srl = 0, srk = 0, sri = 0; + template + void io(Ar& ar) { + ar.i32(A("srb"), srb); + ar.i32(A("srl"), srl); + ar.i32(A("srk"), srk); + ar.i32(A("sri"), sri); + } +}; +struct DesignRecord { // second section of Game::ShipRecords -- note: no srk + int32_t srd = 0, src = 0, srb = 0, srl = 0, sri = 0; + template + void io(Ar& ar) { + ar.i32(A("srd"), srd); + ar.i32(A("src"), src); + ar.i32(A("srb"), srb); + ar.i32(A("srl"), srl); + ar.i32(A("sri"), sri); + } +}; +struct ShipRecords { // Game::ShipRecords + static constexpr const char* kStreamName = "ShipRecs"; + // Two counted sections. `srbd` is the second COUNT, not a field: the recovery + // lists srd/src/srb/srl/sri right after it, and the saves confirm srbd records + // follow (srbd is 0, 1, 3 or 4 across the players available). + std::vector recs; + std::vector designs; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("srnc"), recs, [](Ar& a, ShipRecord& e) { e.io(a); }); + ar.narr(A("srbd"), designs, [](Ar& a, DesignRecord& e) { e.io(a); }); + ar.rest(extra); + } +}; +struct AIEncounterFlags { // Game::AIEncounterFlags + static constexpr const char* kStreamName = "AIEnf"; + struct Entry { + int32_t fid = 0, ast = 0; + template + void io(Ar& ar) { + ar.i32(A("Fid"), fid); + ar.i32(A("Ast"), ast); + } + }; + std::vector entries; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("Nas"), entries, [](Ar& a, Entry& e) { e.io(a); }); + ar.rest(extra); + } +}; +struct PlayerAid { // Game::PlayerAid, one element of the "aid" array + static constexpr const char* kStreamName = ""; + int32_t aidto = 0, aidsa = 0, aidst = 0, aidrai = 0, aidrt = 0; + std::vector extra; + template + void io(Ar& ar) { + ar.i32(A("aidto"), aidto); + ar.i32(A("aidsa"), aidsa); + ar.i32(A("aidst"), aidst); + ar.i32(A("aidrai"), aidrai); + ar.i32(A("aidrt"), aidrt); + ar.rest(extra); + } +}; +struct CommMessages { // Game::CommMessageContainer + static constexpr const char* kStreamName = "comms"; + struct Entry { + int32_t msgt = 0; + Node msg; // Game::ICommMessage: polymorphic, the subtype is msgt + template + void io(Ar& ar) { + ar.i32(A("msgt"), msgt); + ar.any(A("msg"), msg); + } + }; + std::vector msgs; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("nmsg"), msgs, [](Ar& a, Entry& e) { e.io(a); }); + ar.rest(extra); + } +}; +struct SpyReport { // Game::SpyReport: four counted lists, one per report kind + static constexpr const char* kStreamName = "spy2"; + std::vector defences, trade, events, techTree; + std::vector extra; + template + void io(Ar& ar) { + // Every count is 0 in every save available, so the element shapes named by + // the recovery (SpyReportDefences / …Trade / …Events / …TechTree) are + // unverified; the counts and the tags of the element frames are not. + ar.narr(A("defc2"), defences, [](Ar& a, Node& e) { a.any(A("def"), e); }); + ar.narr(A("rtc"), trade, [](Ar& a, Node& e) { a.any(A("strd"), e); }); + ar.narr(A("evc"), events, [](Ar& a, Node& e) { a.any(A("evs"), e); }); + ar.narr(A("ttc"), techTree, [](Ar& a, Node& e) { a.any(A("tt"), e); }); + ar.rest(extra); + } +}; +struct TradeSector { // Game::ServerTradeSector + static constexpr const char* kStreamName = "Trade"; + Vec3 pos, ctr; + int32_t gridID = 0, tssec = 0, tsct = 0, tscr = 0, ptssec = 0, ptsct = 0, ptscr = 0; + std::vector fwarn; // ServerTradeSector::FreighterWarning; empty in every save available + std::vector systems, fleets; + std::vector extra; + template + void io(Ar& ar) { + ar.vec3(A("Pos"), pos); + ar.i32(A("tsgridID"), gridID); + ar.vec3(A("tsctr"), ctr); + ar.i32(A("tssec"), tssec); + ar.i32(A("tsct"), tsct); + ar.i32(A("tscr"), tscr); + ar.i32(A("ptssec"), ptssec); + ar.i32(A("ptsct"), ptsct); + ar.i32(A("ptscr"), ptscr); + ar.carr(A("fwarn"), fwarn); + ar.narr(A("tsnumsys"), systems, [](Ar& a, int32_t& e) { a.i32(A("tssys"), e); }); + ar.narr(A("tsnumflt"), fleets, [](Ar& a, int32_t& e) { a.i32(A("tsflt"), e); }); + ar.rest(extra); + } +}; +struct TradeManager { // Game::ServerTradeManagerImpl + // The `trdmgr` member is declared as Game::ServerTradeManager, whose Read and + // Write really are the inherited no-op -- the campaign recorded that as an open + // trap. The call is virtual: the object is a ServerTradeManagerImpl, and *that* + // class has a real serializer, which is where this field list comes from. The + // same shape resolves Game::IServerSpyManager -> Game::ServerSpyManager below. + static constexpr const char* kStreamName = "trdmgr"; + struct Entry { + int32_t tradeID = 0; + TradeSector trade; + template + void io(Ar& ar) { + ar.i32(A("TradeID"), tradeID); + ar.obj(A("Trade"), trade); + } + }; + std::vector sectors; + float sctSize = 0; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("NumTradeSectors"), sectors, [](Ar& a, Entry& e) { e.io(a); }); + ar.f32(A("SctSize"), sctSize); + ar.rest(extra); + } +}; +struct SpyManager { // Game::ServerSpyManager + static constexpr const char* kStreamName = "spymgr"; + int32_t xsid = 0; + std::vector spies; // Game::SpyCraft frames; nspy is 0 in every save available + std::vector extra; + template + void io(Ar& ar) { + ar.i32(A("xsid"), xsid); + ar.narr(A("nspy"), spies, [](Ar& a, Node& e) { a.any(A("spy"), e); }); + ar.rest(extra); + } +}; +struct ProjectName { // one entry of Game::SpecialProjectNameGen + std::vector used; // usnc is 0 in every save available + std::string nm, ntg; + template + void io(Ar& ar) { + ar.narr(A("usnc"), used, [](Ar& a, Node& e) { a.any(A("usc"), e); }); + ar.str(A("Nm"), nm); + ar.str(A("Ntg"), ntg); + } +}; +struct ProjectNames { // Game::SpecialProjectNameGen + static constexpr const char* kStreamName = "sprjs"; + std::vector names; + std::vector extra; + template + void io(Ar& ar) { + ar.narr(A("NNms2"), names, [](Ar& a, ProjectName& e) { e.io(a); }); + ar.rest(extra); + } +}; + struct Player { static constexpr const char* kStreamName = "Player"; - Node techTree; + TechTree techTree; int32_t homeSys = 0, plyrIdx = 0; std::string plryName; int32_t species = 0; @@ -853,18 +1253,20 @@ struct Player { bool elim = false, npc = false, rebAI = false, reqCL = false; Alliances alliances; int32_t hasVac = 0, hasImm = 0, npTrk = 0, hasDisc = 0, hasDiscSp = 0, hasDiscCl = 0, hasEnc = 0, hasEng = 0; - Node events, fng; + EventStorage events; + FleetNameGen fng; int32_t pvSav = 0; bool pvMA = false, aiBn = false, cnTrd = false, cnRad = false, hgs = false, hadvs = false, harcc = false, cnVItl = false; float pddm = 0; int32_t bnkWrn = 0, bnkTrn = 0, bnkPr = 0, bnkEl = 0; - Node shipRecs; + ShipRecords shipRecs; int32_t nextPrjID = 0, plcy = 0; std::string pswd; int32_t lret = 0, nmeid = 0; bool cdp = false; - Node spy2, civr; + SpyReport spy2; + CivilianRatios civr; int32_t aidf = 0; bool srn = false; int32_t srnTo = 0, lboid = 0; @@ -881,25 +1283,25 @@ struct Player { bool hasAIR = false; Node air; bool cta = false; - Node aiEnf; + AIEncounterFlags aiEnf; std::vector specialProjects; std::vector nexp; std::vector weapXcl; - Node ojvs; + std::vector ojvs; // Game::Objective elements; the count is 0 in every save available std::vector dipstats; - Node comms; + CommMessages comms; std::vector preps; std::vector odes; std::vector owep; std::vector otch; - Node aid; + std::vector aid; std::vector defLayouts, raidTargets; int32_t tnc = 0; std::vector extra; template void io(Ar& ar) { - ar.any(A("TechTree"), techTree); + ar.obj(A("TechTree"), techTree); ar.i32(A("HomeSys"), homeSys); ar.i32(A("PlyrIdx"), plyrIdx); ar.str(A("PlryName"), plryName); @@ -951,8 +1353,8 @@ struct Player { ar.i32(A("HasDiscCl"), hasDiscCl); ar.i32(A("HasEnc"), hasEnc); ar.i32(A("HasEng"), hasEng); - ar.any(A("Events"), events); - ar.any(A("FNG"), fng); + ar.obj(A("Events"), events); + ar.obj(A("FNG"), fng); ar.i32(A("PvSav"), pvSav); ar.b(A("PvMA"), pvMA); ar.b(A("AIBn"), aiBn); @@ -967,15 +1369,15 @@ struct Player { ar.i32(A("BnkTrn"), bnkTrn); ar.i32(A("BnkPr"), bnkPr); ar.i32(A("BnkEl"), bnkEl); - ar.any(A("ShipRecs"), shipRecs); + ar.obj(A("ShipRecs"), shipRecs); ar.i32(A("NextPrjID"), nextPrjID); ar.i32(A("plcy"), plcy); ar.str(A("pswd"), pswd); ar.i32(A("lret"), lret); ar.i32(A("nmeid"), nmeid); ar.b(A("cdp"), cdp); - ar.any(A("spy2"), spy2); - ar.any(A("civr"), civr); + ar.obj(A("spy2"), spy2); + ar.obj(A("civr"), civr); ar.i32(A("aidf"), aidf); ar.b(A("Srn"), srn); ar.i32(A("SrnTo"), srnTo); @@ -993,18 +1395,18 @@ struct Player { ar.b(A("HasAIR"), hasAIR); ar.when(hasAIR, [&](Ar& a) { a.any(A("AIR"), air); }); ar.b(A("cta"), cta); - ar.any(A("AIEnf"), aiEnf); + ar.obj(A("AIEnf"), aiEnf); ar.narr(A("NSprj"), specialProjects, [](Ar& a, SprjEntry& e) { e.io(a); }); ar.narr(A("Nexp"), nexp, [](Ar& a, NexpEntry& e) { e.io(a); }); ar.narr(A("NWeapXcl"), weapXcl, [](Ar& a, int32_t& e) { a.i32(A("WeapXcl"), e); }); - ar.any(A("Ojvs"), ojvs); + ar.carr(A("Ojvs"), ojvs); ar.carr(A("dipstats"), dipstats); - ar.any(A("comms"), comms); + ar.obj(A("comms"), comms); ar.carr(A("preps"), preps); ar.carr(A("odes"), odes); ar.carr(A("owep"), owep); ar.carr(A("otch"), otch); - ar.any(A("aid"), aid); + ar.carr(A("aid"), aid); ar.narr(A("ndeflay"), defLayouts, [](Ar& a, Node& e) { a.any(A("deflay"), e); }); ar.narr(A("rdtc"), raidTargets, [](Ar& a, Node& e) { a.any(A("rdt"), e); }); ar.i32(A("tnc"), tnc); @@ -1467,7 +1869,7 @@ struct Sim { int32_t npcm = 0, npco = 0, npci = 0, npcv = 0, npca = 0; std::optional npc; float szadj = 0, rsadj = 0, suadj = 0; - Node sprjs; + ProjectNames sprjs; float randEncAdj = 0; int32_t cmbtid = 0; TurnStats turnstats; @@ -1478,7 +1880,8 @@ struct Sim { std::vector species; std::vector systems; NodeGrid ndGr2; - Node trdmgr, spymgr; + TradeManager trdmgr; + SpyManager spymgr; std::vector fleets; std::vector acts; std::optional svSctOb; @@ -1523,7 +1926,7 @@ struct Sim { ar.f32(A("szadj"), szadj); ar.f32(A("rsadj"), rsadj); ar.f32(A("suadj"), suadj); - ar.any(A("sprjs"), sprjs); + ar.obj(A("sprjs"), sprjs); ar.f32(A("RandEncAdj"), randEncAdj); ar.i32(A("cmbtid"), cmbtid); ar.obj(A("turnstats"), turnstats); @@ -1543,8 +1946,8 @@ struct Sim { ar.repeat("ISsp", species, [](Ar& a, Species& e) { e.io(a); }); // 7 pairs, no count ar.narr(A("NumSys"), systems, [](Ar& a, SysEntry& e) { e.io(a); }); ar.obj(A("NdGr2"), ndGr2); - ar.any(A("trdmgr"), trdmgr); - ar.any(A("spymgr"), spymgr); + ar.obj(A("trdmgr"), trdmgr); + ar.obj(A("spymgr"), spymgr); ar.narr(A("NumFlts"), fleets, [](Ar& a, FleetEntry& e) { e.io(a); }); ar.narr(A("NumActs"), acts, [](Ar& a, int32_t& e) { a.i32(A("Act"), e); }); ar.opt_any(A("SvSctOb"), svSctOb); // only if the pointer was non-NULL diff --git a/tests/mars_stream/CMakeLists.txt b/tests/mars_stream/CMakeLists.txt index 41368b2..74513b2 100644 --- a/tests/mars_stream/CMakeLists.txt +++ b/tests/mars_stream/CMakeLists.txt @@ -16,3 +16,12 @@ foreach(_t mars_stream_test_rng mars_stream_test_stream mars_stream_test_save) target_include_directories(${_t} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_compile_options(${_t} PRIVATE -Wall -Wextra -Wpedantic) endforeach() + +# Conformance of the typed shapes against the wire schema recovered from the game's +# serializers (include/generated/sots_stream_schema.h). No game data: the generated +# table plus shapes.h, so this one always runs. +add_executable(mars_stream_test_wire_schema test_wire_schema.cpp) +target_link_libraries(mars_stream_test_wire_schema PRIVATE mars_stream sots_addresses) +add_test(NAME mars_stream_wire_schema COMMAND mars_stream_test_wire_schema) +target_include_directories(mars_stream_test_wire_schema PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_compile_options(mars_stream_test_wire_schema PRIVATE -Wall -Wextra -Wpedantic) diff --git a/tests/mars_stream/test_save.cpp b/tests/mars_stream/test_save.cpp index 7741398..2332dab 100644 --- a/tests/mars_stream/test_save.cpp +++ b/tests/mars_stream/test_save.cpp @@ -16,6 +16,7 @@ #include "mars/rng/mt19937.h" #include "mars/stream/dump.h" +#include "mars/stream/probe.h" #include "mars/stream/save.h" using namespace mars::stream; @@ -104,6 +105,27 @@ static void check_save(const std::string& path, const char* dump_dir) { CHECK(twists >= 0); } + // --- coverage: what the shapes understand vs what a Node merely carries --------- + // The round trip below is byte-identical either way, because an opaque Node is + // copied verbatim. This is the number that actually moves when a body gets typed. + { + CoverageArchive cov; + doc.game.io(cov); + size_t total = cov.typed + cov.opaque; + double pct = total ? 100.0 * double(cov.typed) / double(total) : 0.0; + std::printf(" coverage: %zu typed, %zu opaque (%.1f%% of %u stream items typed)\n", cov.typed, + cov.opaque, pct, doc.stats.items); + std::vector> worst; + for (const auto& kv : cov.opaque_by_tag) worst.emplace_back(kv.second, kv.first); + std::sort(worst.rbegin(), worst.rend()); + std::printf(" still opaque:"); + for (size_t i = 0; i < worst.size() && i < 8; ++i) + std::printf(" %s=%zu", worst[i].second.c_str(), worst[i].first); + std::printf("\n"); + // Ratchet, not a target: typing a body must never silently regress. + CHECK(pct >= 95.0); + } + // --- round trips ------------------------------------------------------------------ Bytes tree_bytes = write_tree(doc.tree); CHECK(tree_bytes == doc.inflated); diff --git a/tests/mars_stream/test_wire_schema.cpp b/tests/mars_stream/test_wire_schema.cpp new file mode 100644 index 0000000..48cf0c8 --- /dev/null +++ b/tests/mars_stream/test_wire_schema.cpp @@ -0,0 +1,245 @@ +// Conformance: every typed shape in shapes.h vs the wire schema recovered from +// the game's own Mars::IStreamable serializers (include/generated/sots_stream_schema.h). +// +// Why a check and not a generator. The recovered table is a *specification*, not +// a program: the recovery is a linear pass over the game's Write and cannot see +// Write's branches, so a conditional field (StarShip's BQ2, gated by hbq) is +// listed unconditionally and the sequence is a superset of any single record. +// Container loops are flattened the same way. A codec driven straight off the +// table would desynchronise on the first branch. The hand-written io() shapes +// stay the codec — they can express the conditionals and the nesting that the +// binary facts cannot supply — and this test is what proves they agree with the +// binary, item for item, in order. +// +// SchemaProbe runs each io() with every branch taken, which is the same "all +// branches" view the recovery has, so the two sequences are comparable. They +// are aligned with an LCS and three numbers come out: +// +// matched the shape and the binary agree on tag and on-disk primitive +// MISMATCH same tag, different primitive — a real bug, and a hard failure +// wire-only the binary writes an item the shape does not name: either a +// conditional the shape models with opt_*/when, or genuine +// coverage debt +// shape-only the shape names an item the recovery did not resolve +// +// Opaque items (ar.any / ar.raw_frame — a body carried as a Node) are counted +// separately: they round-trip byte-for-byte but are not understood, and the +// count is this codebase's honest coverage number. +// +// No game data, no saves: the whole test is the generated table plus shapes.h. +#include +#include +#include +#include + +#include "generated/sots_stream_schema.h" +#include "mars/stream/probe.h" +#include "mars/stream/shapes.h" + +using namespace mars::stream; +namespace sh = mars::stream::shapes; + +static int fails = 0; +#define CHECK(cond) \ + do { \ + if (!(cond)) { \ + std::printf("FAIL %s:%d: %s\n", __FILE__, __LINE__, #cond); \ + ++fails; \ + } \ + } while (0) + +// --- primitive compatibility ------------------------------------------------- +// The generated Prim is the DISK type: a member the original holds as int16 or +// int8 is written by Stream::WriteInt and is I32 on the wire, so there is no +// narrow integer to reconcile here. +static bool prim_ok(SchemaProbe::P got, sots::wire::Prim want) { + using P = SchemaProbe::P; + using W = sots::wire::Prim; + if (want == W::Unknown) return true; // recovery could not type it + switch (got) { + case P::Unknown: return true; // opaque on our side: any disk type fits + case P::I32: return want == W::I32; + case P::I64: return want == W::I64; + case P::F32: return want == W::F32; + case P::Bool: return want == W::Bool; + case P::Str: return want == W::Str; + case P::Frame: return want == W::Frame; + case P::Raw: return want == W::Raw || want == W::I64; + } + return false; +} + +struct Result { + int matched = 0, mismatch = 0, wire_only = 0, shape_only = 0; + int opaque = 0; +}; + +// LCS alignment on (tag, compatible primitive). Sequences are short (<= 120). +static Result align(const std::vector& a, const sots::wire::Class& c, bool verbose) { + const size_t n = a.size(), m = c.count; + std::vector> dp(n + 1, std::vector(m + 1, 0)); + auto eq = [&](size_t i, size_t j) { + return a[i].tag == c.fields[j].tag && prim_ok(a[i].prim, c.fields[j].prim); + }; + for (size_t i = n; i-- > 0;) + for (size_t j = m; j-- > 0;) + dp[i][j] = eq(i, j) ? dp[i + 1][j + 1] + 1 : std::max(dp[i + 1][j], dp[i][j + 1]); + + Result r; + for (const SchemaProbe::Item& it : a) r.opaque += it.opaque; + size_t i = 0, j = 0; + while (i < n && j < m) { + if (eq(i, j)) { + ++r.matched; + ++i; + ++j; + continue; + } + // Same tag, incompatible primitive: not a gap, a disagreement. + if (a[i].tag == c.fields[j].tag) { + ++r.mismatch; + std::printf(" MISMATCH %-20s shape %-6s vs wire %-6s\n", a[i].tag.c_str(), + probe_prim_name(a[i].prim), sots::wire::prim_name(c.fields[j].prim)); + ++i; + ++j; + continue; + } + if (dp[i + 1][j] >= dp[i][j + 1]) { + ++r.shape_only; + if (verbose) + std::printf(" shape-only %-20s %s\n", a[i].tag.c_str(), probe_prim_name(a[i].prim)); + ++i; + } else { + ++r.wire_only; + if (verbose) + std::printf(" wire-only %-20s %s %s\n", c.fields[j].tag, + sots::wire::prim_name(c.fields[j].prim), + sots::wire::shape_name(c.fields[j].shape)); + ++j; + } + } + for (; i < n; ++i) { + ++r.shape_only; + if (verbose) std::printf(" shape-only %-20s %s\n", a[i].tag.c_str(), probe_prim_name(a[i].prim)); + } + for (; j < m; ++j) { + ++r.wire_only; + if (verbose) + std::printf(" wire-only %-20s %s %s\n", c.fields[j].tag, sots::wire::prim_name(c.fields[j].prim), + sots::wire::shape_name(c.fields[j].shape)); + } + return r; +} + +static int total_matched = 0, total_mismatch = 0, total_wire_only = 0, total_opaque = 0; +static int bound = 0, unresolved_classes = 0; + +template +static void check(const char* shape_name, const char* cls) { + const sots::wire::Class* c = sots::wire::find(cls); + if (!c) { + std::printf(" %-18s -> %-34s NOT IN TABLE\n", shape_name, cls); + ++fails; + return; + } + SchemaProbe p = SchemaProbe::of(); + bool verbose = std::getenv("SOTS_WIRE_VERBOSE") != nullptr; + Result r = align(p.items, *c, verbose); + ++bound; + total_matched += r.matched; + total_mismatch += r.mismatch; + total_wire_only += r.wire_only; + total_opaque += r.opaque; + std::printf(" %-18s -> %-34s [%-8s %2u/%-2u] shape %2zu wire %2u match %2d" + " wire-only %2d shape-only %2d opaque %d\n", + shape_name, cls, c->grade, c->read_agree, c->read_comparable, p.items.size(), c->count, + r.matched, r.wire_only, r.shape_only, r.opaque); + // A tag both sides name, typed differently, is a real disagreement between + // our codec and the binary. Nothing else here is allowed to fail the build: + // wire-only is conditional-field or coverage debt and is reported, not fatal. + CHECK(r.mismatch == 0); +} + +int main() { + std::printf("wire schema: %zu classes, generated from the game's serializers\n\n", + sots::wire::kClassCount); + + // --- the table's own integrity ------------------------------------------------- + for (const sots::wire::Class& c : sots::wire::kClasses) { + if (c.count == 0) continue; + for (uint16_t k = 0; k < c.count; ++k) unresolved_classes += c.fields[k].unresolved; + } + + std::printf("shape -> class (recovery tier, Read/Write cross-check)\n"); + // Bindings taken from the campaign's own shape->Write table + // (sots-re tools/serializers_golden.py DISK_ORDER, resolved through RTTI), + // extended with unambiguous name matches. + check("Summary", "Game::StrategyGameInfo"); + check("Slot", "Game::SlotDef"); + check("PlayerSettings", "Game::StrategyPlayerGameSettings"); + check("PlayerColor", "Game::PlayerColorID"); + check("Session", "Game::StrategySessionParams"); + check("CreateParams", "Game::StrategyGameCreateParams"); + check("Scrp", "Game::StrategyScriptParams"); + check("MapP", "Game::StarMapParams"); + check("Planet", "Game::SystemParams"); + check("Sim", "Game::StrategyServer"); + check("Sys", "Game::ServerSystem"); + check("Player", "Game::ServerPlayer"); + check("Fleet", "Game::StarFleet"); + check("Ship", "Game::StarShip"); + check("FlightPlan", "Game::FlightPlan"); + check("Waypoint", "Game::FlightPlan::Waypoint"); + check("PrisonerHold", "Game::PrisonerHold"); + check("Otch", "Game::ObservedTech"); + check("Owep", "Game::ObservedWeapon"); + check("Odes", "Game::ObservedDesign"); + check("Rts", "Game::StarSystem::OutputRates"); + check("PlayerView", "Game::StarSystem::PlayerView"); + check("IndependenceInfo", "Game::IndependenceInfo"); + check("BuildOrder", "Game::ShipBuildOrder"); + check("BuildQueue", "Game::BuildQueue"); + check("Prep", "Game::PlayerReport"); + check("DipStat", "Game::DiplomacyStats"); + check("Alliances", "Game::PlayerAlliances"); + check("NodeRoute", "Game::NodeRoute"); + check("SystemEvent", "Game::SystemEvent"); + check("PlayerTurnStats", "Game::PlayerTurnStats"); + check("PlayerTurnHistory", "Game::PlayerTurnHistory"); + check("TurnStats", "Game::GameTurnHistory"); + check("PopG", "Game::PopulationGroup"); + check("Population", "Game::Population"); + check("Morale", "Game::Morale"); + check("MoraleEvent", "Game::MoraleEvent"); + // Game::SimpleNodePath is a different, 2-item type — it is what MapP.nodePaths + // holds (VectorHelper), and it is empty in every real save. + check("NodePath", "Game::NodePath"); + + // Bodies typed this round from the recovered schema (previously opaque Nodes). + check("EventStorage", "Game::EventStorage"); + check("TurnEvents", "Game::EventStorage::TurnEvents"); + check("EventRec", "Game::EventStorage::Event"); + check("FleetNameGen", "Game::FleetNameGenerator"); + check("SpeciesRatios", "Game::SpeciesRatios"); + check("CivilianRatios", "Game::CivilianRatios"); + check("TechTree", "Game::TechTree"); + check("ShipRecords", "Game::ShipRecords"); + check("AIEncounterFlags", "Game::AIEncounterFlags"); + check("PlayerAid", "Game::PlayerAid"); + check("CommMessages", "Game::CommMessageContainer"); + check("SpyReport", "Game::SpyReport"); + check("SpyManager", "Game::ServerSpyManager"); + check("ProjectNames", "Game::SpecialProjectNameGen"); + check("TradeManager", "Game::ServerTradeManagerImpl"); + check("TradeSector", "Game::ServerTradeSector"); + check("ShipSectionID", "Game::ShipSectionID"); + check("DesignSection", "Game::ShipDesignDef::Section"); + + std::printf( + "\ntotals: %d shapes bound, %d items matched, %d MISMATCH, %d wire-only, " + "%d opaque item(s) in bound shapes\n", + bound, total_matched, total_mismatch, total_wire_only, total_opaque); + std::printf("table: %d item(s) the recovery itself could not type\n", unresolved_classes); + std::printf("test_wire_schema: %s (%d failures)\n", fails ? "FAILED" : "ok", fails); + return fails ? 1 : 0; +}