3530 lines
232 KiB
Markdown
3530 lines
232 KiB
Markdown
# Aetheria Perfect Machine Map
|
|
|
|
Date: 2026-06-13
|
|
|
|
This is the Proprioception and Imagination pass for turning Aetheria from a
|
|
Unity project with ancestral cache/network/UI machinery into a coherent
|
|
GameCult machine: typed CultCache state, CultMesh networking, and Eve CultUI
|
|
surfaces lowered into Unity without JSON or RethinkDB remaining as live
|
|
authority.
|
|
|
|
## Objective
|
|
|
|
Aetheria should persist and replicate game state as typed CultCache documents,
|
|
publish multiplayer/service state through CultMesh, and render operator/runtime
|
|
interfaces from Eve CultUI surfaces. The old JSON, RethinkDB, JsonKnownTypes,
|
|
legacy catalog cache, and legacy UI paths should be migration-only or deleted.
|
|
|
|
## Current Mechanism
|
|
|
|
- `Aetheria.State.Daemon` is the first-class local Verse daemon host. It opens
|
|
`AetheriaStateNode` with the CultMesh server enabled, serves
|
|
`AetheriaVerseDiscoveryHost`, accepts typed Eve command documents, advances
|
|
authoritative daemon frames through `AetheriaRuntimeDaemonTickRunner`, and
|
|
publishes provider advertisements, daemon health, command boundaries, and
|
|
Eve GUI/TUI witness surfaces. Aetheria clients connect directly to the
|
|
daemon's advertised CultMesh endpoint. Optional external indexes may ingest
|
|
the provider advertisement, but they are not on the client, command, state,
|
|
or cooperating-daemon path. The daemon owns provider state and surfaces;
|
|
Unity and future clients lower or command that provider through CultMesh
|
|
rather than becoming state owners.
|
|
- Unity client/runtime lives under `Assets/`. Gameplay now opens the typed
|
|
runtime catalog from `GameData/aetheria-world.cc` and projects current
|
|
`ItemData` DTOs through `ItemManager` over the typed runtime catalog snapshot. `ActionGameManager` no
|
|
longer owns or opens a legacy catalog cache.
|
|
`GameCult.Aetheria.State.Unity`, the embedded Unity package under
|
|
`Packages/org.gamecult.aetheria.state`, owns the Unity runtime path to
|
|
`GameData/aetheria-world.cc` through `AetheriaRuntimeStateBoundary` and owns
|
|
the Unity boot-time state-file existence probe through
|
|
`AetheriaRuntimeStateBoot`. `ActionGameManager` consumes that package-owned
|
|
boot report and throws if `aetheria-world.cc` is missing before gameplay
|
|
boot. When the typed state file exists,
|
|
`ActionGameManager` opens a package-owned read-only runtime catalog snapshot
|
|
from the `.cc` directory store before constructing the temporary legacy
|
|
`ItemManager`. Player settings, loadout edits, shutdown checkpoints, and
|
|
wormhole transitions now flow as typed Eve or daemon command records observed
|
|
by the Aetheria Verse daemon. Run checkpoint documents include the current
|
|
zone plus its runtime entity snapshots. `Aetheria.State` owns publishing
|
|
canonical
|
|
`AetheriaPlayerSettings`, `AetheriaLoadoutTemplate`, `AetheriaRunState`,
|
|
`AetheriaZoneState`, and `AetheriaEntitySnapshot` documents through
|
|
`AetheriaStateNode`. The embedded Unity state package can also read typed
|
|
run, zone, and entity snapshot documents back from the `.cc` store as
|
|
read-only runtime DTOs, including action-bar bindings, faction
|
|
relationships, generation seed, zone entity/orbit/body references, entity
|
|
session scalars, active consumables, behavior progress, weapon state,
|
|
behavior state, and stat-grid rows. Local run saves, loadouts, player settings files, zone
|
|
files, and generated keyboard layout caches no longer write bespoke durable files. The
|
|
legacy
|
|
`RuntimePlayerSettings` runtime object is no longer named or decorated as a
|
|
MessagePack persistence shape. `Aetheria.State.Daemon` now observes typed
|
|
daemon and Eve command records from the Aetheria state graph, accepts them
|
|
through the provider-owned command bridge, and publishes canonical typed state
|
|
while hosting the CultMesh state node. The standalone `Aetheria.State.DrainCommands`
|
|
applicator is deleted so command acceptance remains daemon behavior.
|
|
- Shared item domain state is now built around typed item-key references,
|
|
typed runtime catalog rows, direct `RuntimeBehaviorDefinition` behavior
|
|
construction, and runtime geometry/stat primitives. The old `ItemData` DTO hierarchy is deleted
|
|
from live Unity source. Dead
|
|
user-record and galaxy-map-layer catalog roots have been deleted, and
|
|
surviving runtime DTOs no longer carry legacy catalog group/table annotations. Newtonsoft,
|
|
JsonKnownTypes, RethinkDB, LiteNetLib client transport, and the broken
|
|
`Economy.Shared` wrapper have been removed from live source. The stale
|
|
`StrategyGameManager.csbak` backup file and unused Unity asset MessagePack
|
|
formatter classes have also been deleted, so the remaining direct
|
|
`MessagePackSerializer` calls are no longer present in live gameplay source;
|
|
renderer/client code now observes typed `.cc` state records and sends typed
|
|
command records through CultNet/CultMesh boundaries.
|
|
- Local legacy catalog data remains in `GameData/AetherDB.msgpack` and
|
|
`GameData/NameFile/*.msgpack` as migration inputs only. Unity gameplay no
|
|
longer opens those MessagePack files at runtime. The old
|
|
`PlayerSettings.msgpack`, `.loadout`, `.zone`, and
|
|
`GameData/KeyboardLayouts/*.msgpack` authority paths are disabled or deleted.
|
|
The old `SavedGame`/`SavedZone` DTOs and `Galaxy` save-loader constructor are
|
|
deleted. The dead `SavedStory` JSON DTO is deleted.
|
|
The unused Unity Localization package and imported Google Sheets localization
|
|
sample have also been deleted, removing the transitive Unity Newtonsoft package
|
|
from the manifest/lock. Unity's built-in `jsonserialize` module and generated
|
|
InputSystem JSON remain engine/package boundaries, not Aetheria state.
|
|
`ZoneConstructionBlueprint`, body/orbit zone runtime data, item-instance runtime
|
|
data, `Ship`, and `EntitySettings` remain as runtime
|
|
construction/loadout/session projections, but no longer use save-file or
|
|
serializer vocabulary or declare themselves as MessagePack persistence
|
|
documents.
|
|
- `Aetheria.State` now expands `AetheriaPlayerSettings` beyond an active-run
|
|
pointer into the typed Verse replacement for `PlayerSettings.msgpack`: player
|
|
name, tutorial flag, story-file hash cursors, gameplay formatting, graphics
|
|
preferences, input binding overrides, and action-bar inputs. Unity's menu and
|
|
input screens route edits through named typed Eve commands accepted by the
|
|
daemon, which updates the session `RuntimePlayerSettings` projection as a
|
|
read model. The in-memory projection is not portable state authority.
|
|
Aetheria has its own
|
|
remapping UI that calls Unity's InputSystem at the binding/action layer;
|
|
Unity's generated
|
|
`AetheriaInput` class is the edge consumer of typed binding overrides, not
|
|
the durable owner. The runtime Eve input screen now owns low-level rebinding
|
|
and action-bar input toggles, routing them through named runtime input commit
|
|
methods instead of writing the input collections directly. The
|
|
action bar also uses typed runtime catalog category rows to reject
|
|
non-consumable inventory drops and creates consumable bindings around typed
|
|
catalog rows. Weapon groups publish the fossil press/release lifecycle as
|
|
generic `button-hold.v1` values routed to the daemon-owned
|
|
`SetWeaponGroupActive` command. The entity snapshot owns the reconnectable
|
|
active-group latch: a press edge pulses ordinary instant/charged weapons once,
|
|
authored `AutoWeapon` payloads retrigger on the fixed step after their cooldown
|
|
completes while the latch remains held, and constant weapons remain selected
|
|
until the release command clears the latch. AutoWeapon retriggering consumes
|
|
the same lock, ammo, energy, heat, wear, visibility, shot, and damage path as
|
|
its first press; it is not a second combat authority.
|
|
Generic clients send transitions, not frame-frequency keepalive commands.
|
|
`FireWeaponGroup` remains a one-shot compatibility operation for autonomous
|
|
agents and command buttons but is not the public binding contract. The provider
|
|
input capability derives equipment controls from
|
|
exact installed payload indices: `Switch` and `Trigger` publish generic
|
|
`button-hold.v1` values, while adjustable `Thermotoggle` publishes a
|
|
`scalar.v1` Kelvin target with the daemon-owned current value. Fixed and
|
|
non-interactive behaviors publish no counterfeit action; offline equipment
|
|
retains stable action identity but is unavailable. Generic Eve requests for
|
|
every value operation translates into its typed daemon command. The capability
|
|
identifies provider `aetheria`; `aetheria.daemon.commands` remains only the
|
|
operation boundary and cannot replace provider identity. Missing typed rows
|
|
are rejected for consumable binding instead of falling through to legacy DTO classification. Slot-binding drag/drop now
|
|
routes through typed daemon operations, and rebuilt current-entity binds come from typed
|
|
action-bar descriptor rows instead of stale slot-local `Entity` references.
|
|
`AetheriaRuntimeConsumableSimulation` is the sole live owner of consumable
|
|
activation and lifetime. It resolves semantic activation intents against the
|
|
typed catalog and the actor's concrete cargo, atomically removes one unit,
|
|
preserves that instance's quality, applies authored stackability, and creates
|
|
the canonical active-effect row. Daemon simulation time ages and expires those
|
|
rows and publishes lifecycle/refusal facts. Input capability projection derives
|
|
only currently activatable consumable actions from this state; Unity's restored
|
|
`ConsumableItemEffect` and action-bar fill are read models and cannot consume
|
|
cargo or advance timers.
|
|
Active effects execute their typed payload array in authored order after
|
|
capacitor/reactor tick initialization. `EnergyDraw` delegates to the shared
|
|
energy ledger and `ItemUsage` delegates to the shared cargo transaction; a
|
|
failed or unsupported payload stops every later payload and publishes the
|
|
exact behavior index and reason. Consumable performance stats preserve the
|
|
fossil's lifetime-effectiveness and quality weighting. Consumable `Heat`
|
|
remains a successful no-op because the fossil explicitly added heat only to
|
|
equipped items; changing that balance requires an explicit design decision.
|
|
Consumable activation, active-duration fill, runtime duration, and effectiveness curves now use typed
|
|
item rows with neutral defaults for missing optional facets. Gear action-bar bindings read custom icon resource
|
|
paths from typed item rows, then use typed weapon and hardpoint facets for
|
|
fallback icon selection, and finally fall back to a generic tool icon when
|
|
typed facets are incomplete. The current legacy catalog has zero populated
|
|
custom action-bar icon paths, but the typed field is present and owns that
|
|
surface when data appears.
|
|
|
|
Every active effect owns a stable daemon `EffectId`; each authored payload
|
|
owns a stable `BehaviorId` and nested scalar state beneath that effect. Array
|
|
position is execution order, never identity. `Cooldown` follows the fossil's
|
|
update-before-chain semantics: every cooldown ages before ordered execution,
|
|
readiness is strictly below zero, successful execution resets it to one, and
|
|
an earlier failed behavior cannot freeze it. Unity reconciles active-effect
|
|
presentation objects by `EffectId` and removes absent effects. It does not
|
|
restore active-consumable behavior state through the flattened equipment
|
|
behavior table and cannot become a second cooldown owner.
|
|
Player camera articulation grouping now classifies
|
|
equipped non-launcher weapons through typed behavior kind rows instead of
|
|
inspecting runtime behavior config classes. Unity boot reads typed player
|
|
settings back through the package-owned CultCache reader before falling back
|
|
to defaults. The main-menu settings navigation and input subpages now lower
|
|
through local Eve/UI Toolkit surfaces instead of repopulating the old
|
|
`PropertiesPanel` button shell, and the input page delegates to the live
|
|
runtime remap screen when that owner exists. The fake audio page has been
|
|
deleted until audio has a typed owner. Sector-map zone inspection now lowers
|
|
through a local Eve/UI Toolkit surface as well instead of rebuilding
|
|
`PropertiesPanel` rows on each zone click. The runtime in-game menu tab strip
|
|
now lowers through a local Eve/UI Toolkit surface, with `MenuPanel`
|
|
serializing tab metadata directly instead of routing authority through old
|
|
`MenuTabButton` components. Inventory background ship tuning now lowers through a
|
|
local Eve/UI Toolkit surface instead of rebuilding a `PropertiesPanel`
|
|
float field. The dead generic `PropertiesPanel`/`DropdownMenu` shell is now
|
|
deleted from the main menu, trade, inventory, and map serialized assets
|
|
instead of lingering as inert prefab ballast. Trade target-cargo selection now lowers through a local
|
|
Eve/UI Toolkit surface instead of rebuilding a `ContextMenu` option list.
|
|
Inventory entity/bay/loadout dropdown navigation now lowers through a local
|
|
Eve/UI Toolkit surface instead of rebuilding nested `ContextMenu`
|
|
dropdowns/options.
|
|
Trade filter selection and simple-commodity buy-quantity entry now lower
|
|
through local Eve/UI Toolkit surfaces instead of rebuilding `ContextMenu`
|
|
dropdowns/options in `TradeMenu`.
|
|
Trade typed-item inspection now lowers through a local Eve/UI Toolkit surface
|
|
instead of routing spreadsheet row clicks into `PropertiesPanel.Inspect`.
|
|
Inventory cargo-item inspection now lowers through a local Eve/UI Toolkit
|
|
surface instead of routing cargo clicks into `PropertiesPanel.Inspect`.
|
|
Inventory equipped-item inspection now also lowers through a local
|
|
Eve/UI Toolkit surface, with `InventoryMenu` owning weapon-group toggles,
|
|
action-bar group binding, override shutdown, and thermotoggle target
|
|
temperature controls directly instead of routing them through
|
|
`PropertiesPanel`.
|
|
- Main-menu level presentation is now authored as a field-oriented Eve/CultUI
|
|
surface, not as a renderer-owned Aetheria special case. The provider publishes
|
|
`field.surface2d` with embedded document slots for `gravity.height`,
|
|
`nebula.tint`, and object rows. `gravity.height` is a 2D scalar field;
|
|
isolines are one declared visualizer, alongside other possible scalar
|
|
visualizers such as shaded height and probes. `nebula.tint` is a 2D
|
|
vector/color field accumulated from render splats as color times the
|
|
PowerPulse window. The browser lowerer and the Unity client should both lower
|
|
this same field surface. Unity's current `ZoneRenderer`, `PowerBrush`, and
|
|
`Zone.GetHeight` behavior are parity evidence for the new Eve field renderer,
|
|
not a permanent side path.
|
|
Object and body icon selection is provider-owned too:
|
|
`AetheriaRuntimeViewportObject.IconAsset` and
|
|
`AetheriaRuntimeBodyView.IconAsset` carry the CultMesh CDN asset refs. A
|
|
lowering target may draw the advertised asset or expose the missing provider
|
|
data, but it must not synthesize icons, glow, asset paths, gravity fields,
|
|
or backdrop noise as renderer-local compensation.
|
|
- The combat schematic HUD uses typed runtime catalog weapon facets for its
|
|
static weapon icon strip; missing typed weapon facets no longer fall back to
|
|
legacy `WeaponItemData`. Schematic weapon-row selection now uses typed
|
|
behavior-kind rows instead of inspecting runtime behavior config classes;
|
|
live weapon behavior instances still own ammo, cooldown, and active firing
|
|
values until those session facts have typed runtime surfaces.
|
|
Hull and item durability percentages use typed max durability only; incomplete
|
|
typed rows use current runtime durability as the generic denominator instead
|
|
of falling back to legacy `ItemData.Durability`. Target HUD hitpoint fill also
|
|
reads target hull max durability from the typed runtime hull row instead of
|
|
`EquippedHull.Data.Durability`.
|
|
Gear heat-fill ranges in the schematic HUD also read typed catalog thermal
|
|
bounds; rows without typed thermal bounds use a neutral current-temperature
|
|
range instead of hydrating legacy `ItemData`.
|
|
Ship thruster VFX emission scaling also uses typed max durability only.
|
|
Runtime weapon behavior still owns ammo counts, active range, cooldowns,
|
|
temperature, and current durability values until those session facts have
|
|
typed runtime surfaces.
|
|
- `Aetheria.State` now exposes typed node put/get ports for run state, zone
|
|
state, and entity snapshots. The state smoke writes a run referencing a zone,
|
|
a zone referencing an entity snapshot, and an entity snapshot carrying
|
|
generation seed, position, direction, faction, hull, equipment slots, weapon
|
|
groups, and a stat grid. This proves the `.zone` replacement graph is durable typed state. Unity
|
|
now queues current-zone/current-entity-collection snapshots, current
|
|
action-bar bindings, and current faction relationship rows through the
|
|
runtime commit log during run checkpoints; `ZoneConstructionBlueprint` and
|
|
`EntityConstructionBlueprint` remain one-shot construction/loadout projections
|
|
rather than durable file formats. Runtime blueprints no longer capture or
|
|
restore live temperature, armor, max-armor, or hull-conductivity grids; those
|
|
grids are typed checkpoint state, not loadout/construction template state.
|
|
Blueprint price aggregation uses typed runtime item prices through
|
|
`ItemManager` instead of hydrating `HullData.Shape` or `ItemData.Price`.
|
|
Runtime blueprints no longer capture or restore behavior-private
|
|
`PersistentBehaviorData` blobs; that dead save-shape hook and its
|
|
`IPersistentBehavior` interface are deleted.
|
|
- Galaxy generation now exposes the actual nonzero seed used to create topology.
|
|
The main menu passes explicit seeds into normal and tutorial galaxy
|
|
construction, and run checkpoints persist that seed into `AetheriaRunState`.
|
|
Current-zone snapshot restore must attach to a regenerated galaxy with the
|
|
same seed; restoring zone indices against a fresh random galaxy is forbidden
|
|
split-brain state, not a Continue feature.
|
|
- Run checkpoint zone snapshots include typed orbit and body rows. Orbit IDs,
|
|
parent IDs, distance, phase, fixed positions, body kind/name/orbit,
|
|
resources, gravity/body multipliers, asteroid belt entries, and gas/sun
|
|
visual parameters now survive through the typed pending commit lane into
|
|
`AetheriaZoneState`. Asteroid belt runtime damage, respawn timers, and
|
|
miner accumulators also persist on typed asteroid rows. `ZoneConstructionBlueprint`
|
|
feeds one-shot generated geometry into `Zone`; live zone radius/mass/orbit/body
|
|
reads come from runtime wrappers and typed checkpoint projection rather than
|
|
a retained construction payload.
|
|
- Run checkpoint entity snapshots include typed simulation stat grids for
|
|
temperature, thermal mass, armor, max armor, and hull-conductivity axes.
|
|
They also carry public runtime session state: velocity, target entity
|
|
reference, active flag, heatsink toggle, shutdown override, tractor power,
|
|
heatstroke/hypothermia accumulators, aggregate visibility/source-count state,
|
|
contact rows for gathered information, hostility, and visible classification,
|
|
and active consumable item/timer rows.
|
|
Entity equipment, cargo-bay, and docking-bay slot rows preserve item-instance
|
|
facts needed for restore: item key, quality, durability, quantity, and enabled
|
|
state. Those facts are no longer discarded when pending checkpoint commands become
|
|
canonical `AetheriaEntitySnapshot` documents or package readback DTOs.
|
|
Cargo bay contents, docking bay contents, and docking bay child assignments
|
|
also persist as typed snapshot rows, so inventories and docked-child
|
|
placement do not need a bespoke `.zone` or runtime-blueprint save payload.
|
|
Equipped-item and active-consumable behaviors that intentionally expose
|
|
`IProgressBehavior` now publish typed progress rows keyed by owner kind,
|
|
owner index, behavior index, behavior kind, and progress value.
|
|
Weapon behaviors now also publish typed runtime rows for firing state, ammo,
|
|
burst timing, cooldown progress, charged-weapon charging/charge state,
|
|
constant-weapon reload/ammo-interval state, and lock-weapon lock progress
|
|
plus target entity reference. Authored instant lock behavior evaluates every
|
|
fixed daemon step whether or not that weapon currently owns a trigger or
|
|
burst; trigger selection owns permission to fire, not permission for lock
|
|
state to remain alive. Target changes, invalid targets, acquisition, and
|
|
angular decay commit through the same lock-state path and append stable
|
|
`weapon.lock.started`, `weapon.lock.acquired`, and `weapon.lock.lost` events
|
|
with prior/current progress. Eve projects those events generically while the
|
|
continuous combat presentation remains the reticle's state owner.
|
|
Sensor, radiator, reactor, and capacitor behaviors publish typed state rows
|
|
for ping state, radiator temperature/throughput, reactor draw/load, and
|
|
capacitor charge/capacity/efficiency. Aether drives publish typed axis,
|
|
thrust, RPM, maximum RPM, and thrust-direction rows, so rotor simulation
|
|
state is no longer trapped inside live behavior memory. Resource scanners
|
|
publish target body id, asteroid index, scan timer, range, minimum density,
|
|
and scan duration rows. Mining tools publish asteroid belt id, asteroid
|
|
index, and evaluated range rows. Thrusters publish analog axis input,
|
|
evaluated thrust, and torque rows. Shields publish evaluated efficiency and
|
|
energy usage, velocity limiters publish evaluated limit, and thermotoggles
|
|
publish their active target temperature. Switches publish activated state,
|
|
triggers publish pending pulled state, and stat modifiers publish
|
|
applied/executed flags plus target-stat count. Turret controllers publish
|
|
initialized weapon count, shot speed, and predictive-aim flag. Continue
|
|
restore lowers those typed weapon and behavior rows back into the live
|
|
equipped-item and active-consumable behavior instances through narrow
|
|
behavior-owned restore methods; construction/loadout blueprints do not own
|
|
behavior replay.
|
|
- Behavior-chain and stat-modifier authority is daemon-owned. Typed behavior
|
|
activation intents mutate only the addressed equipment `Switch` or `Trigger`;
|
|
the daemon then executes each authored equipment group in stable payload
|
|
order. A false switch or unpulled trigger stops that group, a trigger is
|
|
consumed exactly once, and reached `StatModifier` behaviors commit applied
|
|
state plus their live target count. Equipped modifiers apply in that same
|
|
fixed step. Active-consumable modifiers retain the fossil's update-before-
|
|
execute ordering and therefore apply one step after first execution. Every
|
|
`AetheriaRuntimeEquippedBehavior.EvaluateStat` call derives constant and
|
|
multiplier sources from the persisted snapshot, multiplies all multiplier
|
|
values, sums all constants, and returns `base * product + sum`. There is no
|
|
client modifier owner and no reconnect-time mutable modifier cache to double
|
|
apply. Offline, disabled, or broken source equipment contributes nothing.
|
|
The same executor owns the fossil common resource behaviors in authored group
|
|
order. `Cooldown` persists its normalized scalar and publishes generic
|
|
behavior progress; `EnergyDraw` transacts against the capacitor/reactor
|
|
owner; `Heat` writes the source equipment's thermal cells; `ItemUsage`
|
|
removes exactly one cargo item through the atomic cargo transaction; and
|
|
`Wear` applies thermal simulation's computed wear pressure at its authored
|
|
cadence. A refused cooldown, energy draw, or item use stops the group before
|
|
downstream heat, wear, or modifiers. Thermal simulation computes wear but is
|
|
no longer allowed to apply it merely because an item contains a `Wear`
|
|
payload.
|
|
`Thermotoggle` is another chain gate, not a renderer hint. New state seeds its
|
|
target from authored field 1, evaluates the fossil
|
|
`(temperature < target) XOR highPass` predicate against source-equipment
|
|
temperature, and stops its group when false. The target-temperature command
|
|
mutates only an exact installed `Thermotoggle` whose authored field 3 grants
|
|
adjustment; non-finite values, wrong behavior indices, missing catalogs, and
|
|
fixed thermostats fail closed. Eve receives the live target as ordinary
|
|
behavior state and remains presentation-only.
|
|
Each behavior row also records whether ordered execution reached it during
|
|
the current fixed step. Specialized subsystem handlers consume that daemon
|
|
fact instead of equating "installed and online" with "admitted by the
|
|
chain". `Thruster`, `AetherDrive`, and `Radiator` pause their authored group,
|
|
report the fossil `Execute` return value from their owning simulation organ,
|
|
and let the behavior owner resume the common tail at most once. A failed
|
|
energy draw or idle thruster therefore cannot consume trailing wear. A closed
|
|
thermostat makes its radiator unreachable; an admitted but unfunded radiator
|
|
reports failure and also stops the tail. Radiator emissive cooling remains an
|
|
always-update effect, matching the fossil independently of chain admission.
|
|
- Sensor contact information is daemon-owned. Each operational installed
|
|
`Sensor` behavior executes the fossil information equation against target
|
|
visibility, distance, observer-relative angle, its authored sensitivity
|
|
curve, and fixed simulation time, then applies the authored information
|
|
decay. Contacts become visible only when accumulated information crosses the
|
|
provider-owned detection threshold. Entity kind is not an input. Cargo is
|
|
not installed equipment. Hull-authored `Sensors` hardpoints own only the
|
|
installation envelope; generated loadouts still choose compatible equipment
|
|
through the ordinary footprint, faction, distance, and price rules.
|
|
- Active ping is the same behavior's actor-scoped daemon command path. The last
|
|
operational installed sensor owns the request, energy gate, cooldown,
|
|
expanding radius, and persistent set of already-crossed target indices.
|
|
A target receives the fossil ping boost and named transient signature once
|
|
per expansion crossing, including after reconnect; clients cannot replay the
|
|
boost by resending or rehydrating a request. Manual and future autonomous
|
|
pings must enter this same typed intent. The removed actorless ping flag and
|
|
range-based perfect-information refresh are forbidden writers and no longer
|
|
decide contacts.
|
|
- The daemon observation query owns docked sensor sharing. A docked controlled
|
|
craft's effective contact picture merges its own contacts with the dock
|
|
parent's contacts, retains the primary sensor source on every projected row,
|
|
and resolves duplicate targets to the strongest gathered information.
|
|
Eve contact documents and SoA render bodies consume this same query; runtime
|
|
clients do not discover docking relationships or union sensor state.
|
|
`EntityConstructionBlueprint` still exists for construction/loadout projection,
|
|
but those live hull grids and session scalars are not blueprint fields and
|
|
cannot be restored by the old blueprint projector path.
|
|
- `Aetheria.State` now defines `AetheriaLoadoutTemplate` as the typed Verse
|
|
replacement for bespoke `.loadout` files. It stores structured hull,
|
|
equipment, cargo bay, docking bay, child-entity, assignment, and weapon-group
|
|
state through record-key references and typed value slots instead of opaque
|
|
runtime blueprint serialization. Unity's save/loadout UI now projects its
|
|
in-memory `EntityConstructionBlueprint` into a typed Verse commit command, and
|
|
gameplay boot reads typed loadout templates back from `aetheria-world.cc`
|
|
through `AetheriaRuntimeCatalogStore` before lowering them into runtime
|
|
construction blueprints for the restore menu. The in-memory list remains a
|
|
UI/session cache, not durable authority.
|
|
- `ActionGameManager` opens `AetheriaRuntimeCatalogStore` over
|
|
`aetheria-world.cc`, hands the typed runtime catalog snapshot directly to
|
|
`ItemManager`, and gives it explicit item lookup authority. Item instances carry
|
|
`AetheriaRuntimeItemReference`, a typed item key, not a process-global catalog
|
|
resolver, hydrated projection cache, bare GUID owner, or durable item-data owner. The old
|
|
`LegacyItemCatalogBoundary`,
|
|
`LegacyItemCatalogCache`, and runtime MessagePack deserializer path have been
|
|
deleted. The old `DatabaseEntry`/`RuntimeCatalogEntry`/`RuntimeItemProjectionEntry`
|
|
identity base has been deleted from live source, and the old generic
|
|
`DatabaseLink<T>`/`RuntimeCatalogLink<T>` path has collapsed into the
|
|
item-specific runtime reference.
|
|
- `ItemManager` no longer exposes the raw runtime item catalog reader as public
|
|
gameplay/UI API, and its old `GetData`/`Hydrate` item DTO projection path has
|
|
been deleted. `ItemManager` no longer routes through a duplicate
|
|
`AetheriaRuntimeItemCatalog` cache; it reads typed item rows from the shared
|
|
runtime catalog snapshot only. The
|
|
temporary behavior config bridge has moved under `ItemManager` behavior
|
|
construction. The item properties UI no longer uses
|
|
`ItemManager` for manufacturer display; it resolves the manufacturer through
|
|
the package-owned `ActionGameManager.RuntimeCatalog` typed snapshot. Entity
|
|
restore and loadout manufacturer-distance weighting no longer use `ItemManager`
|
|
for faction lookup; they resolve factions through the `Galaxy` typed
|
|
corporation projection. There is no live console item-spawn command; future
|
|
operator item actions should be typed command documents or Eve/CultUI
|
|
commands, not in-client catalog hydration shortcuts. `LoadoutGenerator` also
|
|
receives the typed runtime catalog and uses typed candidate-kind selectors
|
|
for item selection and instantiation. Hull type, hardpoint type, shape fit,
|
|
station bay fit, hull/category, and behavior-kind prefilters run against typed
|
|
catalog rows. `EquippedItem` and `ConsumableItemEffect` now create behavior
|
|
instances through `ItemManager.CreateRuntimeBehaviors`, which switches on
|
|
stable typed behavior kind and constructs live behavior classes directly from
|
|
`RuntimeBehaviorDefinition`; layout metadata no longer selects or mutates
|
|
runtime behavior configs.
|
|
`StatModifier` requirement and stat-target lookup now inspects
|
|
the live equipped behavior instances and asks package-owned typed behavior
|
|
metadata for kind/family matching, not a freshly rebuilt config list or a
|
|
behavior-local class taxonomy. Live behaviors no longer expose their
|
|
construction config object as a public runtime authority; stat targeting now
|
|
crosses a behavior-owned stat lookup. The unused `TradeMenuDebug` script has been
|
|
deleted instead of preserving an old uGUI debug path that
|
|
turned typed trade rows back into legacy `ItemData` objects. That hydration
|
|
now comes from typed state, not `AetherDB.msgpack`. The surviving trade menu
|
|
wraps rows in a typed `TradeRow`: name, mass, price, size, hardpoint type,
|
|
commodity subtype, hull ownership, and behavior-kind filters read typed
|
|
catalog rows before any legacy projection is hydrated. Active behavior
|
|
filters store typed behavior kind keys and match typed behavior payloads
|
|
through package-owned typed behavior metadata, including parent-kind matching
|
|
for behavior families. PropertiesPanel and TradeMenu display metadata are now
|
|
package-owned typed behavior metadata. The obsolete `RuntimeInspectable`
|
|
attribute has been deleted from behavior classes and fields.
|
|
Dynamic behavior columns read typed behavior payload fields by legacy payload key
|
|
instead of hydrating legacy behavior DTOs. Trade buy decisions for crafted price,
|
|
ship-hull classification, simple commodity base price, and simple commodity
|
|
stack size also read typed catalog rows; the existing inventory transfer and
|
|
ship-construction paths still own the actual runtime mutation.
|
|
The sector properties UI also resolves
|
|
station/turret/ship counts only through typed hull classifications from the runtime catalog;
|
|
missing typed hull rows no longer fall back to legacy `HullData`. Loot pickup
|
|
presentation now uses typed catalog category/name rows to choose weapon-vs-gear
|
|
pickup visuals and scan labels; missing typed rows degrade to generic unknown
|
|
pickup presentation instead of falling back to legacy item projections.
|
|
Zone entity scene instantiation also reads typed hull prefab paths and hull
|
|
classifications from the runtime catalog; missing typed hull prefab rows fail
|
|
loudly instead of asking legacy `HullData` to choose the scene prefab.
|
|
Entity scene instances use typed hull shape cells and typed hardpoint rows for
|
|
collision damage masks and weapon-barrel presentation setup; behavior effect
|
|
prefabs still come from behavior DTOs until behavior construction/execution
|
|
moves to typed payloads.
|
|
Inventory panel equipment-grid geometry, hull/interior cell drawing,
|
|
temperature overlay masking, thermal edge toggles, and entity cell tinting now
|
|
use typed hull shape/interior masks from the runtime catalog. `EquippedCargoBay`
|
|
now reads cargo interior shape, item fit shape, simple commodity max stack,
|
|
cargo bay mass, and cargo bay thermal mass from typed runtime catalog rows;
|
|
`InventoryPanel` lowers cargo-grid display from that typed `InteriorShape`.
|
|
Final equipment fit/equip acceptance also reads typed item shape, hardpoint
|
|
type, hull shape, hull interior, hardpoint masks, cargo/docking categories,
|
|
and mass/thermal mass from runtime catalog rows. `Entity.MapEntity`,
|
|
`Entity.UnoccupiedSpace`, grid-offset placement, and `Entity.UpdateTemperature`
|
|
also read typed hull shape/interior, hardpoints, base armor, mass, specific
|
|
heat, and conductivity from runtime catalog rows. Entity construction now
|
|
names entities from the typed hull row and no longer keeps a `HullData`
|
|
property just to preserve the old naming bridge. `LoadoutGenerator`
|
|
candidate weighting, hardpoint/cargo/capacitor fit, selected-item reuse, and
|
|
hull conductivity setup now use typed runtime catalog rows. Generated loadout
|
|
item birth also uses a typed-row instance primitive, so selected catalog rows
|
|
no longer hydrate `EquippableItemData` just to create equipment. Docking bay
|
|
max ship size is imported as typed item state and `EquippedDockingBay.MaxSize`
|
|
derives from the typed runtime catalog row. `EquippedItem.InsetShape` now
|
|
derives from typed hull/item shape rows. `EquippedItem` and
|
|
`ConsumableItemEffect` behavior construction now read typed behavior payloads
|
|
through `RuntimeBehaviorDefinition` before instantiating the current behavior
|
|
classes. The old behavior config bridge is deleted; typed behavior kind and
|
|
group flow directly into live behavior instances.
|
|
Base `Behavior` now captures a runtime performance-stat table during
|
|
construction and no longer retains the config object for later stat lookup.
|
|
Heat, EnergyDraw, and Cooldown behavior instances now copy constructor
|
|
stat/scalar inputs into explicit runtime fields and no longer retain their
|
|
config subclasses after construction.
|
|
Wear, Visibility, Reflector, VelocityLimit, VelocityConversion, and ItemUsage
|
|
now follow the same rule for their constructor stat/key/scalar inputs.
|
|
Capacitor, Shield, Thruster, MiningTool, ResourceScanner, Thermotoggle,
|
|
Switch, HeatStorage, and Cockpit have also dropped runtime config retention;
|
|
Thermotoggle adjustability is now owned by the live behavior instance.
|
|
Reactor, Radiator, Sensor, and StatModifier now copy constructor performance
|
|
stats, curves, flags, and target strings into explicit runtime fields instead
|
|
of retaining config subclasses.
|
|
AetherDrive now copies rotor geometry, performance stats, torque curve, audio
|
|
parameters, and prefab path into explicit runtime fields. 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`; stat-bearing
|
|
behaviors register their runtime performance stats explicitly for
|
|
`StatModifier` rather than relying on config reflection.
|
|
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`; their live stat surfaces
|
|
are registered explicitly rather than recovered through config reflection.
|
|
Weapon, InstantWeapon, AutoWeapon, ConstantWeapon, ChargedWeapon, LockWeapon,
|
|
Launcher, and GuidedWeapon payloads also construct directly from
|
|
`RuntimeBehaviorDefinition`; the old `RuntimeBehaviorConfig`,
|
|
`BehaviorPayloadReader`, and weapon `*Config` classes are deleted from live
|
|
source.
|
|
`StatModifier` behavior requirements and behavior-stat targets compare typed
|
|
behavior kinds on the live equipped behavior instances through
|
|
`AetheriaRuntimeBehaviorMetadataCatalog` instead of scanning config
|
|
subclasses, rebuilding temporary configs, or hydrating
|
|
`EquippableItemData.Behaviors`. `ConsumableItemData` and
|
|
`EquippableItemData` no longer expose legacy `Behaviors` lists at all. The
|
|
old item-DTO stat branch was deleted after inspection showed no active
|
|
`PerformanceStat` fields on the live equippable item DTO hierarchy.
|
|
Ship drag, combat/turret shot prediction height, and thruster
|
|
torque geometry now consume typed hull facets and typed shape masks.
|
|
The item properties panel also reads typed catalog title names, descriptions,
|
|
manufacturer, base mass, max durability, thermal bounds, and thermal
|
|
performance curve keys for basic item presentation without hydrating legacy
|
|
DTOs. Runtime behavior stat display reads typed behavior payload fields
|
|
through package-owned typed behavior display metadata; stat modifier
|
|
presentation checks the package-owned typed `StatModifier` kind instead of a
|
|
legacy data class name. Damage-range payload selection is keyed by
|
|
package-owned typed weapon behavior metadata; legacy behavior config ancestry
|
|
is no longer a fallback for weapon payload selection. The old explicit
|
|
`Inspect(ItemData)` DTO inspection overload is deleted; trade row clicks now
|
|
inspect the typed runtime catalog row directly. Incomplete typed thermal
|
|
curve rows render a neutral fallback curve instead of hydrating legacy
|
|
`EquippableItemData`. Inventory selection highlighting now uses typed item
|
|
shape cells only for UI tint geometry; incomplete typed rows produce no
|
|
selected-cell mask instead of falling back to legacy `ItemData.Shape`.
|
|
Inventory cargo cell tint now uses typed hardpoint facets only; incomplete
|
|
typed rows receive the generic tint instead of falling back to legacy
|
|
`EquippableItemData.HardpointType`. Inventory HUD durability tint uses typed
|
|
max durability only, with current runtime durability as the generic
|
|
denominator for incomplete typed rows. `ItemManager.Evaluate` also uses typed
|
|
runtime item max durability and item names when evaluating unequipped
|
|
performance stats. Weapon group assignment and guided projectile diagnostics
|
|
report names from equipped typed runtime rows instead of `ItemData.Name`.
|
|
`ItemManager` typed item instantiation primitives create
|
|
simple commodities, crafted items, and equippable items from runtime catalog
|
|
rows; old DTO-based item creation is gone from blueprint cloning.
|
|
`EquippedItem` also takes conductivity, max durability, thermal bounds, and
|
|
thermal performance curve keys from the typed runtime item row for heat
|
|
conduction, durability performance, thermal performance, and wear scaling.
|
|
Thermal resilience is also typed and feeds wear scaling. Audio parameter stat
|
|
bindings are typed item rows and feed equipped-item Wwise parameter updates;
|
|
missing optional thermal/audio facets now degrade to neutral runtime defaults
|
|
instead of hydrating legacy equippable DTOs. Consumable stackability, duration, and
|
|
effectiveness curve slots are part of typed item rows, and action-bar
|
|
consumable activation/fill now command typed item IDs. The current mapped
|
|
legacy catalog has no consumable item rows, so consumable runtime behavior
|
|
still needs future typed data coverage, but it no longer hydrates
|
|
`ConsumableItemData` as a fallback.
|
|
Inventory drag preview occupancy now projects typed item shape cells only into
|
|
the local `Shape` grid, and final fit/equip acceptance shares the typed
|
|
runtime catalog geometry path in `Entity.ItemFits` and `TryEquip`.
|
|
Action-bar gear slots now resolve custom icon resource paths from typed
|
|
runtime item rows before falling back to typed weapon/hardpoint facets; legacy
|
|
`EquippableItemData.ActionBarIcon` is no longer a UI owner.
|
|
- `Galaxy` generation no longer accepts a runtime item catalog reader or `ItemManager`.
|
|
Sector and tutorial generation receive the package-owned typed runtime
|
|
catalog. `Galaxy` projects typed corporation v2 records into temporary legacy
|
|
`Faction` DTOs for the existing simulation shape, but allegiance edges are
|
|
typed-key-only through `AllegianceByKey`; the old GUID allegiance dictionary
|
|
and GUID faction lookup helpers are deleted. Galaxy resolves full name arrays
|
|
from `aetheria.name_file.v2` records. The
|
|
runtime no longer opens the old `GameData/NameFile/*.msgpack` directory.
|
|
- Item instances carry `AetheriaRuntimeItemReference`, a typed item key resolved
|
|
by `ItemManager` against the typed runtime item catalog projected
|
|
from `aetheria-world.cc`. Runtime item references no longer carry hydrated DTO
|
|
projection caches or global link-resolution authority. MessagePack catalog construction no longer grabs global link-resolution
|
|
authority, and the old generic `RuntimeCatalogLink<T>` abstraction is gone.
|
|
- `Aetheria.State.Daemon` starts the modern `Aetheria.State` CultMesh node as
|
|
the first-class Verse daemon and no longer shares authority with the old
|
|
RethinkDB/LiteNetLib server.
|
|
- `Aetheria.State.Import` writes a typed quarantine manifest and migration
|
|
ledger for the legacy catalog files. It also raw-decodes stable old
|
|
MessagePack union fields into typed item/faction/name-file documents without
|
|
compiling the old Unity domain model into `Aetheria.State`. A full import
|
|
writes those documents into one monolithic, tracked `.cc`; ignored
|
|
`.cc.records` directories are runtime materializations and cannot be required
|
|
to open a fresh clone. The current checked-in catalog maps to 116 item
|
|
definitions, 12 factions, and 12 name files. Item definitions now carry
|
|
legacy manufacturer IDs, price, shape
|
|
dimensions, occupied cell counts, full typed shape-cell masks, hardpoint
|
|
type, hull type, interior shape masks for hull/cargo equipment, hull
|
|
hardpoint definitions, behavior kind fingerprints, typed recursive behavior
|
|
payloads, stack size, specific heat, conductivity, hull grid offset, hull
|
|
armor, hull drag, hull towing flag, durability, and weapon
|
|
range/caliber/type/fire/modifier classifications. Corporation documents now carry the legacy short name, true
|
|
description from key 3, name-file and boss-hull legacy IDs, influence
|
|
distance, allegiance count, full allegiance edges, and music bank IDs. Empty
|
|
legacy GUID references are imported as absent links rather than as
|
|
`Guid.Empty` catalog IDs.
|
|
Name-file documents are now `aetheria.name_file.v2` records and carry both
|
|
sample names for compact surfaces and the full legacy name array for future
|
|
`Galaxy`/Markov name generation cutover. Corporation documents are now
|
|
`aetheria.corporation.v2` records because runtime generation needs actual
|
|
allegiance edges, not only a count. `Aetheria.State` now owns the canonical
|
|
legacy-ID record key mapping for migrated item, corporation, and name-file
|
|
documents.
|
|
- `AetheriaCatalogSnapshot` is the typed catalog read surface over materialized
|
|
`.cc` records. It exposes trade-item, typed
|
|
manufacturer/corporation/name-file key queries, corporation prefix queries,
|
|
and legacy-ID migration lookup, plus equipment, hardpoint, and behavior
|
|
queries without touching runtime projection DTOs.
|
|
- `ItemManager` can now ask its typed runtime item reader for the owning
|
|
`AetheriaRuntimeCatalogItem` row by item ID. Its generic mass, thermal-mass,
|
|
and crafted-price helpers read typed mass, specific heat, quantity, quality,
|
|
and price rather than hydrating `ItemData`; legacy projection hydration is
|
|
still used for behavior construction and simulation surfaces that have not
|
|
been rebuilt yet.
|
|
- The embedded `GameCult.Aetheria.State.Unity` package now owns the
|
|
Unity-visible immutable catalog read-model contract for
|
|
trade/equipment/behavior/hardpoint/manufacturer/corporation/name queries,
|
|
typed item shape masks, typed interior masks, hardpoints, and behavior
|
|
payloads. It also owns a read-only Unity-compatible CultCache directory-store
|
|
opener for the known Aetheria catalog schemas, so Unity runtime code can read
|
|
`aetheria-world.cc` catalog records without runtime projection DTOs or a MessagePack
|
|
catalog cache. The SDK-style `Aetheria.State.Unity` facade includes
|
|
that package source and owns the full `Aetheria.State` mapper plus Eve surface
|
|
read path for .NET smokes. Neither is a simulation owner and neither writes
|
|
state.
|
|
`Aetheria.Shared.Unity` references this package directly so `Galaxy` can
|
|
consume typed corporation and name-file keys without loading legacy `Faction`
|
|
or `NameFile` documents. The
|
|
package also owns Unity's typed daemon/Eve command helpers for settings,
|
|
loadout-template, and runtime requests. These helpers are transport-only:
|
|
they cannot decide canonical state, and the Verse daemon accounts accepted
|
|
command records after publishing typed documents. Run checkpoint documents now
|
|
carry current-zone and entity snapshots so the old `.zone` file path has a
|
|
live typed runtime projection path.
|
|
- `AetheriaRuntimeEveCommands` is the renderer-facing typed command helper. The
|
|
internal Eve command path persists typed `AetheriaRuntimeEveCommandDocument`
|
|
records; `AetheriaEveCommandBridge` consumes the same shared document type,
|
|
validates provider/surface/command authority, and deletes accounted command
|
|
records. The Eve command lane is transport, not renderer-owned state.
|
|
- `Aetheria.State.Daemon` hosts the CultMesh Verse member and owns long-running
|
|
Eve command acceptance for provider-owned surfaces. `--once` runs one daemon
|
|
tick for smoke/operator use without keeping the process alive.
|
|
- `AetheriaEveCommandAcceptanceStatus` and the `aetheria.operations` Eve surface
|
|
publish Eve request acceptance health, observed depth, applied counts,
|
|
failures, and timestamps as typed state. Console logs are notification-only.
|
|
- Daemon Verse/service identity now lives in typed
|
|
`aetheria.verse_host_settings.v1`, owned by the Aetheria daemon. Provider
|
|
advertisement and operations telemetry project from that document, so public
|
|
or private Verse exposure and seed-galaxy Verse routing no longer hide in
|
|
hardcoded projector strings.
|
|
- `AetheriaPlayerSettingsSurfaceProjector` now emits a provider-owned
|
|
`aetheria.player_settings` Eve surface from canonical `AetheriaPlayerSettings`
|
|
state. Gameplay and graphics settings are exposed as typed read models plus
|
|
narrow typed command buttons, not renderer-local fields.
|
|
- `AetheriaProviderAdvertisementProjector` publishes
|
|
`gamecult.eve.provider_advertisement.v1` for the `aetheria` provider,
|
|
advertising the shared runtime Eve surface catalog, command boundaries,
|
|
schemas, and `.cc` witness path. Its Verse/service identity now comes from
|
|
typed daemon host settings instead of hardcoded projector fields. This is the
|
|
discovery map for Odin/Eve, not a health page.
|
|
- `AetheriaRuntimeEveSurfaceCatalog` is the single inventory of known Aetheria
|
|
Eve panels. The daemon advertisement and Odin-facing provider advertisement
|
|
both derive from it, so daemon GUI/TUI records, operator records, menu shells,
|
|
inventory/trade panels, contextual inspectors, and designer previews are
|
|
visible without making Unity or Electron the owner.
|
|
- `AetheriaCatalogSurfaceProjector` now emits the first provider-owned Eve
|
|
surface from typed catalog state. The importer materializes a
|
|
`gamecult.eve.surface.v1` catalog operator document at
|
|
`eve:surface:aetheria.catalog.operator` with summary, trade-catalog, and
|
|
corporation views. This is a typed CultCache surface document, not a renderer
|
|
dashboard or JSON status card.
|
|
- The embedded Unity state package can now read `gamecult.eve.surface` records
|
|
directly from the CultCache `.cc` store into the shared Eve surface contract
|
|
DTOs. This gives Unity the same provider-owned retained tree that the
|
|
SDK-style state client reads, without JSON fixtures, HTTP dashboard
|
|
summaries, or renderer-owned state.
|
|
- `AetheriaEveSurfacePresenter` is the first runtime UI Toolkit consumer of
|
|
those typed surface documents. It owns mounting only: state file resolution,
|
|
surface lookup, lowering, and command emission into a typed pending queue.
|
|
Provider command acceptance belongs to `AetheriaEveCommandBridge`, which
|
|
consumes typed Eve command documents from the CultCache/CultMesh state node.
|
|
- `AetheriaEveRuntimeBootstrap` mounts the first runtime Eve surface after
|
|
scene load. The default surface is `aetheria.operations`, hosted in a
|
|
runtime-created `UIDocument`; environment variables or a command-line switch
|
|
can redirect/disable the mount for diagnostics. Batchmode disables the
|
|
bootstrap so verification runs do not create renderer state.
|
|
- `GameData/aetheria-world.cc` is now materialized from the importer as the
|
|
self-contained project-local typed state file for the checked-in catalog. The
|
|
importer stores
|
|
relative provenance in the state document, not machine-local absolute paths.
|
|
Unity resolves this path through the embedded `GameCult.Aetheria.State.Unity`
|
|
runtime package, not through the legacy catalog boundary. Unity also asks the
|
|
package to inspect whether the typed state file exists during boot; the
|
|
warning is notification-only and does not make legacy catalog data the typed
|
|
state owner.
|
|
Import rebuilds clear the generated `.cc`, `.cc.records`, and `.cultmesh`
|
|
outputs for the selected state path after capturing legacy inputs, then writes
|
|
the release artifact with the monolithic store. Schema evolution can
|
|
rematerialize typed state instead of being blocked by stale embedded schema
|
|
catalogs. Mutable runtime nodes may materialize their private directory-store
|
|
overlay after deployment; that overlay is never release authority.
|
|
`Aetheria.State.Verify` copies the tracked monolith into a fresh temporary
|
|
directory before opening it and checks that migration
|
|
ledger counts match actual typed catalog records, that name-file v2 records
|
|
carry their full name arrays, that the legacy-ID lookup API resolves migrated
|
|
item, corporation, and name-file documents, and that the expanded typed
|
|
catalog facts, typed catalog snapshot queries, and typed Eve catalog surface
|
|
are present in the `.cc` store. The current verifier sees 52 shaped item
|
|
masks, 5 interior masks, 3 hardpoint-host hulls, 22 hardpoints, 39
|
|
behavior-bearing item definitions, 65 behavior payloads, 661 behavior fields,
|
|
18 behavior-side legacy-ID references, 51 hardpoint-tagged equipment items, 3
|
|
hull items, 18 weapon-facet item definitions, and 143 corporation allegiance
|
|
edges. Legacy content includes at least one overhanging hardpoint
|
|
(`LonginusX`); migration verification
|
|
preserves that payload and does not convert content repair into mapper
|
|
authority.
|
|
- `.voidbot/state/aetheria.cc` is the repo Persona state witness. Aetheria is
|
|
not registered as a VoidBot Discord identity yet, so mutations use the
|
|
repo-local `void-self-state.mjs apply-operation` typed boundary rather than
|
|
the registered Face MCP path.
|
|
- The old IMGUI DB inspector has been deleted. `NameTools` still
|
|
clean/generate names, but it now uses a UI Toolkit editor shell, and the
|
|
legacy NameFile `.msgpack` export control has been deleted instead of leaving
|
|
a warning-only writer stub. The
|
|
remaining Unity helper files formerly under `Assets/Scripts/CultCache` now
|
|
live under `Assets/Scripts/UnitySupport` because they are color/curve helpers,
|
|
not cache authority.
|
|
- Galaxy generation no longer reads legacy `Faction` or `NameFile` entries
|
|
through `ItemManager`; it requires the typed runtime catalog opened from
|
|
`GameData/aetheria-world.cc`.
|
|
- The dead Unity `NameFile` projection class has been deleted. Runtime name
|
|
generation reads `AetheriaRuntimeNameFile` records from the typed catalog
|
|
facade; legacy `GameData/NameFile/*.msgpack` remains migration input only.
|
|
- Pending Unity runtime commit envelopes now carry typed item keys only for
|
|
loadout items, action-bar targets, body resources, entity hulls, and active
|
|
consumables. The older `ItemDefinitionLegacyId` and
|
|
`HullItemDefinitionLegacyId` fields have been deleted from the pending commit
|
|
contract; the applier no longer reconstructs item keys from legacy item GUIDs.
|
|
Corporation legacy ID fallback fields are also deleted from runtime
|
|
commit DTOs; current commands must publish typed faction keys directly.
|
|
- Entity restore and loadout manufacturer-distance weighting no longer read
|
|
legacy `Faction` entries through `ItemManager`; they use `Galaxy.ResolveFaction`
|
|
over the typed corporation projection.
|
|
- The `give` command no longer enumerates legacy item catalog entries; typed
|
|
catalog selection owned the command match before the command was deleted.
|
|
- `LoadoutGenerator` no longer enumerates legacy item catalog entries for its
|
|
candidate pool; typed catalog filtering owns the first item selection pass,
|
|
and typed runtime item rows are passed directly to `ItemManager` for
|
|
instantiation. The remaining post-selection bridge is behavior config
|
|
construction for old behavior constructors, not whole-item DTO hydration.
|
|
- `TradeMenuDebug` no longer enumerates legacy item catalog entries for its
|
|
table rows; typed trade catalog records own the row set, with legacy DTO
|
|
hydration kept for the old debug UI callbacks.
|
|
- MessagePack is no longer used as a runtime object-cloning shortcut for
|
|
`EntitySettings`, and UI/player-settings startup no longer registers the old
|
|
MessagePack resolver. The custom Unity-side MessagePack resolver and math/type
|
|
formatter source has been deleted with the old bespoke file format path.
|
|
Unused Unity asset formatters for GameObject, Material, Sprite, and Texture2D
|
|
are deleted. Keyboard layout DTOs are plain runtime parse/display models, not
|
|
MessagePack save shapes. `PlayerSettings` is a plain session-local runtime
|
|
object until typed Verse settings are imported into Unity. `ZoneData` body/orbit DTOs, `ItemInstance` DTOs,
|
|
`EntitySettings`, `Ship`, Unity inspector game settings, environment/volume
|
|
settings, exponential curves, Wwise bindings, and enum dictionaries are also
|
|
plain runtime/session/config projections now, not MessagePack persistence
|
|
shapes. The global scene-load MessagePack resolver hook is deleted. The slime
|
|
compute settings path no longer serializes its local parameter struct for
|
|
change detection. Agent task runtime shapes no longer carry MessagePack
|
|
object, union, key, or ignore metadata. `AgentTask` no longer inherits the
|
|
shared runtime projection identity base; task objects are plain in-memory AI
|
|
work orders until a typed Verse task document exists.
|
|
- Legacy player, faction, name-file, galaxy-map-layer, and narrative helper
|
|
DTOs no longer carry MessagePack object/key/ignore metadata. Typed
|
|
corporation/name-file/catalog documents own durable state; these classes are
|
|
inspector/runtime projections only. Item and behavior DTO field layout for
|
|
`AetheriaRuntimeItemCatalog` no longer depends on live Unity field
|
|
attributes; importer key maps, typed payload fields, and explicit runtime
|
|
mappers own migrated layout.
|
|
- The dead `PersonalityAttribute` projection DTO and its unused property-panel
|
|
hook have been deleted; no typed catalog import or runtime caller owned that
|
|
shape.
|
|
- Declaration-only personality fields on `Faction`/`Entity` and the unused
|
|
production personality setting have also been cut; there is no surviving
|
|
personality-state owner in live Unity source.
|
|
- `AgentTask` has been cut loose from the item projection base; AI tasks are
|
|
local runtime work orders and no longer participate in the shared projection
|
|
identity base.
|
|
- `BodyConstructionData` and `OrbitConstructionData` have also been cut loose from
|
|
the item projection base; they keep local GUID fields for zone runtime lookup,
|
|
but no longer inherit shared projection equality.
|
|
- `Faction` has been cut loose from the item projection base; it keeps local
|
|
GUID equality for galaxy dictionaries while typed corporation records remain
|
|
the durable catalog owner.
|
|
- `Aetheria.Shared.Unity` no longer references the vendored `MessagePack`
|
|
assembly. The embedded `GameCult.Aetheria.State.Unity` package still depends
|
|
on MessagePackReader to open CultCache `.cc` records; that dependency belongs
|
|
to the typed state package boundary until it can move to a modern CultLib
|
|
Unity package.
|
|
- The dead story compiled-JSON cache sketch and its SHA helper are deleted;
|
|
story compilation currently reads Ink source directly until a typed Verse
|
|
story/cache document exists.
|
|
- Runtime UI still contains old Unity UI/uGUI prefabs plus `MonoBehaviour`
|
|
scripts under `Assets/Scripts/UI/` and `Assets/Prefabs/UI/`, but the old
|
|
renderer-local debug console and field-tester panel authorities have been
|
|
deleted. Runtime UI commands must be provider-advertised Eve command
|
|
documents, not text parsed by a Unity component or a test-scene uGUI panel and
|
|
invoked directly against gameplay objects.
|
|
- Aetheria already has Unity UIElements support available through
|
|
`com.unity.modules.uielements`. It now imports
|
|
`org.gamecult.eve.surface` and `org.gamecult.eve.unity-uitoolkit` from the
|
|
neighboring Eve repository:
|
|
the first carries no-engine `gamecult.eve.surface.v1` contract DTOs, and the
|
|
second lowers those retained trees into UI Toolkit `VisualElement` trees.
|
|
These packages are renderer boundaries, not UI truth owners.
|
|
`org.gamecult.aetheria.eve-runtime` now adds the Aetheria-specific
|
|
`UIDocument` presenter that reads provider-owned Eve surfaces from
|
|
`GameData/aetheria-world.cc` and mounts them through the lowerer. Its command
|
|
path sends typed `gamecult.eve.command.v1` records to the provider-owned
|
|
command bridge instead of accepting renderer-local command effects.
|
|
`AetheriaEveCommandBridge`
|
|
currently accepts the advertised catalog/operations refresh commands plus the
|
|
first provider-owned player-settings mutation commands, republishes
|
|
provider-owned surfaces, rejects unknown/unadvertised commands, and records
|
|
`AetheriaEveCommandAcceptanceStatus` as typed state.
|
|
|
|
## Invariants
|
|
|
|
- Durable game state is typed CultCache state, not JSON documents or ad hoc
|
|
sidecars.
|
|
- Network-visible state is published through CultMesh/CultNet documents, not a
|
|
RethinkDB changefeed or bespoke status endpoint.
|
|
- Record identity belongs to CultCache record keys and typed references, not to
|
|
mutable domain base classes.
|
|
- UI surfaces are provider-owned Eve CultUI documents; Unity is a lowering
|
|
runtime, not the owner of UI truth.
|
|
- Migration code may read old formats, but old stores cannot decide live state
|
|
after migration.
|
|
- The runtime must have one commit path for user action, load/import, server
|
|
replication, and editor mutation of the same state.
|
|
|
|
## Current Authority Map
|
|
|
|
### Direct CultMesh Session And Peer Transport
|
|
|
|
- Owner: each Aetheria daemon owns its advertised client CultMesh endpoint and
|
|
its explicitly configured direct daemon-peer endpoints.
|
|
- Inputs: typed client sessions, commands, snapshot requests, committed facts,
|
|
and optional `--peer-cultmesh-endpoint` routes. Odin publication is disabled
|
|
unless an operator explicitly supplies `--odin-cultmesh-uri`.
|
|
- Outputs: typed state/surface snapshots, receipts, provider-owned assets, and
|
|
policy-filtered committed-fact convergence between directly connected
|
|
daemons.
|
|
- Derived state: discovery catalogs and external provider indexes may mirror
|
|
advertisements, but they do not grant authority or mediate an Aetheria
|
|
session.
|
|
- Forbidden writers: Odin, Eve lowerers, Unity, and remote peers cannot apply a
|
|
fact directly. Imported facts pass the daemon authority policy and execute
|
|
through the daemon's required Ymir world-physics owner.
|
|
- Shared paths: local commands and accepted remote facts enter the same daemon
|
|
command transaction and receipt chronology.
|
|
- Cut line: the rejection that forced `--peer-cultmesh-endpoint` through Odin
|
|
is deleted. Direct CultMesh is the Aetheria path; Odin is optional external
|
|
indexing only.
|
|
- Verification layer: `Aetheria.State.AuthoritySmoke` boots real child daemons,
|
|
connects replicas directly, proves accepted/rejected policy outcomes, and
|
|
proves committed-fact convergence with production Ymir physics injected.
|
|
|
|
### Daemon Sector-Map Surface
|
|
|
|
- Owner: the daemon run owns sector topology, discovery, current location,
|
|
faction presence, and the visibility of zone and link facts.
|
|
- Inputs: `gamecult.aetheria.sector_map.v1`, projected from the committed run.
|
|
- Outputs: the directly advertised `aetheria.sector_map` Eve surface. Its
|
|
generic graph contains discovered nodes and links, the weighted
|
|
entrance-to-Terminus route, home/executive landmarks, a legend, and one
|
|
`graph.region` scalar field per visible faction. Region samples preserve the
|
|
fossil values: owner `10`, present `5`, excluded `-10`.
|
|
- Derived state: graph drawing and selection treatment are presentation. The
|
|
provider publishes the historical galaxy and Influence materials plus the
|
|
start, Terminus, home, and executive sprites through its asset catalog. Exact
|
|
scene and shader levers travel as `sectorMap.*` tokens: background noise,
|
|
contour threshold, fill tiling/blends/alpha, hatch tilt, stroke shape,
|
|
faction color boosts, `0.002/0.005` link widths, `0.5/0.25s` reveal timing,
|
|
landmark scale, current marker treatment, label offset, and zoom bounds.
|
|
Faction hatch tilt is stable for generation seed and faction identity rather
|
|
than renderer-local randomness.
|
|
- Forbidden writers: Unity `SectorMap`, map cameras, Electron, and generic Eve
|
|
lowerers cannot reveal zones, add links, or choose the current zone.
|
|
- Shared paths: every runtime reads the same CultMesh record advertised by the
|
|
daemon. The record republishes with every daemon frame so travel and discovery
|
|
cannot remain stuck at topology-boot state. Zone details remain an inspection
|
|
surface and do not impersonate the sector map itself.
|
|
- Cut line: `MapMenuSurface` publishes the sector graph rather than a card for
|
|
only the current zone. The legacy Unity map remains a transitional lowerer,
|
|
not an alternate map authority.
|
|
- Verification layer: daemon smoke proves undiscovered labels and links are
|
|
absent; the weighted critical route is derived from daemon facts; home and
|
|
executive landmarks survive CultCache reopen; influence samples, legend,
|
|
historical values, material refs, sprites, and provider-owned visual tokens
|
|
travel with the surface.
|
|
|
|
### Daemon Combat Lifecycle
|
|
|
|
Weapon admission, pending trigger, progressive target lock, burst/reload/charge
|
|
state, deterministic shot resolution, and transition chronology live in the
|
|
public daemon run checkpoint. A restart restores that exact checkpoint rather
|
|
than reconstructing combat from client input or replaying presentation events.
|
|
Daemon smoke now persists a partial instant-weapon lock, reopens it, and proves
|
|
the pending trigger completes exactly one shot with one `weapon.lock.started`,
|
|
one `weapon.lock.acquired`, and one `shot.committed` event. Ymir reconstructs
|
|
process-local bodies from committed world state; it does not own weapon
|
|
lifecycle state.
|
|
|
|
### Durable Loadout Restart Contract
|
|
|
|
- Owner: `AetheriaRuntimeDaemonFrameDocument` at `DaemonFrameLatest` is the
|
|
durable live-run checkpoint. `AetheriaRunState`, `AetheriaZoneState`, and
|
|
`AetheriaEntitySnapshot` seed a run only when no playable live frame exists;
|
|
they are not a second writer for an active session.
|
|
- Inputs: accepted daemon transactions plus the complete runtime entity state:
|
|
hull, installed placement and rotation, per-instance item fields, cargo and
|
|
bay contents, weapon groups, equipment/behavior/weapon/consumable state, and
|
|
loadout-generation receipts. Generic Eve refit requests enter through the
|
|
advertised operation and are translated into that same typed transaction;
|
|
Eve never writes the checkpoint directly.
|
|
- Outputs: one typed CultCache frame that can be closed, reopened in a fresh
|
|
state node, resumed by the daemon, and projected into Eve without rebuilding
|
|
gameplay state from Unity objects or client input.
|
|
- Reconnect invariant: exact item placement, authored rotation, quality,
|
|
durability, thermal state, cargo quantity, held groups, wear, specialized
|
|
chain chronology, ammunition, shot sequence, active-effect execution state,
|
|
and generation provenance survive the real directory store. Restored Eve
|
|
weapon and thermostat levers derive from that same frame. A refit preserves
|
|
state owned by surviving equipment indices, removes state owned by removed
|
|
equipment, and gives newly installed cargo no invented runtime history.
|
|
- Forbidden writers: Unity loadout mirrors, Eve lowerers, and bootstrap entity
|
|
documents cannot overwrite an active latest-frame checkpoint.
|
|
- Verification layer: daemon smoke hard-flushes the frame, disposes the first
|
|
`AetheriaStateNode`, opens a second node, verifies the complete loadout and
|
|
behavior state plus an accepted generic Eve equipment placement and consumed
|
|
source, then rebuilds generic Eve input capabilities from the restored frame.
|
|
|
|
### Daemon Resource Behavior Chains
|
|
|
|
- Owner: `MiningTool` and `ResourceScanner` each own the success or failure of
|
|
their authored behavior-chain position. Generic behavior execution pauses at
|
|
that position until the specialized daemon subsystem evaluates the requested
|
|
world target.
|
|
- Inputs: chain admission from preceding switch/cooldown/resource gates, the
|
|
exact behavior intent, operational equipment state, authoritative body or
|
|
asteroid identity and pose, actor position, and evaluated range.
|
|
- Outputs: a successful in-range mining or scanning transaction reports one
|
|
specialized success and resumes the remaining group once. Missing, expired,
|
|
or out-of-range targets report no success, so trailing heat, item use, wear,
|
|
or modifiers remain unreachable.
|
|
- Derived state: scan progress, mining feedback, effects, audio, and UI progress
|
|
are projections of daemon behavior state and world transactions.
|
|
- Forbidden writers: Unity behavior instances, agent presentation, Eve
|
|
lowerers, and a later reconciliation pass cannot declare the resource action
|
|
successful or execute its tail.
|
|
- Shared order: inline gates run first; flight, combat, sensor, mining, and
|
|
survey owners evaluate their specialized work; deferred tails then complete;
|
|
reactors settle the complete tick's energy ledger; thermal integration and
|
|
medical consequences run last. Resource work can no longer occur after the
|
|
tick has already settled its energy and heat.
|
|
- Verification: daemon smoke proves successful mining and scanning each consume
|
|
one authored trailing item, while otherwise identical out-of-range attempts
|
|
preserve cargo and leave the trailing behavior's `ChainReached` false.
|
|
|
|
### Daemon Orbital Turret Controller
|
|
|
|
- Owner: each chain-admitted operational installed `TurretController` behavior owns automatic
|
|
target acquisition, predictive look direction, and its exact per-weapon
|
|
trigger set. Ship agent combat remains owned by the task planner and pilot
|
|
fire remains an accepted command; neither path impersonates an orbital
|
|
controller.
|
|
- Inputs: authored preceding behavior-chain gates, including the canonical
|
|
`EnergyDraw`; visible hostile ship contacts in stable zone order, current target,
|
|
entity and target pose/velocity, operational weapon behaviors, evaluated
|
|
weapon range and velocity, and catalog placement rotation.
|
|
- Outputs: selected target, daemon look direction, reconnectable controller
|
|
weapon count/shot speed/predictive flag, and behavior-granular weapon
|
|
requests consumed by the ordinary instant, constant, charged, and deployable
|
|
weapon lifecycle.
|
|
- Derived state: turret tracking animation, barrel articulation, muzzle effects,
|
|
target indicators, and audio are Eve presentation of daemon aim, weapon state,
|
|
shot receipts, and feedback chronology.
|
|
- Forbidden writers: faction identity, entity kind, Unity update loops, and
|
|
generic Eve lowerers cannot grant automatic fire. The deleted non-player
|
|
group-zero fallback is not a compatibility path. Mere installation cannot
|
|
bypass a refused behavior-chain resource gate.
|
|
- Shared paths: pilot and ship-agent group commands expand to every weapon
|
|
behavior on their assigned equipment; turret control requests only the exact
|
|
aligned in-range behavior. All then enter the same lock, charge, burst,
|
|
energy, heat, wear, visibility, shot, and damage transactions.
|
|
- Verification: daemon smoke proves no controller/no command means no hostile
|
|
auto-fire; an empty capacitor prevents acquisition, aim, and fire through the
|
|
canonical `EnergyDraw -> TurretController` chain; restored power acquires
|
|
without firing in the same fossil tick; projectile
|
|
velocity enables CultMath first-order intercept; and a forward weapon fires
|
|
while the reversed behavior remains inactive. That exact forward weapon alone
|
|
receives thermal wear and publishes its authored transient visibility. Shared
|
|
weapon smokes also prove those side effects for instant, constant, charged,
|
|
and deployable transactions, including the charged visibility multiplier.
|
|
|
|
### Daemon Ship Schematic Projection
|
|
|
|
- Owner: the daemon entity snapshot and typed catalog own schematic topology and
|
|
every displayed gameplay value.
|
|
- Inputs: hull shape, current/maximum armor grids, installed-item placement and
|
|
rotation, catalog footprint/durability/thermal bounds, equipment state, and
|
|
weapon lifecycle state.
|
|
- Outputs: one generic `ship.schematic` child for the controlled entity and one
|
|
for its selected target, marked `self` or `target`; explicit `schematic.hull-cell`,
|
|
`schematic.item`, `schematic.item-cell`, and `schematic.weapon` children carry
|
|
the complete spatial and live state.
|
|
- Derived state: renderer layout, color ramps, warning animation, typography,
|
|
temperature units, and compact-vs-spatial presentation are client choices.
|
|
- Forbidden writers: fossil `SchematicDisplay.Update`, Unity item objects, and
|
|
generic Eve lowerers cannot calculate armor, durability, temperature,
|
|
performance, online state, wear, ammo, or cooldown.
|
|
- Shared paths: schematic item footprints use
|
|
`AetheriaRuntimeEquipmentGridGeometry.RotatedCells`, the same geometry used by
|
|
refit admission and damage interception.
|
|
- Cut line: the fossil schematic remains a visual reference/product shell, not
|
|
the only source of its semantics. Generic clients need no Aetheria runtime
|
|
types or provider internals to lower the advertised tree.
|
|
- Verification: daemon smoke proves a selected target's nonuniform armor grid,
|
|
clockwise two-cell equipment footprint, durability/temperature ratios,
|
|
thermal performance, online state, ammo, and cooldown, plus the controlled
|
|
entity's `self` role.
|
|
|
|
### Guided Shot Presentation Contract
|
|
|
|
- Owner: the daemon's ordinary shot transaction owns hit and damage for
|
|
`GuidedWeapon` and `Launcher`, exactly as it does for the fossil weapon event.
|
|
- Inputs: authored target mode, guidance/thrust/lift curves, thrust, missile top
|
|
speed, dodge frequency, range, origin, endpoint, and stable shot identity.
|
|
- Outputs: a retained `shot.receipt` with `presentationKind=guided` and the
|
|
complete runtime-neutral guidance profile; it survives checkpoint restart and
|
|
reaches generic Eve shot facts.
|
|
- Derived state: missile steering, split/fade particles, trail geometry, and hit
|
|
visuals are client presentation. Provider prefab parameters may style those
|
|
effects but cannot decide damage or contact.
|
|
- Forbidden writers: Unity casts, visual missile transforms, and generic Eve
|
|
lowerers cannot damage, retarget canonical state, or create an ordinary Ymir
|
|
gameplay body.
|
|
- Shared paths: `Launcher` retains target-entity guidance and `GuidedWeapon`
|
|
retains look-direction guidance; both commit through the same lock, resource,
|
|
wear, visibility, shot, and damage transactions as other instant weapons.
|
|
- Cut line: the roadmap no longer asks for guided persistent payloads. The fossil
|
|
projectile was a visual follower after damage authority had already fired.
|
|
- Verification: daemon smoke proves no physical payload is created, every
|
|
authored curve/scalar reaches the receipt and Eve surface, `Launcher` selects
|
|
the guided presentation kind, and the profile survives serialization.
|
|
|
|
### Daemon Damage Transaction
|
|
|
|
- Owner: the daemon's canonical damage transaction owns damage-layer ordering
|
|
and mutation for direct weapons and deployables.
|
|
- Inputs: hull and hardpoint catalog topology; initialized armor and
|
|
maximum-armor grids; shield, equipment, and scalar hull state; deterministic
|
|
impact position/direction; fossil full-width/full-height schematic UV
|
|
scaling; damage amount, orthogonal spread, 0.5-cell penetration, and typed
|
|
damage type.
|
|
- Outputs: one atomic `shield -> armor cell -> equipment -> scalar hull`
|
|
result, mutated canonical grids/equipment/hull state, receipts recording
|
|
which layers were reached, and one `equipment.destroyed` fact whenever an
|
|
installed item crosses the fossil durability threshold.
|
|
- Derived state: aggregate armor and exact schematic armor/maximum-armor facts
|
|
are Eve projections of canonical cell state. Scalar hull is the terminal
|
|
remainder, not an armor surrogate. Every direct-shot receipt projects stable
|
|
`shot.damage-cell` children with coordinates and exact armor, equipment, and
|
|
hull application so presentation never reconstructs the transaction. Damage
|
|
type is typed/pass-through; no resistance authority exists because the fossil
|
|
did not apply resistances.
|
|
- Forbidden writers: direct-fire code, deployable handlers, Ymir contacts,
|
|
Unity components, Eve lowerers, scalar-health helpers, and reconciliation
|
|
loops cannot independently apply or repair armor, equipment, or hull damage.
|
|
- Shared paths: direct and deployable impacts enter the same transaction after
|
|
their respective authoritative impact facts are resolved. All behavior
|
|
consumers use the shared operational-equipment query, so disabled,
|
|
thermally-offline, and destroyed items cannot keep acting through a forgotten
|
|
subsystem-specific filter. Equipment interception derives occupied cells
|
|
from the same rotation-aware grid geometry as refit, thermal simulation, and
|
|
Eve schematic projection.
|
|
- Cut line: scalar-hull-only and caller-specific damage paths are no longer
|
|
owners. Hull/hardpoint topology initializes armor grids; only the daemon
|
|
transaction mutates them thereafter. Penetration always advances by a
|
|
half-cell step, eliminating the fossil's non-advancing infinite loop, and
|
|
terminates at the first empty sample instead of crossing a hull gap.
|
|
- Verification: daemon smoke proves a rotated asymmetric equipment footprint
|
|
receives residual cell damage, a deterministic UV lands on the cell selected
|
|
by the fossil's full-dimension arithmetic, and a penetrating direct shot
|
|
cannot reach a disconnected hull island. The exact contiguous cell count and
|
|
per-layer cell outcome remain visible in the generic Eve shot receipt.
|
|
|
|
### Daemon Destruction Transaction
|
|
|
|
- Owner: cause-specific daemon damage owns one destruction identity, active-world
|
|
removal, reference cleanup, loot rolls, pickup state, and chronology.
|
|
- Inputs: canonical hull result or cockpit-destruction crossing, run seed,
|
|
entity equipment/cargo, and fossil loot settings (`0.25` equipment
|
|
probability, `25` launch speed, `30` second life).
|
|
- Outputs: an inactive identity-stable tombstone, deterministic typed pickups,
|
|
`entity.destroyed` and `pickup.dropped` events, and Eve world removal/effects.
|
|
- Derived state: the retained entity row exists only for stable indexing and
|
|
replay protection. It is not rendered, targetable, salvageable, or alive.
|
|
- Forbidden writers: Unity destruction callbacks, Eve feedback renderers, and
|
|
the reserved `DestroyEntity` command cannot erase entities or create loot.
|
|
- Shared paths: direct shots and deployable splash invoke the same destruction
|
|
commit after the shared damage resolver crosses zero hull or destroys an
|
|
installed cockpit. Cockpit destruction preserves the remaining hull value and
|
|
publishes `equipment.destroyed` before `entity.destroyed(cockpit-destroyed)`.
|
|
- Cut line: client-commanded removal and presentation-triggered loot are dead;
|
|
EveUnity resolves `effect.feedback.entity.destroyed` only after the provider
|
|
has published authoritative destruction chronology.
|
|
|
|
### Daemon Terminus Scenario Ownership
|
|
|
|
The generated Terminus world and deterministic released-client proofs are
|
|
separate daemon-owned scenarios. `standard` preserves the generated ship
|
|
loadouts. `released-client-proof` alone creates the one-hit raider and guaranteed
|
|
salvage transaction; `cargo-capacity-rejection-proof` additionally fills every
|
|
generated player cargo bay from typed catalog volume and bay capacity. The
|
|
scenario selects a distinct run identity, so an existing proof run cannot
|
|
impersonate ordinary play. Unity selects the scenario only as a launch input and
|
|
cannot write cargo, hull, pickups, or feedback.
|
|
|
|
Scenario generation may select an active run and default pilot name, but it is
|
|
not tutorial progression authority. It preserves `TutorialPassed`; only a
|
|
future daemon-owned tutorial completion transaction may cross that flag. The
|
|
fossil selected tutorial New Game while the flag was false, so merely entering
|
|
the Terminus proof arena cannot award completion.
|
|
|
|
### Daemon Terminus Clock And Attention Ownership
|
|
|
|
- Owner: the daemon session clock owns requested rate, effective rate, fixed-step
|
|
execution, and the decision to interrupt compressed time.
|
|
- Inputs: accepted clock commands, the active game mode, and new authoritative
|
|
gameplay facts committed by each fixed simulation step.
|
|
- Outputs: committed simulation time, actual steps executed,
|
|
`simulation.interrupted`, effective pause state, and Eve scene properties that
|
|
expose the requested rate, effective rate, and cause without granting control
|
|
authority to the renderer.
|
|
- Derived state: Unity interpolation and visible pause/attention affordances are
|
|
projections. They do not advance time or classify gameplay facts.
|
|
- Forbidden writers: Eve lowerers, wall-clock cadence, publication batching, and
|
|
presentation effects cannot change the effective simulation clock.
|
|
- Shared paths: compressed transit, single-step inspection, failure, combat,
|
|
docking, thermal, cargo, and wormhole events all commit through the same
|
|
daemon tick and event ledger.
|
|
- Cut line: executing the full requested compressed batch before inspecting its
|
|
intermediate facts is dead. Requested rate is no longer overloaded as the
|
|
current effective rate.
|
|
- Verification layer: daemon smoke detonates a mine in the first of four
|
|
requested steps, proves the causal damage commits at that step, proves later
|
|
steps do not execute, and round-trips the clock/cause fields through Eve.
|
|
|
|
### Daemon Tutorial Topology Ownership
|
|
|
|
- Owner: the daemon tutorial topology generator owns the tutorial zone graph,
|
|
faction roles and homes, zone influence, entrance, and initial discovery.
|
|
- Inputs: the authored six faction selectors, 64-zone/link-density settings,
|
|
typed corporation catalog, daemon generation seed, and the historical
|
|
ten-octave simplex cloud-density field.
|
|
- Outputs: a deterministic connected zone graph with stable positions,
|
|
adjacency, faction presence/ownership, home zones, entrance, discovery set,
|
|
selected cloud-noise position, and unique faction-trained Markov names.
|
|
- Derived state: the sector map and eventual zone materialization consume this
|
|
topology. Bodies, stations, ships, and Eve map rendering do not get to revise
|
|
it; names are generated once inside the topology owner from typed geoname
|
|
corpora because the fossil used them to seed later zone generation.
|
|
- Forbidden writers: Unity `MainMenu`, `Galaxy`, `ZoneGenerator`, scene objects,
|
|
and Eve clients cannot generate or repair tutorial topology.
|
|
- Shared paths: generation and parity smoke use the same CultMath random stream,
|
|
Unity-compatible simplex semantics, weighted sample elimination, Delaunay
|
|
graph, connectivity-preserving link pruning, and faction placement owner.
|
|
- Cut line: a generated Terminus proof arena cannot be relabelled as the
|
|
tutorial. New Game selects the daemon-persisted tutorial while completion is
|
|
false; Terminus remains a witness fixture.
|
|
- Verification layer: smoke generates the authored 64-zone graph twice from one
|
|
seed, proves point/adjacency repeatability, a connected undirected graph, six
|
|
distinct role homes, an unowned entrance, and discovery containing exactly
|
|
that entrance and its neighbors. CultMath separately proves the C# simplex
|
|
implementation against Unity Mathematics vectors and carries the same
|
|
semantics in HLSL.
|
|
|
|
### Daemon Tutorial Population And Run Ownership
|
|
|
|
- Owner: the daemon tutorial materializer owns station, turret, faction-ship,
|
|
starter-ship, orbit, and run persistence decisions.
|
|
- Inputs: the immutable tutorial topology, each celestial plan and its exact
|
|
post-body CultMath state, typed faction/catalog data, player settings, and the
|
|
accepted New Game command.
|
|
- Outputs: 64 canonical zone documents, stable entity records, loadout
|
|
generation receipts, one controlled entrance ship, tutorial discovery state,
|
|
and an Aetheria-mode game session.
|
|
- Agent work: each generated NPC ship receives one assigned `patrol` task with
|
|
the fossil four-orbit shuffled circuit. Orbit circuits are typed separately
|
|
from mining/survey body targets and survive bootstrap into the runtime
|
|
checkpoint. Daemon sensor policy derives the fossil owner-security trespass
|
|
rule from faction relationships and orbital security fields. The first
|
|
visible hostile ship temporarily drives the shared attack planner without
|
|
replacing or advancing the patrol task; loss of contact resumes the same
|
|
circuit. Unity no longer creates `Minion` patrol or combat state on activation.
|
|
- Physical placement: the daemon resolves orbital entities from the canonical
|
|
orbit graph before persistence and deterministically distributes generated
|
|
non-player ships through the fossil half-zone volume. The controlled starter
|
|
alone enters at the origin; generic clients do not repair spawn positions.
|
|
- Orbital motion: each generated orbit carries the fossil
|
|
`OrbitPeriod(distance) = distance` result. Every daemon fixed step advances
|
|
canonical phase, resolves the shared parent graph, and writes orbital entity
|
|
pose and velocity before Ymir. Bodies and Eve read that same advanced graph;
|
|
period-zero compatibility orbits remain fixed.
|
|
- Derived state: wormhole exits derive from adjacency; generic Eve maps,
|
|
cameras, scene objects, fog, and HUD state lower the persisted run.
|
|
- Forbidden writers: Unity generators, menu callbacks, scene materializers, and
|
|
Terminus scenarios cannot create or select gameplay entities for this run.
|
|
- Shared paths: fresh daemon boot and accepted New Game use the same tutorial
|
|
run writer; the Unity product shell submits the Eve command and waits for a
|
|
newer tutorial sector-map publication before entering the scene.
|
|
- Cut line: New Game reloading the previous frame without sending its advertised
|
|
operation is dead. Celestial-only tutorial graphs are not playable runs.
|
|
- Verification layer: focused smokes prove deterministic population, resolved
|
|
orbital references and poses, distributed non-player spawns,
|
|
fixed-step orbit phase/pose/velocity through Ymir, station/turret/agent
|
|
presence, assigned four-orbit patrol persistence and movement, critical-zone
|
|
trespass hostility, combat pre-emption and same-circuit resumption, loadout
|
|
provenance, all 64 persisted zones, canonical starter identity, discovery,
|
|
and adjacency.
|
|
|
|
### Daemon Regular-Sector Topology Ownership
|
|
|
|
- Owner: `AetheriaDaemonRegularTopologyGenerator` owns the non-tutorial sector
|
|
graph. It is distinct from tutorial role placement and from the Terminus
|
|
witness fixture.
|
|
- Inputs: the typed corporation/name catalog, the authored regular-sector
|
|
settings (`196` zones, `0.5` link density, `12` corporations, `3` bosses),
|
|
the serialized main cloud field, and one generation seed.
|
|
- Outputs: deterministic weighted-sample positions, pruned Delaunay links,
|
|
maximally isolated exit and furthest entrance, initial discovery, full-radius
|
|
corporation influence and ownership, boss chokepoints, headquarters, and
|
|
order-four Markov zone names.
|
|
- Derived state: sector-map rendering and later zone population consume the
|
|
topology. They cannot select corporations, move homes or bosses, alter links,
|
|
or reinterpret entrance and exit.
|
|
- Forbidden writers: Unity `Galaxy`, menus, map renderers, and Terminus scenario
|
|
generation cannot decide regular-sector topology.
|
|
- Population and persistence: the regular topology feeds the same daemon-owned
|
|
celestial hierarchy, full-influence population, loadout, orbit, patrol, and
|
|
CultCache persistence organs as the tutorial, under distinct regular-run
|
|
identities. The entrance receives one equipped controlled starter; every
|
|
persisted run carries its explicit `aetheria` game mode.
|
|
- Shared paths: accepted New Game identity hashes to the regular generation
|
|
seed, so command replay cannot create a different sector. Fresh boot and menu
|
|
requests use `AetheriaDaemonRunFactory`; incomplete tutorial state selects the
|
|
tutorial writer and completed tutorial state selects the regular writer.
|
|
- Cut line: post-tutorial Terminus fallback selection is deleted. Terminus can
|
|
only be created when the daemon is explicitly launched with a
|
|
`--terminus-scenario` witness fixture; `IsTutorial=false` is no longer allowed
|
|
to decide session mode for new state.
|
|
- Verification layer: focused smoke generates the full sector twice and proves
|
|
exact seeded repeatability, connected symmetric links, twelve homes, three
|
|
boss zones, exit isolation, entrance distance, discovery, names, and home
|
|
presence. A persisted-run smoke uses the shared factory and proves explicit
|
|
Aetheria mode, command-stable seed, generated starter/loadout, regular record
|
|
identities, autonomous patrols, selection, and hard CultCache reopen.
|
|
|
|
### Daemon Generated Zone Body Ownership
|
|
|
|
- Owner: the daemon zone-body generator owns each generated zone's radius,
|
|
mass, subzone packing, celestial hierarchy, orbit graph, body classification,
|
|
asteroid belts, gravity curves, and gas-giant/sun visual parameters.
|
|
- Inputs: tutorial topology identity/name/position, galaxy seed, the canonical
|
|
cloud-density sample, and the authored `ZoneSettings`/`PlanetSettings` values.
|
|
- Outputs: one deterministic zone plan containing stable orbit/body identities,
|
|
normalized hierarchy mass, explicit empty rosette orbit count, typed body and
|
|
asteroid snapshots, positive Ymir gravity magnitudes, and provider visual
|
|
parameters.
|
|
- Derived state: Ymir radial fields, Eve celestial rows, field splats, lights,
|
|
asteroid presentation, and later station/ship placement consume the plan.
|
|
They cannot regenerate its hierarchy.
|
|
- Forbidden writers: fossil `ZoneGenerator`/`GeneratorPlanet`, Unity prefabs,
|
|
scene scripts, render lowerers, and clients cannot author bodies or orbits.
|
|
- Shared paths: a complete tutorial world plan materializes all 64 topology
|
|
zones through the same daemon generator. Rosettes, ordinary solar systems,
|
|
satellite passes, binaries, belt selection, and mass normalization share one
|
|
CultMath stream per zone.
|
|
- Cut line: generated zones no longer depend on process-randomized
|
|
`string.GetHashCode`/`HashCode.Combine`; daemon generation derives a stable
|
|
FNV-1a seed from galaxy and typed zone identity. This intentionally
|
|
canonicalizes a nonportable fossil seed while retaining its mechanics.
|
|
- Verification layer: focused smoke proves deterministic body kinds/masses,
|
|
connected parent references, mass conservation including empty rosette nodes,
|
|
positive gravity curves, and stable asteroid cardinality. Whole-world smoke
|
|
proves every topology zone has bodies/orbits, every zone has a stellar
|
|
primary, and the tutorial retains asteroid belts.
|
|
|
|
### Daemon Pickup Proximity Transaction
|
|
|
|
- Owner: the daemon simulation owns pickup collection by comparing canonical
|
|
active-ship and live-pickup XZ positions after the Ymir motion step.
|
|
- Inputs: stable ship and pickup identities, their daemon-owned XZ positions,
|
|
the fixed 25-unit collection distance, catalog-backed cargo capacity, and
|
|
current frame identity. Tractor power influences pickup motion only.
|
|
- Outputs: capacity permits one atomic cargo insertion, pickup removal, and
|
|
`pickup.collected` event. Capacity refusal retains the pickup, applies the
|
|
fossil 25-unit outward kick along the ship-to-pickup direction, moves the
|
|
pickup just outside collection distance, and emits
|
|
`pickup.rejected`.
|
|
- Derived state: pickup transforms, tractor visuals, Eve world nodes, Unity
|
|
colliders, and client selection are presentation or control projections and
|
|
cannot admit collection.
|
|
- Forbidden writers: the reserved `PickUpLoot` command, Ymir contact facts,
|
|
Unity collision callbacks, and generic Eve lowerers cannot mutate cargo or
|
|
despawn pickups.
|
|
- Shared paths: destruction drops, generated pickups, and restored live pickup
|
|
rows all enter the same post-Ymir proximity pass. Pickups are ordered by
|
|
stable index and choose the nearest eligible ship with entity-index tie
|
|
breaking; removal of the durable pickup row makes a second commit impossible.
|
|
A capacity-rejection displacement is committed to daemon world truth and the
|
|
retained Ymir session reconciles that pose before its next integration step.
|
|
- Cut line: the contact-receipt helper and pickup contact lowering are deleted.
|
|
The old enum ordinal remains reserved only to avoid shifting serialized
|
|
command values and is rejected by the daemon.
|
|
- Verification layer: daemon smoke proves exact inside/outside boundary,
|
|
tractor-independent collection, one commit per pickup identity, ship-only
|
|
admission, capacity refusal, outward displacement/kick, and restart without
|
|
resurrection or duplicate cargo. The prior released contact-gated witness is
|
|
historical evidence only and must be rerun against the proximity owner.
|
|
|
|
### Daemon Gravity Field Contract
|
|
|
|
- Owner: typed daemon zone/body state owns positive gravity-depth magnitudes;
|
|
embedded Ymir owns radial integration and contact facts without reinterpreting
|
|
their sign.
|
|
- Inputs: body poses, influence radii, positive `GravityWellDepth`, positive
|
|
zone `GravityTerrainDepth`, exponents, waves, and fixed delta.
|
|
- Outputs: Ymir produces inward acceleration, positions, velocities, and
|
|
contacts. Daemon projections publish typed gravity viewport and render-splat
|
|
documents from the same state.
|
|
- Derived state: terrain samples and `gravity.height` splat values are negative
|
|
because presentation subtracts the positive magnitude. Bands, Eve fields,
|
|
Unity meshes, and cameras remain derived.
|
|
- Forbidden writers: negative authored depths, adapter-side sign compensators,
|
|
Unity gravity scripts, Eve lowerers, main-menu fallback fixtures, and stale
|
|
persisted Terminus rows cannot author gravity semantics.
|
|
- Shared paths: generated, restored, and imported worlds use the same magnitude
|
|
convention; physics and every render projection consume those canonical
|
|
values.
|
|
- Cut line: the dead main-menu fallback world is deleted. Built-in Terminus
|
|
state with the old sign fails the current-scenario check and is regenerated;
|
|
only presentation conversion may negate depth.
|
|
- Verification layer: daemon smoke proves inward Ymir velocity, negative sampled
|
|
height, and negative body splats. Released cold/warm witnesses exercise the
|
|
persisted daemon path.
|
|
|
|
### Pilot Camera Presentation Contract
|
|
|
|
- Owner: the Aetheria daemon selects camera semantics from authoritative dock
|
|
state and publishes the fossil framing and lens values. EveUnity owns only the
|
|
native camera projection.
|
|
- Inputs: controlled entity identity and rotation, dock parentage, presentation
|
|
mode, daemon-published aim convergence state, distance, field of view, target
|
|
screen position, damping, and clip planes.
|
|
- Outputs: undocked flight uses `perspective.entity-forward-follow.v1` with the
|
|
fossil `Third Person Rig` values and `aim.convergence-point.v1` look-at. Docked
|
|
presentation remains a distinct mode and cannot lend its framing to flight.
|
|
- Coordinate boundary: Cinemachine serializes target screen Y from the top of
|
|
the frame, while Eve's canonical viewport follows Unity viewport coordinates
|
|
from the bottom. Aetheria translates fossil flight `0.81` to Eve `0.19` and
|
|
docked `0.55` to Eve `0.45` before publication. EveUnity receives only the
|
|
canonical value and has no Cinemachine compatibility branch.
|
|
- Derived state: Unity camera position, rotation, matrices, culling mask, and
|
|
temporal fog history are presentation state.
|
|
- Forbidden writers: Unity cameras cannot choose dock state, alter entity look
|
|
direction, or infer an Aetheria camera from product types. The old scene and
|
|
Cinemachine components are reference evidence, not runtime authorities.
|
|
- Cut line: the unconditional `planar.top-down-follow.v1` projection no longer
|
|
collapses the fossil dock and flight cameras into one false top-down view.
|
|
|
|
### Daemon Agent Combat Policy
|
|
|
|
Agent combat uses the fossil `CombatState` policy inside the daemon scheduler,
|
|
not a faction-wide attack radius. The planner reads operational typed weapon
|
|
behaviors and durable group membership, samples 32 range points with the fossil
|
|
`range^0.25` preference, evaluates range-conditioned damage and the authored
|
|
damage curve, and selects the highest current DPS group. Movement blends
|
|
target-relative strafe with closing/opening pressure using the fossil `0.5`
|
|
forward lerp and 50-unit forward-distance scale. Projectile aim uses CultMath
|
|
first-order intercept. Fire is emitted only through the shared weapon-group
|
|
command when the selected equipment's catalog placement rotation faces the
|
|
intercept direction; locking groups continue to request their daemon-owned
|
|
progressive locks. Flight and agent combat share one equipment-rotation parser.
|
|
The task's weapon-group field is now an observed last selection, not an attack
|
|
policy owner. Daemon smoke proves close/open strafe, DPS group selection,
|
|
projectile lead, hardpoint gating, progressive lock, and target destruction.
|
|
|
|
Task assignment is the only owner of autonomous helm and target controls for an
|
|
uncontrolled agent. Cancel, complete, failure, stale-assignment repair, and
|
|
duplicate-carrier repair all use `AetheriaRuntimeAgentScheduler.ReleaseControls`.
|
|
That transition clears the durable assignment marker, both helm axes, and the
|
|
scheduler target; a tow task also releases its target from the agent's child
|
|
list at the already-authoritative world position. Task status and phase are
|
|
terminal facts after cancellation. They are not a repair signal that permits
|
|
the previous controller state to survive for another tick.
|
|
|
|
Task execution is restart-stable through the daemon's ordinary live-frame
|
|
checkpoint. The frame owns the task row, its assigned status and phase, the
|
|
agent's single assignment edge, persisted helm/target controls, and the last
|
|
Ymir-committed pose. On restart, the scheduler reads that same graph and a fresh
|
|
embedded Ymir session reconstructs ordinary motion from committed world truth;
|
|
neither component reissues the task or invents a second carrier. Daemon smoke
|
|
stops an explore task during travel, hard-flushes CultCache, closes and reopens
|
|
the store, proves the ownership edge and pose, then completes through the same
|
|
movement-command reducer, releases controls exactly once, and projects the
|
|
completed row through the generic Eve commander surface. A second proof stops
|
|
a three-zone assignment during its first persisted `entering` phase, replaces
|
|
the run/task object graph and Ymir owner from CultCache, and finishes both route
|
|
edges with one worker and exactly two start/transfer/completion event triplets.
|
|
|
|
### Authoritative Flight Actuator Contract
|
|
|
|
- Owner: Aetheria daemon owns persistent local helm axes, desired look
|
|
direction, installed-actuator evaluation, energy/heat/visibility consequences,
|
|
hull drag, and the velocity/direction submitted to physics. Ymir owns body
|
|
integration and contacts. Eve clients own input sampling and interpolation,
|
|
never accepted motion.
|
|
- Inputs: accepted semantic movement/look commands; current hull direction and
|
|
velocity; catalog hull/item shapes and masses; equipment placement and
|
|
rotation; online/durability/thermal state; behavior payload performance stats;
|
|
capacitor/reactor availability; fixed delta.
|
|
- Outputs: actual entity direction and velocity, persistent helm/look state,
|
|
typed Thruster/AetherDrive behavior state, equipment heat, plume visibility,
|
|
and the Ymir-integrated body pose.
|
|
- Velocity-controller invariant: after thrust, drive force, and hull drag, each
|
|
operational `VelocityConversion` exponentially aligns the existing velocity
|
|
magnitude toward hull direction with the fossil `1 - exp(-lambda * delta)`
|
|
damp factor. Operational `VelocityLimit` behaviors then clamp that resulting
|
|
magnitude and publish the evaluated limit in durable behavior state. The
|
|
daemon owns both mutations before Ymir integrates the body; the client only
|
|
renders their consequences and controls their ordinary equipment state.
|
|
- Ordinary-flight invariant: standard ships fly through directional thrusters.
|
|
The daemon clears and reallocates their axes each tick using the fossil
|
|
forward/reverse/left/right rotation groups, symmetric lateral-torque
|
|
compensation, placement-derived torque, and desired-look turn demand. A
|
|
thruster that cannot fund its authored energy demand produces no force, heat,
|
|
or plume visibility.
|
|
- Variant invariant: AetherDrive is not baseline propulsion. The canonical
|
|
catalog contains the single 250,000-credit `Traction` drive with hardpoint
|
|
type `AetherDrive`, and only the 7,500,000-credit modified `LonginusX` hull
|
|
exposes that hardpoint. The fingerprinted 2021-04-14 catalog restores the
|
|
separate common `Longinus` row under its original GUID, including four
|
|
directional-thruster mounts, and restores `Djinni`; `LonginusX` and every
|
|
AetherDrive item carry typed `rarity:rare` catalog tags. The daemon applies a
|
|
0.05 generation multiplier to those tags. Its rotor RPM, coupling, torque
|
|
curve, energy, heat, and thrust run only when that rare equipment is actually
|
|
installed. Ordinary flight fixtures explicitly prove that no AetherDrive
|
|
state is manufactured.
|
|
- Catalog recovery owner: `Aetheria.State.Import` alone turns the quarantined
|
|
April 2021 MessagePack fossil into typed hull documents. Its allowed inputs
|
|
are the fingerprinted historical blob and the explicit `April2021` field
|
|
layout; its outputs are ordinary typed item documents. The blob, Unity
|
|
database classes, and current fixture catalog are not runtime authorities.
|
|
Missing-row recovery is limited to the historical `Longinus` and `Djinni`
|
|
GUIDs plus missing `Thruster` equipment required to fill their authored
|
|
mounts, so the supplemental catalog cannot overwrite live rows or silently
|
|
revive unrelated obsolete content.
|
|
- Generation owner: one daemon loadout generator owns one advancing mutable
|
|
CultMath random stream. A readonly struct field is forbidden because it
|
|
mutates a defensive copy and restarts every weighted draw. Price, allegiance,
|
|
graph distance, footprint, and typed rarity are inputs; selected hull and
|
|
immutable selection receipt are outputs. Eve and Unity only inspect them.
|
|
- Derived state: Eve actuator rows, RPM gauges, plume/effect intensity, sound
|
|
parameters, and interpolated transforms are presentation projections. They
|
|
cannot write velocity, direction, heat, energy, or equipment state back.
|
|
- Forbidden writers: faction speed constants, command reducers, task planners,
|
|
Eve lowerers, and Unity transforms cannot assign accepted ship velocity or
|
|
heading. `SetLookDirection` now writes desired look only; physical actuators
|
|
turn the hull. World-space autonomous travel must be translated into the same
|
|
local strafe/forward helm axes used by a pilot.
|
|
- Shared paths: manual movement, autonomous exploration/haul/patrol/attack,
|
|
cross-zone approach, and home docking all enter the same command reducer,
|
|
actuator step, and Ymir world step. AetherDrive and Thruster share mass,
|
|
thermal, energy, drag, and physics owners without pretending to be the same
|
|
equipment class.
|
|
- Cut line: `ApplyMovementIntent` and faction `PawnSpeed`/`RaiderSpeed` motion
|
|
are gone. No compatibility fallback may restore direct velocity assignment.
|
|
- Verification: daemon smoke proves local-axis dominance through ordinary
|
|
thrusters, placement-derived torque/thrust state, funded heat and plume,
|
|
unfunded no-motion/no-plume behavior, progressive hardware turning before
|
|
weapon lock, autonomous navigation and cross-zone travel through Ymir, and
|
|
isolated rare AetherDrive spool/force on a modified-hull fixture. It also
|
|
proves the fossil exponential velocity-conversion equation runs before the
|
|
evaluated velocity limit and that the limit survives in reconnectable
|
|
behavior state. Canonical
|
|
catalog assertions lock the restored common hull identities and the
|
|
`Traction`/`LonginusX` rarity boundary; a 2,000-loadout deterministic witness
|
|
proves rare candidates remain possible without becoming the default path.
|
|
- Open parity: model-local hardpoint transform directions (the daemon currently
|
|
has catalog placement rotation, not the old renderer-populated barrel
|
|
transform), exact per-equipment behavior execution ordering,
|
|
float32/CultMath parity against the fossil, live
|
|
production-world generation-frequency evidence, and generic native
|
|
thrust/turn feedback still
|
|
require proof.
|
|
|
|
### Authoritative Visibility Contract
|
|
|
|
- Owner: the Aetheria daemon owns each entity's emitted, weapon, ping, and
|
|
reflected stellar signature. It decays named transient sources, evaluates
|
|
operational `Visibility` and `Reflector` behaviors after energy and thermal
|
|
state settle, applies authored weapon visibility when a shot commits, and
|
|
executes sensor pings before contact projection. Eve and Unity only present
|
|
the resulting visibility and named sources.
|
|
- Inputs: fixed simulation time, authored visibility-decay setting, entity
|
|
position, equipped visibility and reflector performance, thermal state,
|
|
committed weapon visibility (including the charged-weapon multiplier), ping
|
|
visibility, daemon-owned sun mass, sun light-radius multiplier, the provider
|
|
render settings light-radius curve, and resolved orbit positions.
|
|
- Outputs: aggregate entity visibility plus inspectable, reconnectable constant
|
|
equipment, reflector, weapon, and ping source grids. Transient source values
|
|
follow the fossil exponential decay and disappear below its cutoff.
|
|
- Shared-field invariant: daemon visibility and environment rendering resolve
|
|
body positions through `AetheriaRuntimeOrbitQueries`; gravity-center overrides
|
|
and nested authored orbits cannot silently put the visible sun and its
|
|
gameplay light field in different places. Light uses the fossil exponent-8
|
|
`PowerPulse` and the same provider-owned radius inputs exposed for rendering.
|
|
- Derived state: light meshes, fog tint, ambient color, lens effects, and any
|
|
debug visualization of the stellar radius are client presentation. Their
|
|
parameters are levers; they do not decide whether another entity detects the
|
|
reflector.
|
|
- Forbidden writers: contact refresh cannot overwrite emitted signature, and
|
|
clients cannot submit visibility, transient decay, stellar light, ping
|
|
crossings, weapon flashes, or reflector results.
|
|
- Verification: daemon smoke proves evaluated constant equipment visibility, a
|
|
displaced authored sun orbit, the fossil pulse equation, evaluated reflector
|
|
cross-section, named source publication without accumulation, actor-scoped
|
|
energy-gated ping with reconnect-stable crossed-target state, committed weapon
|
|
visibility, and exact exponential transient decay.
|
|
- Open parity: active consumable reflector effects and complete visibility-
|
|
source cardinality remain to be migrated.
|
|
|
|
### Daemon Wormhole Transition
|
|
|
|
- Owner: the daemon persists one wormhole transition on the moving entity.
|
|
- Inputs: actor identity, current and adjacent zones, canonical wormhole
|
|
positions, proximity, fixed simulation time, run seed, and the fossil timing
|
|
constants.
|
|
- Outputs: four-second `entering`, authoritative zone transfer, four-second
|
|
`exiting`, and one-frame `completed` state; deterministic exit pose/velocity;
|
|
destination-adjacency discovery; and stable start/transfer/completion events.
|
|
- Derived state: `VisualDepthOffset` is the fossil 1000-unit presentation lever.
|
|
Camera roll, corkscrew, fade, audio, and native effects may lower it but cannot
|
|
move the entity.
|
|
- Forbidden writers: `ActionGameManager`, `Ship.EnterWormhole`, client
|
|
transforms, and command-supplied positions cannot transfer a ship.
|
|
- Shared paths: player interact, explicit travel, agent task routing, and agent
|
|
homecoming all initialize the same canonical transition.
|
|
- Cut line: command application no longer splices zone arrays. Flight and the
|
|
world-physics port exclude transitioning bodies, and Ymir resumes only on the
|
|
tick after completion.
|
|
- Proof: daemon smoke rejects a second transition owner and verifies exact
|
|
enter/transfer/exit timing and discovery. The multi-edge agent route performs
|
|
a real CultCache hard flush, close, and reopen during entry, reconstructs a
|
|
fresh embedded Ymir owner, preserves task/carrier/phase state, and proves
|
|
exactly-once chronology plus single-entity arrival before completing work.
|
|
|
|
### Flight Post-Processing Contract
|
|
|
|
- Owner: Aetheria selects the logical flight profile and owns its native asset
|
|
variants. EveUnity owns only a reversible lowering lease for the active world
|
|
camera.
|
|
- Inputs: `postProcessProfileAssetRef` from the world surface and the matching
|
|
provider-catalog variant. The Unity authoring build derives
|
|
`profile.environment.flight` from the fossil ARPG global profile's ACES,
|
|
bloom, histogram dark-scene exposure bound, contrast, vignette, and grain.
|
|
- Outputs: the generic Unity lowerer resolves a `VolumeProfile`, enables URP
|
|
post-processing on the leased camera, and installs one global runtime volume.
|
|
The same world view advertises `temporal-reprojection.v1` with the fossil
|
|
pilot camera's `0.99` history blend, `0.1` jitter scale, zero sharpening, and
|
|
high quality; EveUnity lowers those neutral values to URP TAA.
|
|
- Derived state: the Unity `Volume`, additional-camera data, and enabled flag are
|
|
client presentation state. They restore or disappear when the camera lease
|
|
ends.
|
|
- Forbidden writers: scene-local Aetheria scripts, provider-id checks, fog-color
|
|
heuristics, and client-authored exposure values cannot choose flight
|
|
presentation.
|
|
- Cut line: the fossil scene's global `PostProcessVolume` is reference evidence,
|
|
not a surviving runtime owner. Missing or incompatible advertised profiles
|
|
fail closed instead of silently rendering a different look.
|
|
|
|
### Celestial World Presentation Contract
|
|
|
|
- Owner: the daemon owns which celestial bodies and asteroid instances exist,
|
|
their authoritative orbit-derived XZ positions, terrain-derived altitude,
|
|
authored scale, and presentation identity. Aetheria's provider catalog owns
|
|
the native visual assets. EveUnity owns only generic entity instantiation.
|
|
- Inputs: the current zone's typed body and asteroid rows, daemon simulation
|
|
time, canonical orbit evaluation, gravity-terrain evaluation, and daemon
|
|
render settings.
|
|
- Outputs: planets, suns, gas giants, and asteroids occupy ordinary rows in the
|
|
shared Eve entity SoA generation. Stable synthetic identities distinguish
|
|
these presentation rows from simulation entities; each row carries a generic
|
|
entity kind and provider asset reference.
|
|
- Derived state: the Unity `GameObject`, prefab instance, renderer bounds,
|
|
material instances, native layer, and pilot-frustum intersection are client
|
|
projections. Celestial synthetic identities are not selectable, controllable,
|
|
damageable, or valid command targets.
|
|
- Forbidden writers: the fossil `ZoneRenderer`, planet scripts, Unity physics,
|
|
and runtime-side terrain sampling cannot create, position, scale, rotate, or
|
|
remove celestial rows. EveUnity cannot import Aetheria types or branch on
|
|
Aetheria celestial asset keys.
|
|
- Shared paths: cold download, warm cache, reconnect, and every committed SoA
|
|
generation use the same provider assets and immutable generation swap as
|
|
ships, stations, pickups, and persistent payloads.
|
|
- Cut line: the Aetheria-specific zone-render document is not a client ABI.
|
|
Provider packaging extracts only the advertised visual child from each fossil
|
|
celestial prefab, then applies the common script, physics, material, and
|
|
bundle verification pipeline. Gravity wells, map icons, runtime scripts, and
|
|
other fossil authorities do not hitch a ride inside the presentation prefab.
|
|
- Verification layer: the daemon smoke proves stable, unique negative synthetic
|
|
indices, provider asset references, body/asteroid positions, and equivalent
|
|
local/network SoA bodies. The released generic-client witness records every
|
|
presented entity's kind, asset, scale, renderer count, and pilot-frustum
|
|
intersection. Its warm run instantiated eleven bodies and eighteen asteroids
|
|
with enabled provider renderers; seven celestial instances intersected the
|
|
pilot frustum. This proves projection and lowering, not final art parity.
|
|
|
|
### Native Environment Lighting Contract
|
|
|
|
- Owner: Aetheria owns stellar ambient tint, the gravity-fog frame fill, the
|
|
custom reflection cubemap, and each provider material's lit/unlit semantics.
|
|
EveUnity owns only the reversible application of those advertised environment
|
|
facts.
|
|
- Inputs: daemon-owned sun `LightColor`, sun mass and light-radius multiplier,
|
|
`Assets/Textures/studio2.hdr`, the gravity-fog field, and source shader lighting
|
|
models. Multiple stellar tints blend by their authored light-radius weight.
|
|
- Outputs: the world surface advertises stellar-tinted flat ambient lighting at
|
|
fossil intensity `1.46`, the studio HDRI as custom reflection at intensity `1`,
|
|
no skybox, and no invented directional key light. Provider material conversion maps
|
|
particle sources to URP Particles/Unlit, unlit or sprite sources to URP/Unlit,
|
|
and genuinely lit sources to URP/Lit.
|
|
- Derived state: Unity ambient state, custom-reflection state, runtime material
|
|
instances, and shader keywords are client presentation state. The studio HDRI
|
|
textures reflected ambient light; it does not choose its color or own the
|
|
visible background. The raymarch pass fills the frame.
|
|
- Forbidden writers: the daemon cannot invent a directional light to compensate
|
|
for broken material conversion. EveUnity cannot promote the reflection HDRI to
|
|
skybox/ambient authority or infer shader models from Aetheria asset names.
|
|
- Cut line: the obsolete provider skybox catalog entry and world binding are
|
|
deleted, as is the invented `0.4,-1,0.25` warm key light. The embedded
|
|
fossil shield renderer is removed from legacy ship roles and catalog-backed
|
|
`entity.hull` presentation prefabs because its
|
|
dithered collision response is already externalized as the provider-owned,
|
|
receipt-driven shield-impact effect; it cannot remain permanently visible
|
|
after generic material conversion.
|
|
- Verification layer: daemon smoke proves the stellar color projection and
|
|
negatively proves that neither skybox nor key-light fields are published. The released witness records flat
|
|
ambient mode, the exact lowered color, zero directional intensity,
|
|
no player `Shield Visual`, seven active player renderers, and a map-channel
|
|
material using `Universal Render Pipeline/Unlit`; visual inspection shows ship
|
|
hulls instead of opaque shield ellipsoids and readable map glyphs.
|
|
|
|
### Stardust Field-Particle Contract
|
|
|
|
- Owner: Aetheria owns the authored Stardust program, its exact scalar values,
|
|
its color ramp, and the choice to visualize the gravity-fog field with
|
|
stateless camera-relative particles. EveUnity owns only generic program
|
|
binding, compute dispatch, and procedural drawing.
|
|
- Inputs: the same typed `gamecult.eve.fields.splats.v1` document used by the
|
|
fog volume; gravity surface height and gravity-derived tint (not patch or
|
|
patch-height layers); the provider compute shader, material, and blackbody
|
|
color texture; the provider dither texture; active camera XZ; daemon
|
|
simulation time; and the client render-frame index used only for temporal
|
|
coverage.
|
|
- Outputs: `field.particles3d` names the provider programs, logical field and
|
|
asset ports, the 256-by-256 row-major particle grid, 128-thread dispatch,
|
|
28-byte particle stride, exact fossil values, and camera-followed viewport
|
|
policy.
|
|
- Hash invariant: no client CPU particle state exists. The provider compute
|
|
program retains `id % span`, `id / span`, truncation toward zero, the `65535`
|
|
unsigned cell offset, Wang/xorshift sequence, Perlin jitter, lifetime phase,
|
|
and float32 evaluation. Changing any of these creates a different field.
|
|
Buffer slots are not particle identities: after a one-cell X move,
|
|
`before[localX + 1, localY]` and `after[localX, localY]` must be the same
|
|
world-cell particle bit for bit. Every slot is reassigned while all
|
|
overlapping world particles remain visually motionless.
|
|
- Viewport invariant: the particle grid and sampled gravity textures use one
|
|
transform and one integer lattice. The 256-by-256 particle grid at six world
|
|
units per cell owns a 1536-square viewport. The 2048-square surface-height
|
|
target is therefore 0.75 world units per texel and exactly eight gravity
|
|
texels per Stardust cell; the 512-square tint target is exactly two texels per
|
|
cell. Camera XZ snaps by one six-unit Stardust cell/eight gravity pixels using
|
|
truncation toward zero. The snapped center becomes both the raster viewport
|
|
center and `_GridTransform.xy`. A 2000-wide viewport is rejected because it
|
|
aliases the gravity and particle lattices even when particle hashing itself
|
|
is correct. Fog and particles do not separately project that frame: both
|
|
generic lowerers call the same viewport-frame resolver and receive identical
|
|
`EveFieldsViewport` bounds.
|
|
- Derived state: GPU buffers, generated quads, raster targets, keywords, and
|
|
draw calls are client presentation state. The viewport-scaled dither
|
|
coordinates and render-frame index are also presentation state; they cannot
|
|
feed particle identity, phase, position, or simulation.
|
|
- Forbidden writers: EveUnity cannot reseed, pool, randomly initialize, move,
|
|
recolor, or CPU-generate particles. Aetheria cannot publish per-particle rows
|
|
or make the field a gameplay body set.
|
|
- Cut line: the fossil `Stardust` MonoBehaviour and renderer feature remain only
|
|
reference code. Generic clients execute advertised provider programs through
|
|
logical ABI metadata; no Aetheria type enters EveUnity.
|
|
- Verification layer: daemon smoke locks every authored value and asset ref;
|
|
generic package tests lock ABI validation, repeated daemon-time bindings,
|
|
truncating camera snap, buffer layout, and dispatch dimensions. Provider
|
|
bundle verification dispatches the bundled HLSL and reindexes by world cell;
|
|
705 overlapping cells across X, Y, and diagonal whole-buffer remaps must keep
|
|
all seven particle floats bit-identical while the same buffer slot changes
|
|
identity. An asymmetric gravity texture also proves positive-world X samples
|
|
positive texture X; the deleted fossil gravity camera's two-axis reversal is
|
|
not part of the typed Eve Fields viewport. The released witness must record 65,536 particles, one compute
|
|
dispatch and one pilot-camera draw while the map camera remains isolated.
|
|
The released `0.3.57` witness additionally requires the live fog and particle
|
|
grid centers to be equal and the leased pilot camera to report URP temporal
|
|
anti-aliasing with the advertised history and jitter values. It resolves the
|
|
material's logical ports from provider metadata and proves the cloned live
|
|
material holds the provider dither texture, pixel scale, and advancing render
|
|
frame. The bundle gate rejects a fixed `_AlphaClip` regression and requires
|
|
the fossil temporal-coverage, overwrite-blend, and depth-write source tokens.
|
|
|
|
### Gravity Fog Presentation Contract
|
|
|
|
- Owner: Aetheria owns gravity/fog brush placement and values, authored volume
|
|
tuning, and the provider shader asset. Eve Fields owns the portable splat
|
|
document, radial falloff equations and parameters, and `field.volume3d`
|
|
logical ports. EveUnity owns only the native render lifecycle.
|
|
- Inputs: daemon-derived brush centers, radii, depths and exponents; the
|
|
canonical viewport splat document; logical surface-height,
|
|
patch-height, patch, tint, scalar parameters, viewport-to-texture scale
|
|
relations, provider asset reference, and the selected runtime asset variant's
|
|
native program metadata.
|
|
- Outputs: the generic runtime rasterizes logical field layers, executes the
|
|
advertised raymarch, optional temporal-history, and composite passes, and
|
|
presents pixels. No pass can emit gameplay state or commands.
|
|
- Derived state: Unity materials, shader-property names, pass indices, keywords,
|
|
raymarch targets, ping-pong history textures, previous camera matrices, and
|
|
viewport-derived texture scales and composite counters are runtime projections.
|
|
They are neither daemon truth nor portable Eve state.
|
|
- Native target topology: the provider advertises the fossil layer shapes rather
|
|
than letting the lowerer invent one common texture: surface height is
|
|
`2048x2048`, patch height is `256x256`, patch and tint are `512x512`, and only
|
|
tint is mipmapped/trilinear. EveUnity applies those descriptors without owning
|
|
the layer meanings.
|
|
- Time and camera bindings: the splat document's daemon-authored simulation time
|
|
drives logical `flowScroll` through an advertised scale. The provider variant
|
|
maps logical camera-to-world and flow-scroll ports to native uniforms; the
|
|
generic runtime does not use local gameplay time or provider identifiers.
|
|
The provider shader constructs both its raymarch and temporal-reprojection
|
|
rays using the historical Unity shader camera transform, whose local forward
|
|
is positive Z. EveUnity `0.3.63` supplies that transform instead of the
|
|
negative-Z `Camera.cameraToWorldMatrix`. The provider also advertises
|
|
`non-render-target-projection.previous-view.v1`, preserving the historical
|
|
`Graphics.Blit` GPU-projection convention without making it a client guess;
|
|
provider bundle verification rejects divergence between the two passes.
|
|
- Semantic split: `gravity.height` is the negative gameplay terrain projection;
|
|
`fog.surface_height` is the positive visual displacement the fossil
|
|
`PowerBrush` camera supplied to `_NebulaSurfaceHeight`. Both derive from the
|
|
same daemon-owned radial brushes, but neither may impersonate the other.
|
|
- Fossil producer map: layer 9 coarse displacement and layer 10 fine waves
|
|
compose `fog.surface_height`; those same producers plus layer 12 patch
|
|
displacement compose `fog.patch_height`; layer 11 simplex/cellular density
|
|
brushes compose `fog.patch`; layer 13 ambient and body light brushes compose
|
|
`fog.tint`. These are additive field producers, not Unity camera objects.
|
|
- Procedural-source ownership: Eve Fields defines world-anchored Ashima simplex,
|
|
the fossil moving cellular-B function, published simulation-time animation,
|
|
splat-local animated radial cosine, absolute-value folding, and `PowerPulse`.
|
|
Aetheria owns each brush's extent, target layer, depth, constant offset,
|
|
frequency, speed, exponent, and color. The fossil brush objects use Unity's
|
|
one-unit built-in Quad (`fileID 10210`), so authored scale converts to half
|
|
extent by multiplying by `0.5`, not `5`. Canonical `ARPG.unity` scales the
|
|
gameplay `Zone Brushes` parent to `3000`, making its global half extent
|
|
`1500`; `TestScene`'s smaller `1024` value is not gameplay authority.
|
|
The splat cameras independently use orthographic size `1000`, so the canonical
|
|
field viewport is a 2000-by-2000 square. Brush coverage and sampling extent
|
|
are separate provider-owned facts; the generic lowerer does not infer either.
|
|
Constant offsets are separate constant splats. No provider texture reference
|
|
is introduced: the fossil materials carry a stale `_MainTex`, but their
|
|
shaders sample procedural functions and never read it.
|
|
- Entity altitude: after every Ymir XZ step, the daemon derives root entity Y as
|
|
fossil `gravity.height + HullGridOffset`; children inherit their parent's full
|
|
altitude. Eve clients consume the resulting 3D position and never sample or
|
|
recreate terrain height as gameplay truth.
|
|
- Forbidden writers: the old `VolumeSampling`/`VolumeCloudRenderer` presentation
|
|
path, shader code, Unity cameras, and generic lowerers cannot calculate gravity,
|
|
move bodies, or publish world truth. EveUnity may not import an Aetheria assembly
|
|
or branch on Aetheria asset identities. A viewport-sized solid splat cannot
|
|
stand in for the zone's radial gravity terrain.
|
|
- Shared paths: first frame, camera motion, reconnect, viewport resize, and warm
|
|
asset reuse all enter the same generic volume lifecycle. History resets on a
|
|
new node, program, or render size. A provider that advertises a temporal pass
|
|
without all required history ports, or a viewport scale relation with an
|
|
unresolved logical port or texture, fails closed.
|
|
- Cut line: the daemon publishes the fossil zone and body `PowerPulse` brushes
|
|
directly; the former full-viewport solid gravity writer is deleted. The two
|
|
invented viewport-local patch noises are also deleted before the fossil
|
|
producer stack is restored. Procedural samples are anchored to field-world
|
|
coordinates, so viewport motion cannot move the fog through the world. The
|
|
portable surface contains logical field and parameter names only.
|
|
`_Nebula*`, `_PrevVP`, `_ResetHistory`, shader keywords, and pass indices live
|
|
exclusively in the provider's Unity asset-variant metadata.
|
|
- Verification layer: EveUnity package tests prove two-pass compatibility,
|
|
complete temporal-program acceptance, partial-program rejection, portable
|
|
`PowerPulse` GPU evaluation, and absence of Aetheria assembly references.
|
|
Aetheria daemon smoke proves radial brush parity and that the exact fossil
|
|
shader ABI is advertised outside the portable surface. Released package
|
|
`0.3.49` proves target topology, authoritative flow time, explicit camera
|
|
transforms, float32 packed-output diagnostics, and both camera-channel masks.
|
|
The released HD capture proves a live fog horizon using the original
|
|
`-36.17` vertical-noise amplitude. The earlier opaque slab was caused by
|
|
publishing Cinemachine's top-origin `0.81` as Eve bottom-origin `0.81`, which
|
|
placed the camera below the fog surface. The controlled zero-noise run was a
|
|
diagnostic, not the adopted rendering contract. Blue tint, luminance, patch
|
|
structure, gravity-wave readability, and world geometry remain open visual
|
|
parity work. Released EveUnity `0.3.63` also restores the provider-advertised
|
|
previous-view/current-projection temporal policy, the fossil ultra-quality
|
|
first history frame, adaptive histogram exposure, and HDR grading before
|
|
ACES, and lowers the provider-selected non-render-target temporal projection.
|
|
The released warm witness records 359 fog composites while retaining the
|
|
daemon gameplay assertions and camera-channel isolation. The alpha-fixed cold
|
|
HD witness uses bundle
|
|
`a829e57731fbe08f4564fa131468148e99f6b4204708ad3e64498885532b5091`
|
|
and passes in 52.7 seconds. Its temporal history stores direct density in
|
|
alpha; bundle verification rejects any composite that again unpacks that
|
|
value as the raymarch pass's packed distance/density payload. Cloud structure
|
|
and Stardust occupy the same projected gravity surface. Remaining color and
|
|
composition differences are not permission to alter the fossil scattering
|
|
or tint inputs without stronger historical evidence.
|
|
|
|
### Daemon Asset Content Delivery
|
|
|
|
- Owner: the Aetheria daemon owns bundle content and serves bytes only through
|
|
the managed `cultmesh.content.v1` session hosted by CultMesh.
|
|
- Inputs: provider bundle path, packed artifact manifest, content hash, byte
|
|
length, negotiated chunk requests, and resumable client checkpoint.
|
|
- Outputs: snapshot delivery publishes the typed artifact manifest only;
|
|
content-session requests return bounded byte ranges which the generic runtime
|
|
verifies and atomically promotes to a hash-named `.body`, then binds to a
|
|
read-only mapped-body lease for Unity loading.
|
|
- Derived state: Unity `AssetBundle` instances, native prefab lookup, cache
|
|
files, progress UI, and screenshots cannot publish or mutate provider bytes.
|
|
- Forbidden writers: batched snapshot chunks and the former
|
|
`gamecult.cultmesh.cdn.asset_blob.v1` fallback are deleted. Eve surfaces and
|
|
renderer code cannot smuggle bundle bytes through state records.
|
|
- Shared paths: cold transfer, resume, and warm cache reuse all resolve the same
|
|
advertised manifest and content hash through the generic runtime transport.
|
|
- Cut line: CultMesh snapshots index manifests; managed content sessions own
|
|
remote bytes, verification, and promotion. Mapped-body negotiation begins only
|
|
at the returned final path and cannot map partials or reconstruct cache names.
|
|
|
|
- Owner: `Aetheria.State` owns the new typed state spine for durable state.
|
|
The embedded `GameCult.Aetheria.State.Unity` package owns Unity's runtime
|
|
typed state file path plus the boot-time state-file probe, and is the landing
|
|
zone for future typed catalog boot.
|
|
`ActionGameManager` opens the package-owned typed runtime catalog snapshot
|
|
and binds item reference resolution directly through `ItemManager`.
|
|
Runtime code receives narrow `ItemManager` projection methods over typed
|
|
runtime catalog rows and no longer hydrates old `ItemData` DTOs. `Galaxy`,
|
|
entity restore, and faction-distance loadout weighting have been moved off
|
|
legacy faction catalog reads.
|
|
The embedded Unity state package owns the read-only runtime catalog model
|
|
contract and the read-only known-schema `.cc` catalog opener. `ActionGameManager`
|
|
now exposes that typed package snapshot at boot. The SDK-style
|
|
`Aetheria.State.Unity` facade maps typed `.cc` documents into the same
|
|
contract for full .NET smokes and Eve surface reads. Neither writes state or
|
|
owns simulation. The runtime no longer has a MessagePack catalog cache or
|
|
whole-item DTO projection cache. The typed runtime catalog snapshot exposes typed
|
|
item rows only. `ItemManager.CreateRuntimeBehaviors` owns the explicit typed
|
|
behavior-kind switch from typed payloads into live behavior instances. There
|
|
is no remaining `RuntimeBehaviorConfig` projection and no reflection over
|
|
`LegacyPayloadKeyAttribute` to select or assign config fields;
|
|
gameplay stat modifiers target live behavior instances and package-owned
|
|
behavior metadata instead of rebuilding config DTOs for lookup.
|
|
`ItemInstance.Reference` stores the typed item key, `ItemInstance.ItemKey`
|
|
is the runtime identity surface, and `ItemInstance.ItemId` is a derived
|
|
legacy-GUID compatibility projection. `EquippedCargoBay.ItemsOfType`,
|
|
consumable activation, action-bar consumable fill/quantity display, item
|
|
transfer lookup, and trade owned-count rows now use item keys rather than
|
|
GUID-owned cargo indexes. Weapon ammo and item-use behavior config item
|
|
references are also item-key-only at the behavior API surface
|
|
(`AmmoItemKey`/`ItemKey`); the derived `AmmoType` and `Item` GUID
|
|
compatibility properties have been deleted. Runtime commit DTOs now
|
|
publish item and hull identity through `ItemKey`/`HullItemKey`, with legacy
|
|
ID fields demoted to compatibility. The package runtime catalog snapshot now
|
|
indexes items by canonical item key, and Unity gameplay/UI/zone helper
|
|
lookups resolve `ItemKey` directly rather than deriving legacy GUIDs for
|
|
`FindItemByLegacyId`. The package snapshot no longer exposes item,
|
|
corporation, or name-file `Find*ByLegacyId` indexes, and its runtime
|
|
item/corporation/name-file DTOs no longer publish legacy relationship fields;
|
|
legacy-ID lookup remains only on the canonical `Aetheria.State`
|
|
migration/catalog inspection boundary.
|
|
The shared runtime item catalog reader no longer has a GUID index or
|
|
`GetRuntimeItem(Guid)` entry point; item-key strings are the only lookup authority;
|
|
there is no remaining `ItemInstance.Data` identity/backing field. `ItemManager`
|
|
reads typed catalog
|
|
row lookup. Behavior
|
|
type selection now uses an explicit runtime catalog map instead of
|
|
`UnionAttribute` reflection, and the temporary behavior config constructor
|
|
map is keyed by typed behavior payload kind rather than legacy union key.
|
|
Live `Behavior` instances expose their typed payload kind and group directly,
|
|
so runtime state projection, stat-modifier matching, and behavior grouping no
|
|
longer reach back through config objects for behavior identity.
|
|
Runtime item category classification uses package-owned
|
|
`AetheriaRuntimeItemCategories` tokens; gameplay code should not ask C#
|
|
legacy DTO class names to classify typed catalog rows. `Aetheria.State.Import`
|
|
now materializes stable category tokens such as `hull`, `weapon`, `gear`,
|
|
`cargo-bay`, and `docking-bay` into typed item documents, while old union
|
|
names remain migration provenance. The typed state verifier also consumes
|
|
those package-owned category tokens for consumable and docking-bay coverage
|
|
checks and rejects item categories ending in `Data`.
|
|
Item/behavior DTO field layout is no longer marked in live Unity source with
|
|
MessagePack or project-owned payload-key attributes. Importer key maps and
|
|
typed runtime payload fields own migrated layout; runtime behavior
|
|
construction does not use field attributes as an authority. Item properties
|
|
manufacturer display is a typed snapshot consumer; loadout generation uses
|
|
typed catalog rows for hull type, shape, category, hardpoint type, behavior
|
|
kind prefilters, and selected-item instantiation. The old trade debug UI
|
|
and console `give` command have been deleted. The surviving trade menu also
|
|
uses typed catalog rows for first-pass size, hardpoint, and behavior filters
|
|
before hydrating row projections. No live caller can enumerate
|
|
legacy catalog entries or request catalog-shaped single entries through
|
|
`ItemManager`.
|
|
Equipment placement rotation is durable semantic state, not an occupancy-loop
|
|
temporary. The daemon generator emits the same quarter-turn used to reserve a
|
|
hardpoint, free-space fit, or cargo fit; loadout documents, runtime commits,
|
|
catalog and viewport snapshots, state mapping, and clone/transfer paths retain
|
|
it. This is the required input for daemon-owned thruster direction and torque;
|
|
Unity may visualize the resulting actuator state but cannot reconstruct a
|
|
missing rotation from prefab transforms.
|
|
- Inputs: Unity gameplay code, legacy catalog files, typed state documents, and
|
|
CultMesh server state.
|
|
- Outputs: `Aetheria.State` emits `.cc` state and CultMesh documents. Runtime
|
|
typed item catalog projection emits in-memory domain objects only; the old
|
|
local save and editor catalog write paths have been cut. Migrated catalog documents are
|
|
addressed through `AetheriaCatalogKeys` and `AetheriaStateNode` legacy-ID
|
|
methods, not importer-local string concatenation. Player settings, loadout
|
|
templates, and run checkpoints have a shared Unity commit-log primitive plus
|
|
a typed state node applicator. Run checkpoints now carry the current zone and
|
|
its entity snapshots through that same command/apply spine. Whole-galaxy
|
|
unloaded-zone projection still needs to be added once lazy generation has a
|
|
typed state owner. The old `SaveState`/`SaveZone` command surface is gone.
|
|
The catalog operator UI is emitted as a typed Eve surface document derived
|
|
from the catalog snapshot.
|
|
- Derived state: UI panels, generated keyboard layouts, editor rows, typed
|
|
state boot warnings, and serialized legacy payloads are projections,
|
|
migration inputs, diagnostics, or disabled session-local DTOs, not durable
|
|
authority.
|
|
- Forbidden writers: old JSON backing stores, JsonKnownTypes converters,
|
|
Rethink/LiteNet paths, IMGUI database editor exports, local save-file writes,
|
|
generated keyboard layout caches, server-side `DatabaseCache` paths, and item
|
|
DTO projection caches.
|
|
- Shared paths: manual gameplay edits, editor edits, server updates, file load,
|
|
file save, and migration all need to converge on one typed commit primitive.
|
|
- Deletion line: no new behavior should recreate old `ItemData` DTO metadata,
|
|
whole-item projection caches, or MessagePack catalog paths except bounded
|
|
migration readers.
|
|
|
|
## Target Authority Map
|
|
|
|
- Owner: `Aetheria.State`, a typed document layer backed by modern
|
|
`GameCult.Caching` and opened through a CultMesh node.
|
|
- Inputs: typed commands, save/import migration records, CultMesh replication,
|
|
editor mutations, and deterministic simulation facts.
|
|
- Outputs: CultCache `.cc` state files, CultMesh document streams, Eve surface
|
|
documents, simulation events, and migration reports.
|
|
- Derived state: Unity scene objects, HUD panels, editor inspectors, debug
|
|
views, server dashboards, and compatibility DTOs.
|
|
- Forbidden writers: Unity UI components, RethinkDB, legacy JSON stores,
|
|
`RuntimeCatalogEntry.ID`, `RuntimeItemProjectionEntry`, global cache statics,
|
|
and any compatibility reader.
|
|
- Shared paths: gameplay input, editor edits, import/deep-load, replication,
|
|
simulation ticks, and tests all call the same typed state service.
|
|
- Deletion line: keep old MessagePack/catalog metadata quarantined at import or
|
|
typed CultCache transport boundaries only. Delete or quarantine any remaining
|
|
live Unity predicates that still need legacy DTO vocabulary, and replace
|
|
operator/runtime UI truth with Eve surfaces rather than parallel status
|
|
widgets.
|
|
|
|
## Intended Change
|
|
|
|
Create a modern Aetheria state runtime that opens a CultMesh node over a typed
|
|
CultCache file, registers Aetheria document types, and exposes narrow ports for
|
|
gameplay, editor tools, migration, and UI projection. The state runtime becomes
|
|
the only live writer. Everything else becomes a consumer, a command source, or
|
|
a migration reader.
|
|
|
|
Use modern CultLib surfaces:
|
|
|
|
- `GameCult.Caching` for `[CultDocument]`, record keys, indexes, references,
|
|
schema catalog, and typed persistence.
|
|
- `GameCult.Caching.MessagePack` for the binary CultCache backing format.
|
|
- `GameCult.Mesh` for node/database illusion, durable shard logs, Verse
|
|
descriptors, authority leases, replication, and peer discovery.
|
|
- Eve CultUI for portable UI documents and command envelopes.
|
|
|
|
## UI Direction
|
|
|
|
Unity should lower Eve surfaces through UI Toolkit, not through the old uGUI
|
|
CultUI package as the strategic path.
|
|
|
|
The package should live in the Eve repo as an importable Unity package, for
|
|
example `org.gamecult.eve.unity-uitoolkit`. It should consume
|
|
`gamecult.eve.surface.v1` and `gamecult.eve.command.v1`, lower retained
|
|
components into `UIDocument`/`VisualElement` trees, and publish commands back to
|
|
the provider through CultMesh/CultNet.
|
|
|
|
Aetheria should import that Eve package and provide surfaces. It should not own
|
|
a bespoke Unity lowering. The existing CultLib Unity uGUI package remains useful
|
|
as prior art for resolver-backed controls and inspector generation, but it is
|
|
not the new portable UI authority.
|
|
|
|
The shared Eve Unity package pair now lives upstream in the neighboring Eve
|
|
repository, and Aetheria imports it by sibling-repo file path:
|
|
|
|
- `org.gamecult.eve.surface`: no-engine DTOs for `gamecult.eve.surface.v1`.
|
|
- `org.gamecult.eve.unity-uitoolkit`: UI Toolkit lowering from those DTOs to
|
|
native `VisualElement` trees.
|
|
|
|
These are import boundaries, not Aetheria UI authority. The provider-owned
|
|
surface document in CultCache/CultMesh remains the truth, and the lowerer only
|
|
projects it.
|
|
|
|
First Aetheria surfaces to publish:
|
|
|
|
- runtime HUD
|
|
- inventory
|
|
- menu shell
|
|
- sector/map view
|
|
- typed state inspector
|
|
- migration report / quarantine viewer
|
|
- server/session status
|
|
|
|
## Migration Phases
|
|
|
|
1. Baseline
|
|
- Record the current compile/test status for Unity and .NET projects.
|
|
- Keep this map current before cutting code.
|
|
- Count old authority references with `rg` so deletion has a visible target.
|
|
|
|
2. Modern state spine
|
|
- Add references to modern `GameCult.Caching`,
|
|
`GameCult.Caching.MessagePack`, and `GameCult.Mesh`.
|
|
- Create `Aetheria.State` document definitions using `[CultDocument]`,
|
|
`[MessagePackObject]`, `[CultName]`, `[CultIndex]`, and typed references.
|
|
- Add a smoke that writes, flushes, reopens, and reads typed state from a
|
|
CultCache `.cc` file.
|
|
|
|
3. Legacy quarantine
|
|
- Done: capture old `GameData/AetherDB.msgpack` and related name files as a
|
|
typed quarantine manifest without granting them runtime authority.
|
|
- Done: emit typed CultCache records plus a migration ledger for the catalog
|
|
quarantine preflight.
|
|
- Done: implement a bounded raw payload mapper that converts stable old
|
|
`DatabaseEntry` union fields into typed item/faction/name-file catalog
|
|
documents without making `Aetheria.State` depend on Unity's legacy model.
|
|
- Done: promote typed name files to `aetheria.name_file.v2` with full name
|
|
arrays, so `Galaxy` name generation has a Verse-owned replacement
|
|
for legacy `NameFile.Names`.
|
|
- Done: promote typed corporations to `aetheria.corporation.v2` with full
|
|
allegiance edges, so temporary `Faction` DTO projection can preserve
|
|
loadout generation behavior without reading legacy faction entries.
|
|
- Done: expand the stable item mapper to include equipment facets and
|
|
behavior kind fingerprints needed by future Unity/Eve catalog consumers.
|
|
- Done: import full item shape-cell masks into typed catalog documents and
|
|
expose them through the Unity-facing read facade.
|
|
- Done: import typed interior shape masks and hull hardpoint definitions
|
|
needed by future equipment/cargo layout and fitting consumers.
|
|
- Done: import recursive typed behavior payloads so future behavior
|
|
factories no longer have to depend on legacy `BehaviorData` objects just
|
|
to see authored behavior fields.
|
|
- Done: expand typed `AetheriaPlayerSettings` so `PlayerSettings.msgpack`
|
|
no longer lacks a durable Verse replacement for actual runtime settings
|
|
values.
|
|
- Done: add typed `AetheriaLoadoutTemplate` documents and smoke coverage so
|
|
`.loadout` no longer lacks a durable Verse replacement.
|
|
- Done: add the Unity runtime read projection for typed loadout templates,
|
|
so the restore menu can rehydrate saved loadouts from CultCache instead
|
|
of relying on the in-memory session list after restart.
|
|
- Done: route runtime loadout restore through typed daemon operations.
|
|
`InventoryPanel` may list typed loadout templates and display the restored
|
|
entity, but the daemon owns blueprint instantiation, credit spend,
|
|
docked-ship assignment, current entity update, and typed run checkpoint.
|
|
- Done: add typed node ports and smoke coverage for run -> zone -> entity
|
|
snapshots so `.zone` no longer lacks a durable Verse replacement graph.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
action-bar bindings into `AetheriaRunState` as stable input-control and
|
|
target references instead of UI or behavior-object payloads.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
faction relationship rows into `AetheriaRunState` as corporation
|
|
references, relationship tokens, and numeric standings.
|
|
- Done: make `AetheriaRuntimeSession` a live CultMesh document with state
|
|
node ports, provider advertisement, server heartbeat publication, and
|
|
smoke coverage; daemon liveness is no longer only console output or
|
|
incidental drain status.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
zone orbit/body rows into `AetheriaZoneState`, so generated celestial
|
|
graph facts no longer live only inside construction blueprints.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
entity simulation stat grids into `AetheriaEntitySnapshot`, so
|
|
temperature/armor/conductivity no longer live only in runtime blueprints.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry public
|
|
entity session state into `AetheriaEntitySnapshot`: velocity, target
|
|
references, active/toggle scalars, thermal injury accumulators, and active
|
|
consumable timers.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
behavior progress rows for equipped-item and active-consumable behaviors
|
|
that expose `IProgressBehavior`.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
weapon behavior state rows for instant, charged, and constant weapon
|
|
runtime internals.
|
|
- Done: extend weapon behavior state rows for lock-weapon progress and
|
|
target entity references, so lock acquisition state no longer evaporates
|
|
at the commit boundary.
|
|
- Done: extend run checkpoint commits and smoke coverage to carry typed
|
|
behavior state rows for sensor ping state plus radiator, reactor, and
|
|
capacitor runtime internals.
|
|
- Done: extend behavior state rows for AetherDrive axis, thrust, RPM,
|
|
maximum RPM, and thrust direction, so drive rotor state has a typed
|
|
snapshot/readback path.
|
|
- Done: extend behavior state rows for ResourceScanner target body key,
|
|
asteroid index, scan timer, range, minimum density, and duration, so
|
|
scanner progress and target ownership are typed state instead of
|
|
live-only behavior memory.
|
|
- Done: extend behavior state rows for MiningTool asteroid belt key,
|
|
asteroid index, and range, so active mining target state is typed
|
|
snapshot/readback state.
|
|
- Done: extend behavior state rows for Thruster axis, thrust, and torque,
|
|
so analog propulsion state is typed snapshot/readback state.
|
|
- Done: extend behavior state rows for Shield efficiency/energy usage,
|
|
VelocityLimit limit, and Thermotoggle target temperature.
|
|
- Done: extend behavior state rows for Switch activation and Trigger
|
|
pending pull state.
|
|
- Done: extend behavior state rows for StatModifier applied/executed flags
|
|
and target-stat count.
|
|
- Done: extend behavior state rows for TurretController initialized weapon
|
|
count, shot speed, and predictive-aim flag.
|
|
- Done: move TurretController weapon range and shot-speed evaluation behind
|
|
`Weapon` runtime methods, so turret AI no longer casts weapon config DTOs
|
|
to decide firing range or predictive aim.
|
|
- Done: cut live simulation grids out of `EntityConstructionBlueprint`; loadout
|
|
and construction templates no longer capture or restore temperature,
|
|
armor, max-armor, or hull-conductivity state.
|
|
- Done: add Unity package readback for canonical typed run, zone, and
|
|
entity snapshot documents, so the `.zone` replacement graph is not only
|
|
writable through the state node but also inspectable by runtime package
|
|
consumers.
|
|
- Done: preserve asteroid belt runtime state on typed asteroid rows:
|
|
damage, respawn timers, and miner accumulator references.
|
|
- Done: persist the actual galaxy generation seed in typed run state, so
|
|
future Continue/restore work has a reproducible topology body before
|
|
applying current-zone/entity snapshots.
|
|
- Done: preserve entity snapshot item-instance facts for equipment,
|
|
cargo-bay, and docking-bay slot rows: item key, quality, durability, and
|
|
quantity now survive canonical state and Unity package readback.
|
|
- Done: preserve item enabled state on typed loadout items and entity item
|
|
slots, so disabled equipment is no longer only runtime blueprint state.
|
|
- Done: preserve cargo bay contents, docking bay contents, and docking bay
|
|
child assignments in typed entity snapshots.
|
|
- Done: preserve aggregate entity visibility and visibility-source count in
|
|
typed entity snapshots, so `Entity.VisibilitySources` no longer hides
|
|
untyped session pressure.
|
|
- Done: preserve entity contact rows for gathered info, hostility, and
|
|
visible classification, so detection/contact state is typed snapshot data
|
|
instead of only reactive runtime collections.
|
|
- Done: preserve dropped world-pickup rows in typed zone snapshots. Run
|
|
checkpoints now carry pickup index, position, velocity, item key, quality,
|
|
durability, quantity, and package readback through
|
|
`AetheriaRuntimeZoneStateSnapshot.DroppedPickups`.
|
|
- Done: lower typed dropped-pickup zone rows back into live scene pickups on
|
|
zone load. `AetheriaRuntimeZoneStateSnapshot.RecordKey` preserves the exact
|
|
typed zone identity, and `ActionGameManager` restores only the matching
|
|
`RunId + ZoneIndex` pickup rows through `ZoneRenderer.DropItem`.
|
|
- Done: replace the main-menu null `Continue` button with a typed run-state
|
|
entry point. `MainMenu` reads available `AetheriaRunState` records through
|
|
`AetheriaRuntimeCatalogStore`, selects the newest run, regenerates the
|
|
galaxy from the saved generation seed, and passes the selected run to
|
|
`ActionGameManager` so boot enters the saved current zone and lowers typed
|
|
pickup rows.
|
|
- Done: restore the current zone's entity graph from typed state during
|
|
Continue boot. Package entity readback preserves `AetheriaEntitySnapshot`
|
|
record identity, and `ActionGameManager` resolves the exact
|
|
`RunId + ZoneIndex` entity-record prefix, removes generated zone entities
|
|
and their agents as Continue authority, lowers all typed entity snapshots
|
|
through the existing construction blueprint path, restores hull,
|
|
equipment, cargo, docking contents, weapon groups, position, direction,
|
|
velocity, shutdown override, heatsink toggle, tractor power,
|
|
heatstroke/hypothermia exposure, active consumable item/timer rows,
|
|
typed stat grids for temperature, thermal mass, armor, max armor, and
|
|
hull-conductivity axes, then reconnects target/contact rows among restored
|
|
entities, restores child/docking relationships from typed child keys and
|
|
docking-bay assignments, restores typed weapon and behavior runtime rows
|
|
into live behavior instances, and binds the saved current entity by
|
|
`AetheriaRunState.CurrentEntityKey` so Continue restore follows exact typed
|
|
entity identity instead of reconstructing the player ship from an integer
|
|
slot. Canonical run state and package runtime snapshots no longer keep the
|
|
old current-entity slot field; the package reader only synthesizes the key
|
|
from older stored runs, and the pending commit reader only synthesizes it
|
|
from older queued run checkpoints, when those compatibility seams are
|
|
encountered.
|
|
- Done: project run checkpoint entity snapshots from the flattened live
|
|
entity graph, not only `Zone.Entities`, so docked child ships can receive
|
|
typed entity records and stable child/docking references instead of
|
|
disappearing from the `.zone` replacement graph.
|
|
- Done: complete typed runtime behavior factory construction and snapshot
|
|
coverage for the live mutable behavior families. Articulated weapon kinds
|
|
restore through typed weapon rows, mutable non-weapon kinds restore through
|
|
typed behavior rows, and generic progress kinds project through the shared
|
|
progress path. Remaining work in this lane is catalog-field coverage, not
|
|
a missing runtime behavior owner.
|
|
|
|
4. Runtime cutover
|
|
- Done: add a Unity-facing typed catalog read facade and smoke proving it can
|
|
read the materialized `.cc` catalog plus Eve surface without the legacy
|
|
catalog reader.
|
|
- Done: move `Galaxy` faction selection and name generation to the typed
|
|
runtime catalog; legacy `Faction`/`NameFile` catalog entries no longer
|
|
decide generated sector factions or zone names.
|
|
- Done: move entity faction restore to `Galaxy.ResolveFactionByKey` through
|
|
`EntityConstructionBlueprint.FactionKey`, so typed loadout readback and
|
|
entity construction resolve corporation identity by typed key only. The
|
|
old blueprint `Faction` GUID compatibility field is deleted, and runtime
|
|
entity/faction-relationship commits no longer rebuild faction keys from
|
|
legacy `Faction.ID` GUIDs.
|
|
- Done: delete `Faction.Allegiance`, `Galaxy.ContainsFaction(Guid)`, and
|
|
`Galaxy.ResolveFaction(Guid)`; galaxy/loadout faction relationship logic
|
|
now uses `AllegianceByKey`, `ContainsFaction(string)`, and
|
|
`ResolveFactionByKey` only.
|
|
- Done: delete the temporary `Faction` shell's `GeonameFile` and `BossHull`
|
|
GUID link fields; galaxy name generation and boss-zone eligibility use
|
|
`GeonameFileKey` and `BossHullItemKey`.
|
|
- Done: move temporary `Faction` equality, hashing, narrative constraints,
|
|
sector display filtering, sector-map link/influence rendering, zone
|
|
security ownership checks, and runtime faction-relationship ordering to
|
|
`FactionKey`. The legacy `Faction.ID` projection field is deleted from
|
|
the temporary simulation shell.
|
|
- Done: move package and canonical manufacturer/corporation/name-file lookup
|
|
to typed keys (`ManufacturerKey`, `CorporationKey`, `GeonameFileKey`,
|
|
and `NameFileKey`), and move loadout manufacturer-distance weighting to
|
|
`Galaxy.ResolveFactionByKey`, so loadout code no longer parses
|
|
manufacturer legacy GUIDs to find faction influence.
|
|
- Done: move `LoadoutGenerator` weighted candidate selection, hardpoint fit,
|
|
station bay fit, cargo/capacitor fit, selected-item reuse, hull/category,
|
|
hull type, hull conductivity setup, and behavior-kind prefilters onto typed
|
|
runtime catalog rows; selected item instantiation now receives typed rows
|
|
directly.
|
|
- Done: replace `LoadoutGenerator`'s legacy DTO generic selectors with
|
|
private typed candidate-kind selectors, so loadout code no longer asks for
|
|
`HullData`, `GearData`, `CargoBayData`, or `EquippableItemData` as
|
|
candidate-selection authority.
|
|
- Done: add package-owned `AetheriaRuntimeItemCategories` tokens and move
|
|
runtime category checks off `nameof(ConsumableItemData)`,
|
|
`nameof(HullData)`, `nameof(WeaponItemData)`, and scattered raw category
|
|
strings in gameplay/loadout/docking classification.
|
|
- Done: remap imported item definition `Category` values from legacy union
|
|
class names to stable typed tokens, regenerate `GameData/aetheria-world.cc`,
|
|
and add a verifier guard that fails if item categories contain old `*Data`
|
|
DTO names.
|
|
- Done: delete unused `TradeMenuDebug`; the old debug uGUI trade path no
|
|
longer hydrates typed trade rows back into legacy `ItemData` objects.
|
|
- Done: move surviving trade menu size, hardpoint, and behavior filters onto
|
|
typed catalog row prefilters before row-level `ItemData` hydration.
|
|
- Done: move trade menu row presentation for name, mass, price, size,
|
|
hardpoint type, commodity subtype, hull-owned counts, and behavior-kind
|
|
filtering onto typed `TradeRow` fields.
|
|
- Done: demote TradeMenu behavior filters from `BehaviorData` `Type`
|
|
authority to typed behavior kind keys matched against typed payloads;
|
|
`BehaviorData` reflection remains only for temporary filter labels and
|
|
dynamic column metadata.
|
|
- Done: move trade menu buy price, ship-hull classification, and simple
|
|
commodity stack-size decisions onto typed catalog rows; inventory transfer
|
|
and ship construction are daemon-owned runtime mutations.
|
|
- Done: route trade purchase mutation through typed daemon operations.
|
|
`TradeMenu` still presents typed trade rows and calculates display prices,
|
|
but no longer subtracts credits, transfers purchased cargo, or constructs
|
|
purchased ships directly. The daemon owns the purchase mutation and typed
|
|
run checkpoint.
|
|
- Done: make docked sale a daemon-owned atomic economy transaction. The
|
|
command identifies only the seller cargo cell and quantity; the daemon
|
|
derives the dock parent, instance-sensitive catalog value, payout, and
|
|
first fitting typed station-stock placement. Generic Eve action rows are
|
|
derived availability levers. Clients cannot name a station, payout, or
|
|
destination stock cell, and a rejected placement changes neither cargo
|
|
nor credits.
|
|
- Done: move TradeMenu dynamic behavior columns onto typed behavior payload
|
|
fields; the menu no longer hydrates `ItemData` or `BehaviorData` for row
|
|
display, filtering, sorting, or buy decisions.
|
|
- Done: move action-bar consumable drop binding, activation command, and
|
|
active-duration fill onto typed catalog item IDs; legacy
|
|
`ConsumableItemData` is now only a compatibility fallback because the
|
|
current mapped legacy catalog contains no consumable item rows.
|
|
- Done: move player camera articulation grouping for equipped non-launcher
|
|
weapons onto typed behavior-kind rows instead of runtime `BehaviorData`
|
|
type inspection.
|
|
- Done: import typed thermal bounds and move schematic HUD heat-fill ranges
|
|
onto typed catalog rows.
|
|
- Done: move schematic HUD weapon-row classification onto typed behavior-kind
|
|
rows; runtime `Weapon` instances remain the owner for live ammo/cooldown
|
|
display values.
|
|
- Done: move target HUD hitpoint fill denominator onto typed hull durability;
|
|
live hull item durability remains the numerator/runtime damage owner.
|
|
- Done: import typed item specific heat and move `ItemManager` generic mass,
|
|
thermal-mass, and crafted-price helpers onto typed runtime catalog rows.
|
|
- Done: import typed thermal performance curve keys and move PropertiesPanel
|
|
thermal curve presentation onto typed catalog rows; incomplete typed rows
|
|
use a neutral fallback curve instead of hydrating legacy thermal DTOs.
|
|
- Done: move PropertiesPanel runtime behavior stat display and damage-range
|
|
curves onto typed behavior payload fields, and delete the explicit
|
|
`Inspect(ItemData)` projection inspector after moving trade row inspection
|
|
onto typed runtime catalog rows.
|
|
- Done: replace the PropertiesPanel stat modifier class-name check with the
|
|
package-owned typed `StatModifier` behavior kind.
|
|
- Done: demote PropertiesPanel weapon damage-range payload matching from
|
|
`BehaviorData` `Type` authority to package-owned typed weapon behavior
|
|
metadata.
|
|
- Done: move PropertiesPanel generic behavior stat display off
|
|
`BehaviorData` reflection and onto package-owned typed behavior display
|
|
metadata keyed by behavior kind and payload field key.
|
|
- Done: complete package-owned typed behavior metadata coverage for live
|
|
`Heat`, `MiningTool`, and `Thermotoggle` payload fields plus `Switch` and
|
|
`Trigger` shell kinds. `PropertiesPanel` and `TradeMenu` no longer
|
|
silently drop those typed behavior families, and temperature-bearing
|
|
payload values format through the runtime temperature unit.
|
|
- Done: move TradeMenu behavior filter options, behavior family matching,
|
|
and dynamic behavior columns off `BehaviorData` reflection and onto
|
|
package-owned typed behavior metadata.
|
|
- Done: delete the dead `RuntimeInspectable` attribute and annotations after
|
|
the UI behavior metadata owner moved into the typed runtime package.
|
|
- Done: remove the loot pickup presentation fallback to legacy `ItemData`;
|
|
typed category/name rows now decide pickup visuals and scan labels, and
|
|
missing typed rows render generic unknown gear pickup presentation.
|
|
- Done: import typed hull prefab paths and move `ZoneRenderer` entity scene
|
|
instantiation onto typed hull rows; legacy `HullData` no longer chooses
|
|
zone entity prefabs or station compass classification.
|
|
- Done: move `EntityInstance` hull shape and hardpoint presentation/damage
|
|
masks onto typed catalog rows; legacy `HullData` no longer supplies hull
|
|
shape or hardpoint lists to scene entity instances.
|
|
- Done: move `InventoryPanel` entity-grid hull shape/interior rendering and
|
|
thermal overlay masking onto typed catalog rows; legacy `HullData` no
|
|
longer supplies equipment-grid display geometry.
|
|
- Done: move `EquippedCargoBay` cargo geometry, item fit shape, simple stack
|
|
limits, cargo mass, cargo thermal mass, and `InventoryPanel` cargo-grid
|
|
lowering onto typed catalog rows; legacy `CargoBayData` remains only in
|
|
later simulation projections such as behavior construction.
|
|
- Done: import docking bay max ship size into typed item rows and move
|
|
`EquippedDockingBay.MaxSize` onto the typed runtime catalog row; legacy
|
|
`DockingBayData.MaxSize` is no longer the runtime docking-limit owner.
|
|
- Done: move `EquippedItem.InsetShape` construction onto typed hull and item
|
|
shape rows; legacy `HullData.Shape`/`EquippableItemData.Shape` no longer
|
|
decide equipped-item temperature footprint geometry.
|
|
- Done: move `EquippedItem` and `ConsumableItemEffect` behavior construction
|
|
off `Data.Behaviors` and onto typed runtime behavior payload construction.
|
|
- Done: route `EquippedItem` and `ConsumableItemEffect` behavior instance
|
|
creation through `ItemManager.CreateRuntimeBehaviors`; behavior reads now
|
|
go through `RuntimeBehaviorDefinition`.
|
|
- Done: move the temporary behavior config constructor map from legacy union
|
|
keys to typed behavior payload kind strings; union keys remain migration
|
|
provenance only for this runtime path.
|
|
- Done: move `StatModifier` behavior requirements and behavior-stat targets
|
|
off `EquippableItemData.Behaviors` and old `BehaviorData` subclass
|
|
identity checks. Live behaviors carry typed payload kinds, and
|
|
`StatModifier` matches those kind strings for target and requirement
|
|
selection. The obsolete item-DTO stat target branch is deleted because the
|
|
live equippable item DTO hierarchy has no active `PerformanceStat` fields.
|
|
- Done: move `StatModifier` target and requirement lookup onto the live
|
|
equipped behavior instances. It now modifies the `PerformanceStat` objects
|
|
actually held by runtime behaviors instead of rebuilding temporary config
|
|
DTOs from the catalog.
|
|
- Done: delete the generic `BehaviorPayloadReader.Guid(...)` helper from
|
|
`ItemManager`; migrated behavior payload legacy-ID fields now cross the
|
|
runtime bridge only through the explicit `ItemKey(...)` projection.
|
|
- Done: move `StatModifier` behavior kind/family matching onto
|
|
`AetheriaRuntimeBehaviorMetadataCatalog`; the behavior only normalizes
|
|
migrated `*Data` tokens before asking the package-owned metadata owner.
|
|
- Done: move live behavior identity reads onto `Behavior.Kind` and
|
|
`Behavior.Group`, so state snapshots, weapon snapshots, progress rows,
|
|
stat-modifier matching, and behavior grouping use runtime instance
|
|
identity.
|
|
- Done: move TurretController's weapon range/velocity reads off
|
|
weapon config casts and onto `Weapon.EvaluateRange`/`EvaluateVelocity`;
|
|
copied weapon range and velocity fields are owned by the weapon runtime.
|
|
- Done: move projectile, hitscan, beam, lightning, and mine effect damage
|
|
type reads off weapon configs and onto `Weapon.DamageType`; effect managers
|
|
consume live weapon metadata instead of config DTO fields.
|
|
- Done: move weapon effect prefab lookup and constant weapon visual startup
|
|
off `InstantWeaponData`/`ConstantWeaponData`; `EntityInstance` caches
|
|
managers by `Weapon.EffectPrefab`, and constant effect managers consume
|
|
live `ConstantWeapon` stats.
|
|
- Done: move thruster particle prefab lookup off `ThrusterData`;
|
|
`ShipInstance` now consumes `Thruster.ParticlesPrefab`, so the renderer
|
|
reads live behavior metadata instead of the temporary config bridge.
|
|
- Done: move AetherDrive particle prefab lookup off `AetherDriveData`;
|
|
`ShipInstance` now consumes `AetherDrive.Particles`, and the public
|
|
`DriveData` escape hatch has been removed.
|
|
- Done: move guided missile profile reads off `LauncherData` and
|
|
`GuidedWeaponData`; `GuidedProjectileManager` now consumes
|
|
`Weapon`-owned target mode, curve keys, dodge frequency, and evaluated
|
|
thrust/top-speed values.
|
|
- Done: move HUD ammo display reads off `WeaponData`; `SchematicDisplay`
|
|
consumes `Weapon.AmmoItemKey`, `Weapon.MagazineSize`, and `Weapon.UsesAmmo`,
|
|
and the public `WeaponData` escape hatch has been removed.
|
|
- Done: stop `Weapon`, `InstantWeapon`, `ConstantWeapon`, `ChargedWeapon`,
|
|
and `LockWeapon` from retaining runtime config subclasses; weapon-family
|
|
constructors now copy stats, curves, ammo/reload data, guided projectile
|
|
profile fields, burst/cooldown fields, charge multipliers, and lock
|
|
parameters into runtime-owned fields.
|
|
- Done: delete dormant legacy item audio reads in `EntityInstance` and stale
|
|
commented thruster sound-trigger code; those paths had no live output and
|
|
therefore earned deletion rather than a new runtime metadata owner.
|
|
- Done: move runtime orbit parent/phase/distance/fixed-position reads off
|
|
`OrbitConstructionData`; `Zone`, `ActionGameManager`, and `ZoneRenderer` consume
|
|
`Orbit` runtime properties, and the old `Orbit.ToData()` construction
|
|
capture bridge is deleted.
|
|
- Done: move orbit phase evaluation off `OrbitConstructionData`; runtime zone updates,
|
|
asteroid transforms, and generator rosette spacing now use `Orbit.Evaluate`,
|
|
leaving `OrbitConstructionData` as a construction input only.
|
|
- Done: move orbital runtime entity ownership from the old DTO-shaped
|
|
`OrbitData` scar all the way onto `OrbitKey`; the obsolete `OrbitId`
|
|
intermediate field is gone, and runtime entities now resolve through
|
|
`Zone` instead of exposing wrapper orbit GUID authority.
|
|
- Done: move patrol/tow orbit targets onto typed orbit keys: `PatrolOrbitsTask`,
|
|
`MoveToOrbitState`, and `StationTowing` now retain keyed orbit references,
|
|
and `Zone` owns orbit-key parsing/resolution for agent orbit movement.
|
|
- Done: move live asteroid-belt simulation, scanning, and mesh setup reads
|
|
off `AsteroidBeltConstructionData`; `Zone`, `ResourceScanner`, and `AsteroidBeltUI`
|
|
consume `AsteroidBelt` runtime asteroid/resource/orbit properties, and
|
|
the old `AsteroidBelt.ToData()` construction capture bridge is deleted.
|
|
- Done: move live planet mass/orbit/gravity reads off `BodyConstructionData`; `Zone`
|
|
gravity evaluation and `ZoneRenderer` consume `Planet` runtime properties,
|
|
and the old `Planet.ToData()` construction capture bridge is deleted.
|
|
- Done: move typed zone orbit snapshot projection off
|
|
construction-blueprint orbit rows; run checkpoint commits now project current
|
|
`Zone.Orbits` runtime wrappers into typed orbit snapshot rows.
|
|
- Done: move typed zone body snapshot projection off `BodyConstructionData` and
|
|
`AsteroidBeltConstructionData`; run checkpoint commits now project `Planet` and
|
|
`AsteroidBelt` runtime wrappers, including body resources, asteroid
|
|
runtime damage/respawn/miner accumulators, and gas/sun visual fields.
|
|
- Done: move visited-sector summary counts off construction-blueprint
|
|
body/entity DTOs; `SectorRenderer` now counts planets, belts, gas giants,
|
|
stars, stations, turrets, and ships from `GalaxyZone.Contents` runtime
|
|
wrappers and live entities.
|
|
- Done: delete `GalaxyZone.RuntimeBlueprint` as a persistent zone-side cache;
|
|
unvisited zone generation now feeds the `Zone` constructor directly, and
|
|
visited zone state is owned by `GalaxyZone.Contents`/`Zone.CaptureBlueprint`.
|
|
- Done: delete the `Zone.Planets` `BodyConstructionData` shadow dictionary; orbit
|
|
targeting, resource scanning, and zone capture now read `PlanetInstances`
|
|
and `AsteroidBelts` runtime wrappers, with DTOs retained only as
|
|
construction/capture payloads.
|
|
- Done: move `ZoneRenderer` body classification off `BodyConstructionData` subclasses;
|
|
zone rendering now walks runtime orbits and lowers `Planet`, `GasGiant`,
|
|
`Sun`, and `AsteroidBelt` wrappers directly.
|
|
- Done: remove public `GasGiantConstructionData`/`SunConstructionData` handles from runtime wrappers;
|
|
wave and light calculations now use copied wrapper fields after
|
|
construction.
|
|
- Done: move saved loadout template ownership off `EntityConstructionBlueprint`;
|
|
`ActionGameManager` keeps typed `AetheriaRuntimeLoadoutTemplateSnapshot`
|
|
documents and projects blueprints only for pricing, instantiation, and
|
|
commit boundaries.
|
|
- Done: rename `RuntimeZoneBlueprint` to `ZoneConstructionBlueprint`, delete
|
|
retained construction-payload state from `Zone`, and delete the unused
|
|
construction-capture bridge; `Zone` now keeps radius/mass as copied runtime
|
|
facts after construction.
|
|
- Done: delete the legacy `Behaviors` lists from `ConsumableItemData` and
|
|
`EquippableItemData`; item DTOs can no longer carry behavior config state.
|
|
- Done: move runtime blueprint price aggregation and conductivity restore
|
|
geometry onto typed runtime item price and hull shape rows; legacy
|
|
`ItemData.Price` and `HullData.Shape` no longer own those blueprint paths.
|
|
- Done: move runtime blueprint item cloning off `ItemData` hydration and onto
|
|
typed runtime item rows; `ItemManager.Instantiate` now clones simple
|
|
commodities, crafted items, consumables, and equippables from
|
|
`AetheriaRuntimeCatalogItem` identity and facets.
|
|
- Done: delete dead runtime blueprint behavior-private persistence:
|
|
`PersistedBehaviors`, `IPersistentBehavior`, and `PersistentBehaviorData`
|
|
no longer exist, so behavior state cannot smuggle itself through the
|
|
blueprint projection path.
|
|
- Done: delete the runtime item DTO hydration bridge; `ItemManager.GetData`,
|
|
`ItemManager.Hydrate`, the old projection reader item DTO API, the
|
|
redundant `AetheriaRuntimeItemCatalog` cache wrapper, and
|
|
`RuntimeItemReference.Projection` are gone.
|
|
- Done: move final `Entity.ItemFits`, `TryFindSpace`, `TryEquip`, and
|
|
`TryUnequip` gear occupancy/mass deltas onto typed catalog rows for item
|
|
shape, hull shape/interior, hardpoint masks, cargo/docking category, and
|
|
mass/thermal mass.
|
|
- Done: move `LoadoutGenerator` selected item birth onto typed runtime item
|
|
rows via `ItemManager.CreateEquippableInstance`; generated hulls, cargo,
|
|
docking bays, controllers, capacitors, reused gear, and station inventory no
|
|
longer hydrate `EquippableItemData` projections merely to instantiate.
|
|
- Done: import typed conductivity and hull physical facets, regenerate the
|
|
checked-in `.cc` catalog, and move `Entity.MapEntity`,
|
|
`Entity.UnoccupiedSpace`, grid-offset placement, and
|
|
`Entity.UpdateTemperature` onto typed runtime hull rows.
|
|
- Done: move entity default naming onto typed hull rows and delete the
|
|
entity-level `HullData` property that only preserved legacy name hydration.
|
|
- Done: move unequipped `ItemManager.Evaluate` durability/name inputs onto
|
|
typed runtime item rows; legacy `EquippableItemData.Durability` no longer
|
|
owns that stat-evaluation path.
|
|
- Done: move new equippable instance durability initialization onto typed
|
|
runtime item rows.
|
|
- Done: move `EquippedItem` conductivity and max-durability performance/wear
|
|
inputs onto typed runtime item rows.
|
|
- Done: move `EquippedItem` thermal performance evaluation onto typed
|
|
runtime item thermal bounds and curve keys; missing typed curve/range data
|
|
uses a neutral runtime default.
|
|
- Done: import typed thermal resilience and move equipped-item wear scaling
|
|
off `EquippableItemData.ThermalResilience`; missing typed resilience uses
|
|
a neutral runtime default.
|
|
- Done: import typed audio parameter stat bindings and move equipped-item
|
|
Wwise parameter updates off `EquippableItemData.AudioStats`; missing
|
|
typed audio stat bindings produce no parameter updates.
|
|
- Done: add typed consumable stackability, duration, and effectiveness curve
|
|
fields and route action-bar consumable activation/runtime evaluation
|
|
through typed item rows; verifier records that the current mapped catalog
|
|
has `0` consumable item rows, so future consumable content still needs
|
|
typed coverage.
|
|
- Done: delete `Entity` consumable activation overloads that accepted
|
|
`ConsumableItemData`; active lookup uses item keys and activation commands
|
|
accept typed runtime catalog rows only.
|
|
- Done: delete dead `Entity.GetBehaviorData<T>()` and stale commented
|
|
switch/trigger/axis behavior-query helpers; entity-level behavior queries
|
|
expose live behavior instances, not DTO config.
|
|
- Done: import action-bar icon resource paths into typed item definitions and
|
|
move `ActionBarSlot` custom gear icon lookup onto typed runtime item rows.
|
|
- Done: move `Ship` drag, combat/turret predicted shot height, and thruster
|
|
torque geometry onto typed hull facets and typed shape masks.
|
|
- Done: delete the console `give` command instead of preserving a debug
|
|
operator path that hydrated typed item rows back into legacy item DTOs.
|
|
- Done: delete `ItemManager.GetCatalogEntries<T>` after all live callers
|
|
moved to typed catalog selection.
|
|
- Done: delete `ILegacyItemCatalogReader.GetAll<T>` and the type/global indexes
|
|
inside `LegacyItemCatalogCache`; the legacy cache is now only a pull-fed GUID
|
|
lookup bridge.
|
|
- Done: remove `GameData/NameFile/*.msgpack` from Unity runtime legacy
|
|
catalog boot; typed name files now own runtime names, and old name files
|
|
remain migration inputs only.
|
|
- Done: narrow `ILegacyItemCatalogReader` and `DatabaseLink<T>` to `ItemData`;
|
|
`LegacyItemCatalogCache` ignores non-item entries from `AetherDB.msgpack`.
|
|
- Done: replace `ActionGameManager` cache bootstrap with the typed
|
|
`AetheriaRuntimeCatalogSnapshot`; delete `LegacyItemCatalogBoundary`,
|
|
`LegacyItemCatalogCache`, and the runtime MessagePack deserializer path.
|
|
- Done: demote `DatabaseEntry` and `DatabaseLink<T>` from MessagePack
|
|
union/object shapes to plain runtime identity/link helpers.
|
|
- Done: rename live Unity projection helpers from `DatabaseEntry`,
|
|
`DatabaseLink<T>`, and `InspectableDatabaseLinkAttribute` to runtime
|
|
projection names, and move the old `ServerShared/CultCache` folder to
|
|
`ServerShared/RuntimeProjection`.
|
|
- Done: rename the surviving runtime DTO identity base from
|
|
`RuntimeCatalogEntry` to `RuntimeItemProjectionEntry`.
|
|
- Done: delete the `RuntimeItemProjectionEntry` base after item DTO hydration
|
|
was removed; surviving `ItemData` DTOs own only their local legacy GUID.
|
|
- Done: delete unused `InspectableRuntimeCatalogLinkAttribute` metadata from
|
|
runtime DTOs; link inspection no longer masquerades as catalog authority.
|
|
- Done: delete the empty `RuntimeProjection/Serialization` folder marker and
|
|
unused projection-era attributes (`GlobalSettings`, `RangedFloat`,
|
|
`Tooltip`, `Name`, and the commented `ExternalEntry`) from live Unity
|
|
source.
|
|
- Done: replace behavior union reflection with an explicit runtime catalog
|
|
behavior map and remove all live `Union(...)` annotations.
|
|
- Done: demote agent task runtime shapes from MessagePack object/key/union
|
|
metadata to plain in-memory DTOs.
|
|
- Done: demote legacy player, faction, name-file, galaxy-map-layer, and
|
|
narrative helper DTOs from MessagePack metadata to plain runtime/inspector
|
|
shapes.
|
|
- Done: delete remaining item/behavior DTO MessagePack field metadata and
|
|
the follow-on `LegacyPayloadKeyAttribute`; no live `Assets/Scripts` source
|
|
depends on Newtonsoft, RethinkDB, bespoke save-file serializer symbols, or
|
|
legacy payload-key annotations. Remaining package-level MessagePack usage
|
|
is the typed CultCache `.cc` transport boundary, not a gameplay save
|
|
format.
|
|
- Done: delete dead `PlayerData` and `GalaxyMapLayerData` catalog roots, and
|
|
remove legacy catalog group/table annotations from surviving runtime DTOs.
|
|
- Done: move loadout generation's selected-item instantiation onto typed
|
|
runtime item rows; typed catalog filtering remains the selection owner.
|
|
- Done: remove stale main-menu/editor database vocabulary from Unity UI
|
|
surfaces; galaxy generation now reports typed catalog loading.
|
|
- Done: remove the stale `MessagePack` assembly reference from
|
|
`Aetheria.Shared.Unity`; the remaining MessagePack reference is contained
|
|
in the typed state package's `.cc` reader.
|
|
- Done: convert domain references from GUID/base-class patterns to
|
|
typed record refs. Item instances, cargo inventory indexes, weapon ammo
|
|
references, item-use behavior references, and runtime commit item/hull
|
|
surfaces now carry typed item keys. Runtime behavior resource-scanner and
|
|
mining-tool body references are named and serialized as typed body keys
|
|
through commit/readback state, with the behaviors retaining keyed runtime
|
|
state directly and `Zone` owning key-indexed runtime lookup. Patrol/tow
|
|
orbit task targets now also retain typed orbit keys with `Zone` owning
|
|
orbit-key resolution. Orbital runtime entities and runtime construction
|
|
blueprints now also retain typed `OrbitKey` values, with `Zone` owning
|
|
orbital movement and dock-camera parent-orbit resolution for that seam.
|
|
Renderer, intro-cutscene, and `ResourceScanner` orbit readers now also
|
|
consume the wrapper `OrbitKey` edge instead of wrapper GUID orbit fields.
|
|
`Planet`, `AsteroidBelt`, and `Orbit` runtime wrappers no longer retain
|
|
GUID identity sidecars; they keep `BodyKey`/`OrbitKey`/`ParentOrbitKey`
|
|
plus their runtime object links. `Zone` no longer keeps GUID-to-body
|
|
lookup dictionaries or the `GetBodyKey(Guid)` bridge. Zone construction
|
|
data and generator handoff now carry typed orbit/body keys directly, and
|
|
the remaining agent-task shell placeholders also retain typed string keys
|
|
rather than raw GUID fields. The only surviving GUID use in this lane is
|
|
local key minting during zone generation, not runtime reference authority.
|
|
- Done: delete the `ItemInstance.ItemId` legacy-GUID projection; diagnostics
|
|
now report `ItemKey` so item instances expose only typed item-key identity.
|
|
- Done: delete `Entity`/`EquippedCargoBay` cargo and consumable GUID lookup
|
|
overloads; transfer, count, active-consumable, and first-item APIs now
|
|
expose item-key contracts only.
|
|
- Done: delete the runtime catalog raw-GUID string fallback and unused
|
|
reverse legacy-GUID projections from `AetheriaRuntimeItemReference`; catalog
|
|
lookup accepts canonical item keys only.
|
|
- Done: move action-bar consumable bindings off `Target.LegacyId` parsing;
|
|
they read the typed runtime row `ItemKey` directly for HUD fill/count and
|
|
runtime commit projection.
|
|
- Done: move zone body resource dictionaries from legacy item GUID keys to
|
|
typed item-key strings; runtime body resource commit projection no longer
|
|
calls `FromLegacyId`.
|
|
- Done: move resource scanner targets and mining tool asteroid belts to
|
|
typed body-key runtime commit fields; raw body ID command-document fields
|
|
are deleted.
|
|
- Done: delete the old `ItemData`/`EquippableItemData`/`HullData`/
|
|
`WeaponItemData` DTO hierarchy from live Unity source; shared runtime
|
|
geometry/stat primitives now live in `RuntimeGeometry.cs`.
|
|
|
|
5. Mesh host
|
|
- Replace the old RethinkDB/LiteNetLib database authority with a
|
|
CultMesh node.
|
|
- Keep any transport bridge only if it delegates to CultMesh and protects a
|
|
named external compatibility contract.
|
|
- Publish Verse descriptors and state subscriptions through CultMesh.
|
|
- In progress: the Unity state client can now open an explicit remote
|
|
replica with `AetheriaRuntimeVerseClient.OpenRemoteAsync`. Snapshot reads
|
|
arrive through CultMesh and non-primary writes route to the daemon shard;
|
|
the local `.cc` scene adapter is no longer described as a live daemon
|
|
transport. The remaining proof is a separately running daemon, observed
|
|
receipts, and PlayMode reconciliation in an EveUnity-owned client.
|
|
- Done: publish committed facts for every applied or rejected daemon command,
|
|
including operation-level rejection. The remote Unity adapter correlates
|
|
those facts by command ID and emits a terminal receipt only after the
|
|
synchronized game surface reaches the fact's source frame.
|
|
|
|
6. Eve UI
|
|
- Done: publish the typed catalog operator surface from `Aetheria.State`.
|
|
- Done: stage the Eve surface contract DTO package and UI Toolkit lowering
|
|
package as importable Unity packages, then move their shared home into the
|
|
neighboring Eve repo once that worktree was clean.
|
|
- Done: teach the embedded Unity state package to read
|
|
`gamecult.eve.surface` records from the `.cc` store into that shared
|
|
contract.
|
|
- Done: add `org.gamecult.aetheria.eve-runtime` with a `UIDocument`
|
|
presenter that mounts typed Eve surfaces from `GameData/aetheria-world.cc`
|
|
through UI Toolkit without giving the renderer state authority.
|
|
- Done: add the Unity editor `Aetheria/CultUI/Live Composition Surface`
|
|
authoring window. It rebuilds a draft `EveSurfaceDocument` in editor
|
|
memory, lowers it through the shared Eve UI Toolkit path, and emits
|
|
provider-builder code for menu work; it does not publish state, accept
|
|
commands, or become a menu authority.
|
|
- Done: add a shared file-owned debug CultUI surface at
|
|
`GameData/cultui-debug-surface.cultui`. Unity can mount it through
|
|
`AETHERIA_EVE_FILE_SURFACE_PATH` / `AetheriaEveFileSurfacePresenter`;
|
|
Electron reads and watches the same file through IPC and lowers it in the
|
|
RTS side panel. The file owns only debug composition; daemon/provider
|
|
surfaces and command acceptance remain separate authorities.
|
|
- Done: publish renderer-emitted Eve commands as typed
|
|
`gamecult.eve.command.v1` records, separate from runtime state commits so
|
|
only the daemon-owned provider bridge accepts commands it owns.
|
|
- Done: add the provider-owned Eve command bridge that accepts observed Eve commands,
|
|
validates provider/surface/command templates, invokes the current refresh
|
|
handlers, republishes accepted surfaces, rejects unknown commands, and
|
|
records typed command acceptance status.
|
|
- Done: delete provider-side Eve command emission from
|
|
`AetheriaEveCommandBridge`; renderer/runtime requests submit through
|
|
`AetheriaRuntimeEveCommands`, while the provider bridge only validates,
|
|
applies, reports, and deletes accounted commands.
|
|
- Done: replace the old pending-lane private raw MessagePack payload files
|
|
with CultCache-shaped command documents. `AetheriaRuntimeCultCacheDocumentStore`
|
|
owns the temporary envelope writer/reader until the Unity package can use
|
|
generated CultCache serializers directly.
|
|
- Done: extend the command bridge beyond refresh commands for the first
|
|
mutating settings surface; player-settings Eve commands now mutate
|
|
canonical `AetheriaPlayerSettings` and republish the provider-owned
|
|
`aetheria.player_settings` surface.
|
|
- Done: wire the presenter into runtime through `AetheriaEveRuntimeBootstrap`
|
|
so the operations surface mounts as a UI Toolkit surface after scene load.
|
|
- Done: delete the concrete uGUI debug console path: `ConsoleView`,
|
|
`ConsoleController`, the `ARPG.unity` script binding, and
|
|
`ActionGameManager` debug command registrations. Refresh commands now use
|
|
the Eve command bridge; future gameplay/editor commands must add
|
|
provider-owned Eve handlers instead of reintroducing renderer-local text
|
|
command execution.
|
|
- Done: delete the uGUI `FieldTester` debug panel and its
|
|
`FieldShieldTest.unity` script binding. Future field prototype controls
|
|
should be provider-owned Eve/prototype commands or local simulation code,
|
|
not a `PropertiesPanel` mutating `FieldDriver` directly.
|
|
- Done: delete `PropertiesPanel` reflection write authority. The legacy
|
|
inspector can still project object fields for display, but `readWrite`
|
|
mode and `FieldInfo.SetValue` mutation are gone; renderer-local object
|
|
edits must become provider-owned typed commands or local simulation code.
|
|
- Done: route runtime simulation tuning controls through typed daemon
|
|
operations. UI fields for entity override shutdown, per-item override
|
|
shutdown, thermotoggle target temperature, and entity shutdown performance
|
|
now send daemon requests instead of writing simulation objects directly.
|
|
The item override-shutdown bit is part of the typed loadout/entity
|
|
item-slot state so the daemon checkpoint spine can see what the simulation
|
|
sees.
|
|
- Done: route hull conductivity toggles through typed daemon operations.
|
|
`InventoryPanel` requests conductivity edge toggles; the daemon mutates
|
|
`Entity.HullConductivity` and publishes the typed run checkpoint that
|
|
projects `hull_conductivity_x` and `hull_conductivity_y` grids.
|
|
- Done: route inventory entity renames through typed daemon operations.
|
|
`InventoryPanel` may collect the name in a dialog, but the daemon owns the
|
|
entity `Name` mutation and typed entity snapshot checkpoint.
|
|
- Done: route weapon group membership changes through typed daemon
|
|
operations. The old `WeaponGroupAssignment` uGUI shell and its prefab
|
|
chain have been deleted; the daemon owns the membership mutation and typed
|
|
checkpoint outright.
|
|
- Done: route action-bar drag/drop bindings through typed daemon operations,
|
|
and restore them from typed run-state descriptors when the current entity
|
|
changes or a typed continue run rehydrates the session. Runtime UI may
|
|
still lower the action bar, but the daemon owns both the binding mutation
|
|
and the rebind path back onto the live current entity.
|
|
- Current generic action-bar authority: Aetheria publishes semantic actions,
|
|
provider icon asset keys, availability, typed live values, and initial
|
|
action-bar suggestions. EveUnity lowers those documents into buttons,
|
|
held controls, view-direction controls, and explicit scalar fields; it
|
|
submits only through advertised operations. Physical bindings, slot order,
|
|
and user overrides belong to the Eve client profile. The older
|
|
daemon-persisted `ActionBarBinding` descriptors are no longer an owner for
|
|
generic clients; they remain a fossil-client compatibility path awaiting
|
|
deletion when generic binding persistence is available through CultMesh.
|
|
Aetheria gameplay objects and Unity gear behaviors are forbidden writers.
|
|
- Done: route inventory double-click transfer and drag/drop placement
|
|
through typed daemon operations. `InventoryMenu` and `InventoryPanel` no
|
|
longer drop items, remove cargo, unequip gear, equip gear, or store cargo
|
|
directly for those UI paths; they ask the daemon to commit cargo-to-cargo,
|
|
cargo-to-equipment, equipment-to-cargo, or equipment-to-equipment movement
|
|
and then refresh display. uGUI still owns the presentation shell for now,
|
|
not the inventory mutation.
|
|
- Done: route docked current-ship selection through typed daemon operations.
|
|
`InventoryPanel` may request a selected docked player ship and update the
|
|
button color, but the daemon owns `CurrentEntity`, `DockingBay.DockedShip`,
|
|
and the typed checkpoint.
|
|
- Done: delete client-owned loot pickup submission. Tractor power influences
|
|
Ymir motion; after that step the daemon alone compares live ship/pickup XZ
|
|
positions and may mutate cargo or remove a pickup. Ymir contact facts,
|
|
Unity collision callbacks, and the retired serialized command payload have
|
|
no writer authority.
|
|
- Done: route entity destruction through typed daemon operations.
|
|
`EntityInstance` observes hull death and may spawn the local destruction
|
|
effect, but the daemon owns equipment/cargo drop decisions, zone entity
|
|
removal, and the typed run checkpoint. Dropped world pickups are now
|
|
projected into typed zone snapshot state and lowered back into live scene
|
|
pickups by exact typed zone record key during zone load.
|
|
- Done: replace the main-menu gameplay/graphics settings screen with a
|
|
locally lowered UI Toolkit projection of the shared
|
|
`aetheria.player_settings` Eve surface contract. The menu shell still owns
|
|
entry/exit flow, but the daemon now owns surface command semantics through
|
|
typed Eve player-settings commands.
|
|
- Done: move the main-menu player-name field into the shared
|
|
`aetheria.player_settings` Eve surface contract. `MainMenu` no longer owns
|
|
a special-case text field; UI Toolkit lowers the shared Eve text control
|
|
and the daemon owns the typed player-settings command.
|
|
- Done: replace the whole main-menu shell with Eve-owned UI Toolkit
|
|
surfaces. Root navigation and settings/input pages now lower through a
|
|
single Eve host instead of the old `PropertiesPanel`/fade shell. The menu
|
|
remains a client-side projection: the Aetheria daemon owns Verse state and
|
|
Unity renders and submits commands. The input page now reports typed state
|
|
and opens the live runtime Eve input screen in the in-game overlay instead
|
|
of the old drag/drop uGUI remap shell. The fake audio page is deleted
|
|
until audio has a typed state owner.
|
|
- Done: replace the live runtime input remap screen with an Eve-owned UI
|
|
Toolkit surface that still calls into Aetheria's low-level InputSystem
|
|
remapping layer through typed player-settings commands.
|
|
- Done: replace the sector-map zone details panel with an Eve-owned UI
|
|
Toolkit surface. `SectorRenderer` still owns reveal/camera behavior, but
|
|
zone inspection no longer rebuilds `PropertiesPanel` rows when the player
|
|
clicks a zone.
|
|
- Done: replace the runtime in-game menu tab strip with an Eve-owned UI
|
|
Toolkit surface. `MenuPanel` now owns tab-content activation and tab
|
|
metadata directly; the old `MenuTabButton` component shell is gone.
|
|
- Done: replace inventory background ship tuning with an Eve-owned UI
|
|
Toolkit surface. `InventoryMenu` still owns click routing and the typed
|
|
daemon operation owns mutation, but the old
|
|
`PropertiesPanel.AddField("Shutdown Threshold", ...)` path no longer owns
|
|
that settings shell.
|
|
- Done: replace the trade target-cargo selector popup with an Eve-owned UI
|
|
Toolkit surface. `TradeMenu` still owns local target-cargo presentation
|
|
state, but the old `ContextMenu.AddOption(...)` popup path no longer owns
|
|
that selector shell.
|
|
- Done: replace the inventory entity/bay/loadout dropdown popup with an
|
|
Eve-owned UI Toolkit surface. `InventoryPanel` still owns local display
|
|
projection while daemon operations own entity/cargo selection plus loadout
|
|
restore/save effects, but the old `ContextMenu` dropdown tree no longer
|
|
owns that shell.
|
|
- Done: replace the remaining `TradeMenu` filter-selector and row-action
|
|
popups with Eve-owned UI Toolkit surfaces. `TradeMenu` still owns local
|
|
filter state and the quantity dialog delegates to typed daemon purchase
|
|
operations, but the old `ContextMenu` dropdown/option tree no longer
|
|
owns any live trade-menu shell.
|
|
- Done: replace `TradeMenu` typed-item inspection with an Eve-owned UI
|
|
Toolkit surface. The surface still projects typed catalog facts from local
|
|
trade rows, but spreadsheet row clicks no longer route through the old
|
|
`PropertiesPanel` shell.
|
|
- Done: replace `InventoryMenu` cargo-item inspection with an Eve-owned UI
|
|
Toolkit surface. Inventory still owns selected-cell highlighting, but
|
|
cargo clicks no longer route through `PropertiesPanel.Inspect`.
|
|
- Done: replace `InventoryMenu` equipped-item inspection with an Eve-owned
|
|
Toolkit surface. `InventoryMenu` now owns weapon-group toggles,
|
|
action-bar group binding, override shutdown, and thermotoggle controls
|
|
directly; the old live-control `PropertiesPanel` shell is gone from the
|
|
inventory path.
|
|
- Done: move the shared `org.gamecult.eve.surface` and
|
|
`org.gamecult.eve.unity-uitoolkit` packages into the Eve repo and retarget
|
|
Aetheria to import them from there instead of carrying local staged
|
|
copies.
|
|
- Done: delete the old IMGUI DB inspector; it is no longer a blocker on the
|
|
live UI migration path.
|
|
- Done: cut `ConfirmationDialog` loose from generic `PropertiesPanel`
|
|
inheritance. Runtime prompts still use local uGUI content prefabs for now,
|
|
but the dialog only owns prompt text and text/integer entry instead of
|
|
serializing the whole dead inspector field zoo.
|
|
- Done: delete the dead generic `PropertiesPanel` / `PropertiesList` /
|
|
`DropdownMenu` shell from live source plus serialized scene/prefab assets.
|
|
- Then replace runtime HUD/menu/inventory/map screens.
|
|
|
|
7. Purge
|
|
- Done: delete vendored RethinkDB.
|
|
- Done: delete root-level RethinkDB operator query notes; no old Rethink
|
|
runbook remains as a live operational surface.
|
|
- Done: delete JsonKnownTypes.
|
|
- Done: delete Newtonsoft dependencies and attributes from live code.
|
|
- Done: delete the unused Unity Localization package and imported localization
|
|
sample, removing the transitive Unity Newtonsoft package from the package
|
|
lock.
|
|
- Done: delete old JSON backing stores.
|
|
- Done: delete the broken `Economy.Shared` wrapper and tracked build output.
|
|
- Done: disable legacy local save, loadout, zone, player-settings, and
|
|
keyboard layout writers; delete the DB inspector and NameFile export
|
|
control instead of preserving warning-only editor surfaces.
|
|
- Done: delete the old `SavedGame`/`SavedZone` runtime save DTO and loader.
|
|
- Done: remove the stale Unity `SaveState`/`SaveZone` command names after
|
|
their bespoke serializers were deleted.
|
|
- Done: replace warning-only player settings, loadout, shutdown, and
|
|
wormhole save paths with typed Eve/daemon command records accepted by the
|
|
Verse daemon.
|
|
- Done: delete the `.cc.pending` runtime commit lane and its private raw
|
|
MessagePack array protocol; canonical writes now happen behind daemon
|
|
command acceptance.
|
|
- Done: extend run checkpoint commands to carry current-zone and entity
|
|
snapshots into canonical `AetheriaZoneState` and `AetheriaEntitySnapshot`
|
|
documents.
|
|
- Done: delete `Aetheria.State.DrainCommands`; bounded acceptance now uses
|
|
`Aetheria.State.Daemon --once` so the Verse daemon remains the only command owner.
|
|
- Done: move Eve request acceptance into `Aetheria.State.Daemon` startup and
|
|
daemon ticking.
|
|
- Done: publish Eve request acceptance health as typed CultCache state and an
|
|
Eve operations surface.
|
|
- Done: publish Eve command acceptance health as typed CultCache state and include
|
|
it in the operations surface.
|
|
- Done: move daemon Verse/service identity into typed
|
|
`aetheria.verse_host_settings.v1`, with provider advertisement and
|
|
operations telemetry deriving from that daemon-owned host document.
|
|
- Done: publish provider-owned player-settings controls as a typed Eve
|
|
surface and advertise their command boundary through the provider ad.
|
|
- Done: publish an Eve provider advertisement so Odin/Eve can discover
|
|
Aetheria surfaces and command boundaries through typed state.
|
|
- Done: make the daemon/provider advertisements derive from the shared
|
|
`AetheriaRuntimeEveSurfaceCatalog`, so Odin/Hermodr can index every known
|
|
Aetheria Eve panel instead of only the daemon game/editor surfaces.
|
|
- Done: stop legacy catalog pull/read paths from writing entries back to
|
|
their source backing store.
|
|
- Done: delete legacy catalog backing-store write/realtime APIs.
|
|
- Done: delete public legacy catalog cache mutation APIs.
|
|
- Done: delete the stale `StrategyGameManager.csbak` backup source and
|
|
unused Unity asset MessagePack formatters.
|
|
- Done: demote keyboard layout DTOs from MessagePack shapes, delete the
|
|
global scene-load MessagePack resolver hook, and remove the now-unused
|
|
Unity-side custom MessagePack resolver/formatter source.
|
|
- Done: demote `PlayerSettings` and nested settings from MessagePack shapes
|
|
after the legacy settings writer was disabled.
|
|
- Done: delete the process-global runtime catalog resolver from
|
|
`RuntimeCatalogLink<T>`; item instances now carry item-definition
|
|
identifiers and `ItemManager` owns hydration through the typed runtime
|
|
catalog reader.
|
|
- Done: collapse the old generic `RuntimeCatalogLink<T>` abstraction into
|
|
`RuntimeItemReference`, an item-specific runtime projection reference owned
|
|
by `ItemManager`.
|
|
- Done: demote `RuntimeItemReference.Value` to an item-definition id, then
|
|
delete `RuntimeItemReference.Projection`; item references no longer carry
|
|
hydrated `ItemData` DTOs.
|
|
- Done: add `ItemInstance.ItemId` as an intermediate runtime identity
|
|
surface and move live runtime/UI/catalog lookup call sites off
|
|
`.Data.ItemId`. The old `Data` field became compatibility backing state
|
|
before it was deleted.
|
|
- Done: add `ItemInstance.Reference` as the explicit item-reference API and
|
|
move factories/cargo stacking off direct `.Data` comparisons and
|
|
assignments.
|
|
- Done: rename `RuntimeItemReference` to
|
|
`RuntimeItemDefinitionReference` and delete the `ItemInstance.Data`
|
|
compatibility field; this was the intermediate reference shape before
|
|
typed item keys became the owner.
|
|
- Done: rename `RuntimeItemDefinitionReference` to
|
|
`AetheriaRuntimeItemReference` and make the reference typed-key-first.
|
|
`ItemInstance.ItemKey` is now the primary identity surface; `ItemId` is
|
|
derived legacy compatibility for unfinished cargo and simulation paths.
|
|
- Done: move `EquippedCargoBay.ItemsOfType`, consumable activation lookup,
|
|
action-bar consumable quantity/fill, item transfer lookup, and trade owned
|
|
counts from derived `Guid ItemId` keys to typed `ItemKey` strings.
|
|
- Done: move weapon ammo and `ItemUsage` config references from GUID fields
|
|
to typed item-key fields. The derived `AmmoType` and `Item` compatibility
|
|
properties have been deleted; runtime ammo consumption, item use, and HUD
|
|
ammo counts use `AmmoItemKey`/`ItemKey`.
|
|
- Done: make runtime commit item surfaces item-key-only through
|
|
`ItemKey`/`HullItemKey`; stale legacy-ID commit fields were deleted.
|
|
Loadout items, action-bar targets, body resources, entity hulls, cargo
|
|
contents, and active consumables now prove typed-key ownership in the
|
|
Unity smoke without any item legacy-ID commit fields.
|
|
- Done: add package runtime catalog lookup by canonical item key and move
|
|
Unity gameplay, HUD, inventory, trade, ship, and zone helper lookups off
|
|
`ItemId`/`FindItemByLegacyId` detours. The Unity runtime package catalog
|
|
snapshot no longer exposes item/corporation/name-file legacy-ID lookup;
|
|
legacy lookup remains only as a canonical `Aetheria.State`
|
|
catalog/migration inspection API.
|
|
- Done: move server-shared weapon grouping, generated loadout previous-item
|
|
reuse, and hauling task item target identity off derived item GUIDs and
|
|
onto typed `ItemKey` strings.
|
|
- Done: delete the shared runtime item catalog GUID index, `GetRuntimeItem(Guid)`
|
|
reader path, `ItemManager` item-ID fallback, and unused
|
|
`AetheriaRuntimeItemReference(Guid)` constructor. Runtime item lookup is
|
|
item-key-only outside explicit compatibility projection helpers.
|
|
- Done: delete the dead `ItemManager.GetRuntimeItemProjection<T>` bridge
|
|
after loadout generation stopped hydrating selected typed rows into
|
|
`EquippableItemData` merely to instantiate equipment.
|
|
- Done: rename the surviving runtime item read port from
|
|
`IRuntimeItemProjectionReader` to an item-key-only typed catalog lookup,
|
|
and rename behavior config methods to temporary behavior config construction so
|
|
old projection vocabulary no longer implies item DTO authority.
|
|
- Done: delete the temporary behavior-config reader path; the
|
|
runtime catalog lookup now exposes typed item rows only.
|
|
- Done: rename the temporary behavior construction DTO family from
|
|
`BehaviorData`/`*Data` to `RuntimeBehaviorConfig`/`*Config`; live
|
|
`Behavior` instances expose typed kind/group values while typed behavior
|
|
kind strings such as `Cockpit`, `TurretController`, and `Capacitor` remain
|
|
stable catalog facts rather than class-name-derived selectors.
|
|
- Done: remove the public `Behavior.Config` runtime API; stat modifiers ask
|
|
behavior instances for target performance stats instead of reflecting over
|
|
exposed construction config objects.
|
|
- Done: replace `ItemManager` behavior config reflection with an explicit
|
|
typed behavior-kind mapper.
|
|
- Done: remove runtime config retention from the remaining weapon family;
|
|
all behavior subclasses now copy constructor config inputs into explicit
|
|
runtime fields instead of keeping `RuntimeBehaviorConfig` subclass
|
|
instances alive as state.
|
|
- Done: delete the no-payload `CockpitConfig`, `HeatStorageConfig`,
|
|
`SwitchConfig`, `TriggerConfig`, and `TurretControllerConfig` classes.
|
|
`ItemManager` now constructs those behavior kinds directly from typed
|
|
runtime behavior definitions rather than routing them through the
|
|
temporary config bridge.
|
|
- Done: delete the simple field-bearing `HeatConfig`, `EnergyDrawConfig`,
|
|
`CooldownConfig`, `WearConfig`, `VisibilityConfig`, `ReflectorConfig`,
|
|
`VelocityLimitConfig`, `VelocityConversionConfig`, and `ItemUsageConfig`
|
|
classes. `RuntimeBehaviorDefinition` now owns the typed field reads for
|
|
those behavior kinds, and the live behaviors explicitly register their
|
|
performance stats for `StatModifier`.
|
|
- Done: delete `CapacitorConfig`, `ShieldConfig`, `MiningToolConfig`,
|
|
`ResourceScannerConfig`, `ThermotoggleConfig`, and `ThrusterConfig`.
|
|
`RuntimeBehaviorDefinition` reads their typed stats, scalar flags, and
|
|
prefab path directly, and live stat-bearing behavior instances explicitly
|
|
register the performance-stat names used by `StatModifier`.
|
|
- Done: delete `ReactorConfig`, `RadiatorConfig`, `SensorConfig`, and
|
|
`StatModifierConfig`. `RuntimeBehaviorDefinition` now reads their typed
|
|
stats, curves, enum, scalar, and stat-reference fields directly, and live
|
|
behavior instances explicitly expose the stat names used by
|
|
`StatModifier`.
|
|
- Done: delete `AetherDriveConfig`. `RuntimeBehaviorDefinition` now reads
|
|
rotor geometry, RPM/coupling/torque/energy/passive-coupling stats, torque
|
|
curve, audio parameters, and particle prefab path directly.
|
|
- Done: delete the weapon config hierarchy and the last
|
|
`RuntimeBehaviorConfig` bridge. Weapon-family behavior construction now
|
|
reads common stats, instant/constant/charged/lock fields, and guided
|
|
projectile profiles directly through `RuntimeBehaviorDefinition`;
|
|
`BehaviorPayloadReader`, `BuildBehaviorConfig`, and config reflection are
|
|
gone from live Unity source.
|
|
- Done: delete `LegacyPayloadKeyAttribute` from live Unity source after
|
|
importer constants and explicit typed mappers became the only migrated
|
|
field-key authorities.
|
|
- Done: quarantine the vendored Unity `MessagePack` assembly by disabling
|
|
asmdef auto-reference; only explicit state-spine assemblies should see it
|
|
while the Unity CultCache bridge still needs a low-level `.cc` codec.
|
|
- Done: demote `ZonePack`/`EntityPack` save-payload names to
|
|
construction blueprint vocabulary, and rename loadout collections away
|
|
from save-payload vocabulary. These are now explicitly construction
|
|
projections, not portable state authority.
|
|
- Done: continue the zone demotion by renaming `RuntimeZoneBlueprint` to
|
|
`ZoneConstructionBlueprint`; the old intermediate name no longer appears
|
|
in live Unity source.
|
|
- Done: rename the old `EntitySerializer` helper to
|
|
`EntityConstructionBlueprintProjector`; it captures/instantiates
|
|
construction blueprint projections and no longer presents itself as a
|
|
serializer or runtime-state owner.
|
|
- Done: delete the unused `Zone.AddOrbit(OrbitConstructionData)` construction-row
|
|
writer; zone orbit construction flows through `ZoneConstructionBlueprint`
|
|
only.
|
|
- Done: rename zone body/orbit construction DTOs to
|
|
`BodyConstructionData`/`OrbitConstructionData` and move `ZoneData.cs` to
|
|
`ZoneConstructionData.cs`; the construction blueprint now exposes
|
|
`Bodies` rather than a planet list that also contained belts, gas giants,
|
|
and suns.
|
|
- Done: demote Unity's live `PlayerSettings` runtime object to
|
|
`RuntimePlayerSettings`; `AetheriaPlayerSettings` remains the typed Verse
|
|
state document owner, while Unity only keeps a session projection and
|
|
sends typed player-settings commands.
|
|
- Done: route input-screen binding/action-bar edits through named typed
|
|
player-settings commands on the Unity runtime boundary, so the UI is
|
|
no longer a direct writer of input binding or action-bar collections.
|
|
- Done: route main-menu graphics settings returns through the same typed
|
|
player-settings command path as gameplay settings, so graphics edits
|
|
no longer survive only as session-local `RuntimePlayerSettings`.
|
|
- Done: route main-menu player name, gameplay formatting, and graphics
|
|
preference edits through typed Eve player-settings commands. MainMenu
|
|
reads the `RuntimePlayerSettings` projection for display, but no longer
|
|
assigns its player/gameplay/graphics fields directly.
|
|
- Done: lower the shared `aetheria.player_settings` Eve surface contract
|
|
directly inside `MainMenu` through UI Toolkit. The menu no longer owns a
|
|
second bespoke gameplay/graphics widget tree for those settings; it lowers
|
|
the shared document and dispatches command ids through typed Eve commands.
|
|
- Done: delete `ItemManager`'s unused zone dictionary, commented corporation
|
|
controller/galaxy-zone GUID caches, force-load GUID sketch, and dead time
|
|
property sketch. ItemManager no longer pretends to own a zone/time cache
|
|
while the runtime state spine owns durable state.
|
|
- Done: delete the redundant `AetheriaRuntimeItemCatalog`/`IRuntimeItemCatalogReader`
|
|
adapter layer. `ItemManager` now reads item rows straight from the shared
|
|
typed runtime catalog snapshot instead of rebuilding a duplicate lookup
|
|
cache over the same item-key index.
|
|
- Done: delete the dead runtime-projection reflection caches. `ReflectionExtensions`
|
|
now keeps only the live string-formatting helpers used by the surviving
|
|
typed UI surfaces; it no longer scans loaded assemblies or keeps static
|
|
type-cache dictionaries for the old inspector/projection path.
|
|
- Done: delete the dead inspector-specialization metadata. Unused
|
|
header/order/preferred-inspector attribute types and their stale
|
|
annotations are gone.
|
|
- Done: delete the generic `PropertiesPanel` reflection inspector fallback
|
|
and the last `Inspectable`/`EntityTypeRestriction` attribute cargo cult.
|
|
Live item inspection stays on the typed item/property paths; there is no
|
|
remaining runtime object walker generating UI from reflection metadata.
|
|
|
|
## Verification
|
|
|
|
- `rg "Newtonsoft|JsonObject|JsonProperty|JsonConvert|JsonKnownTypes|RethinkDb|RethinkTable|DatabaseCache"` is zero outside migration quarantine and docs.
|
|
- `rg "DatabaseEntry|DatabaseLink|InspectableDatabaseLink|ServerShared\\\\CultCache" Assets Economy.*` shows no live runtime ownership path.
|
|
- `AetheriaRuntimeEnergySimulation` owns the equipped capacitor/reactor/radiator
|
|
network. `AetheriaRuntimeThermalSimulation` owns catalog-derived cell topology,
|
|
equipment-local temperature/performance, shutdown, wear, conduction, and
|
|
radiation. The daemon orders radiator pumping before reactor settlement and
|
|
thermal conduction; client operations have no direct energy, heat, wear, or
|
|
equipment-online writer. Radiator pumping reports its exact chain result,
|
|
while emissive cooling remains the behavior's independent always-update path.
|
|
`AetheriaRuntimeThermalMedicalSimulation` derives
|
|
cockpit exposure, recovery, severe-risk crossings, and thermal death from the
|
|
cockpit's canonical cells; all death causes use the same destruction commit.
|
|
The Eve game surface publishes the resulting power, radiator, temperature,
|
|
wear, offline-equipment, cockpit, risk, render-weight, and typed death facts.
|
|
EveUnity now lowers the original severe heatstroke pulse and retained thermal
|
|
death chronology into a renderer-neutral native sink frame, including an
|
|
immediate settled result on reconnect rather than replaying stale death.
|
|
Aetheria deterministically translates the five broken legacy thermal/death
|
|
profiles into clean URP profiles and advertises those generated assets through
|
|
its CultMesh CDN catalog. EveUnity resolves arbitrary typed native assets by
|
|
semantic role, and the canonical client sink only binds profiles and applies
|
|
normalized weights. Legacy SSR/AO/roundness equivalents, rotated equipment
|
|
footprints, parent/child radiation, schematic composition, canonical
|
|
render-pipeline activation, and rendered capture remain migration work rather
|
|
than presentation authority.
|
|
- `dotnet list package --vulnerable --include-transitive` is clean for active
|
|
maintained projects.
|
|
- CultCache smoke proves write, flush, reopen, query, and typed reference
|
|
resolution, including full player settings as the `PlayerSettings.msgpack`
|
|
replacement, loadout templates as the `.loadout` replacement, and a run ->
|
|
zone -> entity snapshot graph as the `.zone` replacement. The zone smoke
|
|
includes orbit/body rows for generated celestial state, and the entity smoke
|
|
includes typed simulation stat grids, public entity session scalars, and
|
|
active consumable timer rows, plus typed behavior progress rows for
|
|
`IProgressBehavior` surfaces, typed weapon runtime rows, and typed
|
|
sensor/radiator/reactor/capacitor behavior state rows. The Unity runtime smoke also proves
|
|
package-owned readback of typed loadout templates from `.cc` records. It also
|
|
proves `aetheria.runtime_session.v1` is advertised and survives reopen as the
|
|
typed daemon-session signal.
|
|
- CultMesh smoke proves node start, typed put/get, subscription, flush, and
|
|
reopen.
|
|
- Eve surface smoke proves provider-owned surface documents are generated from
|
|
typed state and survive `.cc` store reopen before any renderer owns them.
|
|
- Quarantine import smoke proves old catalog file facts can be captured into
|
|
typed state without old readers remaining on the live runtime path.
|
|
- Migration smoke proves stable old catalog payload fields can be read once and
|
|
converted without old readers remaining on the live runtime path.
|
|
- Unity runtime catalog smoke proves read-only catalog consumers can open the
|
|
typed `.cc` store through both the SDK-style `Aetheria.State.Unity` opener and
|
|
the embedded package-owned read-only catalog opener, receiving the same
|
|
package-owned runtime catalog read models without a MessagePack catalog cache,
|
|
including typed item masks, interior masks, hardpoint definitions,
|
|
corporation/name-file links, typed behavior payloads, and dropped world
|
|
pickup rows in zone snapshots. It also proves the
|
|
embedded package can read provider-owned Eve surface documents from the same
|
|
CultCache store. The smoke proves legacy runtime snapshots can be
|
|
imported into canonical typed settings/run/zone/entity state and cleared
|
|
afterward, while renderer-emitted Eve commands stay typed command documents
|
|
outside that legacy import lane. The smoke now inspects pending mailbox bytes
|
|
directly and verifies each pending file is a CultCache store snapshot with a
|
|
schema catalog and exactly one typed record.
|
|
- Unity batchmode compile with Editor `6000.4.2f1` is currently available and
|
|
should be rerun after package/runtime C# edits; Unity may leave generated
|
|
package metadata and project files that must be cleaned before commit.
|
|
- Direct `dotnet build .\Assembly-CSharp.csproj --no-restore` is not currently
|
|
a valid gameplay compile substitute: the generated Unity project references a
|
|
missing root-level `GameCult.Aetheria.State.Unity.csproj` instead of the live
|
|
package/state project path, so it fails before reaching the gameplay rename
|
|
checks.
|
|
- Unity batchmode compile with Editor `6000.4.2f1` returned cleanly after the
|
|
runtime catalog resolver cut; `Logs/codex-unity-compile.log` has no compiler
|
|
error hits.
|
|
- `rg ".Data.Value|SetValue|GetCatalogEntry|IRuntimeItemCatalogReader|AetheriaRuntimeItemCatalog|BindRuntimeItemCatalog|ResolveRuntimeItemCatalog|private static IRuntimeItemCatalogReader"` in
|
|
`Assets/Scripts` is zero for the old item value/catalog-entry/resolver path.
|
|
- Live Unity source has no `RuntimeCatalogLink<T>` or `RuntimeCatalogLinkBase`;
|
|
item instances expose `ItemId` and `Reference`; the old `ItemInstance.Data`
|
|
identity field is deleted.
|
|
- Live Unity source has no `RuntimeCatalogEntry` or `RuntimeItemProjectionEntry`.
|
|
- Live Unity source has no `InspectableRuntimeCatalogLinkAttribute` or
|
|
`LegacyPayloadKeyAttribute`.
|
|
- Unity batchmode compile also returned cleanly after disabling `MessagePack`
|
|
auto-reference; `Assets/Scripts` and `Assets/Editor` have no `using
|
|
MessagePack`, `MessagePackSerializer`, `[MessagePackObject]`, or
|
|
`IMessagePackFormatter` hits.
|
|
- `Aetheria.State.Verify` now enforces the gameplay-source purity invariant:
|
|
live `Assets/Scripts` cannot contain MessagePack, Newtonsoft,
|
|
JsonKnownTypes, RethinkDB, old database-link symbols, or serializer metadata.
|
|
Package/import MessagePack usage remains explicitly bounded to CultCache
|
|
transport and migration.
|
|
- `Aetheria.State.Verify` also fences the Unity package serializer boundary:
|
|
MessagePack symbols may appear only in typed CultCache transport and document
|
|
shapes until CultLib generated serializers become the Unity runtime owner.
|
|
- `Aetheria.State.Verify` also guards runtime faction identity ownership:
|
|
construction blueprints cannot carry a legacy faction GUID, and runtime
|
|
entity/faction commits cannot rebuild `FactionKey` from `Faction.ID`.
|
|
- `Aetheria.State.Verify` guards galaxy faction relationships as typed-key-only:
|
|
no `Faction.Allegiance` GUID dictionary, GUID faction containment, GUID
|
|
faction resolver, or `CorporationLegacyId` relationship read may return to
|
|
the live `Galaxy`/`LoadoutGenerator` path.
|
|
- `Aetheria.State.Verify` guards Unity runtime catalog lookup authority:
|
|
package snapshots may expose typed-key lookup only, and runtime
|
|
item/corporation/name-file DTOs may not publish legacy relationship fields;
|
|
legacy-ID lookup remains quarantined in canonical migration/catalog
|
|
inspection APIs.
|
|
- `Aetheria.State.Verify` guards behavior body reference naming:
|
|
resource-scanner and mining-tool runtime state surfaces use `BodyKey` fields;
|
|
old `*BodyId` readback names and generic legacy reference parsers may not
|
|
return. `Zone`, `Planet`, `AsteroidBelt`, and `Orbit` now own the runtime
|
|
body/orbit key surfaces consumed by `ActionGameManager` projection, so local
|
|
body/orbit key formatters may not return there either.
|
|
- `Aetheria.State.Verify` guards orbit-targeting agent runtime naming:
|
|
patrol/tow task orbit references and move-state orbit targets use `OrbitKey`
|
|
fields, and `Zone` owns orbit-key parsing/resolution instead of agent-local
|
|
raw GUID targets.
|
|
- `Aetheria.State.Verify` guards temporary `Faction` shell links: geoname and
|
|
boss-hull relationships use typed keys, not legacy GUID projection fields.
|
|
- `Aetheria.State.Verify` guards temporary `Faction` identity: equality,
|
|
hashing, ordering, narrative checks, sector filtering/rendering, and zone
|
|
security checks must use `FactionKey`; the legacy `Faction.ID` projection
|
|
field may not return.
|
|
- Unity batchmode compile returned cleanly after the runtime blueprint rename;
|
|
live Unity source has no `EntityPack`, `ShipPack`, `OrbitalEntityPack`,
|
|
`ZonePack`, `PackedContents`, `PackZone`, `EntitySerializer.Pack`, or
|
|
`EntitySerializer.Unpack` hits.
|
|
- Entity construction blueprint projection no longer uses the `EntitySerializer`
|
|
or runtime-state authority names; live Unity source calls
|
|
`EntityConstructionBlueprintProjector`.
|
|
- Vendored Unity `MessagePack` remains a low-level codec boundary only; its
|
|
typeless contractless resolver now follows the same `NET_STANDARD_2_0`
|
|
dynamic-resolver guards as `StandardResolver`, so Unity batchmode cannot
|
|
resurrect unsupported typeless dynamic code while compiling the quarantined
|
|
assembly.
|
|
- Vendored Unity `MSAGL` debug timing remains diagnostic-only; `TimeMeasurer`
|
|
now requires the same `REPORTING` symbol that defines
|
|
`Microsoft.Msagl.DebugHelpers.Timer`, so `TEST_MSAGL` cannot accidentally
|
|
summon a missing debug dependency during Unity compilation.
|
|
- Unity runtime settings projection is now `RuntimePlayerSettings`; live Unity
|
|
source has no standalone `PlayerSettings` class/property/method symbols.
|
|
- Input binding and action-bar edits now send the same typed player-settings
|
|
command path as menu settings changes; the old `SaveLayout` runtime-only
|
|
warning is gone. The generated `AetheriaInput` class still calls Unity's
|
|
`InputActionAsset.FromJson`, but that JSON belongs to Unity's generated input
|
|
action lowering under Aetheria's remapping system. It is not durable Aetheria
|
|
state and does not own remapping authority.
|
|
- Action-bar slot binding drag/drop now queues its own `action-bar-binding`
|
|
typed run checkpoint immediately, and typed continue-run restore rebuilds slot
|
|
bindings onto the live current entity instead of leaving stale `ActionBarBinding`
|
|
instances pointed at the previous entity body.
|
|
- Main-menu settings navigation, input, and audio pages now lower through a
|
|
shared UI Toolkit `UIDocument` host and local Eve surface documents instead
|
|
of rebuilding those pages through `PropertiesPanel.AddButton(...)` calls.
|
|
- Sector-map zone inspection now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document instead of rebuilding
|
|
`PropertiesPanel.AddProperty(...)` rows on each zone click.
|
|
- Runtime in-game menu tab navigation now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document, with `MenuPanel`
|
|
owning tab metadata directly instead of `MenuTabButton` components.
|
|
- Inventory background ship tuning now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document instead of rebuilding a
|
|
mutable `PropertiesPanel.AddField(...)` control for shutdown threshold.
|
|
- Trade target-cargo selection now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document instead of rebuilding a
|
|
`ContextMenu.AddOption(...)` popup for docking-bay and ship-bay choices.
|
|
- Inventory entity/bay/loadout dropdown navigation now lowers through a shared
|
|
UI Toolkit `UIDocument` host and a local Eve surface document instead of
|
|
rebuilding nested `ContextMenu.AddDropdown(...)` and `ContextMenu.AddOption(...)`
|
|
menus.
|
|
- The dead `ContextMenu` popup shell, its prefab assets, and orphan
|
|
scene/prefab references are deleted outright; `InventoryPanel`,
|
|
`ActionGameManager`, `TradeMenu`, and `SectorRenderer` no longer keep
|
|
serialized hooks into dead popup or properties-panel shells.
|
|
- Trade filter selection and simple-commodity buy-quantity entry now lower
|
|
through shared UI Toolkit `UIDocument` hosts and local Eve surface documents
|
|
instead of rebuilding `ContextMenu.AddDropdown(...)`, `ContextMenu.AddOption(...)`,
|
|
and `ContextMenu.Show()` shells in `TradeMenu`.
|
|
- Trade typed-item inspection now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document instead of routing
|
|
spreadsheet row clicks into `PropertiesPanel.Inspect(...)`.
|
|
- Inventory cargo-item inspection now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document instead of routing cargo
|
|
clicks into `PropertiesPanel.Inspect(...)`.
|
|
- Inventory equipped-item inspection now lowers through a shared UI Toolkit
|
|
`UIDocument` host and a local Eve surface document, with `InventoryMenu`
|
|
owning weapon-group toggles, action-bar group binding, override shutdown,
|
|
and thermotoggle controls directly instead of `PropertiesPanel.Inspect(...)`.
|
|
- Keyboard display layout parsing is no longer JSON-backed:
|
|
the runtime input screen builds its action-bar candidates and rebinding UI
|
|
from typed input paths, and `InputLayout` remains the typed ANSI-104 keyboard
|
|
geometry helper instead of a JSON text asset. The dead commented Ink `ToJson`
|
|
write path and checked-in `ansi104.json` display file have been removed from
|
|
live source.
|
|
- `Aetheria.State.Smoke` proves the provider-owned Eve command bridge accepts
|
|
`gamecult.eve.command.v1` envelopes, accepts advertised refresh commands plus
|
|
player-settings mutation commands, rejects unknown commands, persists
|
|
`AetheriaEveCommandAcceptanceStatus`, and exposes Eve command acceptance through the
|
|
operations surface while preserving the `aetheria.player_settings` surface.
|
|
- Unity play smoke proves runtime UI reads from Eve surfaces and sends commands
|
|
through the shared state service.
|
|
- UI Toolkit lowering parity compares Aetheria surfaces against the Eve browser
|
|
renderer for component tree, state bindings, command envelopes, disabled/stale
|
|
states, and visible error surfaces.
|
|
|
|
## Immediate Cut Line
|
|
|
|
Do not add behavior to `ItemData` or resurrect `RuntimeItemProjectionEntry`.
|
|
The typed state spine, direct behavior factories, and migration quarantine
|
|
exist; the next cuts should remove remaining live predicates that still need
|
|
legacy DTO vocabulary, keep package-level MessagePack/JSON at explicit
|
|
boundaries, and replace runtime/operator UI truth with Eve surfaces. The old
|
|
Do not restore the deleted generic `PropertiesPanel` reflection inspector as a
|
|
shortcut around typed command/state ownership. Runtime simulation
|
|
tuning controls may remain temporarily on uGUI only when they delegate to typed
|
|
daemon operations; direct UI mutation of entity/item/behavior settings is
|
|
obsolete authority. Hull conductivity changes follow the same rule: UI requests
|
|
the toggle, and the daemon owns the grid mutation and checkpoint. Entity renames
|
|
follow the same rule: UI collects text, and the daemon owns the name mutation
|
|
and checkpoint. Weapon group assignment follows the same rule: UI requests
|
|
membership, and the daemon owns the group mutation and checkpoint. Inventory
|
|
double-click transfer follows the same
|
|
rule, and drag/drop placement now shares that commit family: UI requests
|
|
cargo/equipment movement, and the daemon owns the move and checkpoint. Target
|
|
selection is likewise daemon policy:
|
|
generic Eve supplies source and target identities or a view direction, while
|
|
the daemon filters authoritative visible contacts and owns the selected index.
|
|
The cycle order deliberately preserves the executable fossil rather than the
|
|
input labels: `Target Nearest` used `MaxBy(distance)`, stable contact order
|
|
breaks ties, and previous-from-no-selection uses the original array arithmetic.
|
|
EveUnity's explicit `{sourceEntityId, targetEntityId}` request now retains both
|
|
identities through translation; an unseen target commits `target-not-visible`
|
|
and reaches Eve as a denied receipt without changing the previous selection.
|
|
Trade purchases follow the same rule: UI requests only item, quantity, stock slot,
|
|
and destination bay. The daemon derives the dock parent, current catalog price,
|
|
product kind, capacity, hull-vs-cargo result, credit changes, cargo transfer,
|
|
ship creation, and checkpoint. Historical price, station, target, purchase-kind,
|
|
and `CreatesDockedShip` fields remain serialization tombstones only; live clients
|
|
do not write them and daemon operations do not read them. The daemon's ordered
|
|
command reducer is also the sole contested-stock serialization point. Each
|
|
purchase reads the stock left by the preceding command in that frame, so two
|
|
clients requesting the final stack produce one atomic debit/delivery and one
|
|
typed `trade-stock-unavailable` rejection. World state and both committed
|
|
command facts survive a hard CultCache close/reopen; generic Eve reconstructs
|
|
the reconciled and denied receipts without owning economy logic. Commodity
|
|
delivery shares the inventory owner's cloned spatial transaction: existing
|
|
compatible stacks fill first, remaining quantity splits at the catalog maximum,
|
|
and each new stack claims the first fitting authored bay cells before stock,
|
|
cargo, or credits commit. The old volume-only capacity proxy is no longer a
|
|
trade writer. The fossil had no durable quote object or expiry transition; it
|
|
displayed current value and bought immediately, so purchase execution derives
|
|
the current authoritative value instead of adding a counterfeit quote owner.
|
|
Runtime loadout
|
|
restore follows the same rule: UI requests restoration, and the daemon owns
|
|
instantiation, credits, dock assignment, current entity, and checkpoint. Docked
|
|
current-ship selection follows the same rule: UI requests selection, and the
|
|
daemon owns `CurrentEntity`, `DockingBay.DockedShip`, and checkpoint. Undocking
|
|
preserves the fossil ship pose, velocity, and direction when the detached ship
|
|
re-enters world physics. Loot pickup is proximity-gated: the tractor applies
|
|
force to loose bodies through Ymir, then the daemon compares canonical XZ
|
|
positions and owns capacity validation, cargo storage or rejection bounce,
|
|
pickup removal, feedback, and checkpoint. Ymir contacts, targeting, client
|
|
commands, and presentation collisions cannot decide inventory ownership. The
|
|
portable Eve entity SoA publishes
|
|
`inventory.cargo.quantity`, allowing generic clients and witnesses to observe
|
|
the committed cargo delta without reading Aetheria internals. Entity destruction follows
|
|
the same rule: instance code observes death, and the daemon owns drop
|
|
decisions, zone removal, and checkpoint. Dropped world pickups are typed
|
|
zone-snapshot state, not only
|
|
renderer-local objects; live lowering consumes the exact typed zone record key
|
|
instead of rehydrating a parallel presentation list. Any
|
|
predicate that still needs legacy DTO objects must earn that dependency by
|
|
using behavior objects or simulation-only methods that typed facets do not yet
|
|
expose.
|
|
|
|
The released-package proof keeps two lifecycle claims separate. The
|
|
`cold-start-lowering` profile begins with an empty cache, receives and verifies
|
|
the 56,168,017-byte provider body through `cultmesh.content.v1`, promotes the
|
|
exact hash with no partial, negotiates `SharedFileMapping` over the exact
|
|
transfer-owned file, and proves generic world, field-volume, movement,
|
|
environment, and pilot/map camera lowering. The `full-session-gameplay` profile
|
|
starts a fresh warm daemon session, begins with no pickup, destroys the
|
|
deterministic salvage target, observes its canonical cargo drop, and collects
|
|
it exactly once from a persisted Ymir Begin fact. Witness runners use the
|
|
daemon's native 20 ms wall interval for its 20 ms simulation delta; download
|
|
latency is not allowed to redefine transient world lifetime. Managed network
|
|
delivery and verified local file mapping are proven. Provider-to-client network
|
|
zero-copy, shared-memory delivery, and GPU zero-copy remain CultMesh/runtime
|
|
work. The fog contract and provider shader execute. Terminus
|
|
now publishes its blue fog tint from the daemon-owned sun visual rather than an
|
|
unrelated brown calibration; the generic runtime applies the same field ABI.
|
|
The warm witness records `225,293` changed pilot pixels, average luminance
|
|
`0.11927`, 241 volume composites, intact pilot/map isolation, and the same
|
|
authoritative destruction-loot path. The current volume still reads as a broad
|
|
blue shelf against sparse world geometry, so patch readability, gravity-wave
|
|
readability, surrounding geometry, and final luminance/composition remain open
|
|
visual parity work.
|
|
|
|
Generated loadouts accept no scenario-authored cargo strings. Catalog selection
|
|
is the only loadout item-key owner: ordinary ships begin without generated
|
|
cargo, stations draw typed faction-available inventory, and both cargo slots and
|
|
selection receipts carry the same canonical catalog keys. Scenario flavor may
|
|
later select a typed loot table or authored item key, but it cannot silently
|
|
invent identity. `scripts/verify-aetheria-daemon.ps1` restores and runs the
|
|
daemon smoke with one explicit CultLib/EveUnity/Ymir root set so a stale NuGet
|
|
project graph cannot substitute another worktree during `--no-restore`.
|
|
The unused Starbridge bootstrap that wrote invented stock, attacker, boss, and
|
|
technology keys has been deleted. A future Starbridge mode must enter through
|
|
the active daemon game-mode owner and typed catalogs; a dormant document seeder
|
|
is not a game mode.
|
|
|
|
Run-lifecycle ownership is deliberately narrower than a quest system:
|
|
|
|
- Owner: the daemon run checkpoint owns whether the run is `active` or
|
|
terminal. The fossil supplied a failure transition on destruction of the
|
|
controlled entity; it did not supply a victory transition.
|
|
- Inputs: the controlled entity key and the daemon's committed destruction
|
|
transaction, including its cause and frame.
|
|
- Outputs: lifecycle phase, terminal reason, terminal frame, one durable
|
|
`run.failed` fact, command rejection, and a frozen world after the lethal
|
|
frame.
|
|
- Derived state: docked, travelling, fighting, mining, looting, and refitting
|
|
remain projections of authoritative world facts. They are not durable run
|
|
phases and cannot advance the lifecycle.
|
|
- Forbidden writers: Unity death callbacks, Eve surfaces, command payloads,
|
|
health documents, and menu navigation cannot end, revive, or complete a run.
|
|
- Shared paths: every lethal hull, cockpit, heatstroke, and hypothermia path
|
|
must pass through the same daemon destruction commit. New Game replaces the
|
|
run through the existing daemon session bootstrap; Continue reads the latest
|
|
checkpoint.
|
|
- Cut line: clearing `CurrentEntityKey` is no longer the implicit lifecycle
|
|
decision. It remains the controlled-entity consequence of the explicit
|
|
failure commit.
|
|
- Verification layer: daemon smoke kills the controlled entity, serializes the
|
|
terminal checkpoint, restarts it, proves later commands are rejected and
|
|
simulation is frozen, and inspects the Eve surface state bindings. Completion
|
|
remains unimplemented until a source-backed game-mode rule owns it.
|
|
|
|
Docking ownership follows the fossil's entity and `ActionGameManager` path:
|
|
|
|
- Owner: daemon docking operations own bay selection, parentage, the
|
|
dock/undock acceptance decision, and the disarm transition into docked state;
|
|
daemon combat derives its participant set by subtracting docked child
|
|
identities.
|
|
- Inputs: zone entity order, the 25-unit interaction radius, real docking-bay
|
|
slots and assignments, occupied-bay cargo, installed Cockpit,
|
|
Thruster-or-AetherDrive, and Reactor behaviors, and the ship's preserved
|
|
authoritative pose, velocity, and direction. Ymir retains entity bodies for
|
|
fields and spatial queries, but ship/station bodies share a non-colliding
|
|
group because the fossil had no rigidbody entity collision response; pickup
|
|
bodies remain independently collidable with ships.
|
|
- Outputs: exact parent/assignment mutation, cleared held-group and transient
|
|
weapon state on dock, a world-combat participant set containing neither
|
|
docked attackers nor docked targets, docking intent, one retained
|
|
`ship.docked` or `ship.undocked` fact carrying actor, parent, bay, frame and
|
|
position, and an authoritative rejection reason carried by the command fact
|
|
and Eve receipt.
|
|
- Derived state: camera target, subject visibility, movement suppression, menu
|
|
copy, audio, and effects derive from dock parentage plus retained feedback
|
|
chronology. They do not decide whether docking happened.
|
|
- Forbidden writers: Unity `TryDock`/`TryUndock`, camera transitions, client
|
|
proximity, command-supplied failure text, and renderer-local component checks
|
|
cannot mutate or explain docking truth. Stale input state, forged fire
|
|
intents, and installed turret controllers cannot make a docked child a combat
|
|
participant.
|
|
- Shared paths: explicit Dock, DockNearest, contextual Interact, autonomous
|
|
homecoming, reconnect, and purchased docked ships use the same assignment
|
|
representation; explicit Undock and contextual Interact use the same
|
|
prerequisite transaction.
|
|
- Cut line: the daemon may not append a synthetic docking slot, select the
|
|
geometrically nearest ineligible entity, move a ship 72 units, zero its
|
|
velocity, overwrite its direction during undock, or let invented generic
|
|
circle radii make the authored center-distance rule unreachable.
|
|
- Verification layer: operation tests cover every ordered rejection, bay cargo,
|
|
first-eligible selection, weapon disarm, docked fire-command rejection,
|
|
preserved pose/velocity/direction, exact receipt reason, exactly one accepted
|
|
transition fact, no false event on rejected undock, Eve feedback projection,
|
|
entity pass-through during home approach, and retained pickup motion followed
|
|
by daemon proximity collection. A production-Ymir smoke advances an overlapping ship/station
|
|
pair, proves the negative collision group leaves the ship at the authored
|
|
24-unit pose, and then accepts docking through the ordinary daemon command.
|
|
Simulation smoke also proves both docked attacker and docked target
|
|
subtraction despite stale state and a forged pulse; the live witness remains
|
|
responsible for camera/effect timing.
|
|
|
|
Unity spatial projection is a one-way boundary:
|
|
|
|
- Owner: daemon/Ymir generations own entity pose; the generic EveUnity scene
|
|
sink owns only the current native presentation objects.
|
|
- Inputs: immutable `EveUnityPresentedEntityGeneration` values containing
|
|
provider-authored identity, pose, velocity, scale, render group, and asset ref.
|
|
- Outputs: Unity transforms and a read-only presented-entity registry for
|
|
cameras, attachments, effects, and inspection.
|
|
- Forbidden writers: the scene sink and presented-entity registry may not know
|
|
`EveSurfaceCommandRequest`, `IEveUnitySurfaceCommandTransport`, or the
|
|
CultMesh playable-world provider. Local transform changes cannot become
|
|
daemon commands or provider state.
|
|
- Verification layer: the released-package client gate inspects the resolved
|
|
EveUnity sources for the immutable generation/sink boundary and rejects any
|
|
provider or command-transport dependency; it separately rejects Aetheria and
|
|
ServerShared gameplay assemblies from the canonical Unity product.
|
|
|
|
Docked refit ownership follows the fossil's `Entity.ItemFits`, `TryEquip`, and
|
|
`TryUnequip` transaction:
|
|
|
|
- Owner: one daemon refit transaction owns source selection, destination fit,
|
|
category routing, and the atomic equipment/cargo mutation.
|
|
- Inputs: authoritative docking parentage, typed hull interior and hardpoint
|
|
geometry, typed item footprint/category/hardpoint type, current ordinary
|
|
equipment, cargo bays, docking bays and their contents, the exact source item
|
|
instance, and the requested destination cell.
|
|
- Outputs: either one committed move preserving the item instance fields and
|
|
updating the category-owned collection, or one exact rejection reason that
|
|
reaches the command fact and Eve receipt.
|
|
- Derived state: drag previews, valid-cell highlights, filters, sounds, and
|
|
animations are presentation. They may predict the daemon decision but cannot
|
|
commit it.
|
|
- Forbidden writers: Unity occupancy checks, renderer inventory graphs,
|
|
client-supplied acceptance/rejection reasons, and remove-first mutation paths
|
|
cannot decide or repair a refit.
|
|
- Shared paths: cargo-to-cargo transfer, cargo-to-equipment equip, equipment
|
|
reposition, equipment-to-cargo store, reconnect, and loadout restore use the
|
|
same typed collection and placement semantics where their contracts overlap.
|
|
- Cut line: generated cargo and docking bays no longer masquerade as ordinary
|
|
equipment; unconditional destination appends and source removal before
|
|
destination validation are removed from refit and cargo-transfer operations.
|
|
- Verification layer: daemon smokes compare source and destination state before
|
|
and after rejection, cover hardpoint type/shape/rotation, interior occupancy,
|
|
deployed-state rejection, nonempty bay rejection, category routing, exact
|
|
receipts, and aligned typed bay collections. Reconnect remains a live proof
|
|
obligation.
|
|
|
|
The docked pilot surface is the provider-owned control projection for that
|
|
transaction. While the current ship has an authoritative docking parent, the
|
|
daemon publishes `inventory.grid` and `inventory.item` nodes for the ship
|
|
equipment, each ship cargo bay, and each station cargo bay. Those nodes carry
|
|
authored grid dimensions, item footprints, source/target identities, and
|
|
`TransferCargoItem`, `EquipItem`, or `StoreItem` drop commands. Generic Eve
|
|
lowerers own only transient pointer/keyboard drag state and visual prediction.
|
|
The old request-local Unity inventory panel is no longer advertised as a
|
|
player surface, and cannot become a second refit authority. Cargo transfers
|
|
also require the command actor to own one endpoint and reach the other through
|
|
docking parentage or physical interaction range, preserving autonomous haul
|
|
tasks without permitting remote arbitrary inventory mutation.
|
|
|
|
Ymir restart ownership is deliberately private and asymmetric:
|
|
|
|
- Owner: `AetheriaYmirPersistenceCoordinator` owns reconstruction durability;
|
|
the public daemon frame still owns committed gameplay time.
|
|
- Inputs: an immutable completed-tick Ymir capture, the prior durable journal
|
|
cursor, and the exact public `(RunId, FrameId, ZoneIndex)` boundary.
|
|
- Outputs: checksummed immutable journal chunks and immutable bounded resume
|
|
records in `<state>.ymir.cc`.
|
|
- Derived state: native Box3D worlds and handles are reconstructed process
|
|
state. Resume records are recovery inputs, not client world truth.
|
|
- Forbidden writers: the public Aetheria CultCache, CultMesh subscriptions,
|
|
Eve surfaces, Unity, and broad public snapshots cannot store, enumerate, or
|
|
select private replay history.
|
|
- Shared path: first publication and periodic publication both capture before a
|
|
later simulation tick, flush private chunks, flush private resumes, publish
|
|
and hard-flush the public frame, then activate fail-closed restart.
|
|
- Cut line: the rejected design that embedded complete Ymir checkpoints in
|
|
every public zone/frame is absent; no public persistence document types are
|
|
registered.
|
|
- Verification layer: daemon smoke collects a live pickup, persists the public
|
|
frame and private Ymir state, restores both into fresh sessions, and proves
|
|
the next tick cannot resurrect the pickup or duplicate cargo or feedback. Ymir unit
|
|
tests prove incremental suffix capture, exact chunk coverage, checksums, and
|
|
replay verifier convergence.
|