diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 84bca700f..34040bb57 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -7295,8 +7295,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "public CultMeshReactiveDocument ReactiveZoneContacts(", "public Task> ReactiveStationRefitAsync(", "public CultMeshReactiveDocument ReactiveStationRefit(", - "public Task> ReactiveZoneRenderAsync(", - "public CultMeshReactiveDocument ReactiveZoneRender(", + "public CultMeshReactiveDocument Reactive(", "public Task> ReactiveZoneAsync(", "public CultMeshReactiveDocument ReactiveZone(", "public Task> ReactiveEntityAsync(", @@ -8133,9 +8132,8 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root var requiredClientSymbols = new[] { "public AetheriaRuntimeDaemonFrameDocument LatestDaemonFrame()", - "public CultMeshReactiveDocument ReactiveDaemonFrame(", "public AetheriaRuntimeDaemonSoaViewDocument LatestDaemonSoaView()", - "public CultMeshReactiveDocument ReactiveDaemonSoaView(", + "public CultMeshReactiveDocument Reactive(", "public AetheriaRuntimeObservedDaemonState? LatestObservedDaemon()", "public AetheriaRuntimeObservedDockingState? CurrentDocking(", "public CultMeshReactiveDocument ReactiveCatalog(", @@ -8180,6 +8178,14 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root string.Join(", ", missingClientSymbols)); } + if (topLevelClientState.Contains("ReactiveDaemonFrame(", StringComparison.Ordinal) || + topLevelClientState.Contains("ReactiveDaemonSoaView(", StringComparison.Ordinal) || + topLevelClientState.Contains("ReactiveZoneRender(", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "AetheriaClientState must not reintroduce named daemon reactive wrappers; use Reactive() for managed typed document access."); + } + var observedDaemonState = File.ReadAllText(observedDaemonStatePath); if (!observedDaemonState.Contains("public static bool TryCreateCurrent(", StringComparison.Ordinal) || !observedDaemonState.Contains("new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender)", StringComparison.Ordinal)) @@ -11468,11 +11474,11 @@ static void RequireAetheriaRuntimeVerseClientContract(string root) "private readonly CultMeshReactiveDocument _starbridgeScenario;", "private readonly CultMeshReactiveDocument _starbridgeSession;", "public AetheriaRuntimeManagedClientInputs(AetheriaClientState state)", - "_daemonFrame = state.ReactiveDaemonFrame();", - "_catalog = state.ReactiveCatalog();", - "_loadoutTemplates = state.ReactiveLoadoutTemplates();", - "_starbridgeScenario = state.Starbridge.ReactiveScenario();", - "_starbridgeSession = state.Starbridge.ReactiveSession();", + "_daemonFrame = state.Reactive();", + "_catalog = state.Reactive();", + "_loadoutTemplates = state.Reactive();", + "_starbridgeScenario = state.Reactive();", + "_starbridgeSession = state.Reactive();", "public AetheriaRuntimeCatalogSnapshot Catalog => _catalog.Current", "public AetheriaRuntimeLoadoutTemplatesDocument LoadoutTemplates => _loadoutTemplates.Current", "public AetheriaRuntimeDaemonFrameDocument RequireFrame()", @@ -15686,9 +15692,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) var requiredManagedObservedDaemonSymbols = new[] { "public AetheriaRuntimeObservedDaemonState? CurrentObservedDaemon(", - "using var frame = ReactiveDaemonFrame(options);", - "using var soaView = TryReactiveDaemonSoaView(options);", - "using var zoneRender = ReactiveZoneRender(options);", + "using var frame = Reactive(options);", + "using var soaView = TryReactive(options);", + "using var zoneRender = Reactive(options);", "AetheriaRuntimeObservedDaemonState.TryCreateCurrent(frame, soaView, zoneRender, out var current)" }; var missingManagedObservedDaemonSymbols = requiredManagedObservedDaemonSymbols @@ -15702,9 +15708,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) } if (!daemonRuntimeDocumentTests.Contains("ManagedStateSamplesCurrentObservedDaemonFromReactiveDocuments()", StringComparison.Ordinal) || - !daemonRuntimeDocumentTests.Contains("using var observedFrame = client.State.ReactiveDaemonFrame();", StringComparison.Ordinal) || - !daemonRuntimeDocumentTests.Contains("using var observedSoaView = client.State.ReactiveDaemonSoaView();", StringComparison.Ordinal) || - !daemonRuntimeDocumentTests.Contains("using var observedZoneRender = client.State.ReactiveZoneRender();", StringComparison.Ordinal) || + !daemonRuntimeDocumentTests.Contains("using var observedFrame = client.State.Reactive();", StringComparison.Ordinal) || + !daemonRuntimeDocumentTests.Contains("using var observedSoaView = client.State.Reactive();", StringComparison.Ordinal) || + !daemonRuntimeDocumentTests.Contains("using var observedZoneRender = client.State.Reactive();", StringComparison.Ordinal) || !daemonRuntimeDocumentTests.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(", StringComparison.Ordinal) || !daemonRuntimeDocumentTests.Contains("var sampledObserved = client.State.CurrentObservedDaemon();", StringComparison.Ordinal)) { @@ -15926,9 +15932,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) !daemonObserver.Contains("CultMeshReactiveDocument _daemonFrame", StringComparison.Ordinal) || !daemonObserver.Contains("CultMeshReactiveDocument _daemonSoaView", StringComparison.Ordinal) || !daemonObserver.Contains("CultMeshReactiveDocument _zoneRender", StringComparison.Ordinal) || - !daemonObserver.Contains("_daemonFrame ??= state.ReactiveDaemonFrame();", StringComparison.Ordinal) || - !daemonObserver.Contains("_daemonSoaView ??= TryReactiveDaemonSoaView(state);", StringComparison.Ordinal) || - !daemonObserver.Contains("_zoneRender ??= state.ReactiveZoneRender();", StringComparison.Ordinal) || + !daemonObserver.Contains("_daemonFrame ??= state.Reactive();", StringComparison.Ordinal) || + !daemonObserver.Contains("_daemonSoaView ??= TryReactive(state);", StringComparison.Ordinal) || + !daemonObserver.Contains("_zoneRender ??= state.Reactive();", StringComparison.Ordinal) || !daemonObserver.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(", StringComparison.Ordinal) || !daemonObserver.Contains("DisposeObservedDaemonDocuments()", StringComparison.Ordinal)) { @@ -17372,7 +17378,7 @@ static void RequireInventoryLoadoutSaveRequestAuthority(string root) "CultMeshReactiveDocument _loadoutFrame", "ProjectLoadoutTemplate(targetEntityKey)", "AetheriaRuntimeLoadoutSnapshotProjector.ProjectLoadoutTemplate(", - ".ReactiveDaemonFrame()", + ".Reactive()", "_loadoutFrame?.Dispose()", ".Ui.SaveLoadoutTemplateAsync(loadout, \"unity-inventory\")" }; @@ -17398,7 +17404,7 @@ static void RequireInventoryLoadoutSaveRequestAuthority(string root) "InventoryPanel", "AetheriaRuntimeDaemonFrameDocument", "_loadoutFrame", - ".ReactiveDaemonFrame()", + ".Reactive()", "AetheriaRuntimeDaemonFrameSession", ".ObserveDaemonFrame()"); @@ -17415,7 +17421,7 @@ static void RequireInventoryLoadoutSaveRequestAuthority(string root) { "ProjectLoadoutTemplateAsync(", "AetheriaClientState state", - ".ReactiveDaemonFrame()", + ".Reactive()", "ProjectLoadoutTemplate(", "frame.Current?.Run ?? new AetheriaRuntimeRunCheckpointCommit()" }; @@ -17437,10 +17443,11 @@ static void RequireInventoryLoadoutSaveRequestAuthority(string root) if (loadoutSnapshotProjector.Contains("state.Daemon.LatestFrame.ReactiveAsync", StringComparison.Ordinal) || loadoutSnapshotProjector.Contains("state.LatestFrame.ReactiveAsync", StringComparison.Ordinal) || - loadoutSnapshotProjector.Contains(".ObserveDaemonFrame()", StringComparison.Ordinal)) + loadoutSnapshotProjector.Contains(".ObserveDaemonFrame()", StringComparison.Ordinal) || + loadoutSnapshotProjector.Contains(".ReactiveDaemonFrame()", StringComparison.Ordinal)) { throw new InvalidOperationException( - "Loadout template save payloads must use named AetheriaClientState reactive daemon frame access instead of walking raw CultMesh handles."); + "Loadout template save payloads must use generic AetheriaClientState reactive typed document access instead of named wrappers or raw handle walks."); } if (clientState.Contains("ReactiveLoadoutSnapshotProjector", StringComparison.Ordinal) || diff --git a/Assets/Scripts/Gameplay/AetheriaDaemonObserver.cs b/Assets/Scripts/Gameplay/AetheriaDaemonObserver.cs index 31373a99f..afe8e6b80 100644 --- a/Assets/Scripts/Gameplay/AetheriaDaemonObserver.cs +++ b/Assets/Scripts/Gameplay/AetheriaDaemonObserver.cs @@ -131,17 +131,18 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour return; } - _daemonFrame ??= state.ReactiveDaemonFrame(); - _daemonSoaView ??= TryReactiveDaemonSoaView(state); - _zoneRender ??= state.ReactiveZoneRender(); + _daemonFrame ??= state.Reactive(); + _daemonSoaView ??= TryReactive(state); + _zoneRender ??= state.Reactive(); } - private static CultMeshReactiveDocument TryReactiveDaemonSoaView( + private static CultMeshReactiveDocument TryReactive( AetheriaClientState state) + where TDocument : class { try { - return state.ReactiveDaemonSoaView(); + return state.Reactive(); } catch (System.Collections.Generic.KeyNotFoundException) { diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index d87a5ebc9..f7aec6d14 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -206,8 +206,8 @@ public class DaemonRuntimeDocumentTests var observed = client.State.LatestObservedDaemon(); var observedAuthoritativeFrame = client.State.LatestDaemonFrame(); using var catalogReactive = client.State.ReactiveCatalog(); - using var daemonFrameReactive = client.State.ReactiveDaemonFrame(); - using var daemonSoaViewReactive = client.State.ReactiveDaemonSoaView(); + using var daemonFrameReactive = client.State.Reactive(); + using var daemonSoaViewReactive = client.State.Reactive(); using var loadoutTemplatesReactive = client.State.ReactiveLoadoutTemplates(); using var sectorMapReactive = client.State.ReactiveSectorMap(); using var playerSettingsReactive = client.State.Settings.ReactivePlayer(); @@ -2263,9 +2263,9 @@ public class DaemonRuntimeDocumentTests .OpenAsync(statePath, "unity-reactive-observer-test", pullOnOpen: true) .GetAwaiter() .GetResult(); - using var observedFrame = client.State.ReactiveDaemonFrame(); - using var observedSoaView = client.State.ReactiveDaemonSoaView(); - using var observedZoneRender = client.State.ReactiveZoneRender(); + using var observedFrame = client.State.Reactive(); + using var observedSoaView = client.State.Reactive(); + using var observedZoneRender = client.State.Reactive(); var observed = AetheriaRuntimeObservedDaemonState.TryCreateCurrent( observedFrame, observedSoaView, diff --git a/Assets/Scripts/UI/Menu/InventoryPanel.cs b/Assets/Scripts/UI/Menu/InventoryPanel.cs index ef59303a6..a35b84e6d 100644 --- a/Assets/Scripts/UI/Menu/InventoryPanel.cs +++ b/Assets/Scripts/UI/Menu/InventoryPanel.cs @@ -1552,7 +1552,7 @@ private void Update() { _loadoutFrame = ResolveClient() .State - .ReactiveDaemonFrame(); + .Reactive(); } catch (Exception ex) { diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs index 178dc11dd..da8ae8343 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs @@ -209,18 +209,6 @@ namespace GameCult.Aetheria.State.Verse return LatestDaemonFrameAsync().ConfigureAwait(false).GetAwaiter().GetResult(); } - public Task> ReactiveDaemonFrameAsync( - CultMeshReactiveDocumentOptions? options = null) - { - return LatestFrame.ReactiveAsync(options); - } - - public CultMeshReactiveDocument ReactiveDaemonFrame( - CultMeshReactiveDocumentOptions? options = null) - { - return LatestFrame.Reactive(options); - } - public Task LatestDaemonSoaViewAsync() { return LatestSoaView.LatestAsync(); @@ -231,18 +219,6 @@ namespace GameCult.Aetheria.State.Verse return LatestDaemonSoaViewAsync().ConfigureAwait(false).GetAwaiter().GetResult(); } - public Task> ReactiveDaemonSoaViewAsync( - CultMeshReactiveDocumentOptions? options = null) - { - return LatestSoaView.ReactiveAsync(options); - } - - public CultMeshReactiveDocument ReactiveDaemonSoaView( - CultMeshReactiveDocumentOptions? options = null) - { - return LatestSoaView.Reactive(options); - } - public async Task LatestObservedDaemonAsync() { var frame = await LatestDaemonFrameAsync().ConfigureAwait(false); @@ -259,9 +235,9 @@ namespace GameCult.Aetheria.State.Verse public AetheriaRuntimeObservedDaemonState? CurrentObservedDaemon( CultMeshReactiveDocumentOptions? options = null) { - using var frame = ReactiveDaemonFrame(options); - using var soaView = TryReactiveDaemonSoaView(options); - using var zoneRender = ReactiveZoneRender(options); + using var frame = Reactive(options); + using var soaView = TryReactive(options); + using var zoneRender = Reactive(options); return AetheriaRuntimeObservedDaemonState.TryCreateCurrent(frame, soaView, zoneRender, out var current) ? current : null; @@ -278,12 +254,13 @@ namespace GameCult.Aetheria.State.Verse : null; } - private CultMeshReactiveDocument? TryReactiveDaemonSoaView( + private CultMeshReactiveDocument? TryReactive( CultMeshReactiveDocumentOptions? options) + where TDocument : class { try { - return ReactiveDaemonSoaView(options); + return Reactive(options); } catch (KeyNotFoundException) { @@ -532,18 +509,6 @@ namespace GameCult.Aetheria.State.Verse return LatestZoneRenderAsync().ConfigureAwait(false).GetAwaiter().GetResult(); } - public Task> ReactiveZoneRenderAsync( - CultMeshReactiveDocumentOptions? options = null) - { - return ZoneRender.ReactiveAsync(options); - } - - public CultMeshReactiveDocument ReactiveZoneRender( - CultMeshReactiveDocumentOptions? options = null) - { - return ZoneRender.Reactive(options); - } - public Observable Watch() where TDocument : class { diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeLoadoutSnapshotProjector.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeLoadoutSnapshotProjector.cs index 401b21d57..d0380d3ca 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeLoadoutSnapshotProjector.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeLoadoutSnapshotProjector.cs @@ -15,7 +15,7 @@ namespace GameCult.Aetheria.State.Verse { if (state == null) throw new ArgumentNullException(nameof(state)); - using var frame = state.ReactiveDaemonFrame(); + using var frame = state.Reactive(); return Task.FromResult(ProjectLoadoutTemplate( frame.Current?.Run ?? new AetheriaRuntimeRunCheckpointCommit(), entityKey ?? "")); diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeManagedClientInputs.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeManagedClientInputs.cs index 0e67a6ac1..3d7736dd7 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeManagedClientInputs.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeManagedClientInputs.cs @@ -18,11 +18,11 @@ namespace GameCult.Aetheria.State.Verse if (state == null) throw new ArgumentNullException(nameof(state)); - _daemonFrame = state.ReactiveDaemonFrame(); - _catalog = state.ReactiveCatalog(); - _loadoutTemplates = state.ReactiveLoadoutTemplates(); - _starbridgeScenario = state.Starbridge.ReactiveScenario(); - _starbridgeSession = state.Starbridge.ReactiveSession(); + _daemonFrame = state.Reactive(); + _catalog = state.Reactive(); + _loadoutTemplates = state.Reactive(); + _starbridgeScenario = state.Reactive(); + _starbridgeSession = state.Reactive(); } public AetheriaRuntimeCatalogSnapshot Catalog => _catalog.Current