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:
parent
bb45afef33
commit
b298f99f91
38 changed files with 711 additions and 93 deletions
|
|
@ -15,6 +15,7 @@ public sealed class RuntimeGameplayOwnershipTests
|
|||
var inventory = new RuntimeInventoryState(entities);
|
||||
var character = new RuntimeCharacterState();
|
||||
var communication = new RuntimeCommunicationState();
|
||||
var actions = new RuntimeActionState();
|
||||
inventory.Shortcuts.Changed += static () => { };
|
||||
inventory.Shortcuts.Load([new ShortcutEntry(1, 2u, 3u)]);
|
||||
inventory.ItemMana.OnQueryItemManaResponse(2u, 0.5f, true);
|
||||
|
|
@ -60,12 +61,19 @@ public sealed class RuntimeGameplayOwnershipTests
|
|||
new HashSet<uint> { 4u })));
|
||||
IDisposable subscription =
|
||||
communication.Events.Subscribe(new NoopObserver());
|
||||
actions.Selection.Select(
|
||||
0x50000002u,
|
||||
AcDream.Core.Selection.SelectionChangeSource.World);
|
||||
actions.Combat.SetCombatMode(AcDream.Core.Combat.CombatMode.Melee);
|
||||
actions.Combat.OnUpdateHealth(0x50000002u, 0.75f);
|
||||
actions.Interaction.EnterUse();
|
||||
|
||||
RuntimeGameplayOwnershipSnapshot populated =
|
||||
RuntimeGameplayOwnership.Capture(
|
||||
inventory,
|
||||
character,
|
||||
communication);
|
||||
communication,
|
||||
actions);
|
||||
|
||||
Assert.False(populated.IsConverged);
|
||||
Assert.Equal(1, populated.Inventory.ShortcutCount);
|
||||
|
|
@ -73,7 +81,13 @@ public sealed class RuntimeGameplayOwnershipTests
|
|||
Assert.Equal(1, populated.Communication.StreamSubscriberCount);
|
||||
Assert.True(populated.Communication.HasReplyTarget);
|
||||
Assert.True(populated.Communication.HasRetellTarget);
|
||||
Assert.Equal(0x50000002u, populated.Actions.SelectedObjectId);
|
||||
Assert.Equal(
|
||||
AcDream.Core.Combat.CombatMode.Melee,
|
||||
populated.Actions.CombatMode);
|
||||
Assert.Equal(1, populated.Actions.TrackedTargetHealthCount);
|
||||
|
||||
actions.Dispose();
|
||||
communication.Dispose();
|
||||
character.Dispose();
|
||||
inventory.Dispose();
|
||||
|
|
@ -83,7 +97,8 @@ public sealed class RuntimeGameplayOwnershipTests
|
|||
RuntimeGameplayOwnership.Capture(
|
||||
inventory,
|
||||
character,
|
||||
communication);
|
||||
communication,
|
||||
actions);
|
||||
|
||||
Assert.True(retired.IsConverged);
|
||||
Assert.Equal(0, retired.Inventory.ShortcutSubscriberCount);
|
||||
|
|
@ -99,6 +114,7 @@ public sealed class RuntimeGameplayOwnershipTests
|
|||
var inventory = new RuntimeInventoryState(entities);
|
||||
var character = new RuntimeCharacterState();
|
||||
var communication = new RuntimeCommunicationState();
|
||||
var actions = new RuntimeActionState();
|
||||
|
||||
inventory.ExternalContainers.RequestOpen(0x70000001u);
|
||||
inventory.ExternalContainers.ApplyViewContents(0x70000001u);
|
||||
|
|
@ -119,12 +135,14 @@ public sealed class RuntimeGameplayOwnershipTests
|
|||
Assert.Throws<AggregateException>(inventory.Dispose);
|
||||
Assert.Throws<AggregateException>(character.Dispose);
|
||||
communication.Dispose();
|
||||
actions.Dispose();
|
||||
|
||||
RuntimeGameplayOwnershipSnapshot retired =
|
||||
RuntimeGameplayOwnership.Capture(
|
||||
inventory,
|
||||
character,
|
||||
communication);
|
||||
communication,
|
||||
actions);
|
||||
|
||||
Assert.True(retired.IsConverged);
|
||||
Assert.Equal(1, retired.Communication.DispatchFailureCount);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue