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:
Erik 2026-07-26 08:39:02 +02:00
parent d362172620
commit d02a12ceac
16 changed files with 418 additions and 96 deletions

View file

@ -15,6 +15,7 @@ using AcDream.Core.Physics;
using AcDream.Core.Rendering;
using AcDream.Core.Spells;
using AcDream.Core.Vfx;
using AcDream.Runtime.Gameplay;
using DatReaderWriter.DBObjs;
using Silk.NET.Input;
using Silk.NET.OpenAL;
@ -257,7 +258,7 @@ public sealed class ContentEffectsAudioCompositionTests
ResidencyBudgetOptions.Default,
new PhysicsDataCache(),
false,
new Spellbook(),
new RuntimeCharacterState(),
Router,
Poses,
new DeferredEntityEffectAdvanceSource(),
@ -289,7 +290,11 @@ public sealed class ContentEffectsAudioCompositionTests
throw new InvalidOperationException($"fault at {point}");
});
public void Dispose() => Publication.Dispose();
public void Dispose()
{
Publication.Dispose();
Dependencies.Character.Dispose();
}
}
private sealed class Publication :
@ -386,7 +391,9 @@ public sealed class ContentEffectsAudioCompositionTests
return _preparedAssets;
}
public MagicCatalog LoadMagicCatalog(IDatReaderWriter dats) => _magic;
public void InstallSpellMetadata(Spellbook spellBook, MagicCatalog catalog) { }
public void InstallSpellMetadata(
RuntimeCharacterState character,
MagicCatalog catalog) { }
public int GetSpellCount(MagicCatalog catalog) => 0;
public IAnimationLoader CreateAnimationLoader(
IDatReaderWriter dats,

View file

@ -191,9 +191,8 @@ public sealed class InteractionRetainedUiCompositionTests
Selection: null!,
Inventory: null!,
MagicCatalog: null!,
Spellbook: null!,
Character: null!,
Communication: null!,
LocalPlayer: null!,
StackSplitQuantity: null!,
UiRegistry: null,
CombatModeCommands: null!,