From 62cb95d807fa36ce7dea48033d9cd7f229cc18ac Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 21 Jun 2026 18:51:50 +0100 Subject: [PATCH] Load daemon zone view after facade rebuild --- Aetheria.State.Verify/Program.cs | 19 +++++++++++-- Assets/Scripts/Gameplay/ActionGameManager.cs | 28 ++++++-------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index eb5d22b36..6b194684e 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -7755,6 +7755,7 @@ static void RequireMainMenuContinueRunState(string root) "CanApplyDaemonEntitySnapshotsInPlace", "ZoneRenderer?.ApplyDaemonFrame(daemonZone, run)", "ApplyDaemonEntitySnapshotsInPlace", + "PrepareObservedDaemonZoneContext(targetZone, daemonZone)", "ReplaceObservedEntityFacadesFromTypedSnapshots", "RestoreCurrentEntityBinding", "RestoreCurrentEntityBinding(currentEntity, actionBarBindings)", @@ -7774,7 +7775,7 @@ static void RequireMainMenuContinueRunState(string root) "_observedEntityFacadesByRecordKey", "_observedEntityFacadesByDaemonIndex", "RebuildObservedEntityFacadeIndex();", - "ZoneRenderer.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, daemonRun)", + "ZoneRenderer?.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, run)", "entity.RestoreStatGrids(entitySnapshot.StatGrids)", "RestoreThermalExposure((float)entitySnapshot.Heatstroke, (float)entitySnapshot.Hypothermia)", "entity.HeatsinksEnabled = entitySnapshot.HeatsinksEnabled", @@ -8063,7 +8064,8 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root) "observed.IsAuthoritative", "TryRestoreEntityGraphFromDaemonRun(observed.Run)", "CreateDaemonZoneConstructionBlueprint(daemonZone)", - "ZoneRenderer.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, daemonRun)", + "PrepareObservedDaemonZoneContext(targetZone, daemonZone)", + "ZoneRenderer?.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, run)", "ZoneRenderer?.ApplyDaemonFrame(daemonZone, run)", "CreateDaemonEntitySnapshots(runId, daemonZone)", "FindCurrentDaemonZoneSnapshot()", @@ -8134,6 +8136,19 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root) "Unity frame application must project observed daemon state, not instantiate authoritative gameplay entities."); } + var contextPrepRendererLoads = FindMethodScopedLineHits( + actionGameManager, + new[] { "LoadDaemonZoneView(", "BindToEntity(" }) + .Where(hit => hit.MethodName == "PrepareObservedDaemonZoneContext") + .Select(hit => $"{hit.MethodName}:{hit.LineNumber}: {hit.Line.Trim()}") + .ToArray(); + if (contextPrepRendererLoads.Length > 0) + { + throw new InvalidOperationException( + "Unity zone context prep must not load renderer instances before observed daemon facades have been rebuilt: " + + string.Join("; ", contextPrepRendererLoads)); + } + var unauthorizedEntityProjectionHits = FindMethodScopedLineHits( actionGameManager, new[] { "Zone.Entities.Add(", "Zone.Entities.Remove(", "Zone.Agents.Clear()" }) diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index 8e9d3de9e..8604e57df 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -2075,10 +2075,9 @@ public class ActionGameManager : MonoBehaviour } } - public void PopulateLevel( + private void PrepareObservedDaemonZoneContext( GalaxyZone galaxyZone, - AetheriaRuntimeZoneSnapshotCommit daemonZone = null, - AetheriaRuntimeRunCheckpointCommit daemonRun = null) + AetheriaRuntimeZoneSnapshotCommit daemonZone = null) { if (galaxyZone == null) throw new ArgumentNullException(nameof(galaxyZone)); @@ -2097,14 +2096,6 @@ public class ActionGameManager : MonoBehaviour PlayMusic(MusicType.Overworld); Zone.Log = s => Debug.Log($"Zone: {s}"); - - ZoneRenderer.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, daemonRun); - - if (CurrentEntity != null) - { - UnbindEntity(); - BindToEntity(CurrentEntity); - } } public bool CanShowInputScreenFromMenu() @@ -2254,15 +2245,17 @@ public class ActionGameManager : MonoBehaviour if (Zone?.GalaxyZone != targetZone) { - PopulateLevel(targetZone, daemonZone, run); + PrepareObservedDaemonZoneContext(targetZone, daemonZone); } var actionBarBindings = run.ActionBarBindings? .Select(ToActionBarBindingSnapshot) .Where(binding => binding != null) .ToArray() ?? Array.Empty(); - ReplaceObservedEntityFacadesFromTypedSnapshots(entitySnapshots, currentEntityKey, actionBarBindings); - ZoneRenderer?.ApplyDaemonFrame(daemonZone, run); + ReplaceObservedEntityFacadesFromTypedSnapshots(entitySnapshots); + ZoneRenderer?.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, run); + if (_observedEntityFacadesByRecordKey.TryGetValue(currentEntityKey, out var currentEntity)) + RestoreCurrentEntityBinding(currentEntity, actionBarBindings); RestoreDroppedPickupsFromDaemonZoneState(daemonZone); _lastAppliedAuthoritativeDaemonRunId = runId; _lastAppliedAuthoritativeDaemonZoneIndex = run.CurrentZoneIndex; @@ -2719,9 +2712,7 @@ public class ActionGameManager : MonoBehaviour } private void ReplaceObservedEntityFacadesFromTypedSnapshots( - IReadOnlyList entitySnapshots, - string currentEntityKey, - IReadOnlyList actionBarBindings) + IReadOnlyList entitySnapshots) { var restoredEntities = new Dictionary(); foreach (var entitySnapshot in entitySnapshots) @@ -2765,9 +2756,6 @@ public class ActionGameManager : MonoBehaviour foreach (var restoredEntity in restoredEntities) _observedEntityFacadesByRecordKey[restoredEntity.Key] = restoredEntity.Value; RebuildObservedEntityFacadeIndex(); - - if (restoredEntities.TryGetValue(currentEntityKey, out var currentEntity)) - RestoreCurrentEntityBinding(currentEntity, actionBarBindings); } private void RebuildObservedEntityFacadeIndex()