refactor(runtime): own magic and player state
Move the coupled Spellbook and LocalPlayerState into one Runtime-owned character graph, route content, live-session, retained UI, reset, and shutdown through that exact owner, and delete the duplicate desired-component snapshot from inventory state. Preserve synchronous retail update and reset ordering while adding independent-instance and retryable-failure coverage. Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
parent
d362172620
commit
d02a12ceac
16 changed files with 418 additions and 96 deletions
|
|
@ -337,14 +337,14 @@ public sealed class GameWindow :
|
|||
public readonly AcDream.Core.Combat.CombatState Combat = new();
|
||||
private readonly RuntimeEntityObjectLifetime _runtimeEntityObjects = new();
|
||||
private readonly RuntimeInventoryState _runtimeInventory;
|
||||
private readonly RuntimeCharacterState _runtimeCharacter;
|
||||
public AcDream.Core.Items.ItemManaState ItemMana =>
|
||||
_runtimeInventory.ItemMana;
|
||||
public IReadOnlyList<(uint Id, uint Amount)> DesiredComponents =>
|
||||
_runtimeInventory.DesiredComponents.Items;
|
||||
// Retail resolves learned IDs through portal.dat's CSpellTable. MagicCatalog
|
||||
// installs that immutable table once DatCollection opens in OnLoad.
|
||||
public AcDream.Core.Spells.SpellTable SpellTable => SpellBook.Metadata;
|
||||
public readonly AcDream.Core.Spells.Spellbook SpellBook = null!;
|
||||
public AcDream.Core.Spells.Spellbook SpellBook =>
|
||||
_runtimeCharacter.Spellbook;
|
||||
/// <summary>Persisted hotbar shortcuts from the last PlayerDescription (D.5.1 toolbar source).</summary>
|
||||
public IReadOnlyList<AcDream.Core.Items.ShortcutEntry> Shortcuts =>
|
||||
_runtimeInventory.Shortcuts.Items;
|
||||
|
|
@ -352,7 +352,8 @@ public sealed class GameWindow :
|
|||
// PlayerDescription so the Vitals HUD can render those bars.
|
||||
// Issue #6 — wired to SpellBook so GetMaxApprox folds enchantment
|
||||
// buffs into the max formula via Spellbook.GetVitalMod.
|
||||
public readonly AcDream.Core.Player.LocalPlayerState LocalPlayer = null!;
|
||||
public AcDream.Core.Player.LocalPlayerState LocalPlayer =>
|
||||
_runtimeCharacter.LocalPlayer;
|
||||
|
||||
// Phase D.2a — ImGui devtools UI overlay. Null unless ACDREAM_DEVTOOLS=1.
|
||||
// See docs/plans/2026-04-24-ui-framework.md for the staged UI strategy.
|
||||
|
|
@ -562,6 +563,7 @@ public sealed class GameWindow :
|
|||
{
|
||||
_options = options ?? throw new System.ArgumentNullException(nameof(options));
|
||||
_runtimeInventory = new RuntimeInventoryState(_runtimeEntityObjects);
|
||||
_runtimeCharacter = new RuntimeCharacterState();
|
||||
var alphaScratchBudgets =
|
||||
AcDream.App.Rendering.Residency.AlphaScratchBudgetProfile.Create(
|
||||
_options.ResidencyBudgets.AlphaScratchBytes);
|
||||
|
|
@ -591,8 +593,6 @@ public sealed class GameWindow :
|
|||
_uiRegistry = uiRegistry;
|
||||
_animatedEntities = new LiveEntityAnimationRuntimeView<LiveEntityAnimationState>(
|
||||
_liveEntityRuntimeSlot);
|
||||
SpellBook = new AcDream.Core.Spells.Spellbook();
|
||||
LocalPlayer = new AcDream.Core.Player.LocalPlayerState(SpellBook);
|
||||
// #184 Slice 2a: the extracted per-remote DR tick. Its stateful
|
||||
// setup/motion dependency crosses the fail-fast construction bridge;
|
||||
// the server-velocity animation cycle is stateless shared policy.
|
||||
|
|
@ -1149,7 +1149,7 @@ public sealed class GameWindow :
|
|||
_options.ResidencyBudgets,
|
||||
_physicsDataCache,
|
||||
_animationDiagnostics.DumpMotionEnabled,
|
||||
SpellBook,
|
||||
_runtimeCharacter,
|
||||
_hookRouter,
|
||||
_effectPoses,
|
||||
_entityEffectAdvance,
|
||||
|
|
@ -1261,9 +1261,8 @@ public sealed class GameWindow :
|
|||
_selection,
|
||||
_runtimeInventory,
|
||||
contentEffectsAudio.MagicCatalog,
|
||||
SpellBook,
|
||||
_runtimeCharacter,
|
||||
_runtimeCommunication,
|
||||
LocalPlayer,
|
||||
_stackSplitQuantity,
|
||||
_uiRegistry,
|
||||
_liveCombatModeCommands,
|
||||
|
|
@ -1405,8 +1404,7 @@ public sealed class GameWindow :
|
|||
Combat,
|
||||
_combatFeedback,
|
||||
_runtimeCommunication,
|
||||
LocalPlayer,
|
||||
SpellBook,
|
||||
_runtimeCharacter,
|
||||
_portalTunnelFallback,
|
||||
Console.WriteLine),
|
||||
this).Compose(
|
||||
|
|
@ -1582,6 +1580,7 @@ public sealed class GameWindow :
|
|||
_liveEntities,
|
||||
_runtimeEntityObjects,
|
||||
_runtimeInventory,
|
||||
_runtimeCharacter,
|
||||
_runtimeCommunication,
|
||||
_renderSceneShadow,
|
||||
_livePresentationBindings,
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@ internal sealed record LiveShutdownRoots(
|
|||
LiveEntityRuntime? LiveEntities,
|
||||
RuntimeEntityObjectLifetime EntityObjects,
|
||||
RuntimeInventoryState Inventory,
|
||||
RuntimeCharacterState Character,
|
||||
RuntimeCommunicationState Communication,
|
||||
RenderSceneShadowRuntime? RenderSceneShadow,
|
||||
LivePresentationRuntimeBindings? PresentationBindings,
|
||||
|
|
@ -391,6 +392,9 @@ internal static class GameWindowShutdownManifest
|
|||
]),
|
||||
new ResourceShutdownStage("runtime entity/object stream",
|
||||
[
|
||||
Hard(
|
||||
"runtime character state",
|
||||
live.Character.Dispose),
|
||||
Hard(
|
||||
"runtime inventory state",
|
||||
live.Inventory.Dispose),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue