465 lines
30 KiB
Markdown
465 lines
30 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 files are `GameData/aetheria-world.cc` for daemon-owned
|
|
Verse state and `GameData/aetheria-client.cc` for the client-owned active Verse
|
|
target. `Aetheria.State.Import` generates the daemon-owned world file 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, loadout templates,
|
|
run state, zone state, entity snapshots, item slots, weapon groups, action-bar
|
|
bindings, stat grids, and runtime session documents. Runtime checkpoints
|
|
include current action-bar bindings as stable typed targets: input control
|
|
path, binding kind, item key, equipment index, behavior index,
|
|
or weapon-group index. They also include current faction relationship rows as
|
|
typed corporation references plus relationship tokens and numeric standings.
|
|
Zone checkpoints include typed orbit and body rows for generated celestial
|
|
state: orbit IDs, parent IDs, distance, phase, fixed positions, body kind,
|
|
typed resource item keys, gravity/body multipliers, asteroid entries, and gas/sun visual
|
|
parameters. Entity checkpoints include typed simulation stat grids for
|
|
temperature, thermal mass, armor, max armor, and hull-conductivity axes.
|
|
Player settings include player name, tutorial flag,
|
|
story-file hash cursors, gameplay formatting, graphics preferences, input
|
|
binding overrides, and action-bar inputs. Do not preserve `SavedGame`, Unity
|
|
runtime settings projections, or runtime entity blueprints as opaque payloads in
|
|
the new store; they are source shapes for projection, not portable state
|
|
authority.
|
|
|
|
The Unity client no longer writes `PlayerSettings.msgpack`, `.loadout`, or
|
|
`.zone` files. `AetheriaPlayerSettings` is the typed Verse replacement for
|
|
`PlayerSettings.msgpack`, and `AetheriaLoadoutTemplate` is the typed Verse
|
|
replacement for bespoke loadout files, with structured hull/equipment/cargo/
|
|
docking item slots, nested child-entity loadouts, and weapon groups.
|
|
`RuntimePlayerSettings` is the Unity session projection for menus, formatting,
|
|
and input binding display. Menu and input-screen changes send typed Eve request
|
|
documents to the provider-owned Aetheria Verse service; they are not portable
|
|
state authority and must not mutate daemon-owned state inside Unity.
|
|
The old `.cc.pending` runtime commit document lane is deleted. Gameplay state,
|
|
loadout templates, and run checkpoints are accepted by the daemon/Verse owner
|
|
through typed state operations and daemon command documents, not by
|
|
renderer-side commit authority.
|
|
`AetheriaRuntimeSession` is the typed Verse signal for the running daemon.
|
|
`Aetheria.State.Daemon` owns the long-running `aetheria-daemon` heartbeat and
|
|
publishes `starting`, `running`, and `stopping` states through `Aetheria.State`;
|
|
legacy outbox status remains operation telemetry, not daemon-session ownership.
|
|
The daemon also owns the first deterministic abstract combat kernel. That
|
|
kernel consumes native runtime run/zone/entity snapshot commits directly and
|
|
mutates those same snapshot rows: stat grids for hull, shield, heat, thermal
|
|
capacity, signature masking, cognition, cognitive load, fire control, and
|
|
munition pressure; contact rows for track confidence and visibility; and native
|
|
weapon-state rows for abstract firing and lock state. It is meant for
|
|
out-of-view combat advancement and balance simulation without creating a second
|
|
private combat state model. The current C# host exposes it behind
|
|
`--abstract-combat-kernel` while the older shared daemon simulation remains the
|
|
default compatibility path. The promotion path is to move this authority into
|
|
the Rust daemon/Ymir simulation body, not into Unity or a renderer package.
|
|
Unity Eve surfaces construct typed `gamecult.eve.command.v1` command documents.
|
|
`AetheriaRuntimeVerseClient` is the shared CultMesh client boundary for
|
|
headless, Unity, and non-Unity runtimes. Typed command clients submit directly
|
|
to the same Verse records; there is no command-port facade or cached submitter
|
|
between client code and the Aetheria state graph.
|
|
`AetheriaEveCommandBridge` is the provider-owned command acceptor for those
|
|
records: it validates the provider, surface, and command template before
|
|
running the narrow refresh handlers for the catalog and operations surfaces
|
|
plus the typed player-settings mutation handlers for gameplay/graphics Eve
|
|
controls and typed Verse-host visibility commands. Renderer callbacks do not
|
|
accept commands or mutate game state locally.
|
|
`AetheriaEveRuntimeBootstrap` mounts the `aetheria.operations` surface through a
|
|
runtime-created `UIDocument` after scene load, with environment and command-line
|
|
switches for diagnostics. UI Toolkit is now a live runtime lowering path, not
|
|
only a package sample.
|
|
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.
|
|
Daemon run frames project into Unity through the explicit
|
|
`EntityConstructionBlueprintProjector.ProjectObservedFromBlueprint` lowering
|
|
path; authoritative blueprint construction remains named separately as a
|
|
migration target for code that still has to move into the daemon.
|
|
Main-menu gameplay boot also projects the daemon run through
|
|
`Galaxy.ProjectObservedDaemonRun` rather than constructing or generating a
|
|
Unity-owned run. The Unity handle for this shell is
|
|
`ActionGameManager.ObservedGalaxy` to keep the client-side object named as an
|
|
observation.
|
|
The dead `SavedStory` JSON DTO is gone. `ZoneConstructionBlueprint` and
|
|
`RuntimeEntityBlueprint` remain in-memory construction/loadout projections for
|
|
Unity runtime code, with `RuntimeEntityBlueprintProjector` capturing and
|
|
instantiating those projections. They no longer carry save-file or serializer
|
|
vocabulary, and they do not declare MessagePack persistence attributes.
|
|
|
|
Keyboard layout rendering now builds the static ANSI-104 display as typed
|
|
`InputLayout` rows and columns. It no longer reads a checked-in JSON text asset
|
|
or uses `SimpleJson` for display geometry. The generated `AetheriaInput` wrapper
|
|
still calls Unity's `InputActionAsset.FromJson`; that is an engine-owned
|
|
lowering boundary under Aetheria's remapping layer, not a save format or state
|
|
owner. The old generated `GameData/KeyboardLayouts/*.msgpack` cache and the
|
|
checked-in `ansi104.json` display file are deleted. Remapping and action-bar
|
|
edits are owned by typed `AetheriaPlayerSettings` commits, and the live input
|
|
screen now lowers through Eve/UI Toolkit instead of the old drag/drop uGUI
|
|
shell. Keyboard display layout edits remain runtime-only until Verse owns a
|
|
typed layout document.
|
|
The unused Unity Localization package and imported Google Sheets localization
|
|
sample have been removed; the old transitive Unity Newtonsoft package is no
|
|
longer in the manifest or package lock.
|
|
|
|
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 records are the durable owner.
|
|
Dead legacy catalog roots for user records and galaxy map-layer resources have
|
|
been deleted from live Unity source. Surviving runtime DTOs no longer carry
|
|
legacy catalog group/table annotations; their remaining metadata is projection
|
|
and inspection metadata for the typed runtime bridge.
|
|
Item instances now carry `AetheriaRuntimeItemReference`, a typed item-key
|
|
facade. `ItemInstance.ItemKey` is the identity surface; the old `ItemId`
|
|
legacy-GUID projection has been deleted from item instances.
|
|
Cargo inventory indexes, consumable activation lookup, action-bar consumable
|
|
quantity/fill, transfer lookup, trade owned counts, weapon ammo references, and
|
|
item-use behavior references now use item keys. The old cargo/consumable GUID
|
|
lookup overloads and the derived behavior `AmmoType`/`Item` GUID properties
|
|
have been deleted. Action-bar consumable bindings now read the target `ItemKey`
|
|
directly from typed runtime catalog rows instead of reconstructing it from
|
|
legacy item IDs.
|
|
Daemon snapshot DTOs carry typed `ItemKey`/`HullItemKey` fields only for
|
|
loadout items, action-bar targets, body resources, entity hulls, and active
|
|
consumables; daemon command application no longer reconstructs item keys from
|
|
legacy item GUID fields.
|
|
Daemon snapshot DTOs now carry typed `FactionKey` only for loadout entities,
|
|
run entity snapshots, and faction relationship state. The old command-document
|
|
`CorporationLegacyId` fallback fields are deleted.
|
|
`EntityConstructionBlueprint` also carries `FactionKey` only. Loadout restore,
|
|
entity construction, run entity snapshots, and faction relationship commits no
|
|
longer rebuild corporation references from legacy `Faction.ID` GUIDs.
|
|
Galaxy faction relationship projection is also typed-key-only: the old
|
|
`Faction.Allegiance` GUID dictionary, GUID containment helper, and GUID faction
|
|
resolver are deleted from the simulation shell.
|
|
The remaining temporary `Faction` shell also uses `GeonameFileKey` and
|
|
`BossHullItemKey`; it no longer parses name-file or boss-hull legacy IDs into
|
|
GUID link fields.
|
|
`Faction` equality, hashing, narrative constraints, sector display filtering,
|
|
sector-map link/influence rendering, zone security ownership checks, and
|
|
runtime faction-relationship ordering now use `FactionKey`. The legacy
|
|
`Faction.ID` projection field is deleted from the temporary simulation shell.
|
|
Run checkpoint snapshot DTOs carry typed `OrbitKey`, `ParentOrbitKey`, and
|
|
`BodyKey` only for zone orbit/body snapshots. The old command-document
|
|
`OrbitLegacyId`, `ParentLegacyId`, and `BodyLegacyId` fallback fields are
|
|
deleted. Behavior-state daemon snapshots and readback snapshots carry typed
|
|
body-key fields for resource scanner targets and mining tool asteroid belts;
|
|
the old raw body ID commit/readback field names are deleted. `ResourceScanner`
|
|
and `MiningTool` now retain typed body-key runtime state directly, while
|
|
`Zone` owns parsing and resolution at the current Unity body runtime boundary.
|
|
`Zone`, `Planet`, `AsteroidBelt`, and `Orbit` now own the runtime body/orbit
|
|
key surfaces used for projection, and `ActionGameManager` no longer formats or
|
|
resolves body/orbit keys locally while checkpointing or restoring state.
|
|
Typed `AetheriaZoneState` orbit/body snapshot rows now use `OrbitKey`,
|
|
`ParentOrbitKey`, and `BodyKey` property names all the way through the typed
|
|
document and runtime catalog readback surface; the old `...Id` names were only
|
|
legacy-shaped aliases for those key strings and are gone.
|
|
Orbit-targeting agent runtime also now retains typed orbit keys directly:
|
|
`PatrolOrbitsTask`, `MoveToOrbitState`, and `StationTowing` no longer own raw
|
|
orbit GUID targets, and `Zone` resolves orbit keys for agent orbit movement.
|
|
Orbital runtime entities and their construction blueprints now follow the same
|
|
rule: `OrbitalEntity` and `OrbitalEntityConstructionBlueprint` retain
|
|
`OrbitKey`, runtime loadout generation seeds the empty value as `""`, and
|
|
`Zone` resolves orbit keys for orbital entity movement and dock camera parent
|
|
lookup.
|
|
Renderer and gameplay orbit consumers now stay on that keyed edge too:
|
|
intro-cutscene planet selection, zone planet/belt loading, gas-giant parent
|
|
lighting, asteroid-belt UI setup, and `ResourceScanner` planet range checks all
|
|
read `OrbitKey` from runtime wrappers and ask `Zone` to resolve it instead of
|
|
reading wrapper GUID orbit fields directly.
|
|
`Planet` and `AsteroidBelt` runtime wrappers no longer publish separate wrapper
|
|
orbit GUID fields either: they keep `OrbitKey` plus their `Orbit` runtime
|
|
object, and `Zone` lowers asteroid transforms through `belt.Orbit.ParentOrbitKey`
|
|
instead of reading a raw wrapper orbit GUID.
|
|
`Zone`'s own public key-facing lookup surface is also now natively keyed:
|
|
body and orbit lookups resolve through key-indexed runtime dictionaries rather
|
|
than reparsing GUIDs from `BodyKey` or `OrbitKey` strings before touching the
|
|
Guid-indexed substrate.
|
|
The live asteroid helper surface follows the same rule: nearest-asteroid,
|
|
asteroid-exists, transform-update, and mining paths now use typed body keys or
|
|
runtime `AsteroidBelt` objects directly instead of Guid asteroid-belt helper
|
|
overloads.
|
|
The package runtime catalog snapshot indexes items by canonical item key; Unity
|
|
gameplay, HUD, inventory, trade, ship, and zone helper lookups use `ItemKey`
|
|
directly instead of deriving `ItemId` and searching by legacy GUID.
|
|
The Unity runtime package snapshot also no longer exposes item, corporation, or
|
|
name-file lookup by legacy ID, and its item/corporation/name-file DTOs no
|
|
longer publish legacy relationship fields. Canonical legacy-ID lookup remains
|
|
only in `Aetheria.State` migration/catalog inspection APIs.
|
|
The shared runtime item catalog reader is also item-key-only now: its GUID index,
|
|
`GetRuntimeItem(Guid)` entry point, raw GUID string fallback,
|
|
`AetheriaRuntimeItemReference(Guid)` constructor, `FromLegacyId`, and reverse
|
|
legacy-GUID projections have been deleted.
|
|
`ItemManager` now reads typed item rows directly from the shared
|
|
`AetheriaRuntimeCatalogSnapshot`; the redundant `AetheriaRuntimeItemCatalog`
|
|
adapter layer has been deleted.
|
|
The old generic `RuntimeCatalogLink<T>` abstraction, `ItemManager.GetData`
|
|
hydration path, vague `ItemInstance.Data` identity field, and old
|
|
`RuntimeItemReference.Projection` cache have been deleted; runtime item facts
|
|
come from typed catalog rows.
|
|
ItemManager's behavior construction no longer exposes a generic GUID reader or
|
|
item GUID projection helper. Migrated legacy-id behavior payload fields carry
|
|
`LegacyIdValue` as provenance/backfill only; gameplay item behavior reads the
|
|
typed `ItemKeyValue` emitted by import/runtime projection.
|
|
Loadout generation now applies typed catalog prefilters for item category,
|
|
hardpoint type, shape fit, hull type, and behavior kind, then instantiates
|
|
generated equipment directly from typed runtime rows.
|
|
Typed item definition `Category` values are stable Aetheria tokens such as
|
|
`hull`, `weapon`, `gear`, `cargo-bay`, and `docking-bay`; legacy union class
|
|
names remain migration provenance, not live category predicates.
|
|
The surviving trade menu also applies typed catalog prefilters for row size,
|
|
hardpoint type, and behavior kind before legacy buy actions.
|
|
The old `ItemData`/`EquippableItemData`/`HullData`/`WeaponItemData` DTO
|
|
hierarchy has been deleted from live Unity source. Shared runtime geometry and
|
|
stat primitives now live in `RuntimeGeometry.cs`; item facts come from typed
|
|
runtime rows. The old `RuntimeCatalogEntry` and `RuntimeItemProjectionEntry`
|
|
base names no longer appear in live source.
|
|
The dead `InspectableRuntimeCatalogLinkAttribute` inspector metadata is gone;
|
|
live Unity source no longer carries `LegacyPayloadKeyAttribute` either.
|
|
Catalog import and migration readers own deterministic legacy field layout
|
|
through explicit key maps, while runtime behavior construction uses an explicit
|
|
typed behavior-kind mapper.
|
|
Agent task DTOs no longer inherit the item projection base; they are local
|
|
runtime AI work orders until a typed Verse task document exists.
|
|
|
|
`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, full allegiance edges, and music bank IDs. Corporation
|
|
documents are `aetheria.corporation.v2` records because runtime generation
|
|
needs actual allegiance weights, not only display counts. Runtime checkpoints
|
|
now persist session faction relationships into typed run state, and runtime
|
|
sessions publish typed state-host liveness. Zone checkpoints persist generated
|
|
orbit/body rows into `AetheriaZoneState`, so `ZoneConstructionBlueprint` is a
|
|
one-shot construction input carrying typed orbit/body keys rather than the retained surface carrying celestial graph facts. Entity checkpoints
|
|
persist hull simulation grids into `AetheriaEntitySnapshot`, so
|
|
`EntityConstructionBlueprint` is no longer the only surface carrying those live
|
|
values. Run checkpoints project the flattened live entity graph, including
|
|
docked children, into exact typed entity snapshot records. Continue restore
|
|
lowers the current zone entity graph from those records, including position,
|
|
velocity, target/contact state, child/docking relationships,
|
|
shutdown/heatsink state, thermal exposure, active consumable timers, and typed
|
|
stat grids for temperature, thermal mass, armor, max armor, and hull
|
|
conductivity. Continue also lowers typed weapon and behavior runtime rows back
|
|
into live equipped-item and active-consumable behavior instances through
|
|
behavior-owned restore methods; construction/loadout blueprints do not own
|
|
behavior replay. Broader runtime object graphs without typed rows remain legacy
|
|
until dedicated typed runtime documents exist. Live behavior
|
|
instances expose typed behavior kind and group through `Behavior.Kind` and
|
|
`Behavior.Group`; behavior construction now reads typed payload fields through
|
|
`RuntimeBehaviorDefinition` instead of projecting through config DTOs. Stat
|
|
modifiers ask live behavior instances for target stats instead of reading
|
|
behavior config objects directly; base `Behavior` captures a runtime stat table
|
|
at construction without config reflection.
|
|
Heat, EnergyDraw, and Cooldown behavior instances now copy their constructor
|
|
stat/scalar inputs into explicit runtime fields and no longer retain their
|
|
config subclasses after construction.
|
|
Wear, Visibility, Reflector, VelocityLimit, VelocityConversion, and ItemUsage
|
|
also copy their constructor stat/key/scalar inputs into explicit runtime fields
|
|
instead of retaining config subclasses.
|
|
Capacitor, Shield, Thruster, MiningTool, ResourceScanner, Thermotoggle, Switch,
|
|
HeatStorage, and Cockpit have also dropped runtime config retention. Thermotoggle
|
|
adjustability is exposed on the live behavior instance, not through its config.
|
|
Reactor, Radiator, Sensor, and StatModifier now copy their constructor
|
|
performance stats, curves, flags, and target strings into explicit runtime
|
|
fields; those live behaviors no longer retain their config subclasses.
|
|
AetherDrive now follows the same rule for rotor geometry, performance stats,
|
|
torque curve, audio parameters, and prefab path. Weapon, InstantWeapon,
|
|
ConstantWeapon, ChargedWeapon, and LockWeapon now copy constructor stats,
|
|
curves, ammo/reload fields, guided projectile profile fields, burst/cooldown
|
|
fields, charge multipliers, and lock parameters into runtime-owned fields.
|
|
Behavior instances no longer retain construction config DTOs after
|
|
construction.
|
|
Cockpit, HeatStorage, Switch, Trigger, and TurretController read directly from
|
|
typed runtime behavior definitions.
|
|
Heat, EnergyDraw, Cooldown, Wear, Visibility, Reflector, VelocityLimit,
|
|
VelocityConversion, and ItemUsage also bypass the temporary config bridge and
|
|
read typed behavior fields through `RuntimeBehaviorDefinition`, registering
|
|
runtime performance stats explicitly for `StatModifier`.
|
|
Capacitor, Shield, MiningTool, ResourceScanner, Thermotoggle, and Thruster now
|
|
follow the same direct-definition path.
|
|
Reactor, Radiator, Sensor, StatModifier, and AetherDrive also read typed
|
|
payload fields through `RuntimeBehaviorDefinition`; AetherDrive registers its
|
|
live performance-stat names explicitly for `StatModifier`.
|
|
Weapon, InstantWeapon, AutoWeapon, ConstantWeapon, ChargedWeapon, LockWeapon,
|
|
Launcher, and GuidedWeapon payloads also construct directly from
|
|
`RuntimeBehaviorDefinition`. The old `RuntimeBehaviorConfig` bridge,
|
|
`BehaviorPayloadReader`, and weapon config hierarchy are deleted.
|
|
Typed name-file documents are `aetheria.name_file.v2` records. They carry the
|
|
legacy ID, display name, count, compact sample names for surfaces, and the full
|
|
name array used by `Galaxy`/Markov name generation through typed name-file
|
|
keys rather than legacy `NameFile.Names`.
|
|
Legacy GUID references that are `Guid.Empty` are imported as absent references,
|
|
not as resolvable catalog links.
|
|
Before materializing state, the importer clears the generated `.cc`,
|
|
`.cc.records`, and `.cultmesh` outputs for the selected state path. Legacy
|
|
catalog inputs are captured first and are not deleted. This lets schema changes
|
|
rebuild the typed artifact instead of failing on a stale embedded schema catalog.
|
|
|
|
`AetheriaCatalogSnapshot` is the typed read surface over materialized catalog
|
|
documents. It exposes trade items, legacy-ID migration lookup, typed
|
|
manufacturer/corporation/name-file key lookup, corporation prefix lookup,
|
|
equipment items, behavior lookup, and hardpoint lookup without reading runtime
|
|
projection DTOs.
|
|
|
|
`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 resolves the active Verse through the client-owned `aetheria-client.cc`
|
|
target document, then opens the selected typed state source. Today that source
|
|
is still a local `.cc` file transport, so the facade 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, exposes typed interior masks and hardpoints for
|
|
equipment/cargo layout consumers, exposes typed behavior payload read models,
|
|
can read typed player settings for Unity boot, and can read the published Eve
|
|
catalog surface. It does not deserialize legacy runtime projection objects and
|
|
does not write daemon-owned Verse state. Unity can use this as the first
|
|
package boundary once CultLib/Eve runtime packaging is available.
|
|
Unity `MainMenu` now lowers a typed Verse settings shell over that split:
|
|
client-target edits persist locally in `aetheria-client.cc`, while Verse-host
|
|
visibility changes append provider-owned Eve request documents against the
|
|
selected local Verse state file.
|
|
`Galaxy` now consumes this package-owned runtime catalog for faction selection
|
|
and name generation, so generated sectors use typed corporation v2 and
|
|
`aetheria.name_file.v2` records instead of legacy `Faction`/`NameFile`
|
|
catalog documents. Loadout manufacturer-distance weighting also resolves
|
|
manufacturers through typed corporation keys rather than parsing manufacturer
|
|
legacy IDs. `Galaxy` still projects typed corporations into temporary `Faction`
|
|
DTOs, including local GUID equality for the surviving simulation surface,
|
|
because the surrounding simulation has not yet been rebuilt around typed
|
|
corporation records. The DTOs now carry typed faction/name-file keys and typed
|
|
allegiance edges so they cannot reclaim catalog lookup authority.
|
|
|
|
`Aetheria.State.Smoke` writes and reopens full typed player settings plus a
|
|
typed loadout template in addition to world, catalog, run state, zone state, and
|
|
an entity snapshot. It also writes and reopens `AetheriaRuntimeSession`, the
|
|
provider-owned `aetheria.player_settings` Eve surface, and player-settings Eve
|
|
commands that mutate typed significant-digit and minimap-asteroid settings
|
|
through the provider bridge. The smoke checks that the Eve provider advertises
|
|
the runtime-session schema and player-settings command surface. The run smoke
|
|
proves a typed run can reference a typed zone, the zone can preserve
|
|
orbit/body rows and reference typed entity snapshots, and entity snapshots can
|
|
preserve equipment slots, weapon groups, and simulation stat grids without
|
|
reviving `PlayerSettings.msgpack`, `.loadout`, or `.zone` serialization.
|
|
Unity `MainMenu` now lowers that same player-settings Eve document contract
|
|
locally through UI Toolkit instead of hand-authoring separate gameplay/graphics
|
|
widgets; the menu shell keeps name entry and back-navigation while gameplay
|
|
still owns command semantics through `ActionGameManager.RequestRuntimePlayerSettingsCommand`.
|
|
The run document also carries `CurrentEntityKey`, so Continue restore binds the
|
|
saved player entity by exact typed record identity instead of reconstructing it
|
|
from a transient entity-slot index. Canonical typed run state no longer stores
|
|
`CurrentZoneEntityIndex`; older stored runs are translated through the package
|
|
reader into `CurrentEntityKey`. The older runtime commit importer has
|
|
been removed from the first-party state host and Unity package.
|
|
|
|
`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, checks that name-file v2 records
|
|
carry their full name arrays, and checks that expanded item and corporation
|
|
catalog facts survived materialization. The verifier also exercises the typed
|
|
catalog snapshot query surface, shape-mask invariants, 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. The verifier also
|
|
fails if live `Assets/Scripts` source grows back serializer or legacy database
|
|
symbols such as MessagePack, Newtonsoft, JsonKnownTypes, RethinkDB, or old
|
|
`DatabaseEntry`/`DatabaseLink` references; the remaining MessagePack usage is a
|
|
named package/import CultCache transport boundary, not gameplay state authority.
|
|
The package boundary is also fenced: MessagePack symbols may only appear in the
|
|
runtime catalog reader, CultCache document store, and typed runtime/Eve
|
|
command document files until generated CultCache serializers replace that
|
|
temporary Unity-side codec. The verifier also checks that the Eve runtime
|
|
bootstrap exists, mounts the operations surface through the UI Toolkit presenter,
|
|
and keeps renderer commands routed through the typed Eve command inbox.
|
|
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. Live Unity code uses typed Eve or daemon request documents
|
|
instead of runtime commit outboxes. Runtime and Eve requests are typed `.cc`
|
|
records with embedded schema catalogs; their current record payload codec is
|
|
still temporary package code until Unity consumes generated CultCache
|
|
serializers directly.
|
|
|
|
`Aetheria.State.Daemon` opens the CultMesh Verse daemon, publishes daemon-owned
|
|
Verse identity/health/game/editor surfaces, accepts observed Eve command
|
|
documents on startup, and executes observed daemon command records each tick.
|
|
For a bounded one-shot daemon tick:
|
|
|
|
```powershell
|
|
dotnet run --project .\Aetheria.State.Daemon\Aetheria.State.Daemon.csproj -- --once
|
|
```
|
|
|
|
The daemon publishes `AetheriaEveCommandAcceptanceStatus`, the
|
|
`aetheria.operations` Eve surface, and the
|
|
typed `aetheria.player_settings` Eve surface after request acceptance attempts,
|
|
so observed depth, accepted/applied/rejected counts, failures, timestamps, and
|
|
player settings controls are typed state rather than console-only status. It also
|
|
persists daemon-owned `aetheria.verse_host_settings.v1`, with boot-time
|
|
defaults or overrides for service id, Verse id, visibility, and CultMesh
|
|
address. When visibility is `public`, the daemon also serves a
|
|
derived CultMesh Verse catalog from that same typed host document, using the
|
|
located service name as the discoverable `cultnet://...:3075` endpoint. The
|
|
operations surface and provider advertisement project from that typed host
|
|
document instead of hardcoded daemon identity strings. The provider
|
|
advertisement still publishes `gamecult.eve.provider_advertisement.v1` for the
|
|
`aetheria` provider, advertising the catalog, operations, and player-settings
|
|
surfaces plus the typed schemas witnessed by the local `.cc` state file.
|
|
|
|
Remote Unity clients should not pretend a public Verse is local authority. Use
|
|
`Aetheria.State.Replica` to pull a cache-only local witness from the daemon:
|
|
|
|
```powershell
|
|
dotnet run --project .\Aetheria.State.Replica\Aetheria.State.Replica.csproj -- sync --endpoint cultnet://host:3075 --game-data-root .\GameData --verse-id aetheria.public
|
|
```
|
|
|
|
That writes `GameData\Verses\<verse>.cc` as a replica projection of daemon
|
|
truth. The selected remote client target resolves to that replica path. The
|
|
daemon still owns accepted state; the replica is only the local read surface
|
|
Unity lowers from.
|
|
|
|
The Unity Verse-settings shell can also trigger the same one-shot sync through
|
|
the `Aetheria.State.Replica` bridge when the repo-local tool is available. That
|
|
keeps target selection local while the replica organ owns daemon transport.
|
|
|
|
The old standalone `Aetheria.State.DrainCommands` applicator is deleted. Command
|
|
acceptance is daemon behavior now; bounded operation uses `Aetheria.State.Daemon
|
|
--once` so the same Verse member publishes the same provider, health, command
|
|
boundary, and Eve surfaces.
|
|
|
|
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.
|