refactor(runtime): cut graphical host over to canonical root
Make every App composition phase borrow one GameRuntime, retire the duplicate view/event adapters, and dispose the root only after its graphical borrowers release. This preserves synchronous UI commands while giving shutdown one exact ownership ledger. Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
ecb9f79444
commit
ce41efb9e5
29 changed files with 613 additions and 778 deletions
|
|
@ -762,43 +762,40 @@ public sealed class CurrentGameRuntimeAdapterTests
|
|||
private readonly ItemInteractionController _items;
|
||||
private readonly LiveSessionController _session;
|
||||
private readonly IDisposable _combatModeBinding;
|
||||
private readonly GameRuntime _gameRuntime;
|
||||
|
||||
public Harness()
|
||||
{
|
||||
Identity = new LocalPlayerIdentityState();
|
||||
EntityObjects = new RuntimeEntityObjectLifetime();
|
||||
InventoryState = new RuntimeInventoryState(EntityObjects);
|
||||
Character = new RuntimeCharacterState();
|
||||
Entities = new LiveEntityRuntime(
|
||||
new GpuWorldState(),
|
||||
new NoopEntityResources(),
|
||||
EntityObjects);
|
||||
Objects = EntityObjects.Objects;
|
||||
Communication = new RuntimeCommunicationState();
|
||||
CombatAttackOperations = new CombatAttackOperationsSlot();
|
||||
CombatModeOperations = new RuntimeCombatModeOperationsSlot();
|
||||
SpellCastOperations = new RuntimeSpellCastOperationsSlot();
|
||||
Actions = new RuntimeActionState(
|
||||
InventoryState.Transactions,
|
||||
Character.Spellbook,
|
||||
Options = LiveOptions();
|
||||
Commands = new RecordingCommandRouting();
|
||||
Transport = new TestTransport();
|
||||
_gameRuntime = GameRuntimeTestFactory.Create(
|
||||
CombatAttackOperations,
|
||||
new RuntimeCombatTargetOperationsSlot(),
|
||||
CombatModeOperations,
|
||||
SpellCastOperations,
|
||||
now: static () => 0d);
|
||||
new SessionOperations(Transport),
|
||||
combatTime: static () => 0d);
|
||||
_session = _gameRuntime.Session;
|
||||
Identity = new LocalPlayerIdentityState(
|
||||
_gameRuntime.PlayerIdentity);
|
||||
Entities = new LiveEntityRuntime(
|
||||
new GpuWorldState(),
|
||||
new NoopEntityResources(),
|
||||
EntityObjects);
|
||||
CombatMode = new RecordingCombatModeOperations();
|
||||
_combatModeBinding =
|
||||
CombatModeOperations.BindOwned(CombatMode);
|
||||
MovementState = new RuntimeLocalPlayerMovementState();
|
||||
Environment = new RuntimeWorldEnvironmentState();
|
||||
MovementInput = new DispatcherMovementInputSource(MovementState);
|
||||
GameplayInput = new GameplayInputFrameController(
|
||||
dispatcher: null,
|
||||
MovementInput,
|
||||
mouseLook: null,
|
||||
new NoopCombatInput());
|
||||
Clock = new UpdateFrameClock();
|
||||
WorldTransit = new RuntimeWorldTransitState();
|
||||
Clock = new UpdateFrameClock(_gameRuntime.Clock);
|
||||
WorldReveal = new WorldRevealCoordinator(
|
||||
WorldTransit,
|
||||
static (_, _) => true,
|
||||
|
|
@ -826,50 +823,42 @@ public sealed class CurrentGameRuntimeAdapterTests
|
|||
new SelectionTransport(() => _session?.IsInWorld == true),
|
||||
new NoopInteractionMovement());
|
||||
|
||||
Options = LiveOptions();
|
||||
Commands = new RecordingCommandRouting();
|
||||
Transport = new TestTransport();
|
||||
_session = new LiveSessionController(
|
||||
new SessionOperations(Transport));
|
||||
Host = CreateHost(_session, Commands, Identity);
|
||||
Runtime = new CurrentGameRuntimeAdapter(
|
||||
_session,
|
||||
_gameRuntime,
|
||||
Host,
|
||||
Commands,
|
||||
Identity,
|
||||
EntityObjects,
|
||||
InventoryState,
|
||||
Character,
|
||||
Communication,
|
||||
Actions,
|
||||
MovementState,
|
||||
Environment,
|
||||
WorldTransit,
|
||||
Clock,
|
||||
selectionController);
|
||||
}
|
||||
|
||||
public RuntimeOptions Options { get; }
|
||||
public LocalPlayerIdentityState Identity { get; }
|
||||
public RuntimeEntityObjectLifetime EntityObjects { get; }
|
||||
public RuntimeInventoryState InventoryState { get; }
|
||||
public RuntimeCharacterState Character { get; }
|
||||
public RuntimeEntityObjectLifetime EntityObjects =>
|
||||
_gameRuntime.EntityObjects;
|
||||
public RuntimeInventoryState InventoryState =>
|
||||
_gameRuntime.InventoryOwner;
|
||||
public RuntimeCharacterState Character =>
|
||||
_gameRuntime.CharacterOwner;
|
||||
public LiveEntityRuntime Entities { get; }
|
||||
public ClientObjectTable Objects { get; }
|
||||
public RuntimeCommunicationState Communication { get; }
|
||||
public ClientObjectTable Objects => EntityObjects.Objects;
|
||||
public RuntimeCommunicationState Communication =>
|
||||
_gameRuntime.CommunicationOwner;
|
||||
public ChatLog Chat => Communication.Chat;
|
||||
public CombatAttackOperationsSlot CombatAttackOperations { get; }
|
||||
public RuntimeCombatModeOperationsSlot CombatModeOperations { get; }
|
||||
public RuntimeSpellCastOperationsSlot SpellCastOperations { get; }
|
||||
public RuntimeActionState Actions { get; }
|
||||
public RuntimeActionState Actions => _gameRuntime.ActionOwner;
|
||||
public SelectionState Selection => Actions.Selection;
|
||||
public RuntimeLocalPlayerMovementState MovementState { get; }
|
||||
public RuntimeWorldEnvironmentState Environment { get; }
|
||||
public RuntimeLocalPlayerMovementState MovementState =>
|
||||
_gameRuntime.MovementOwner;
|
||||
public RuntimeWorldEnvironmentState Environment =>
|
||||
_gameRuntime.EnvironmentOwner;
|
||||
public DispatcherMovementInputSource MovementInput { get; }
|
||||
public GameplayInputFrameController GameplayInput { get; }
|
||||
public RecordingCombatModeOperations CombatMode { get; }
|
||||
public UpdateFrameClock Clock { get; }
|
||||
public RuntimeWorldTransitState WorldTransit { get; }
|
||||
public RuntimeWorldTransitState WorldTransit =>
|
||||
_gameRuntime.TransitOwner;
|
||||
public WorldRevealCoordinator WorldReveal { get; }
|
||||
public RecordingCommandRouting Commands { get; }
|
||||
public TestTransport Transport { get; }
|
||||
|
|
@ -879,15 +868,11 @@ public sealed class CurrentGameRuntimeAdapterTests
|
|||
public void Dispose()
|
||||
{
|
||||
Runtime.Dispose();
|
||||
Character.Dispose();
|
||||
Communication.Dispose();
|
||||
_session.Dispose();
|
||||
_items.Dispose();
|
||||
_combatModeBinding.Dispose();
|
||||
Actions.Dispose();
|
||||
InventoryState.Dispose();
|
||||
Entities.Clear();
|
||||
MovementState.Dispose();
|
||||
WorldReveal.ResetSession();
|
||||
_gameRuntime.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue