Delete observed docking bridge
This commit is contained in:
parent
ed1ac90b3a
commit
f4e682422d
4 changed files with 11 additions and 293 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 ?? "";
|
||||
}
|
||||
}
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 3131bc989a39393489b141a3d040e186
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue