Aetheria/Aetheria.State/README.md
2026-06-13 10:01:20 +01:00

111 lines
6.3 KiB
Markdown

# Aetheria.State
`Aetheria.State` is the replacement owner for durable Aetheria game state.
It uses modern `GameCult.Caching`, `GameCult.Caching.MessagePack`, and
`GameCult.Mesh`. It does not reference the old `Assets/Scripts/ServerShared`
tree, RethinkDB, JsonKnownTypes, or Newtonsoft.Json.
The first live state file is `GameData/aetheria-world.cc`. It is generated by
`Aetheria.State.Import` from checked-in legacy catalog inputs without embedding
machine-local absolute paths. Legacy files such as `GameData/AetherDB.msgpack`
are migration inputs only.
The typed runtime state model is split into player settings, run state, zone
state, entity snapshots, item slots, weapon groups, action-bar bindings, and
stat grids. Do not preserve `SavedGame` or `EntityPack` as opaque payloads in
the new store; they are source shapes for migration, not portable state
authority.
The Unity client no longer writes `PlayerSettings.msgpack`, `.loadout`, or
`.zone` files. Until `Aetheria.State` is available to Unity as a runtime Verse
package, player settings and loadout edits are session-local and run saving is
disabled. That is intentional: the missing runtime package is the owner gap, and
the old bespoke file formats must not keep acting as durable truth while the
state spine is being rebuilt.
The old `SavedGame`/`SavedZone` DTOs and `Galaxy` loader constructor have also
been deleted; the new document family is live Verse run/zone state, not a
bespoke save-file format.
The dead `SavedStory` JSON DTO is gone. `ZonePack` and `EntityPack` remain
in-memory construction/loadout snapshots for Unity runtime code, but no longer
carry MessagePack persistence attributes.
Keyboard layout rendering now reads the checked-in Unity text asset directly.
The old generated `GameData/KeyboardLayouts/*.msgpack` cache was deleted; layout
edits are runtime-only until Verse owns a typed layout/settings document.
The old IMGUI CultCache database editor has been deleted, and `NameTools` no
longer exports `NameFile/*.msgpack`. `AetherDB.msgpack` and existing name files
remain legacy catalog inputs only; typed catalog migration is the next owner
move.
`Aetheria.State.Import` captures the legacy catalog files into typed quarantine
state: path, size, and SHA-256 fingerprint for `AetherDB.msgpack` plus
`NameFile/*.msgpack`, and a migration ledger update. It also performs a bounded
raw MessagePack union pass that maps stable catalog fields into typed
item/faction/name-file documents without compiling Unity's legacy domain model
into `Aetheria.State`. The current checked-in catalog maps to 115 item
definitions, 12 factions, and 12 name files. Typed item definitions include
legacy manufacturer IDs, price, shape dimensions, occupied cell counts, full
shape-cell masks, interior shape masks for hull/cargo equipment, hull hardpoint
definitions, behavior kind fingerprints, typed recursive behavior payloads, and
stable equipment facets: hardpoint type, hull type, stack size, durability, and
weapon range/caliber/type/fire/modifier classifications.
Typed corporation documents include the legacy short name, the true description
field from key 3, name-file and boss-hull legacy IDs, influence distance,
allegiance count, and music bank IDs. Runtime object graphs, typed behavior
factory construction, and simulation state remain legacy until dedicated typed
runtime documents exist.
Legacy GUID references that are `Guid.Empty` are imported as absent references,
not as resolvable catalog links.
`AetheriaCatalogSnapshot` is the typed read surface over materialized catalog
documents. It exposes trade items, legacy-ID lookup, manufacturer lookup,
corporation prefix lookup, corporation name-file lookup, equipment items,
behavior lookup, and hardpoint lookup without reading `DatabaseEntry` objects.
`AetheriaCatalogSurfaceProjector` publishes the first Eve-compatible provider
surface from typed catalog state. The importer materializes
`gamecult.eve.surface.v1` at `eve:surface:aetheria.catalog.operator` with
summary, trade-catalog, and corporation views. This is a typed CultCache
provider document and a local mirror of the Eve contract until the shared Eve
Unity UI Toolkit lowering package exists.
`Aetheria.State.Unity` is the Unity-facing runtime read facade over typed state.
It opens `aetheria-world.cc`, emits immutable catalog read models for trade,
equipment, behavior, hardpoint, manufacturer, corporation, and name-file
queries, exposes typed item shape masks for layout and fitting consumers, and
exposes typed interior masks and hardpoints for equipment/cargo layout
consumers, exposes typed behavior payload read models, and can read the
published Eve catalog surface. It does not deserialize legacy `DatabaseEntry`
objects and does not write state. Unity can use this as the first package
boundary once CultLib/Eve runtime packaging is available.
`Aetheria.State.Verify` opens a materialized state file and checks that the
typed migration ledger matches the actual item, corporation, and name-file
records in the `.cc` store. It also verifies the canonical legacy-ID lookup API
for one migrated record of each catalog kind and checks that expanded item and
corporation catalog facts survived materialization. The verifier also exercises
the typed catalog snapshot query surface, shape-mask invariants, and the
typed behavior payload tree, and the published Eve catalog surface. The current
catalog materializes 65 behavior payloads, 661 behavior fields, and 18
behavior-side legacy-ID references. Legacy content currently includes at least
one overhanging hardpoint; the verifier preserves the payload and checks
hardpoint local masks rather than silently converting content repair into
migration.
Use it after import when `GameData/aetheria-world.cc` changes.
`Aetheria.State.Unity.Smoke` opens the materialized state through the runtime
facade and proves read-only Unity-facing catalog access without the legacy
catalog reader.
Current rebuild notes:
- `MessagePack` 3.1.4 is pulled transitively through CultLib and is currently
flagged by NuGet advisory `GHSA-hv8m-jj95-wg3x`; update CultLib's
`GameCult.Caching.MessagePack` package ownership rather than adding a local
Aetheria override.
- `CultRecordRef<T>` should become the persisted reference shape once the
MessagePack source-generator path handles the GameCult formatter cleanly.
Until then, v1 profile documents store explicit record-key strings at the
persistence boundary.