2.9 KiB
Ymir Architecture
Objective
Own physics for Aetheria outside Unity so projectiles, fields, bodies, and contacts share one simulation truth across game runtime, server logic, tools, and future Verse surfaces.
Current Mechanism
The MVP has one pure core and one daemon:
Ymir.Corereceives aYmirSoAWorldand a fixeddeltaTime.- Compatibility callers may still submit a
YmirWorld, but it is immediately lowered into SoA buffers before simulation. - The core computes radial field acceleration with CultMath
BatchMath, uses vectorized semi-implicit Euler integration over SoA arrays, tests circle overlaps, resolves simple collision response, and emits contact events. ymir-daemonpublishes provider/operator state and exposes the core through a small HTTP compatibility surface.YmirWorldStateDocumentpersists the same SoA world asgamecult.ymir.world_state.v0through CultCache MessagePack.
Owner
Ymir owns the decision: given world state plus a time step, what is the next physics state and which contacts occurred.
Inputs
- SoA body columns: id, position x/y, velocity x/y, radius, mass, dynamic mask, restitution
- SoA radial field columns: id, position x/y, strength, radius
- fixed
deltaTime
Outputs
- next world time
- next body positions and velocities
- contact events with body ids, point, normal, penetration, and relative speed
Derived State
YmirWorldDTO records are compatibility views overYmirSoAWorld.- HTTP health, provider advertisement, operator state, and Eve surface are derived compatibility views.
- Unity GameObjects are derived render/adapter state.
- Damage events in Aetheria should become derived from Ymir contacts plus Aetheria gameplay policy.
Forbidden Writers
- Unity
OnCollisionEnterand collider callbacks must stop deciding projectile hit truth once a cutover path exists. - Renderer transforms must not push hidden physics corrections back into Ymir.
- HTTP compatibility witnesses must not become durable state owners.
Shared Paths
Direct user actions, weapon firing, programmatic spawns, reloads, server ticks, and replay/import paths should all create or modify Ymir world state through the same command/step primitive. Manual Unity interaction may author inputs; it does not become a second simulation.
Cut Line
The old Aetheria projectile GameObject/collider path is demoted first to a renderer and diagnostic witness. New damage or hit policy must consume Ymir contact events. Only after that path is proven should Unity collider callbacks be deleted.
Verification Layer
- Unit tests prove core integration, gravity field acceleration, deterministic ordering, and contact generation.
- CLI smoke proves the daemon can execute a step without booting Unity.
- Aetheria cutover needs a Unity-side timeline probe that compares visible projectile positions and hit events against Ymir snapshots during travel, not only after impact.