Delete observed docking bridge

This commit is contained in:
Meta Vens 2026-06-29 11:56:02 +01:00
commit f4e682422d
4 changed files with 11 additions and 293 deletions

View file

@ -7365,8 +7365,7 @@ static void RequireMenuDockingUsesManagedTypedSnapshot(string root)
Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "InventoryPanel.cs"),
Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "LocalMenu.cs"),
Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "MenuPanel.cs"),
Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "TradeMenu.cs"),
Path.Combine(root, "Assets", "Scripts", "Gameplay", "AetheriaUnityObservedDockingIndex.cs")
Path.Combine(root, "Assets", "Scripts", "UI", "Menu", "TradeMenu.cs")
};
var missingPaths = menuPaths.Where(path => !File.Exists(path)).ToArray();
@ -7429,7 +7428,7 @@ static void RequireMenuDockingUsesManagedTypedSnapshot(string root)
if (directDockingOffenders.Count > 0)
{
throw new InvalidOperationException(
"Unity menu docking reads must use current typed state or the Unity observed docking bridge when entity objects are required; do not own duplicate reactive docking/refit documents: " +
"Unity menu docking reads must use current typed state directly and adapt Unity objects at the caller edge; do not own duplicate reactive docking/refit documents: " +
string.Join(", ", directDockingOffenders));
}
@ -7449,31 +7448,7 @@ static bool HasManagedDockingSnapshotAccess(string source)
return true;
}
if (source.Contains("AetheriaUnityObservedDockingIndex", StringComparison.Ordinal) &&
source.Contains("TryResolveObservedDockingIndex(out var dockingIndex)", StringComparison.Ordinal) &&
source.Contains("dockingIndex.TryResolveCurrent", StringComparison.Ordinal) &&
!source.Contains("AetheriaClientReactiveDockingState _reactiveDockingState", StringComparison.Ordinal))
{
return true;
}
return source.Contains("public sealed class AetheriaUnityObservedDockingIndex", StringComparison.Ordinal) &&
source.Contains("TryReadDockingSnapshots(", StringComparison.Ordinal) &&
source.Contains("AetheriaUnityRuntimeClientProvider.RuntimeState()", StringComparison.Ordinal) &&
source.Contains("state.CurrentDockingState()", StringComparison.Ordinal) &&
source.Contains("state.CurrentStationRefit()", StringComparison.Ordinal) &&
source.Contains("state.CurrentEntityState()", StringComparison.Ordinal) &&
!source.Contains("CultMeshReactiveDocument<AetheriaRuntimeCurrentEntityDocument>", StringComparison.Ordinal) &&
!source.Contains("CultMeshReactiveDocument<AetheriaRuntimeCurrentDockingDocument>", StringComparison.Ordinal) &&
!source.Contains("CultMeshReactiveDocument<AetheriaRuntimeStationRefitDocument>", StringComparison.Ordinal) &&
!source.Contains(".ReactiveCurrentEntity(\"unity-observed-docking\")", StringComparison.Ordinal) &&
!source.Contains(".ReactiveCurrentDocking(\"unity-observed-docking\")", StringComparison.Ordinal) &&
!source.Contains(".ReactiveStationRefit(\"unity-observed-docking\")", StringComparison.Ordinal) &&
!source.Contains("state.Latest<AetheriaRuntimeCurrentEntityDocument>()", StringComparison.Ordinal) &&
!source.Contains("state.Latest<AetheriaRuntimeCurrentDockingDocument>()", StringComparison.Ordinal) &&
!source.Contains("state.Latest<AetheriaRuntimeStationRefitDocument>()", StringComparison.Ordinal) &&
!source.Contains("AetheriaClientReactiveDockingState _dockingState", StringComparison.Ordinal) &&
!source.Contains(".ReactiveDockingState()", StringComparison.Ordinal);
return false;
}
static void RequireUnitySharedDocumentAccessorErgonomics(string root)
@ -13240,10 +13215,12 @@ static void RequireMainMenuContinueRunState(string root)
var packageStore = File.Exists(packageStorePath)
? File.ReadAllText(packageStorePath)
: throw new InvalidOperationException("Cannot verify Continue entity payload readback; package runtime store is missing.");
var observedDockingIndexPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "AetheriaUnityObservedDockingIndex.cs");
var observedDockingIndex = File.Exists(observedDockingIndexPath)
? File.ReadAllText(observedDockingIndexPath)
: throw new InvalidOperationException("Cannot verify Continue entity identity; AetheriaUnityObservedDockingIndex.cs is missing.");
var deletedObservedDockingIndexPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "AetheriaUnityObservedDockingIndex.cs");
if (File.Exists(deletedObservedDockingIndexPath))
{
throw new InvalidOperationException(
"AetheriaUnityObservedDockingIndex is dead state-access chaff; read current typed docking/refit documents directly and adapt Unity objects at the caller edge.");
}
var currentEntityPresentationPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "AetheriaUnityCurrentEntityPresentation.cs");
var currentEntityPresentation = File.Exists(currentEntityPresentationPath)
? File.ReadAllText(currentEntityPresentationPath)
@ -13695,59 +13672,6 @@ static void RequireMainMenuContinueRunState(string root)
string.Join(", ", managerTargetQueryHits));
}
var requiredObservedDockingSymbols = new[]
{
"public sealed class AetheriaUnityObservedDockingIndex",
"TryReadDockingSnapshots(",
"AetheriaUnityRuntimeClientProvider.RuntimeState()",
"state.CurrentDockingState()",
"state.CurrentStationRefit()",
"state.CurrentEntityState()",
"public bool IsEntityUndocked(Entity entity)",
"public bool TryResolveDockingBay(",
"out AetheriaRuntimeCurrentDockingDocument docking",
"_observedEntityIndex.TryResolveEntityByRecordKey(docking.DockParentEntityKey",
"docking.DockingBayIndex"
};
var missingObservedDockingSymbols = requiredObservedDockingSymbols
.Where(symbol => !observedDockingIndex.Contains(symbol, StringComparison.Ordinal))
.ToArray();
if (missingObservedDockingSymbols.Length > 0)
{
throw new InvalidOperationException(
"Observed docking relationship queries must live in AetheriaUnityObservedDockingIndex instead of ActionGameManager: " +
string.Join(", ", missingObservedDockingSymbols));
}
var forbiddenObservedDockingSymbols = new[]
{
"CultMeshReactiveDocument<AetheriaRuntimeCurrentEntityDocument>",
"CultMeshReactiveDocument<AetheriaRuntimeCurrentDockingDocument>",
"CultMeshReactiveDocument<AetheriaRuntimeStationRefitDocument>",
".ReactiveCurrentEntity(\"unity-observed-docking\")",
".ReactiveCurrentDocking(\"unity-observed-docking\")",
".ReactiveStationRefit(\"unity-observed-docking\")",
"state.Latest<AetheriaRuntimeCurrentEntityDocument>()",
"state.Latest<AetheriaRuntimeCurrentDockingDocument>()",
"state.Latest<AetheriaRuntimeStationRefitDocument>()",
"state.Reactive<AetheriaRuntimeCurrentEntityDocument>()",
"state.Reactive<AetheriaRuntimeCurrentDockingDocument>()",
"state.Reactive<AetheriaRuntimeStationRefitDocument>()",
"AetheriaRuntimeObservedDockingState",
"new AetheriaRuntimeObservedDockingState(",
"ReactiveEntity()",
"ReactiveDocking()"
};
var observedDockingHits = forbiddenObservedDockingSymbols
.Where(symbol => observedDockingIndex.Contains(symbol, StringComparison.Ordinal))
.ToArray();
if (observedDockingHits.Length > 0)
{
throw new InvalidOperationException(
"Observed docking state composition must sample native current typed documents in AetheriaUnityObservedDockingIndex: " +
string.Join(", ", observedDockingHits));
}
var requiredCurrentEntityBinderSymbols = new[]
{
"public sealed class AetheriaUnityCurrentEntityBinder",
@ -13902,7 +13826,7 @@ static void RequireMainMenuContinueRunState(string root)
if (managerDockingScanHits.Length > 0)
{
throw new InvalidOperationException(
"ActionGameManager still scans daemon docking relationships instead of delegating to AetheriaUnityObservedDockingIndex: " +
"ActionGameManager still scans daemon docking relationships instead of reading current typed docking state at the caller edge: " +
string.Join(", ", managerDockingScanHits));
}
@ -16598,8 +16522,7 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
var missingProviderClientAccess = providerOwnedClientAccessSources
.Where(pair =>
!pair.Value.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal) &&
!pair.Value.Contains("AetheriaUnityObservedDockingIndex", StringComparison.Ordinal))
!pair.Value.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal))
.Select(pair => pair.Key)
.ToArray();
if (missingProviderClientAccess.Length > 0)

View file

@ -1,197 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
using System;
using System.Linq;
using GameCult.Aetheria.State.Verse;
public sealed class AetheriaUnityObservedDockingIndex
{
private readonly AetheriaUnityObservedEntityIndex _observedEntityIndex;
public AetheriaUnityObservedDockingIndex(AetheriaUnityObservedEntityIndex observedEntityIndex)
{
_observedEntityIndex = observedEntityIndex ?? throw new ArgumentNullException(nameof(observedEntityIndex));
}
public int ResolveEntityZoneIndex(Entity entity)
{
return TryResolveCurrentDocking(entity, out var docking)
? docking.ZoneIndex
: -1;
}
public bool IsEntityUndocked(Entity entity)
{
return TryResolveCurrentDocking(entity, out var docking) &&
!docking.IsDocked;
}
public bool TryResolveCurrentEntity(out Entity entity)
{
entity = null;
return TryResolveCurrentEntityKey(out var currentEntityKey) &&
_observedEntityIndex.TryResolveEntityByRecordKey(currentEntityKey, out entity);
}
public bool TryResolveCurrentEntityKey(out string currentEntityKey)
{
currentEntityKey = "";
if (TryReadDockingSnapshots(out var currentEntity, out var docking, out _))
currentEntityKey = CurrentEntityKey(currentEntity, docking);
return !string.IsNullOrWhiteSpace(currentEntityKey);
}
public bool TryReadCurrentEntity(out AetheriaRuntimeCurrentEntityDocument currentEntity)
{
currentEntity = null;
if (!TryReadDockingSnapshots(out var document, out _, out _))
return false;
currentEntity = document;
return currentEntity != null;
}
public AetheriaRuntimeStationRefitDocument StationRefitSnapshot()
{
return TryReadDockingSnapshots(out _, out _, out var refit)
? refit
: null;
}
public bool TryResolveCurrentDockingBayRow(out AetheriaRuntimeStationDockingBayRow dockingBay)
{
dockingBay = null;
if (!TryReadDockingSnapshots(out _, out _, out var refit) ||
!refit.IsDocked ||
refit.DockingBayIndex < 0)
return false;
dockingBay = (refit.DockingBays ?? Array.Empty<AetheriaRuntimeStationDockingBayRow>())
.FirstOrDefault(row => row != null && row.DockingBayIndex == refit.DockingBayIndex);
return dockingBay != null;
}
public bool TryResolveCurrentDockingBay(out EquippedDockingBay dockingBay)
{
dockingBay = null;
var refit = StationRefitSnapshot();
if (!TryResolveCurrentDockingBayRow(out _) ||
string.IsNullOrWhiteSpace(refit?.DockParentEntityKey) ||
refit.DockingBayIndex < 0 ||
!_observedEntityIndex.TryResolveDockingBayByRecordKey(
refit.DockParentEntityKey,
refit.DockingBayIndex,
out dockingBay))
{
return false;
}
return dockingBay != null;
}
public bool TryResolveCurrentDocking(out AetheriaRuntimeCurrentDockingDocument docking)
{
docking = null;
if (!TryReadDockingSnapshots(out _, out var currentDocking, out _))
return false;
docking = currentDocking;
return docking != null;
}
public bool TryResolveDockingBay(
Entity child,
out Entity dockParent,
out EquippedDockingBay dockingBay)
{
return TryResolveDockingBay(child, out dockParent, out dockingBay, out _);
}
public bool TryResolveDockingBay(
Entity child,
out Entity dockParent,
out EquippedDockingBay dockingBay,
out AetheriaRuntimeCurrentDockingDocument docking)
{
dockParent = null;
dockingBay = null;
docking = null;
if (!TryResolveCurrentDocking(child, out docking) || !docking.IsDocked)
return false;
if (!_observedEntityIndex.TryResolveEntityByRecordKey(docking.DockParentEntityKey, out var parent) ||
!(parent is OrbitalEntity))
{
return false;
}
if (parent.DockingBays == null ||
docking.DockingBayIndex < 0 ||
docking.DockingBayIndex >= parent.DockingBays.Count)
{
return false;
}
dockParent = parent;
dockingBay = parent.DockingBays[docking.DockingBayIndex];
return dockingBay != null;
}
private bool TryResolveCurrentDocking(
Entity entity,
out AetheriaRuntimeCurrentDockingDocument docking)
{
TryResolveCurrentDocking(out docking);
if (entity == null ||
docking == null ||
docking.CurrentEntityIndex != entity.DaemonEntityIndex)
{
return false;
}
if (_observedEntityIndex.TryResolveEntityRecordKey(entity, out var entityKey) &&
!string.IsNullOrWhiteSpace(docking.CurrentEntityKey) &&
!string.Equals(docking.CurrentEntityKey, entityKey, StringComparison.Ordinal))
{
return false;
}
return true;
}
private bool TryReadDockingSnapshots(
out AetheriaRuntimeCurrentEntityDocument entity,
out AetheriaRuntimeCurrentDockingDocument docking,
out AetheriaRuntimeStationRefitDocument refit)
{
entity = null;
docking = null;
refit = null;
try
{
var state = AetheriaUnityRuntimeClientProvider.RuntimeState();
docking = state.CurrentDockingState();
refit = state.CurrentStationRefit();
if (docking == null || refit == null)
return false;
entity = state.CurrentEntityState();
return true;
}
catch
{
return false;
}
}
private static string CurrentEntityKey(
AetheriaRuntimeCurrentEntityDocument entity,
AetheriaRuntimeCurrentDockingDocument docking)
{
return !string.IsNullOrWhiteSpace(entity?.EntityKey)
? entity.EntityKey
: docking?.CurrentEntityKey ?? "";
}
}

View file

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 3131bc989a39393489b141a3d040e186

View file

@ -334,12 +334,6 @@ public class DaemonRuntimeDocumentTests
Assert.AreEqual(currentEntity.EntityKey, currentEntityByType.EntityKey);
Assert.AreEqual(currentEntity.EntityKey, currentEntityFromClientType.EntityKey);
Assert.AreEqual(currentEntity.EntityKey, currentDocking.CurrentEntityKey);
Assert.IsNotNull(observedDocking);
Assert.AreEqual(currentEntity.EntityKey, observedDocking.CurrentEntityKey);
Assert.AreEqual(currentEntity.EntityIndex, observedDocking.CurrentEntityIndex);
Assert.AreEqual(currentDocking.CurrentEntityKey, observedDocking.Docking.CurrentEntityKey);
Assert.AreEqual(stationRefit.DockParentEntityKey, observedDocking.Refit.DockParentEntityKey);
Assert.IsFalse(observedDocking.TryResolveCurrentDockingBayRow(out _));
Assert.AreEqual(currentEntity.EntityKey, currentDockingReactive.Current.CurrentEntityKey);
Assert.AreEqual("", stationRefit.DockParentEntityKey);
Assert.AreEqual("", stationRefitReactive.Current.DockParentEntityKey);