4.4 KiB
simulationworld-runtime-convergence
Purpose
Define the battle runtime contract that SimulationWorld is the single authoritative simulation path for movement, projectile stepping, collision/query execution, and presentation-driven output consumption.
Requirements
Requirement: SimulationWorld SHALL be the sole battle simulation executor
The battle runtime MUST execute movement, projectile stepping, collision broad-phase, and related simulation state updates through SimulationWorld, and it MUST NOT route these responsibilities through an alternative non-SimulationWorld runtime path or expose compatibility switches that imply such a runtime path still exists.
Scenario: Battle tick advances through SimulationWorld
- WHEN the battle update loop advances a gameplay frame
- THEN
SimulationWorldexecutes the simulation pipeline for that frame as the authoritative runtime update path
Scenario: Legacy routing switch does not select an alternate executor
- WHEN runtime configuration related to simulation movement is evaluated
- THEN it does not select or re-enable a separate legacy movement execution path
Scenario: Runtime API does not expose legacy movement enablement shims
- WHEN gameplay runtime code integrates with movement simulation
- THEN it does not depend on compatibility members whose purpose is to report whether
SimulationWorldmovement is enabled
Requirement: Runtime entities SHALL submit input and consume simulation output only
Enemy entities, the player entity, projectile entities, and MovementComponent MUST submit movement or behavior input into SimulationWorld state and MUST consume position, facing, hit, or lifecycle results from simulation output, rather than computing world-space advancement independently.
Scenario: MovementComponent no longer advances transforms directly
- WHEN movement input, speed, or separation parameters change on an entity
- THEN the component synchronizes those values to
SimulationWorldstate without directly moving the entity transform
Scenario: Entity presentation follows simulation output
- WHEN simulation state is committed for enemies or projectiles
- THEN entity presentation updates consume the committed output to refresh transforms, facing, visibility, or removal state
Requirement: Spatial queries SHALL use SimulationWorld-owned data and services
Target selection, projectile hits, area hits, and sector hits MUST use SimulationWorld spatial indexing and query services, and MUST NOT fall back to legacy entity-side traversal or solver-specific query paths.
Scenario: Target selection uses simulation spatial data
- WHEN weapon or AI logic requests nearby or nearest targets
- THEN the query resolves against
SimulationWorldmaintained spatial data for the current frame
Scenario: Projectile and area hit evaluation stay on simulation path
- WHEN projectile, area, or sector hit logic runs during combat
- THEN hit candidates are produced from
SimulationWorldcollision and query capabilities instead of a fallback entity-side path
Requirement: Runtime surfaces SHALL reflect the single-path architecture
Runtime debug surfaces, automated tests, architecture documents, and compatibility-facing runtime APIs MUST reflect that the project supports one authoritative SimulationWorld execution path rather than dual-path behavior, and MUST NOT preserve legacy solver provider abstractions that imply an alternate runtime separation path is still supported.
Scenario: Debug panel omits legacy solver controls
- WHEN runtime simulation debugging is displayed
- THEN it shows current
SimulationWorldmetrics without exposing legacy solver switching or dual-path controls
Scenario: Regression tests validate observable single-path behavior
- WHEN simulation regression coverage is maintained
- THEN tests validate observable outcomes such as movement, projectile lifetime, hit results, and hide/remove lifecycle instead of asserting private compatibility fields for legacy paths
Scenario: Runtime codebase omits legacy solver provider abstractions
- WHEN enemy separation behavior is implemented or documented
- THEN it is described as
SimulationWorld-owned runtime behavior without referencingEnemySeparationSolverProvider,IEnemySeparationSolver, or equivalent legacy provider abstractions