true while events are presenting or waiting behind the current one; input belongs to the animation
Abandons every event not yet presented, current one included, and any scheduled follow-ups. The simulation's committed state is untouched: cancellation stops the presentation, not the turn.
saves the simulation state; the queue is deliberately not part of a save
Runs command, enqueues its events, and returns the outcome - or null when locked, so
a command issued mid-animation is refused rather than committed ahead of the show.
advances the current animation and starts whatever follows it
StaticrestoreRebuilds a runtime from snapshot and wraps it in a fresh, idle presentation, so a
loaded run does not replay the animation that was interrupted.
The documented integration between a turn-based simulation and its presentation, over the two pieces that already exist (
simulation.SimulationRuntimeandcore.PresentationQueue) rather than a third kind of thing. It fixes the five interactions that are easy to get subtly wrong when a game wires them by hand:submitdispatches through the runtime and hands the returned events to the queue, in one call, so the state commit and the animation are never started from two places that can drift apart.lockedis the queue's ownisBusy, andsubmitrefuses while it is true - a click during an attack cannot commit a second attack on top of the first.followUpreturns the commands that follow an outcome, and they are dispatched only once the batch before them has finished presenting, so the counter-attack animation starts after the attack animation, not underneath it.canceldrops everything not yet played. The simulation state is not rolled back, because the commands it already committed did happen; cancelling stops the show, it does not undo the turn.snapshotsaves the simulation only, deliberately not the queue. A restored run comes back idle, so loading mid-animation skips the rest of that batch instead of replaying it on top of the loaded state.Example