From 69327bbe193bc49d5a1d1e76570e6b7dd9feb3ca Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 27 Jun 2026 14:06:30 +0100 Subject: [PATCH] Use Aetheria state handles for render feeds --- .../scripts/verify-stage7d-unity-parity.ps1 | 20 +++++++++++++++---- Assets/Scripts/Gameplay/ActionGameManager.cs | 8 +++++++- .../AetheriaUnityObservedFrameApplier.cs | 4 +++- .../AetheriaUnityObservedTargetQuery.cs | 7 ++++++- Assets/Scripts/Zone Display/ZoneRenderer.cs | 4 +++- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Aetheria.State/scripts/verify-stage7d-unity-parity.ps1 b/Aetheria.State/scripts/verify-stage7d-unity-parity.ps1 index 50a790e00..57d2e631d 100644 --- a/Aetheria.State/scripts/verify-stage7d-unity-parity.ps1 +++ b/Aetheria.State/scripts/verify-stage7d-unity-parity.ps1 @@ -325,11 +325,17 @@ Assert-NotContains $actionGameManager "ResolveClient(stateBoot.StateFilePath).Op Assert-NotContains $actionGameManager "ItemManager = new ItemManager(" "ActionGameManager must not construct ItemManager directly." Assert-NotContains $actionGameManager "ZoneRenderer.SetDroppedPickupItemProjector(" "ActionGameManager must not configure renderer pickup projection directly." Assert-NotContains $actionGameManager "ZoneRenderer.BodySettingsCollections = Settings.BodySettingsCollections" "ActionGameManager must not configure renderer body settings directly." -Assert-Contains $observedFrameApplier "ZoneRenderAsync()" "Unity observed frame application must consume the typed zone-render facade." +Assert-Contains $observedFrameApplier ".Aetheria()" "Unity observed frame application must enter state through the semantic Aetheria facade." +Assert-Contains $observedFrameApplier ".ZoneRender" "Unity observed frame application must consume the typed zone-render document handle." +Assert-Contains $observedFrameApplier ".LatestAsync()" "Unity observed frame application must read typed zone-render snapshots." +Assert-NotContains $observedFrameApplier ".ZoneRenderAsync()" "Unity observed frame application must not use the transitional zone-render helper." Assert-NotContains $observedFrameApplier "ProjectZoneRender(" "Unity observed frame application must not rebuild zone-render feeds from raw frames." Assert-NotContains $observedFrameApplier "LastObservedState?.Run" "Unity observed frame application must not read the raw observed run for current-zone lookups." Assert-NotContains $observedFrameApplier "FramePath" "Unity observed frame application should key the presentation cache by typed projection identity, not publication file paths." -Assert-Contains $observedTargetQuery "ZoneContactsAsync()" "Unity target queries must consume the typed zone-contacts facade." +Assert-Contains $observedTargetQuery ".Aetheria()" "Unity target queries must enter state through the semantic Aetheria facade." +Assert-Contains $observedTargetQuery ".ZoneContacts" "Unity target queries must consume the typed zone-contacts document handle." +Assert-Contains $observedTargetQuery ".LatestAsync()" "Unity target queries must read typed zone-contacts snapshots." +Assert-NotContains $observedTargetQuery ".ZoneContactsAsync()" "Unity target queries must not use the transitional zone-contacts helper." Assert-NotContains $observedTargetQuery "AetheriaRuntimeZoneSnapshotCommit" "Unity target queries must not receive raw zone snapshots." Assert-NotContains $observedTargetQuery "AetheriaRuntimeDaemonRenderQueries.TryQueryEntityContact" "Unity target queries must not query contacts from raw zone snapshots." Assert-NotContains $observedTargetQuery "AetheriaRuntimeDaemonRenderQueries.TryQueryEntityTarget" "Unity target queries must not query targets from raw zone snapshots." @@ -645,7 +651,10 @@ Assert-Contains $zoneRenderer "_zoneRenderBodyPoses" "ZoneRenderer must consume Assert-Contains $zoneRenderer "_zoneRenderAsteroidBeltPoses" "ZoneRenderer must consume asteroid belt poses from the zone-render feed." Assert-Contains $zoneRenderer "beltPose.InstancePoses" "ZoneRenderer asteroid rendering must consume typed asteroid instance poses from the zone-render feed." Assert-Contains $zoneRenderer "RestoreDroppedPickupsFromZoneRender" "ZoneRenderer dropped-pickup restore must consume the typed zone-render feed." -Assert-Contains $zoneRenderer "ZoneContactsAsync()" "ZoneRenderer target distance cache must read the typed zone-contacts feed." +Assert-Contains $zoneRenderer ".Aetheria()" "ZoneRenderer target distance cache must enter state through the semantic Aetheria facade." +Assert-Contains $zoneRenderer ".ZoneContacts" "ZoneRenderer target distance cache must read the typed zone-contacts document handle." +Assert-Contains $zoneRenderer ".LatestAsync()" "ZoneRenderer target distance cache must read a typed zone-contacts snapshot." +Assert-NotContains $zoneRenderer ".ZoneContactsAsync()" "ZoneRenderer target distance cache must not use the transitional zone-contacts helper." Assert-Contains $zoneRenderer "_daemonTargetRowsByEntityIndex" "ZoneRenderer target distance cache must store typed target rows." Assert-Contains $zoneRenderer "_daemonContactRows" "ZoneRenderer compass and visibility state must cache typed contact rows." Assert-Contains $zoneRenderer "ObjectsViewportAsync(ToViewportBounds(viewport))" "ZoneRenderer presentation loading must use the typed objects viewport facade." @@ -675,6 +684,9 @@ $actionGameManager = Read-Text "Assets\Scripts\Gameplay\ActionGameManager.cs" $observedFrameApplier = Read-Text "Assets\Scripts\Gameplay\AetheriaUnityObservedFrameApplier.cs" $gameplayLoopShell = Read-Text "Assets\Scripts\Gameplay\AetheriaUnityGameplayLoopShell.cs" Assert-Contains $actionGameManager "ObservedFrameApplier.ApplyLatestZoneRender()" "ActionGameManager must delegate typed zone-render application to the observed frame applier." +Assert-Contains $actionGameManager ".Aetheria()" "ActionGameManager current-entity binding must enter zone-render state through the semantic Aetheria facade." +Assert-Contains $actionGameManager ".ZoneRender" "ActionGameManager current-entity binding must resolve the typed zone-render document handle." +Assert-NotContains $actionGameManager ".ZoneRenderAsync()" "ActionGameManager current-entity binding must not use the transitional zone-render helper." Assert-Contains $actionGameManager "private AetheriaUnityGameplayLoopShell GameplayLoopShell =>" "ActionGameManager should delegate per-frame Unity presentation/input ticking to the gameplay loop shell." Assert-Contains $actionGameManager "GameplayLoopShell.Tick(Time.deltaTime, Time.time)" "ActionGameManager Update should only forward time into the gameplay loop shell." Assert-Contains $actionGameManager "GameplayLoopShell.LateTick()" "ActionGameManager LateUpdate should only forward into the gameplay loop shell." @@ -690,7 +702,7 @@ Assert-NotContains $actionGameManager "_paused" "ActionGameManager must not own Assert-NotContains $actionGameManager "_time" "ActionGameManager must not keep unused local simulation time." Assert-Contains $observedFrameApplier "TryRestoreEntityGraphFromZoneRender" "Observed frame applier must restore Unity shell state from the typed zone-render feed." Assert-Contains $observedFrameApplier "ApplyLatestZoneRender" "Observed frame applier must name the handoff as zone-render application." -Assert-Contains $observedFrameApplier "ZoneRenderAsync()" "Observed frame applier must use the shared zone-render facade at the frame handoff." +Assert-Contains $observedFrameApplier ".ZoneRender" "Observed frame applier must use the shared zone-render document handle at the frame handoff." Assert-Contains $observedFrameApplier "render.EntityFacades" "Observed frame applier entity restoration must consume the typed zone-render entity facade payload." Assert-NotContains $observedFrameApplier "Func" "Observed frame applier must not depend on the whole observed galaxy facade." Assert-Contains $observedFrameApplier "_resolveObservedZone" "Observed frame applier should name the narrow target-zone resolver explicitly." diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index aa9c14e50..2ccdb38c0 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -65,7 +65,13 @@ public class ActionGameManager : MonoBehaviour SetCurrentEntity = entity => CurrentEntity = entity, GetViewDirection = () => _viewDirection, SetViewDirection = direction => _viewDirection = direction, - ResolveZoneRender = () => ResolveDaemonObserver()?.Client?.ZoneRenderAsync().GetAwaiter().GetResult(), + ResolveZoneRender = () => ResolveDaemonObserver() + ?.Client + ?.Aetheria() + .ZoneRender + .LatestAsync() + .GetAwaiter() + .GetResult(), ApplyActionBarBindings = ActionBarBindings.ApplyBindings, EnablePlayerInput = EnablePlayerInput, DisablePlayerInput = DisablePlayerInput, diff --git a/Assets/Scripts/Gameplay/AetheriaUnityObservedFrameApplier.cs b/Assets/Scripts/Gameplay/AetheriaUnityObservedFrameApplier.cs index 8943bd44a..68e804b1a 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityObservedFrameApplier.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityObservedFrameApplier.cs @@ -74,7 +74,9 @@ public sealed class AetheriaUnityObservedFrameApplier try { return observer.Client - .ZoneRenderAsync() + .Aetheria() + .ZoneRender + .LatestAsync() .GetAwaiter() .GetResult(); } diff --git a/Assets/Scripts/Gameplay/AetheriaUnityObservedTargetQuery.cs b/Assets/Scripts/Gameplay/AetheriaUnityObservedTargetQuery.cs index 469030cf1..101b0be10 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityObservedTargetQuery.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityObservedTargetQuery.cs @@ -93,7 +93,12 @@ public sealed class AetheriaUnityObservedTargetQuery { try { - return _resolveClient()?.ZoneContactsAsync().GetAwaiter().GetResult(); + return _resolveClient() + ?.Aetheria() + .ZoneContacts + .LatestAsync() + .GetAwaiter() + .GetResult(); } catch { diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index a9e9fd524..cc12bcc2c 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -923,7 +923,9 @@ public class ZoneRenderer : MonoBehaviour try { var contacts = ResolveClient() - .ZoneContactsAsync() + .Aetheria() + .ZoneContacts + .LatestAsync() .GetAwaiter() .GetResult(); foreach (var target in contacts?.Targets ?? Array.Empty())