diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index a1c490cd6..fede53731 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -7179,10 +7179,10 @@ static void RequireInventoryValidationUsesManagedTypedDocuments(string root) } var clientState = File.ReadAllText(clientStatePath); - if (!clientState.Contains("public CultMeshDocumentHandle Document()", StringComparison.Ordinal) || - !clientState.Contains("public CultMeshDocumentHandle Document(int index)", StringComparison.Ordinal) || - !clientState.Contains("public CultMeshReactiveDocument Reactive(", StringComparison.Ordinal) || - !clientState.Contains("public CultMeshReactiveDocument Reactive(int index)", StringComparison.Ordinal) || + if (!clientState.Contains("public CultMeshDocumentHandle Inventory(", StringComparison.Ordinal) || + !clientState.Contains("public CultMeshReactiveDocument ReactiveInventory(", StringComparison.Ordinal) || + !clientState.Contains("public CultMeshDocumentHandle ZoneDetails(", StringComparison.Ordinal) || + !clientState.Contains("public CultMeshReactiveDocument ReactiveZoneDetails(", StringComparison.Ordinal) || clientState.Contains("AetheriaClientState.Zone(", StringComparison.Ordinal) || clientState.Contains("AetheriaClientState.Entity(", StringComparison.Ordinal) || clientState.Contains("AetheriaClientZone", StringComparison.Ordinal) || @@ -7303,7 +7303,8 @@ static void RequireMenuDockingUsesManagedTypedSnapshot(string root) { "public CultMeshDocumentHandle StationRefit { get; }", "public CultMeshDocumentHandle CurrentDockingDocument { get; }", - "public CultMeshDocumentHandle Document()" + "public CultMeshDocumentHandle StationRefitDocument()", + "public CultMeshDocumentHandle CurrentDocking()" }; var missingClientSymbols = requiredClientSymbols .Where(symbol => !clientState.Contains(symbol, StringComparison.Ordinal)) @@ -7475,8 +7476,9 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) var clientState = File.ReadAllText(clientStatePath); var requiredClientSymbols = new[] { - "public CultMeshDocumentHandle Document()", - "public CultMeshDocumentHandle Document(int index)" + "public CultMeshDocumentHandle CatalogSnapshot()", + "public CultMeshDocumentHandle PlayerSettingsDocument()", + "public CultMeshDocumentHandle Inventory(" }; var missingClientSymbols = requiredClientSymbols .Where(symbol => !clientState.Contains(symbol, StringComparison.Ordinal)) @@ -7484,7 +7486,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) if (missingClientSymbols.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must expose typed document handles for shared and indexed Unity documents, with reactive sync owned by CultMesh handles: " + + "AetheriaClientState must expose named typed document handles for shared and indexed Unity documents, with reactive sync owned by CultMesh handles: " + string.Join(", ", missingClientSymbols)); } @@ -8113,7 +8115,6 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) var clientState = File.ReadAllText(clientStatePath); var requiredClientSymbols = new[] { - "public CultMeshDocumentHandle Document()", "public CultMeshDocumentHandle ObjectsViewport(", "public CultMeshReactiveDocument ReactiveObjectsViewport(", "public CultMeshDocumentHandle RenderSplatsViewport(", @@ -8325,8 +8326,15 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root StringSplitOptions.None)[0]; var requiredClientSymbols = new[] { - "public CultMeshDocumentHandle Document()", "public enum AetheriaClientEveSurface", + "public CultMeshDocumentHandle ProviderAdvertisementDocument()", + "public CultMeshReactiveDocument ReactiveProviderAdvertisement()", + "public CultMeshDocumentHandle HealthDocument()", + "public CultMeshReactiveDocument ReactiveHealth()", + "public CultMeshDocumentHandle CommandBoundaryDocument()", + "public CultMeshReactiveDocument ReactiveCommandBoundary()", + "public CultMeshDocumentHandle AuthorityPolicyDocument()", + "public CultMeshReactiveDocument ReactiveAuthorityPolicy()", "public CultMeshDocumentHandle DaemonFrameDocument()", "public CultMeshReactiveDocument ReactiveDaemonFrame()", "public CultMeshDocumentHandle DaemonSoaViewDocument()", @@ -8356,15 +8364,6 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "public static bool TryResolveEveSurface(", "public CultMeshDocumentHandle? EveSurfaceDocument(", "public CultMeshReactiveDocument? ReactiveEveSurface(", - "public CultMeshDocumentHandle Document(AetheriaClientEveSurface surface)", - "public CultMeshDocumentHandle Document(AetheriaRuntimeRtsViewportBounds viewport)", - "public CultMeshDocumentHandle Document(int index)", - "public CultMeshDocumentHandle Document(string seatId)", - "public CultMeshReactiveDocument Reactive()", - "public CultMeshReactiveDocument Reactive(AetheriaClientEveSurface surface)", - "public CultMeshReactiveDocument Reactive(AetheriaRuntimeRtsViewportBounds viewport)", - "public CultMeshReactiveDocument Reactive(int index)", - "public CultMeshReactiveDocument Reactive(string seatId)", "public CultMeshDocumentHandle RtsViewport(", "public CultMeshReactiveDocument ReactiveRtsViewport(", "public CultMeshDocumentHandle ObjectsViewport(", @@ -8379,6 +8378,12 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "public CultMeshReactiveDocument ReactiveSelectedObject(", "public CultMeshDocumentHandle Inventory(", "public CultMeshReactiveDocument ReactiveInventory(", + "public CultMeshDocumentHandle StarbridgeScenarioDocument()", + "public CultMeshReactiveDocument ReactiveStarbridgeScenario()", + "public CultMeshDocumentHandle StarbridgeSessionDocument()", + "public CultMeshReactiveDocument ReactiveStarbridgeSession()", + "public CultMeshDocumentHandle StarbridgeSummaryDocument()", + "public CultMeshReactiveDocument ReactiveStarbridgeSummary()", "public CultMeshDocumentHandle StarbridgePlayerSeat(", "public CultMeshReactiveDocument ReactiveStarbridgePlayerSeat(" }; @@ -8394,11 +8399,15 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (clientState.Contains("public Task LatestAsync", StringComparison.Ordinal) || clientState.Contains("public TDocument Latest", StringComparison.Ordinal) || + clientState.Contains("public CultMeshDocumentHandle Document", StringComparison.Ordinal) || + clientState.Contains("public CultMeshReactiveDocument Reactive", StringComparison.Ordinal) || + clientState.Contains("TryGetDocument", StringComparison.Ordinal) || + clientState.Contains("CultMeshDocumentCatalog", StringComparison.Ordinal) || clientState.Contains("public Task> ReactiveAsync", StringComparison.Ordinal) || clientState.Contains("public Observable Watch", StringComparison.Ordinal)) { throw new InvalidOperationException( - "AetheriaClientState must not reintroduce generic latest/watch shortcuts; callers should sample native typed document handles."); + "AetheriaClientState must not reintroduce generic document catalogs or latest/watch shortcuts; callers should use named typed document handles."); } var forbiddenFixedReactiveWrappers = new[] @@ -8748,7 +8757,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (!clientState.Contains("StarbridgeSummary", StringComparison.Ordinal) || !checkedSources["DaemonRuntimeDocumentTests.cs"].Contains( - "client.State.Document()", + "client.State.StarbridgeSummaryDocument()", StringComparison.Ordinal)) { throw new InvalidOperationException( @@ -12071,8 +12080,8 @@ static void RequireAetheriaRuntimeVerseClientContract(string root) "managedDaemonFrame = state.ReactiveDaemonFrame();", "managedCatalog = state.ReactiveCatalogSnapshot();", "managedLoadoutTemplates = state.ReactiveLoadoutTemplates();", - "managedStarbridgeScenario = state.Reactive();", - "managedStarbridgeSession = state.Reactive();", + "managedStarbridgeScenario = state.ReactiveStarbridgeScenario();", + "managedStarbridgeSession = state.ReactiveStarbridgeSession();", "AetheriaRuntimeDaemonFrameDocument RequireManagedFrame()", "RequireManagedFrame()", "RequireManagedCatalog()", @@ -12184,7 +12193,7 @@ static void RequireAetheriaRuntimeVerseClientContract(string root) client.Contains("latestFrameDocument.Reactive()", StringComparison.Ordinal)) { throw new InvalidOperationException( - "Aetheria Verse client derived documents must sample directly owned generic reactive typed documents instead of a named input/session wrapper."); + "Aetheria Verse client derived documents must sample directly owned named reactive typed documents instead of an input/session wrapper."); } if (client.Contains("AetheriaRuntimeReactiveProjectionInputs", StringComparison.Ordinal) || @@ -12232,16 +12241,17 @@ static void RequireAetheriaRuntimeVerseClientContract(string root) { "public CultMeshStateRefResolver CreateEveSurfaceCultMeshStateRefResolver()", "public sealed class AetheriaClientState : IDisposable", - "public CultMeshDocumentHandle Document(int index)", - "public CultMeshReactiveDocument Reactive(int index)", - "Aetheria typed state does not expose an indexed document", + "public CultMeshDocumentHandle Inventory(", + "public CultMeshReactiveDocument ReactiveInventory(", + "public CultMeshDocumentHandle StarbridgeSessionDocument()", + "public CultMeshReactiveDocument ReactiveStarbridgeSession()", "CultMeshReactiveDocument? _eveStateRefFrame", "CultMeshReactiveDocument? _eveStateRefHealth", "CultMeshReactiveDocument? _eveStateRefCommandBoundary", "CultMeshReactiveDocument? _eveStateRefCatalog", "_eveStateRefFrame ??= ReactiveDaemonFrame()", - "_eveStateRefHealth ??= Reactive()", - "_eveStateRefCommandBoundary ??= Reactive()", + "_eveStateRefHealth ??= ReactiveHealth()", + "_eveStateRefCommandBoundary ??= ReactiveCommandBoundary()", "_eveStateRefCatalog ??= ReactiveCatalogSnapshot()", "() => _eveStateRefFrame.Current", "() => _eveStateRefHealth.Current", @@ -16569,11 +16579,12 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) var requiredManagedStateAccessSymbols = new[] { - "public CultMeshDocumentHandle Document()", - "public CultMeshDocumentHandle Document(AetheriaClientEveSurface surface)", - "public CultMeshDocumentHandle Document(AetheriaRuntimeRtsViewportBounds viewport)", - "public CultMeshDocumentHandle Document(int index)", - "public CultMeshDocumentHandle Document(string seatId)" + "public CultMeshDocumentHandle DaemonFrameDocument()", + "public CultMeshDocumentHandle CatalogSnapshot()", + "public CultMeshDocumentHandle CurrentEntityDocument()", + "public CultMeshDocumentHandle ObjectsViewport(", + "public CultMeshDocumentHandle Inventory(", + "public CultMeshDocumentHandle StarbridgePlayerSeat(" }; var missingManagedStateAccessSymbols = requiredManagedStateAccessSymbols .Where(symbol => !aetheriaClientState.Contains(symbol, StringComparison.Ordinal)) @@ -16581,19 +16592,23 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) if (missingManagedStateAccessSymbols.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must expose direct typed document handles instead of AetheriaClient forwarding shortcuts or per-document session wrappers: " + + "AetheriaClientState must expose direct named typed document handles instead of AetheriaClient forwarding shortcuts or per-document session wrappers: " + string.Join(", ", missingManagedStateAccessSymbols)); } if (aetheriaClientState.Contains("public Task LatestAsync", StringComparison.Ordinal) || aetheriaClientState.Contains("public TDocument Latest", StringComparison.Ordinal) || aetheriaClientState.Contains("public Observable Watch", StringComparison.Ordinal) || + aetheriaClientState.Contains("public CultMeshDocumentHandle Document", StringComparison.Ordinal) || + aetheriaClientState.Contains("public CultMeshReactiveDocument Reactive", StringComparison.Ordinal) || + aetheriaClientState.Contains("TryGetDocument", StringComparison.Ordinal) || + aetheriaClientState.Contains("CultMeshDocumentCatalog", StringComparison.Ordinal) || aetheriaClientState.Contains("public Task> ReactiveAsync", StringComparison.Ordinal) || aetheriaClientState.Contains("DocumentBySchema(", StringComparison.Ordinal) || aetheriaClientState.Contains("TryGetDocumentBySchema(", StringComparison.Ordinal)) { throw new InvalidOperationException( - "AetheriaClientState still exposes generic latest/watch or schema-string shortcuts instead of direct typed CultMesh document handles."); + "AetheriaClientState still exposes generic document catalogs, latest/watch, or schema-string shortcuts instead of direct named typed CultMesh document handles."); } if (aetheriaClientState.Contains("public AetheriaRuntimeDaemonRenderView? CurrentObservedDaemon(", StringComparison.Ordinal) || diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index 576aedd0c..e9e464fb5 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -166,13 +166,13 @@ public class DaemonRuntimeDocumentTests .GetAwaiter() .GetResult(); - var currentEntity = ReadLatest(client.State.Document()); + var currentEntity = ReadLatest(client.State.CurrentEntityDocument()); var latestFrame = ReadLatest(client.State.DaemonFrameDocument()); - var catalog = ReadLatest(client.State.Document()); - var playerSettings = ReadLatest(client.State.Document()); + var catalog = ReadLatest(client.State.CatalogSnapshot()); + var playerSettings = ReadLatest(client.State.PlayerSettingsDocument()); var verseHostSettings = ReadLatest(client.State.VerseHostSettingsDocument()); var currentEntityByType = client.State - .Document() + .CurrentEntityDocument() .LatestAsync() .GetAwaiter() .GetResult(); @@ -192,12 +192,12 @@ public class DaemonRuntimeDocumentTests var zoneDetails = ReadLatest(client.State.ZoneDetails(0)); var inventory = ReadLatest(client.State.Inventory(0)); var currentEntityFromClientType = client.State - .Document() + .CurrentEntityDocument() .LatestAsync() .GetAwaiter() .GetResult(); using var currentEntityReactive = client.State - .Document() + .CurrentEntityDocument() .ReactiveAsync() .GetAwaiter() .GetResult(); @@ -230,38 +230,38 @@ public class DaemonRuntimeDocumentTests using var playerHudCatalog = client.State.ReactiveCatalogSnapshot(); using var playerHudSettings = client.State.ReactivePlayerSettingsDocument(); using var playerHudEntity = client.State.ReactiveCurrentEntity(); - var gameSurface = ReadLatest(client.State.Document(AetheriaClientEveSurface.Game)); - var gameTuiSurface = ReadLatest(client.State.Document(AetheriaClientEveSurface.GameTui)); - var editorSurface = ReadLatest(client.State.Document(AetheriaClientEveSurface.Editor)); - var editorTuiSurface = ReadLatest(client.State.Document(AetheriaClientEveSurface.EditorTui)); - var authorityStatus = ReadLatest(client.State.Document()); + var gameSurface = ReadLatest(client.State.GameSurface); + var gameTuiSurface = ReadLatest(client.State.GameTuiSurface); + var editorSurface = ReadLatest(client.State.EditorSurface); + var editorTuiSurface = ReadLatest(client.State.EditorTuiSurface); + var authorityStatus = ReadLatest(client.State.AuthorityPolicyDocument()); var currentDocking = client.State.CurrentDockingDocument .LatestAsync() .GetAwaiter() .GetResult(); - var stationRefit = ReadLatest(client.State.Document()); + var stationRefit = ReadLatest(client.State.StationRefitDocument()); Assert.AreEqual(currentEntity.EntityKey, currentEntityDocumentReactive.Current.EntityKey); Assert.AreEqual(currentDocking.CurrentEntityKey, currentDockingReactive.Current.CurrentEntityKey); Assert.AreEqual(stationRefit.StationEntityKey, stationRefitReactive.Current.StationEntityKey); - using var reactiveGameSurface = client.State.Reactive(AetheriaClientEveSurface.Game); - using var reactiveGameTuiSurface = client.State.Reactive(AetheriaClientEveSurface.GameTui); - using var reactiveEditorSurface = client.State.Reactive(AetheriaClientEveSurface.Editor); - using var reactiveEditorTuiSurface = client.State.Reactive(AetheriaClientEveSurface.EditorTui); + using var reactiveGameSurface = client.State.GameSurface.Reactive(); + using var reactiveGameTuiSurface = client.State.GameTuiSurface.Reactive(); + using var reactiveEditorSurface = client.State.EditorSurface.Reactive(); + using var reactiveEditorTuiSurface = client.State.EditorTuiSurface.Reactive(); Assert.AreEqual("aetheria.current.entity", client.State.CurrentEntity.DocumentId); - Assert.AreSame(client.State.CurrentEntity, client.State.Document()); - Assert.AreSame(client.State.Catalog, client.State.Document()); + Assert.AreSame(client.State.CurrentEntity, client.State.CurrentEntityDocument()); + Assert.AreSame(client.State.Catalog, client.State.CatalogSnapshot()); Assert.AreSame(client.State.ZoneRender, client.State.ZoneRenderDocument()); Assert.AreSame( client.State.StarbridgeSummary, - client.State.Document()); + client.State.StarbridgeSummaryDocument()); Assert.AreSame(client.State.DaemonFrame, client.State.DaemonFrameDocument()); Assert.AreSame(client.State.DaemonSoaView, client.State.DaemonSoaViewDocument()); - Assert.IsNotNull(ReadLatest(client.State.Document())); - Assert.IsNotNull(ReadLatest(client.State.Document())); - Assert.IsNotNull(ReadLatest(client.State.Document())); + Assert.IsNotNull(ReadLatest(client.State.ProviderAdvertisementDocument())); + Assert.IsNotNull(ReadLatest(client.State.HealthDocument())); + Assert.IsNotNull(ReadLatest(client.State.CommandBoundaryDocument())); Assert.AreSame( - client.State.Document(), + client.State.AuthorityPolicyDocument(), client.State.AuthorityPolicy); Assert.AreEqual(AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId, reactiveGameSurface.Current.Surface.Id); Assert.AreEqual(AetheriaRuntimeDaemonGameSurfaceBuilder.TuiSurfaceId, reactiveGameTuiSurface.Current.Surface.Id); @@ -269,15 +269,14 @@ public class DaemonRuntimeDocumentTests Assert.AreEqual(AetheriaRuntimeDaemonEditorSurfaceBuilder.TuiSurfaceId, reactiveEditorTuiSurface.Current.Surface.Id); Assert.AreEqual(currentDocking.CurrentEntityKey, currentDockingReactive.Current.CurrentEntityKey); Assert.AreEqual(stationRefit.StationEntityKey, stationRefitReactive.Current.StationEntityKey); - Assert.AreSame(client.State.PlayerSettings, client.State.Document()); + Assert.AreSame(client.State.PlayerSettings, client.State.PlayerSettingsDocument()); Assert.AreSame(client.State.VerseHostSettings, client.State.VerseHostSettingsDocument()); - Assert.AreSame(client.State.CurrentEntity, client.State.Document()); + Assert.AreSame(client.State.CurrentEntity, client.State.CurrentEntityDocument()); Assert.AreSame(client.State.ZoneContacts, client.State.ZoneContactsDocument()); Assert.AreEqual( typeof(AetheriaRuntimeCurrentEntityDocument), - client.State.Document().DocumentType); - Assert.IsTrue(client.State.TryGetDocument(out var sectorMapDocument)); - Assert.AreSame(client.State.SectorMap, sectorMapDocument); + client.State.CurrentEntityDocument().DocumentType); + Assert.AreSame(client.State.SectorMap, client.State.SectorMapDocument()); Assert.AreEqual(AetheriaRuntimeDaemonSchemas.CurrentEntity, currentEntity.Schema); Assert.AreEqual(AetheriaRuntimeDaemonSchemas.Frame, latestFrame.Schema); Assert.AreEqual(frame.FrameId, latestFrame.FrameId); @@ -361,9 +360,9 @@ public class DaemonRuntimeDocumentTests .GetAwaiter() .GetResult(); - var player = ReadLatest(client.State.Document()); + var player = ReadLatest(client.State.PlayerSettingsDocument()); var verseHost = ReadLatest(client.State.VerseHostSettingsDocument()); - var catalog = ReadLatest(client.State.Document()); + var catalog = ReadLatest(client.State.CatalogSnapshot()); Assert.AreEqual(AetheriaRuntimeCatalogSnapshot.SchemaId, client.State.Catalog.Sources.Last().SchemaId); Assert.IsNotNull(catalog); @@ -371,7 +370,7 @@ public class DaemonRuntimeDocumentTests Assert.AreEqual(AetheriaRuntimeVerseHostSettingsDocument.SchemaId, verseHost.Schema); Assert.AreEqual("", player.PlayerName); Assert.AreEqual("", verseHost.VerseId); - Assert.AreSame(client.State.PlayerSettings, client.State.Document()); + Assert.AreSame(client.State.PlayerSettings, client.State.PlayerSettingsDocument()); Assert.AreSame(client.State.VerseHostSettings, client.State.VerseHostSettingsDocument()); } @@ -597,10 +596,10 @@ public class DaemonRuntimeDocumentTests .OpenAsync(statePath, "unity-surface-test", pullOnOpen: true) .GetAwaiter() .GetResult(); - var unityGameSurfaceState = ReadLatest(client.State.Document(AetheriaClientEveSurface.Game)); - var unityGameTuiSurfaceState = ReadLatest(client.State.Document(AetheriaClientEveSurface.GameTui)); - var unityEditorSurfaceState = ReadLatest(client.State.Document(AetheriaClientEveSurface.Editor)); - var unityEditorTuiSurfaceState = ReadLatest(client.State.Document(AetheriaClientEveSurface.EditorTui)); + var unityGameSurfaceState = ReadLatest(client.State.GameSurface); + var unityGameTuiSurfaceState = ReadLatest(client.State.GameTuiSurface); + var unityEditorSurfaceState = ReadLatest(client.State.EditorSurface); + var unityEditorTuiSurfaceState = ReadLatest(client.State.EditorTuiSurface); var surfaceResolver = client.State.CreateEveSurfaceCultMeshStateRefResolver(); var unityGameSurface = AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument( unityGameSurfaceState, @@ -632,7 +631,7 @@ public class DaemonRuntimeDocumentTests Assert.AreEqual(AetheriaRuntimeDaemonEditorSurfaceBuilder.TuiSurfaceId, unityEditorTuiSurface.Surface.Id); Assert.AreEqual("editor.daemon", unityEditorTuiSurface.ProviderKind); var genericGameSurface = AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument( - ReadLatest(client.State.Document(AetheriaClientEveSurface.Game)), + ReadLatest(client.State.GameSurface), surfaceResolver); Assert.AreEqual(AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId, genericGameSurface.Surface.Id); Assert.AreEqual(unityGameSurface.ProviderId, genericGameSurface.ProviderId); @@ -655,11 +654,11 @@ public class DaemonRuntimeDocumentTests AetheriaRuntimeDaemonStateRefs.CurrentTargetName, AetheriaRuntimeDaemonSchemas.Frame)); var genericGameTuiSurface = AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument( - ReadLatest(client.State.Document(AetheriaClientEveSurface.GameTui)), + ReadLatest(client.State.GameTuiSurface), surfaceResolver); Assert.AreEqual(AetheriaRuntimeDaemonGameSurfaceBuilder.TuiSurfaceId, genericGameTuiSurface.Surface.Id); var genericEditorTuiSurface = AetheriaRuntimeEveSurfaceAdapter.ToEveSurfaceDocument( - ReadLatest(client.State.Document(AetheriaClientEveSurface.EditorTui)), + ReadLatest(client.State.EditorTuiSurface), surfaceResolver); Assert.AreEqual(AetheriaRuntimeDaemonEditorSurfaceBuilder.TuiSurfaceId, genericEditorTuiSurface.Surface.Id); } diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs index 3584cf275..d30be3331 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs @@ -15,7 +15,6 @@ namespace GameCult.Aetheria.State.Verse public sealed class AetheriaClientState : IDisposable { - private readonly CultMeshDocumentCatalog _documents; private readonly Func> _mapViewport; private readonly Func> _objectsViewport; private readonly Func> _gravityViewport; @@ -95,41 +94,56 @@ namespace GameCult.Aetheria.State.Verse StarbridgeSession = starbridgeSession ?? throw new ArgumentNullException(nameof(starbridgeSession)); StarbridgeSummary = starbridgeSummary ?? throw new ArgumentNullException(nameof(starbridgeSummary)); _starbridgePlayerSeat = starbridgePlayerSeat ?? throw new ArgumentNullException(nameof(starbridgePlayerSeat)); - _documents = CultMesh.Documents( - ProviderAdvertisement, - Health, - CommandBoundary, - AuthorityPolicy, - GameSurface, - GameTuiSurface, - EditorSurface, - EditorTuiSurface, - DaemonFrame, - DaemonSoaView, - Catalog, - LoadoutTemplates, - PlayerSettings, - VerseHostSettings, - CurrentZone, - CurrentEntity, - CurrentDockingDocument, - ZoneContacts, - StationRefit, - SectorMap, - ZoneRender, - StarbridgeScenario, - StarbridgeSession, - StarbridgeSummary); } public CultMeshDocumentHandle ProviderAdvertisement { get; } + public CultMeshDocumentHandle ProviderAdvertisementDocument() + { + return ProviderAdvertisement; + } + + public CultMeshReactiveDocument ReactiveProviderAdvertisement() + { + return ProviderAdvertisementDocument().Reactive(); + } + public CultMeshDocumentHandle Health { get; } + public CultMeshDocumentHandle HealthDocument() + { + return Health; + } + + public CultMeshReactiveDocument ReactiveHealth() + { + return HealthDocument().Reactive(); + } + public CultMeshDocumentHandle CommandBoundary { get; } + public CultMeshDocumentHandle CommandBoundaryDocument() + { + return CommandBoundary; + } + + public CultMeshReactiveDocument ReactiveCommandBoundary() + { + return CommandBoundaryDocument().Reactive(); + } + public CultMeshDocumentHandle AuthorityPolicy { get; } + public CultMeshDocumentHandle AuthorityPolicyDocument() + { + return AuthorityPolicy; + } + + public CultMeshReactiveDocument ReactiveAuthorityPolicy() + { + return AuthorityPolicyDocument().Reactive(); + } + public CultMeshDocumentHandle DaemonFrame { get; } public CultMeshDocumentHandle DaemonSoaView { get; } @@ -158,10 +172,40 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle StarbridgeScenario { get; } + public CultMeshDocumentHandle StarbridgeScenarioDocument() + { + return StarbridgeScenario; + } + + public CultMeshReactiveDocument ReactiveStarbridgeScenario() + { + return StarbridgeScenarioDocument().Reactive(); + } + public CultMeshDocumentHandle StarbridgeSession { get; } + public CultMeshDocumentHandle StarbridgeSessionDocument() + { + return StarbridgeSession; + } + + public CultMeshReactiveDocument ReactiveStarbridgeSession() + { + return StarbridgeSessionDocument().Reactive(); + } + public CultMeshDocumentHandle StarbridgeSummary { get; } + public CultMeshDocumentHandle StarbridgeSummaryDocument() + { + return StarbridgeSummary; + } + + public CultMeshReactiveDocument ReactiveStarbridgeSummary() + { + return StarbridgeSummaryDocument().Reactive(); + } + public CultMeshDocumentHandle ZoneContacts { get; } public CultMeshDocumentHandle StationRefit { get; } @@ -170,29 +214,6 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle ZoneRender { get; } - public bool TryGetDocument( - out CultMeshDocumentHandle document) - where TDocument : class - { - return _documents.TryGetDocument(out document); - } - - public CultMeshDocumentHandle Document() - where TDocument : class - { - if (TryGetDocument(out var document)) - return document; - - throw new NotSupportedException( - $"Aetheria typed state does not expose a managed document for {typeof(TDocument).FullName}."); - } - - public CultMeshReactiveDocument Reactive() - where TDocument : class - { - return Document().Reactive(); - } - public CultMeshDocumentHandle DaemonFrameDocument() { return DaemonFrame; @@ -358,25 +379,10 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle? EveSurfaceDocument( string? surfaceId) { - return TryResolveEveSurface(surfaceId, out var surface) - ? Document(surface) - : null; - } + if (!TryResolveEveSurface(surfaceId, out var surface)) + return null; - public CultMeshReactiveDocument? ReactiveEveSurface( - string? surfaceId) - { - return EveSurfaceDocument(surfaceId)?.Reactive(); - } - - public CultMeshDocumentHandle Document(AetheriaClientEveSurface surface) - where TDocument : class - { - if (typeof(TDocument) != typeof(global::Aetheria.State.Documents.EveSurfaceState)) - throw new NotSupportedException( - $"Aetheria typed state does not expose an Eve surface document for {typeof(TDocument).FullName}."); - - var document = surface switch + return surface switch { AetheriaClientEveSurface.Game => GameSurface, AetheriaClientEveSurface.GameTui => GameTuiSurface, @@ -384,37 +390,12 @@ namespace GameCult.Aetheria.State.Verse AetheriaClientEveSurface.EditorTui => EditorTuiSurface, _ => throw new ArgumentOutOfRangeException(nameof(surface), surface, null) }; - return (CultMeshDocumentHandle)(object)document; } - public CultMeshReactiveDocument Reactive(AetheriaClientEveSurface surface) - where TDocument : class + public CultMeshReactiveDocument? ReactiveEveSurface( + string? surfaceId) { - return Document(surface).Reactive(); - } - - public CultMeshDocumentHandle Document(AetheriaRuntimeRtsViewportBounds viewport) - where TDocument : class - { - viewport ??= new AetheriaRuntimeRtsViewportBounds(); - - if (typeof(TDocument) == typeof(AetheriaRuntimeRtsViewportDocument)) - return (CultMeshDocumentHandle)(object)_mapViewport(viewport); - if (typeof(TDocument) == typeof(AetheriaRuntimeObjectsViewportDocument)) - return (CultMeshDocumentHandle)(object)_objectsViewport(viewport); - if (typeof(TDocument) == typeof(AetheriaRuntimeGravityViewportDocument)) - return (CultMeshDocumentHandle)(object)_gravityViewport(viewport); - if (typeof(TDocument) == typeof(AetheriaRuntimeRenderSplatsViewportDocument)) - return (CultMeshDocumentHandle)(object)_renderSplatsViewport(viewport); - - throw new NotSupportedException( - $"Aetheria typed state does not expose a viewport document for {typeof(TDocument).FullName}."); - } - - public CultMeshReactiveDocument Reactive(AetheriaRuntimeRtsViewportBounds viewport) - where TDocument : class - { - return Document(viewport).Reactive(); + return EveSurfaceDocument(surfaceId)?.Reactive(); } public CultMeshDocumentHandle RtsViewport( @@ -465,29 +446,6 @@ namespace GameCult.Aetheria.State.Verse return RenderSplatsViewport(viewport).Reactive(); } - public CultMeshDocumentHandle Document(int index) - where TDocument : class - { - if (index < 0) - throw new ArgumentOutOfRangeException(nameof(index), index, "Aetheria document index must be non-negative."); - - if (typeof(TDocument) == typeof(AetheriaRuntimeZoneDetailsDocument)) - return (CultMeshDocumentHandle)(object)_zoneDetails(index); - if (typeof(TDocument) == typeof(AetheriaRuntimeSelectedObjectDocument)) - return (CultMeshDocumentHandle)(object)_selectedObject(index); - if (typeof(TDocument) == typeof(AetheriaRuntimeInventoryDocument)) - return (CultMeshDocumentHandle)(object)_inventory(index); - - throw new NotSupportedException( - $"Aetheria typed state does not expose an indexed document for {typeof(TDocument).FullName}."); - } - - public CultMeshReactiveDocument Reactive(int index) - where TDocument : class - { - return Document(index).Reactive(); - } - public CultMeshDocumentHandle ZoneDetails(int zoneIndex) { if (zoneIndex < 0) @@ -527,24 +485,6 @@ namespace GameCult.Aetheria.State.Verse return Inventory(entityIndex).Reactive(); } - public CultMeshDocumentHandle Document(string seatId) - where TDocument : class - { - if (typeof(TDocument) != typeof(AetheriaRuntimeStarbridgePlayerSeatDocument)) - throw new NotSupportedException( - $"Aetheria typed state does not expose a keyed document for {typeof(TDocument).FullName}."); - if (string.IsNullOrWhiteSpace(seatId)) - throw new ArgumentException("Seat id must be non-empty.", nameof(seatId)); - - return (CultMeshDocumentHandle)(object)_starbridgePlayerSeat(seatId); - } - - public CultMeshReactiveDocument Reactive(string seatId) - where TDocument : class - { - return Document(seatId).Reactive(); - } - public CultMeshDocumentHandle StarbridgePlayerSeat(string seatId) { if (string.IsNullOrWhiteSpace(seatId)) @@ -562,8 +502,8 @@ namespace GameCult.Aetheria.State.Verse public CultMeshStateRefResolver CreateEveSurfaceCultMeshStateRefResolver() { _eveStateRefFrame ??= ReactiveDaemonFrame(); - _eveStateRefHealth ??= Reactive(); - _eveStateRefCommandBoundary ??= Reactive(); + _eveStateRefHealth ??= ReactiveHealth(); + _eveStateRefCommandBoundary ??= ReactiveCommandBoundary(); _eveStateRefCatalog ??= ReactiveCatalogSnapshot(); return AetheriaRuntimeStateRefResolver.CreateEveSurfaceCultMeshStateRefResolver( diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs index 8984706c3..ba07ca077 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeVerseClient.cs @@ -500,8 +500,8 @@ namespace GameCult.Aetheria.State.Verse managedDaemonFrame = state.ReactiveDaemonFrame(); managedCatalog = state.ReactiveCatalogSnapshot(); managedLoadoutTemplates = state.ReactiveLoadoutTemplates(); - managedStarbridgeScenario = state.Reactive(); - managedStarbridgeSession = state.Reactive(); + managedStarbridgeScenario = state.ReactiveStarbridgeScenario(); + managedStarbridgeSession = state.ReactiveStarbridgeSession(); _managedDaemonFrame = managedDaemonFrame; _managedCatalog = managedCatalog; _managedLoadoutTemplates = managedLoadoutTemplates;