refactor(runtime): close canonical gameplay ownership
Unify the toolbar shortcut manager with Runtime inventory state, route retail-ordered shortcut and spellbook command effects through the canonical owners, and make retained controllers borrow those exact instances. Remove the item-interaction transaction fallback and add graphical/no-window parity plus failure-safe terminal ownership-ledger coverage. Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
parent
ce6fae7b38
commit
89e6b207f8
36 changed files with 1433 additions and 251 deletions
|
|
@ -11,7 +11,7 @@ public sealed class RuntimeInventoryStateTests
|
|||
{
|
||||
using var entities = new RuntimeEntityObjectLifetime();
|
||||
using var inventory = new RuntimeInventoryState(entities);
|
||||
inventory.Shortcuts.Replace(
|
||||
inventory.Shortcuts.Load(
|
||||
[
|
||||
new AcDream.Core.Items.ShortcutEntry(3, 0x80000001u, 0u),
|
||||
new AcDream.Core.Items.ShortcutEntry(4, 0u, 42u),
|
||||
|
|
@ -55,12 +55,12 @@ public sealed class RuntimeInventoryStateTests
|
|||
inventory.ExternalContainers.RequestOpen(0x70000001u);
|
||||
inventory.ExternalContainers.ApplyViewContents(0x70000001u);
|
||||
inventory.ItemMana.OnQueryItemManaResponse(0x50000001u, 0.75f, true);
|
||||
inventory.Shortcuts.Replace(shortcuts);
|
||||
inventory.Shortcuts.Load(shortcuts);
|
||||
|
||||
Assert.Same(entities.Objects, inventory.Objects);
|
||||
Assert.Equal(0x70000001u, inventory.ExternalContainers.CurrentContainerId);
|
||||
Assert.Equal(0.75f, inventory.ItemMana.GetManaPercent(0x50000001u));
|
||||
Assert.Same(shortcuts, inventory.Shortcuts.Items);
|
||||
Assert.Equal(shortcuts, inventory.Shortcuts.Items);
|
||||
Assert.Equal(1, inventory.Shortcuts.Revision);
|
||||
}
|
||||
|
||||
|
|
@ -72,7 +72,7 @@ public sealed class RuntimeInventoryStateTests
|
|||
inventory.ExternalContainers.RequestOpen(0x70000001u);
|
||||
inventory.ExternalContainers.ApplyViewContents(0x70000001u);
|
||||
inventory.ItemMana.OnQueryItemManaResponse(0x50000001u, 0.75f, true);
|
||||
inventory.Shortcuts.Replace([new ShortcutEntry(1, 2u, 3u)]);
|
||||
inventory.Shortcuts.Load([new ShortcutEntry(1, 2u, 3u)]);
|
||||
inventory.Transactions.IncrementBusyCount();
|
||||
|
||||
inventory.ResetExternalContainer();
|
||||
|
|
@ -98,7 +98,7 @@ public sealed class RuntimeInventoryStateTests
|
|||
using var first = new RuntimeInventoryState(firstEntities);
|
||||
using var second = new RuntimeInventoryState(secondEntities);
|
||||
|
||||
first.Shortcuts.Replace([new ShortcutEntry(1, 2u, 3u)]);
|
||||
first.Shortcuts.Load([new ShortcutEntry(1, 2u, 3u)]);
|
||||
first.Transactions.IncrementBusyCount();
|
||||
|
||||
Assert.NotSame(first.Objects, second.Objects);
|
||||
|
|
@ -116,7 +116,7 @@ public sealed class RuntimeInventoryStateTests
|
|||
inventory.ExternalContainers.RequestOpen(0x70000001u);
|
||||
inventory.ExternalContainers.ApplyViewContents(0x70000001u);
|
||||
inventory.ItemMana.OnQueryItemManaResponse(0x50000001u, 0.5f, true);
|
||||
inventory.Shortcuts.Replace([new ShortcutEntry(1, 2u, 3u)]);
|
||||
inventory.Shortcuts.Load([new ShortcutEntry(1, 2u, 3u)]);
|
||||
|
||||
inventory.Dispose();
|
||||
inventory.Dispose();
|
||||
|
|
@ -129,7 +129,7 @@ public sealed class RuntimeInventoryStateTests
|
|||
}
|
||||
|
||||
[Fact]
|
||||
public void DisposalRetriesATransientOwnerObserverFailureToConvergence()
|
||||
public void DisposalFailureIsReportedAfterTerminalOwnerConvergence()
|
||||
{
|
||||
using var entities = new RuntimeEntityObjectLifetime();
|
||||
var inventory = new RuntimeInventoryState(entities);
|
||||
|
|
@ -146,12 +146,72 @@ public sealed class RuntimeInventoryStateTests
|
|||
};
|
||||
|
||||
Assert.Throws<AggregateException>(inventory.Dispose);
|
||||
Assert.False(inventory.IsDisposed);
|
||||
Assert.True(inventory.IsDisposed);
|
||||
Assert.True(inventory.Transactions.IsDisposed);
|
||||
inventory.Dispose();
|
||||
|
||||
Assert.True(inventory.CaptureOwnership().IsConverged);
|
||||
Assert.Equal(0u, inventory.ExternalContainers.CurrentContainerId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ShortcutCommandsUseRetailSendThenLocalOrderOnTheExactOwner()
|
||||
{
|
||||
using var entities = new RuntimeEntityObjectLifetime();
|
||||
using var inventory = new RuntimeInventoryState(entities);
|
||||
var order = new List<string>();
|
||||
inventory.Shortcuts.Changed += () => order.Add("local");
|
||||
var entry = new ShortcutEntry(3, 0x80000001u, 0u);
|
||||
|
||||
Assert.True(inventory.TryAddShortcut(
|
||||
entry,
|
||||
() =>
|
||||
{
|
||||
Assert.Null(inventory.Shortcuts.GetEntry(3));
|
||||
order.Add("send");
|
||||
}));
|
||||
Assert.Equal(["send", "local"], order);
|
||||
Assert.Equal(entry, inventory.Shortcuts.GetEntry(3));
|
||||
|
||||
order.Clear();
|
||||
Assert.True(inventory.TryRemoveShortcut(
|
||||
3,
|
||||
() =>
|
||||
{
|
||||
Assert.Equal(entry, inventory.Shortcuts.GetEntry(3));
|
||||
order.Add("send");
|
||||
}));
|
||||
Assert.Equal(["send", "local"], order);
|
||||
Assert.Null(inventory.Shortcuts.GetEntry(3));
|
||||
|
||||
Assert.Throws<InvalidOperationException>(
|
||||
() => inventory.TryAddShortcut(
|
||||
entry,
|
||||
() => throw new InvalidOperationException("transport")));
|
||||
Assert.Equal(entry, inventory.Shortcuts.GetEntry(3));
|
||||
|
||||
int sends = 0;
|
||||
Assert.False(inventory.TryAddShortcut(
|
||||
new ShortcutEntry(ShortcutStore.SlotCount, 1u, 0u),
|
||||
() => sends++));
|
||||
Assert.False(inventory.TryRemoveShortcut(-1, () => sends++));
|
||||
Assert.Equal(0, sends);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DisposalRetiresShortcutObserversAndTransactionSubscriptions()
|
||||
{
|
||||
using var entities = new RuntimeEntityObjectLifetime();
|
||||
var inventory = new RuntimeInventoryState(entities);
|
||||
inventory.Shortcuts.Changed += static () => { };
|
||||
inventory.Shortcuts.Load([new ShortcutEntry(1, 2u, 3u)]);
|
||||
|
||||
inventory.Dispose();
|
||||
|
||||
Assert.True(inventory.IsDisposed);
|
||||
Assert.Equal(0u, inventory.ExternalContainers.CurrentContainerId);
|
||||
Assert.True(inventory.Shortcuts.IsDisposed);
|
||||
Assert.True(inventory.Transactions.IsDisposed);
|
||||
Assert.Equal(0, inventory.Shortcuts.SubscriberCount);
|
||||
Assert.Empty(inventory.Shortcuts.Items);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue