refactor(runtime): own canonical action state

Move selection, combat, and interaction target mode under one Runtime owner; make plugins, retained UI, session routing, and typed runtime views borrow its exact children; and add failure-safe reset, instance isolation, source ownership, and normalized checkpoint coverage without changing retail ordering.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-26 10:44:09 +02:00
parent bb45afef33
commit b298f99f91
38 changed files with 711 additions and 93 deletions

View file

@ -48,7 +48,7 @@ internal sealed record SessionPlayerDependencies(
PhysicsDataCache PhysicsDataCache,
WorldGameState WorldGameState,
WorldEvents WorldEvents,
SelectionState Selection,
RuntimeActionState Actions,
RuntimeEntityObjectLifetime EntityObjects,
EntityClassificationCache ClassificationCache,
LiveEntityRuntimeSlot RuntimeSlot,
@ -80,7 +80,6 @@ internal sealed record SessionPlayerDependencies(
UpdateFrameClock UpdateClock,
MovementTruthDiagnosticController MovementDiagnostics,
CombatAttackOperationsSlot CombatAttackOperations,
CombatState Combat,
CombatFeedbackSlot CombatFeedback,
RuntimeCommunicationState Communication,
RuntimeCharacterState Character,
@ -326,7 +325,7 @@ internal sealed class SessionPlayerCompositionPhase
d.DatLock);
var worldQuiescence = new WorldGenerationQuiescence(
live.WorldAvailability,
d.Selection,
d.Actions.Selection,
live.WorldState,
guid => live.LiveEntities.TryGetProjectionKey(
guid,
@ -455,7 +454,7 @@ internal sealed class SessionPlayerCompositionPhase
live.EntityEffects,
live.RemoteTeleport,
live.SelectionInteractions,
d.Selection,
d.Actions.Selection,
d.AnimatedEntities,
d.RemoteMovementObservations,
d.TranslucencyFades,
@ -563,9 +562,9 @@ internal sealed class SessionPlayerCompositionPhase
"combat attack operations",
d.CombatAttackOperations.BindOwned(
new LiveCombatAttackOperations(
d.Combat,
d.Actions.Combat,
new CombatAttackTargetSource(
d.Selection,
d.Actions.Selection,
live.LiveEntities,
d.EntityObjects.Objects,
d.PlayerIdentity),
@ -798,7 +797,7 @@ internal sealed class SessionPlayerCompositionPhase
new LiveSessionDomainRuntime(
d.EntityObjects,
d.Character,
d.Combat,
d.Actions,
d.Inventory,
d.Communication),
new LiveSessionUiRuntime(
@ -856,7 +855,7 @@ internal sealed class SessionPlayerCompositionPhase
new LocalPlayerCombatEquipmentSource(
d.EntityObjects.Objects,
d.PlayerIdentity),
d.Combat,
d.Actions.Combat,
new ItemInteractionCombatModeIntentSink(
interaction.ItemInteraction),
d.Log,
@ -875,10 +874,10 @@ internal sealed class SessionPlayerCompositionPhase
d.Inventory,
d.Character,
d.Communication,
d.Actions,
d.PlayerController,
worldReveal,
d.UpdateClock,
d.Selection,
live.SelectionInteractions,
gameplayInput,
combatCommand);
@ -940,7 +939,7 @@ internal sealed class SessionPlayerCompositionPhase
GameplayInputActionRouter gameplayActions =
GameplayInputActionRouter.Create(
dispatcher,
d.Combat,
d.Actions.Combat,
targets,
d.HostQuiescence,
d.Log);