diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 451de1815..25585dbec 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -2438,7 +2438,7 @@ static void RequireDaemonRenderQueryAuthority(string root) "FindAnyObjectByType()", "ResolveObjectsViewport(viewport)", "private AetheriaRuntimeObjectsViewportDocument ResolveObjectsViewport(AetheriaRuntimeXzRect viewport)", - ".Reactive(", + ".ReactiveObjectsViewport(", "\"unity-zone-renderer\"", "_objectsViewport?.Current", "foreach (var entity in objects?.Objects ?? Array.Empty())", @@ -4576,7 +4576,7 @@ static void RequireSectorMapZoneDetailsUseEveSurface(string root) "zoneFacts.Entities", "AetheriaUnityRuntimeClientProvider", ".ReactiveSectorMap(\"unity-sector-renderer\")", - ".Reactive(zoneIndex, \"unity-sector-renderer\")", + ".ReactiveZoneDetails(zoneIndex, \"unity-sector-renderer\")", "_zoneDetails?.Current", "AetheriaRuntimeZoneDetailsSurfaceCommands.TryRead(request, out var command)", "AetheriaRuntimeZoneDetailsCommandKind.Close" @@ -4614,7 +4614,7 @@ static void RequireSectorMapZoneDetailsUseEveSurface(string root) "SectorRenderer", "AetheriaRuntimeZoneDetailsDocument", "_zoneDetails", - ".Reactive(zoneIndex, \"unity-sector-renderer\")", + ".ReactiveZoneDetails(zoneIndex, \"unity-sector-renderer\")", "AetheriaRuntimeZoneDetailsSession", ".ObserveZone(zoneIndex)"); RequireReactiveTypedDocumentAccess( @@ -7220,7 +7220,7 @@ static void RequireInventoryValidationUsesManagedTypedDocuments(string root) { currentEntityAccess, stationRefitAccess, - ".Reactive(entityIndex)" + ".ReactiveInventory(entityIndex)" }; missingSymbols = missingSymbols .Concat(requiredCompactedSymbols.Where(symbol => !compact.Contains(symbol, StringComparison.Ordinal))) @@ -7279,7 +7279,7 @@ static void RequireInventoryValidationUsesManagedTypedDocuments(string root) name, "AetheriaRuntimeInventoryDocument", "_inventory", - ".Reactive(entityIndex)", + ".ReactiveInventory(entityIndex)", "AetheriaRuntimeInventorySession", ".ObserveInventory(entityIndex)"); } @@ -7732,8 +7732,8 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) missingMapRendererSharedDocumentSymbols = missingMapRendererSharedDocumentSymbols .Concat(new[] { - ".Reactive(viewport,\"unity-map-renderer\")", - ".Reactive(viewport,\"unity-map-renderer\")" + ".ReactiveObjectsViewport(viewport,\"unity-map-renderer\")", + ".ReactiveRenderSplatsViewport(viewport,\"unity-map-renderer\")" }.Where(symbol => !compactMapRenderer.Contains(symbol, StringComparison.Ordinal))) .ToArray(); if (missingMapRendererSharedDocumentSymbols.Length > 0) @@ -7748,7 +7748,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "MapRenderer", "AetheriaRuntimeObjectsViewportDocument", "_objectsViewport", - ".Reactive(viewport,\"unity-map-renderer\")", + ".ReactiveObjectsViewport(viewport,\"unity-map-renderer\")", "AetheriaRuntimeObjectsViewportSession", ".ObserveObjects(viewport)"); RequireReactiveTypedDocumentAccess( @@ -7756,7 +7756,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "MapRenderer", "AetheriaRuntimeRenderSplatsViewportDocument", "_renderSplatsViewport", - ".Reactive(viewport,\"unity-map-renderer\")", + ".ReactiveRenderSplatsViewport(viewport,\"unity-map-renderer\")", "AetheriaRuntimeRenderSplatsViewportSession", ".ObserveRenderSplats(viewport)"); RequireReactiveTypedDocumentAccess( @@ -7971,7 +7971,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) { ".ReactiveSectorMap(\"unity-sector-renderer\")", ".ReactiveCurrentZone(\"unity-sector-renderer\")", - ".Reactive(zoneIndex,\"unity-sector-renderer\")" + ".ReactiveZoneDetails(zoneIndex,\"unity-sector-renderer\")" }.Where(symbol => !compactSectorRenderer.Contains(symbol, StringComparison.Ordinal))) .ToArray(); if (missingSectorRendererSharedDocumentSymbols.Length > 0) @@ -8002,7 +8002,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "SectorRenderer", "AetheriaRuntimeZoneDetailsDocument", "_zoneDetails", - ".Reactive(zoneIndex,\"unity-sector-renderer\")", + ".ReactiveZoneDetails(zoneIndex,\"unity-sector-renderer\")", "AetheriaRuntimeZoneDetailsSession", ".ObserveZone(zoneIndex)"); RequireReactiveTypedDocumentAccess( @@ -8114,8 +8114,12 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) var requiredClientSymbols = new[] { "public CultMeshDocumentHandle Document()", - "public CultMeshDocumentHandle Document(AetheriaRuntimeRtsViewportBounds viewport)", - "public CultMeshDocumentHandle Document(int index)" + "public CultMeshDocumentHandle ObjectsViewport(", + "public CultMeshReactiveDocument ReactiveObjectsViewport(", + "public CultMeshDocumentHandle RenderSplatsViewport(", + "public CultMeshReactiveDocument ReactiveRenderSplatsViewport(", + "public CultMeshDocumentHandle ZoneDetails(", + "public CultMeshReactiveDocument ReactiveZoneDetails(" }; var missingClientSymbols = requiredClientSymbols .Where(symbol => !clientState.Contains(symbol, StringComparison.Ordinal)) @@ -8123,7 +8127,7 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) if (missingClientSymbols.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must expose generic parameterized document handles for map, viewport, indexed, contacts, and current-entity documents: " + + "AetheriaClientState must expose named parameterized document handles for map, viewport, indexed, contacts, and current-entity documents: " + string.Join(", ", missingClientSymbols)); } @@ -8191,11 +8195,11 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) .Where(symbol => !renderSplatViewportSource.Contains(symbol, StringComparison.Ordinal)) .ToArray(); if (!CompactSource(renderSplatViewportSource).Contains( - ".Reactive(viewport,\"unity-render-splat-viewport\")", + ".ReactiveRenderSplatsViewport(viewport,\"unity-render-splat-viewport\")", StringComparison.Ordinal)) { missingRenderSplatViewportSourceSymbols = missingRenderSplatViewportSourceSymbols - .Concat(new[] { ".Reactive(viewport,\"unity-render-splat-viewport\")" }) + .Concat(new[] { ".ReactiveRenderSplatsViewport(viewport,\"unity-render-splat-viewport\")" }) .ToArray(); } if (missingRenderSplatViewportSourceSymbols.Length > 0 || @@ -8218,7 +8222,7 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) "AetheriaUnityRenderSplatViewportSource", "AetheriaRuntimeRenderSplatsViewportDocument", "_renderSplatsViewport", - ".Reactive(viewport,\"unity-render-splat-viewport\")", + ".ReactiveRenderSplatsViewport(viewport,\"unity-render-splat-viewport\")", "AetheriaRuntimeRenderSplatsViewportSession", ".ObserveRenderSplats(viewport)"); @@ -8238,11 +8242,11 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) .Where(symbol => !zoneRenderer.Contains(symbol, StringComparison.Ordinal)) .ToArray(); if (!CompactSource(zoneRenderer).Contains( - ".Reactive(viewportBounds,\"unity-zone-renderer\")", + ".ReactiveObjectsViewport(viewportBounds,\"unity-zone-renderer\")", StringComparison.Ordinal)) { missingZoneRendererViewportSymbols = missingZoneRendererViewportSymbols - .Concat(new[] { ".Reactive(viewportBounds,\"unity-zone-renderer\")" }) + .Concat(new[] { ".ReactiveObjectsViewport(viewportBounds,\"unity-zone-renderer\")" }) .ToArray(); } if (missingZoneRendererViewportSymbols.Length > 0 || @@ -8265,11 +8269,11 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) "ZoneRenderer", "AetheriaRuntimeObjectsViewportDocument", "_objectsViewport", - ".Reactive(viewportBounds,\"unity-zone-renderer\")", + ".ReactiveObjectsViewport(viewportBounds,\"unity-zone-renderer\")", "AetheriaRuntimeObjectsViewportSession", ".ObserveObjects(viewportBounds)"); - Console.WriteLine("Viewport and map document accessors: Unity reads fixed map/contact state through named documents and viewport state through managed typed document access"); + Console.WriteLine("Viewport and map document accessors: Unity reads fixed map/contact state and parameterized viewport state through named managed typed documents"); } static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root) @@ -8360,7 +8364,23 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "public CultMeshReactiveDocument Reactive(AetheriaClientEveSurface surface)", "public CultMeshReactiveDocument Reactive(AetheriaRuntimeRtsViewportBounds viewport)", "public CultMeshReactiveDocument Reactive(int index)", - "public CultMeshReactiveDocument Reactive(string seatId)" + "public CultMeshReactiveDocument Reactive(string seatId)", + "public CultMeshDocumentHandle RtsViewport(", + "public CultMeshReactiveDocument ReactiveRtsViewport(", + "public CultMeshDocumentHandle ObjectsViewport(", + "public CultMeshReactiveDocument ReactiveObjectsViewport(", + "public CultMeshDocumentHandle GravityViewport(", + "public CultMeshReactiveDocument ReactiveGravityViewport(", + "public CultMeshDocumentHandle RenderSplatsViewport(", + "public CultMeshReactiveDocument ReactiveRenderSplatsViewport(", + "public CultMeshDocumentHandle ZoneDetails(", + "public CultMeshReactiveDocument ReactiveZoneDetails(", + "public CultMeshDocumentHandle SelectedObject(", + "public CultMeshReactiveDocument ReactiveSelectedObject(", + "public CultMeshDocumentHandle Inventory(", + "public CultMeshReactiveDocument ReactiveInventory(", + "public CultMeshDocumentHandle StarbridgePlayerSeat(", + "public CultMeshReactiveDocument ReactiveStarbridgePlayerSeat(" }; var missingClientSymbols = requiredClientSymbols .Where(symbol => !clientState.Contains(symbol, StringComparison.Ordinal)) @@ -8478,7 +8498,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (survivingFixedReactiveWrappers.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must not reintroduce named fixed-document reactive wrappers; use Document() handles and CultMesh handle reactivity: " + + "AetheriaClientState must not reintroduce latest/async fixed-document wrappers; use named reactive typed documents for ordinary gameplay state: " + string.Join(", ", survivingFixedReactiveWrappers)); } @@ -8503,7 +8523,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (survivingClientStateWrappers.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState still exposes nested wrapper state; use flat typed handles plus generic parameterized Document access: " + + "AetheriaClientState still exposes nested wrapper state; use flat named typed handles for ordinary gameplay state: " + string.Join(", ", survivingClientStateWrappers)); } @@ -8515,15 +8535,12 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "ReactiveMapAsync(", "LatestObjects(", "LatestObjectsAsync(", - "ReactiveObjects(", "ReactiveObjectsAsync(", "LatestGravity(", "LatestGravityAsync(", - "ReactiveGravity(", "ReactiveGravityAsync(", "LatestRenderSplats(", "LatestRenderSplatsAsync(", - "ReactiveRenderSplats(", "ReactiveRenderSplatsAsync(" }; var survivingViewportConvenienceWrappers = forbiddenViewportConvenienceWrappers @@ -8532,7 +8549,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (survivingViewportConvenienceWrappers.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must use generic viewport document access instead of named latest/reactive wrappers: " + + "AetheriaClientState must avoid latest/async viewport wrappers; callers should use named reactive typed viewport documents: " + string.Join(", ", survivingViewportConvenienceWrappers)); } @@ -8544,11 +8561,9 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "ReactiveZoneAsync(", "LatestSelectedObject(", "LatestSelectedObjectAsync(", - "ReactiveSelectedObject(", "ReactiveSelectedObjectAsync(", "LatestInventory(", "LatestInventoryAsync(", - "ReactiveInventory(", "ReactiveInventoryAsync(" }; var survivingDetailConvenienceWrappers = forbiddenDetailConvenienceWrappers @@ -8557,7 +8572,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (survivingDetailConvenienceWrappers.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must use generic scoped document access instead of named latest/reactive wrappers: " + + "AetheriaClientState must avoid latest/async scoped wrappers; callers should use named reactive typed scoped documents: " + string.Join(", ", survivingDetailConvenienceWrappers)); } @@ -8589,7 +8604,8 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root var compactClientState = CompactSource(clientState); var requiredStarbridgeParameterizedSymbols = new[] { - "publicCultMeshDocumentHandleDocument(stringseatId)" + "publicCultMeshDocumentHandleStarbridgePlayerSeat(stringseatId)", + "publicCultMeshReactiveDocumentReactiveStarbridgePlayerSeat(" }; var missingStarbridgeParameterizedSymbols = requiredStarbridgeParameterizedSymbols .Where(symbol => !compactClientState.Contains(symbol, StringComparison.Ordinal)) @@ -8597,7 +8613,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (missingStarbridgeParameterizedSymbols.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must expose generic parameterized document access for player-seat state: " + + "AetheriaClientState must expose named parameterized document access for player-seat state: " + string.Join(", ", missingStarbridgeParameterizedSymbols)); } @@ -8605,7 +8621,6 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root { "LatestPlayerSeat(", "LatestPlayerSeatAsync(", - "ReactivePlayerSeat(", "ReactivePlayerSeatAsync(" }; var survivingStarbridgeConvenienceWrappers = forbiddenStarbridgeConvenienceWrappers @@ -8614,7 +8629,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (survivingStarbridgeConvenienceWrappers.Length > 0) { throw new InvalidOperationException( - "AetheriaClientState must use generic parameterized document access instead of named player-seat latest/reactive wrappers: " + + "AetheriaClientState must avoid latest/async player-seat wrappers; callers should use named reactive typed player-seat documents: " + string.Join(", ", survivingStarbridgeConvenienceWrappers)); } @@ -8741,17 +8756,17 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root } if (!checkedSources["StarbridgePlayerSeatDocumentTests.cs"].Contains( - ".Reactive(seat.SeatId)", + ".ReactiveStarbridgePlayerSeat(seat.SeatId)", StringComparison.Ordinal) || !checkedSources["StarbridgePlayerSeatDocumentTests.cs"].Contains( - ".Document(seat.SeatId)", + ".StarbridgePlayerSeat(seat.SeatId)", StringComparison.Ordinal) || checkedSources["StarbridgePlayerSeatDocumentTests.cs"].Contains( ".Latest(seat.SeatId)", StringComparison.Ordinal)) { throw new InvalidOperationException( - "Starbridge player-seat examples must use generic parameterized managed document access instead of named wrappers or raw handle walks."); + "Starbridge player-seat examples must use named parameterized managed document access instead of raw handle walks."); } Console.WriteLine("Domain document accessors: managed Aetheria state exposes named fixed-document reads plus parameterized viewport/detail/Starbridge/Eve-surface access"); @@ -14738,12 +14753,12 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root) var compactSectorRenderer = CompactSource(sectorRenderer); var compactSectorMap = CompactSource(sectorMap); if (!mapRenderer.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal) || - !compactMapRenderer.Contains(".Reactive(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || - !compactMapRenderer.Contains(".Reactive(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || + !compactMapRenderer.Contains(".ReactiveObjectsViewport(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || + !compactMapRenderer.Contains(".ReactiveRenderSplatsViewport(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || !compactMapRenderer.Contains(".ReactivePlayerSettingsDocument(\"unity-map-renderer\")", StringComparison.Ordinal) || !sectorRenderer.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal) || !compactSectorRenderer.Contains(".ReactiveSectorMap(\"unity-sector-renderer\")", StringComparison.Ordinal) || - !compactSectorRenderer.Contains(".Reactive(zoneIndex,\"unity-sector-renderer\")", StringComparison.Ordinal) || + !compactSectorRenderer.Contains(".ReactiveZoneDetails(zoneIndex,\"unity-sector-renderer\")", StringComparison.Ordinal) || !sectorRenderer.Contains(".Current", StringComparison.Ordinal) || !compactSectorRenderer.Contains(".ReactiveCatalogSnapshot(\"unity-sector-renderer\")", StringComparison.Ordinal) || !compactSectorRenderer.Contains(".ReactivePlayerSettingsDocument(\"unity-sector-renderer\")", StringComparison.Ordinal) || @@ -17736,7 +17751,7 @@ static void RequireInventoryDoubleClickTransferRequestAuthority(string root) "TryResolveTypedInventoryRows(", "TryValidateTypedCargoSlot(", "TryValidateTypedEquipmentSlot(", - ".Reactive(entityIndex)", + ".ReactiveInventory(entityIndex)", "origin.Cargo.TryGetValue(item, out var originPosition)", "SourceIndex == cargoIndex", "SourceIndex == equipmentIndex", diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs b/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs index a716c9df0..cbca2cc65 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs @@ -117,7 +117,7 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour try { var nextRenderSplatsViewport = AetheriaUnityRuntimeClientProvider - .Reactive( + .ReactiveRenderSplatsViewport( viewport, "unity-render-splat-viewport"); ClearViewportDocument(); diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs b/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs index 8dc989e4c..509fa9eb4 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs @@ -337,6 +337,66 @@ public static class AetheriaUnityRuntimeClientProvider return RuntimeState(stateBoot, runtimeId).Reactive(viewport); } + public static CultMeshReactiveDocument ReactiveRtsViewport( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveRtsViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveRtsViewport( + AetheriaRuntimeStateBootReport stateBoot, + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveRtsViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveObjectsViewport( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveObjectsViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveObjectsViewport( + AetheriaRuntimeStateBootReport stateBoot, + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveObjectsViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveGravityViewport( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveGravityViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveGravityViewport( + AetheriaRuntimeStateBootReport stateBoot, + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveGravityViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveRenderSplatsViewport( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveRenderSplatsViewport(viewport); + } + + public static CultMeshReactiveDocument ReactiveRenderSplatsViewport( + AetheriaRuntimeStateBootReport stateBoot, + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveRenderSplatsViewport(viewport); + } + public static CultMeshReactiveDocument Reactive( int index, string runtimeId = "") @@ -354,6 +414,66 @@ public static class AetheriaUnityRuntimeClientProvider return RuntimeState(stateBoot, runtimeId).Reactive(index); } + public static CultMeshReactiveDocument ReactiveZoneDetails( + int zoneIndex, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveZoneDetails(zoneIndex); + } + + public static CultMeshReactiveDocument ReactiveZoneDetails( + AetheriaRuntimeStateBootReport stateBoot, + int zoneIndex, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveZoneDetails(zoneIndex); + } + + public static CultMeshReactiveDocument ReactiveSelectedObject( + int zoneIndex, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveSelectedObject(zoneIndex); + } + + public static CultMeshReactiveDocument ReactiveSelectedObject( + AetheriaRuntimeStateBootReport stateBoot, + int zoneIndex, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveSelectedObject(zoneIndex); + } + + public static CultMeshReactiveDocument ReactiveInventory( + int entityIndex, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveInventory(entityIndex); + } + + public static CultMeshReactiveDocument ReactiveInventory( + AetheriaRuntimeStateBootReport stateBoot, + int entityIndex, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveInventory(entityIndex); + } + + public static CultMeshReactiveDocument ReactiveStarbridgePlayerSeat( + string seatId, + string runtimeId = "") + { + return RuntimeState(runtimeId).ReactiveStarbridgePlayerSeat(seatId); + } + + public static CultMeshReactiveDocument ReactiveStarbridgePlayerSeat( + AetheriaRuntimeStateBootReport stateBoot, + string seatId, + string runtimeId = "") + { + return RuntimeState(stateBoot, runtimeId).ReactiveStarbridgePlayerSeat(seatId); + } + public static CultMeshStateRefResolver EveSurfaceStateRefResolver(string runtimeId = "") { return RuntimeState(runtimeId).CreateEveSurfaceCultMeshStateRefResolver(); diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index af70bb23c..576aedd0c 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -188,9 +188,9 @@ public class DaemonRuntimeDocumentTests MaxX = 100, MaxY = 100 }; - var objectsViewport = ReadLatest(client.State.Document(viewport)); - var zoneDetails = ReadLatest(client.State.Document(0)); - var inventory = ReadLatest(client.State.Document(0)); + var objectsViewport = ReadLatest(client.State.ObjectsViewport(viewport)); + var zoneDetails = ReadLatest(client.State.ZoneDetails(0)); + var inventory = ReadLatest(client.State.Inventory(0)); var currentEntityFromClientType = client.State .Document() .LatestAsync() @@ -220,13 +220,13 @@ public class DaemonRuntimeDocumentTests using var currentEntityDocumentReactive = client.State.ReactiveCurrentEntity(); using var currentDockingReactive = client.State.ReactiveCurrentDocking(); using var stationRefitReactive = client.State.ReactiveStationRefit(); - using var zoneDetailsReactive = client.State.Reactive(0); - using var selectedObjectReactive = client.State.Reactive(0); - using var inventoryReactive = client.State.Reactive(0); - using var mapViewportReactive = client.State.Reactive(viewport); - using var objectsViewportReactive = client.State.Reactive(viewport); - using var gravityViewportReactive = client.State.Reactive(viewport); - using var renderSplatsViewportReactive = client.State.Reactive(viewport); + using var zoneDetailsReactive = client.State.ReactiveZoneDetails(0); + using var selectedObjectReactive = client.State.ReactiveSelectedObject(0); + using var inventoryReactive = client.State.ReactiveInventory(0); + using var mapViewportReactive = client.State.ReactiveRtsViewport(viewport); + using var objectsViewportReactive = client.State.ReactiveObjectsViewport(viewport); + using var gravityViewportReactive = client.State.ReactiveGravityViewport(viewport); + using var renderSplatsViewportReactive = client.State.ReactiveRenderSplatsViewport(viewport); using var playerHudCatalog = client.State.ReactiveCatalogSnapshot(); using var playerHudSettings = client.State.ReactivePlayerSettingsDocument(); using var playerHudEntity = client.State.ReactiveCurrentEntity(); diff --git a/Assets/Scripts/Tests/StarbridgePlayerSeatDocumentTests.cs b/Assets/Scripts/Tests/StarbridgePlayerSeatDocumentTests.cs index 91817f914..1fd779c9a 100644 --- a/Assets/Scripts/Tests/StarbridgePlayerSeatDocumentTests.cs +++ b/Assets/Scripts/Tests/StarbridgePlayerSeatDocumentTests.cs @@ -82,12 +82,12 @@ public class StarbridgePlayerSeatDocumentTests var handle = client.Document( AetheriaRuntimeVerseRecordKeys.StarbridgePlayerSeat(seat.SeatId)); using var reactive = handle.Reactive(); - using var aetheriaSeat = client.State.Reactive(seat.SeatId); + using var aetheriaSeat = client.State.ReactiveStarbridgePlayerSeat(seat.SeatId); Assert.AreEqual("seat-support", handle.Latest().SeatId); Assert.AreEqual( "seat-support", - ReadLatest(client.State.Document(seat.SeatId)).SeatId); + ReadLatest(client.State.StarbridgePlayerSeat(seat.SeatId)).SeatId); Assert.AreEqual("item:cockpit:support", reactive.Current.CockpitItemKey); Assert.AreEqual("item:cockpit:support", aetheriaSeat.Current.CockpitItemKey); Assert.AreEqual("entity:pod:support", reactive.Current.EscapePodEntityKey); diff --git a/Assets/Scripts/UI/Menu/InventoryMenu.cs b/Assets/Scripts/UI/Menu/InventoryMenu.cs index 55d2af012..d1c4b1b3a 100644 --- a/Assets/Scripts/UI/Menu/InventoryMenu.cs +++ b/Assets/Scripts/UI/Menu/InventoryMenu.cs @@ -969,7 +969,7 @@ public class InventoryMenu : MonoBehaviour { var nextInventory = AetheriaUnityRuntimeClientProvider .RuntimeState("unity-inventory-menu") - .Reactive(entityIndex); + .ReactiveInventory(entityIndex); _inventory?.Dispose(); _inventoryEntityIndex = entityIndex; _inventory = nextInventory; diff --git a/Assets/Scripts/UI/Menu/InventoryPanel.cs b/Assets/Scripts/UI/Menu/InventoryPanel.cs index 74c7bad4a..909323db1 100644 --- a/Assets/Scripts/UI/Menu/InventoryPanel.cs +++ b/Assets/Scripts/UI/Menu/InventoryPanel.cs @@ -1553,7 +1553,7 @@ private void Update() { var nextInventory = AetheriaUnityRuntimeClientProvider .RuntimeState("unity-inventory") - .Reactive(entityIndex); + .ReactiveInventory(entityIndex); _inventory?.Dispose(); _inventoryEntityIndex = entityIndex; _inventory = nextInventory; diff --git a/Assets/Scripts/UI/Menu/MapRenderer.cs b/Assets/Scripts/UI/Menu/MapRenderer.cs index b646e79db..c87c67f82 100644 --- a/Assets/Scripts/UI/Menu/MapRenderer.cs +++ b/Assets/Scripts/UI/Menu/MapRenderer.cs @@ -128,9 +128,9 @@ public class MapRenderer : MonoBehaviour var viewport = ResolveViewportBounds(); ClearViewportCaches(); _objectsViewport = AetheriaUnityRuntimeClientProvider - .Reactive(viewport, "unity-map-renderer"); + .ReactiveObjectsViewport(viewport, "unity-map-renderer"); _renderSplatsViewport = AetheriaUnityRuntimeClientProvider - .Reactive(viewport, "unity-map-renderer"); + .ReactiveRenderSplatsViewport(viewport, "unity-map-renderer"); var objectsViewport = _objectsViewport?.Current; var zoneName = string.IsNullOrWhiteSpace(objectsViewport?.ZoneName) diff --git a/Assets/Scripts/UI/Menu/SectorRenderer.cs b/Assets/Scripts/UI/Menu/SectorRenderer.cs index 9143792a0..5141db406 100644 --- a/Assets/Scripts/UI/Menu/SectorRenderer.cs +++ b/Assets/Scripts/UI/Menu/SectorRenderer.cs @@ -197,7 +197,7 @@ public class SectorRenderer : MonoBehaviour, IBeginDragHandler, IDragHandler, IS try { var nextZoneDetails = AetheriaUnityRuntimeClientProvider - .Reactive(zoneIndex, "unity-sector-renderer"); + .ReactiveZoneDetails(zoneIndex, "unity-sector-renderer"); _zoneDetails?.Dispose(); _zoneDetailsIndex = zoneIndex; _zoneDetails = nextZoneDetails; diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index bd92c70f2..cfd43c26e 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -1245,7 +1245,7 @@ public class ZoneRenderer : MonoBehaviour try { var nextObjectsViewport = AetheriaUnityRuntimeClientProvider - .Reactive( + .ReactiveObjectsViewport( viewportBounds, "unity-zone-renderer"); _objectsViewport?.Dispose(); diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs index 187318855..3584cf275 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs @@ -417,6 +417,54 @@ namespace GameCult.Aetheria.State.Verse return Document(viewport).Reactive(); } + public CultMeshDocumentHandle RtsViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return _mapViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); + } + + public CultMeshReactiveDocument ReactiveRtsViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return RtsViewport(viewport).Reactive(); + } + + public CultMeshDocumentHandle ObjectsViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return _objectsViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); + } + + public CultMeshReactiveDocument ReactiveObjectsViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return ObjectsViewport(viewport).Reactive(); + } + + public CultMeshDocumentHandle GravityViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return _gravityViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); + } + + public CultMeshReactiveDocument ReactiveGravityViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return GravityViewport(viewport).Reactive(); + } + + public CultMeshDocumentHandle RenderSplatsViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return _renderSplatsViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); + } + + public CultMeshReactiveDocument ReactiveRenderSplatsViewport( + AetheriaRuntimeRtsViewportBounds viewport) + { + return RenderSplatsViewport(viewport).Reactive(); + } + public CultMeshDocumentHandle Document(int index) where TDocument : class { @@ -440,6 +488,45 @@ namespace GameCult.Aetheria.State.Verse return Document(index).Reactive(); } + public CultMeshDocumentHandle ZoneDetails(int zoneIndex) + { + if (zoneIndex < 0) + throw new ArgumentOutOfRangeException(nameof(zoneIndex), zoneIndex, "Aetheria zone index must be non-negative."); + + return _zoneDetails(zoneIndex); + } + + public CultMeshReactiveDocument ReactiveZoneDetails(int zoneIndex) + { + return ZoneDetails(zoneIndex).Reactive(); + } + + public CultMeshDocumentHandle SelectedObject(int zoneIndex) + { + if (zoneIndex < 0) + throw new ArgumentOutOfRangeException(nameof(zoneIndex), zoneIndex, "Aetheria zone index must be non-negative."); + + return _selectedObject(zoneIndex); + } + + public CultMeshReactiveDocument ReactiveSelectedObject(int zoneIndex) + { + return SelectedObject(zoneIndex).Reactive(); + } + + public CultMeshDocumentHandle Inventory(int entityIndex) + { + if (entityIndex < 0) + throw new ArgumentOutOfRangeException(nameof(entityIndex), entityIndex, "Aetheria entity index must be non-negative."); + + return _inventory(entityIndex); + } + + public CultMeshReactiveDocument ReactiveInventory(int entityIndex) + { + return Inventory(entityIndex).Reactive(); + } + public CultMeshDocumentHandle Document(string seatId) where TDocument : class { @@ -458,6 +545,20 @@ namespace GameCult.Aetheria.State.Verse return Document(seatId).Reactive(); } + public CultMeshDocumentHandle StarbridgePlayerSeat(string seatId) + { + if (string.IsNullOrWhiteSpace(seatId)) + throw new ArgumentException("Seat id must be non-empty.", nameof(seatId)); + + return _starbridgePlayerSeat(seatId); + } + + public CultMeshReactiveDocument ReactiveStarbridgePlayerSeat( + string seatId) + { + return StarbridgePlayerSeat(seatId).Reactive(); + } + public CultMeshStateRefResolver CreateEveSurfaceCultMeshStateRefResolver() { _eveStateRefFrame ??= ReactiveDaemonFrame();