From 71f2c14c332c3337290b5e561ffb56c9c7bd1d88 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 15 Jun 2026 16:41:40 +0100 Subject: [PATCH] Use typed body keys in behavior state commits --- .voidbot/state/aetheria.cc | Bin 103221 -> 104323 bytes Aetheria.State.Smoke/Program.cs | 8 ++++---- Aetheria.State.Unity.Smoke/Program.cs | 12 ++++++------ .../AetheriaRuntimeCommitLogApplier.cs | 10 ++++++++-- Aetheria.State/README.md | 4 ++++ Assets/Scripts/Gameplay/ActionGameManager.cs | 8 ++------ .../AetheriaRuntimeStateCommitDocument.cs | 6 ++++++ docs/aetheria-perfect-machine-map.md | 3 +++ 8 files changed, 33 insertions(+), 18 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index 026627344f29458325eaeb1fc6891c43f41bd618..0c2e822864b4a0b9106a2900cfe779aef5bbca96 100644 GIT binary patch delta 1668 zcma)7L5mzk6t;Im+$c!I#6%%%5ibUI#+}*BW@dxp2H6mTu&kSadk|{6Ur$%IyQ))F zJ>!TlN)8(d3QHa4;?0;qkQf}6y@;UT#U<)VSoP{f@Zb*+eO29^-Bn`tH1yP~@4feZ z-+Q%j>)^G|58k^q_QXtUu2HL=X`WtL_l}xx$8Jm%|Fq1XkI%O=E_IrC2J+ zE-173!_k43l&hFxaw6h@NZQLAyYLzb8N>lLpe#a4HEXlj)*8|{Zc~4?`l%mNmTZ5# zj7dtmDoP`m!>C9IK>|loM9)%^h%WLLN|Crcw(~)soWF#*l$N&ooa-{P76sK5un);- z)p5Q9>)5B-btwzo3W&DIctB;pdRqfmOz`dB7Z|7UgF=boG*yF0philwI41CRDiq)k z!*49+p;}xB{znQtbi@%(6C~Ao!xvm-2@os7z$dWUj95^@Pb_3LBDuYH32ZBNZBWqzr>5{CJBrBYl0 z-*J#n+QY?t^q}>aj`q&k$lLt#NpnKJY(Dz?u*c1Nf1Ie71F>sQ*xu~$C}PJ4*TG&H zP5k|&nKU)?;a|^oF6V_i3dq$AGHkopJLO{9SwI%pN-NRJc~I!Q{vRt&@Da;-5}?DW~0m7AJ&Q16qY#jTO|{2kY|T{!A)NqoMEHorRSy?OD_gNx?J z@#l)Cp;;f!uX#TeXU%$RNUnP~%4gzq!#)$k@2-3AKc3%i4PRaJj&EN1!29}85!ITh GulxgD?`9YP delta 1066 zcmah|-%Aux811T=TJ)4Z`T<@E0%051-Nm0^fyx?XmTN@&cAfclW^`um?!9-?^+hs* z$gE@^riUI1${?a5i46>*=bn5t`X}U5IGLVjtriRYCmEW7)4f0)Zvy0q6xwDe9 z>>@P;GZR$j?krP1$`=BH>q*kFoS@7zsIr7F6$q-hDEUB5;4UaprXF9wAy4`)P*pC1 zK`q~LXo2aVWIP(7(qcuRE|c?8d!;+fc7KrWP*}TBG?)S^fEkib;P4nap#{NRRE6al ztMEN#qejFo_<}}9Bda+T4u=+JLeFZHdrEM}L8~ESM3@z}F;yr?Q2VqsR>g#g=wH&A z1AFS%a5p7_fDLe%Q6>=4kn|suog0^EMAfZT~nm9mxfAa z91z~hi4%*fyH`4lT`}w*3k_85bL7j><8R@%ZGfjkDE6%SI8FMSg55E4A~-xk&bDV} zl9{32^iU?F^(IsKmx`HaiB>O+kWI3={&CBz9=k|xT@Hp%la|VMeaDgT;SOra;Q1Qq w2sT#9*QOehs{E>N$Cum~Ja|a>J{piU@-%wfIF;%TA9wZh8u`||hov+5KcI|!+5i9m diff --git a/Aetheria.State.Smoke/Program.cs b/Aetheria.State.Smoke/Program.cs index be6d66656..df5861624 100644 --- a/Aetheria.State.Smoke/Program.cs +++ b/Aetheria.State.Smoke/Program.cs @@ -292,7 +292,7 @@ await using (var node = await AetheriaStateNode.OpenAsync(statePath, "aetheria-s OwnerIndex = 0, BehaviorIndex = 1, BehaviorKind = "ResourceScanner", - ResourceScannerTargetBodyId = "smoke:body", + ResourceScannerTargetBodyId = "aetheria.body:legacy:smoke:body", ResourceScannerAsteroidIndex = 2, ResourceScannerScanTime = 1.25, ResourceScannerRange = 500.0, @@ -305,7 +305,7 @@ await using (var node = await AetheriaStateNode.OpenAsync(statePath, "aetheria-s OwnerIndex = 0, BehaviorIndex = 2, BehaviorKind = "MiningTool", - MiningToolAsteroidBeltId = "smoke:body", + MiningToolAsteroidBeltId = "aetheria.body:legacy:smoke:body", MiningToolAsteroidIndex = 3, MiningToolRange = 275.0 }, @@ -672,12 +672,12 @@ await using (var reopened = await AetheriaStateNode.OpenAsync(statePath, "aether entitySnapshot.BehaviorStates[0].AetherDriveRpmY != 900.0 || entitySnapshot.BehaviorStates[0].AetherDriveMaximumRpm != 2400.0 || entitySnapshot.BehaviorStates[1].BehaviorKind != "ResourceScanner" || - entitySnapshot.BehaviorStates[1].ResourceScannerTargetBodyId != "smoke:body" || + entitySnapshot.BehaviorStates[1].ResourceScannerTargetBodyId != "aetheria.body:legacy:smoke:body" || entitySnapshot.BehaviorStates[1].ResourceScannerAsteroidIndex != 2 || entitySnapshot.BehaviorStates[1].ResourceScannerScanTime != 1.25 || entitySnapshot.BehaviorStates[1].ResourceScannerScanDuration != 3.5 || entitySnapshot.BehaviorStates[2].BehaviorKind != "MiningTool" || - entitySnapshot.BehaviorStates[2].MiningToolAsteroidBeltId != "smoke:body" || + entitySnapshot.BehaviorStates[2].MiningToolAsteroidBeltId != "aetheria.body:legacy:smoke:body" || entitySnapshot.BehaviorStates[2].MiningToolAsteroidIndex != 3 || entitySnapshot.BehaviorStates[2].MiningToolRange != 275.0 || entitySnapshot.BehaviorStates[3].BehaviorKind != "Thruster" || diff --git a/Aetheria.State.Unity.Smoke/Program.cs b/Aetheria.State.Unity.Smoke/Program.cs index 4cf039a90..036752939 100644 --- a/Aetheria.State.Unity.Smoke/Program.cs +++ b/Aetheria.State.Unity.Smoke/Program.cs @@ -542,7 +542,7 @@ try OwnerIndex = 5, BehaviorIndex = 0, BehaviorKind = "ResourceScanner", - ResourceScannerTargetBodyId = "smoke:body", + ResourceScannerTargetBodyKey = "aetheria.body:legacy:smoke:body", ResourceScannerAsteroidIndex = 2, ResourceScannerScanTime = 1.25, ResourceScannerRange = 500.0, @@ -555,7 +555,7 @@ try OwnerIndex = 6, BehaviorIndex = 0, BehaviorKind = "MiningTool", - MiningToolAsteroidBeltId = "smoke:body", + MiningToolAsteroidBeltKey = "aetheria.body:legacy:smoke:body", MiningToolAsteroidIndex = 3, MiningToolRange = 275.0 }, @@ -787,12 +787,12 @@ try entity.BehaviorStates[4].AetherDriveMaximumRpm == 2400.0 && entity.BehaviorStates[4].AetherDriveThrustDirectionY == -0.5 && entity.BehaviorStates[5].BehaviorKind == "ResourceScanner" && - entity.BehaviorStates[5].ResourceScannerTargetBodyId == "smoke:body" && + entity.BehaviorStates[5].ResourceScannerTargetBodyId == "aetheria.body:legacy:smoke:body" && entity.BehaviorStates[5].ResourceScannerAsteroidIndex == 2 && entity.BehaviorStates[5].ResourceScannerScanTime == 1.25 && entity.BehaviorStates[5].ResourceScannerScanDuration == 3.5 && entity.BehaviorStates[6].BehaviorKind == "MiningTool" && - entity.BehaviorStates[6].MiningToolAsteroidBeltId == "smoke:body" && + entity.BehaviorStates[6].MiningToolAsteroidBeltId == "aetheria.body:legacy:smoke:body" && entity.BehaviorStates[6].MiningToolAsteroidIndex == 3 && entity.BehaviorStates[6].MiningToolRange == 275.0 && entity.BehaviorStates[7].BehaviorKind == "Thruster" && @@ -895,9 +895,9 @@ try packageEntities[0].BehaviorStates[3].CapacitorCharge != 7.5 || packageEntities[0].BehaviorStates[4].AetherDriveRpmY != 900.0 || packageEntities[0].BehaviorStates[4].AetherDriveMaximumRpm != 2400.0 || - packageEntities[0].BehaviorStates[5].ResourceScannerTargetBodyId != "smoke:body" || + packageEntities[0].BehaviorStates[5].ResourceScannerTargetBodyId != "aetheria.body:legacy:smoke:body" || packageEntities[0].BehaviorStates[5].ResourceScannerScanDuration != 3.5 || - packageEntities[0].BehaviorStates[6].MiningToolAsteroidBeltId != "smoke:body" || + packageEntities[0].BehaviorStates[6].MiningToolAsteroidBeltId != "aetheria.body:legacy:smoke:body" || packageEntities[0].BehaviorStates[6].MiningToolRange != 275.0 || packageEntities[0].BehaviorStates[7].ThrusterAxis != 0.8 || packageEntities[0].BehaviorStates[7].ThrusterThrust != 125.0 || diff --git a/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs b/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs index 5685e83cf..a9b786b7b 100644 --- a/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs +++ b/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs @@ -542,13 +542,19 @@ public static class AetheriaRuntimeCommitLogApplier AetherDriveMaximumRpm = state.AetherDriveMaximumRpm, AetherDriveThrustDirectionX = state.AetherDriveThrustDirectionX, AetherDriveThrustDirectionY = state.AetherDriveThrustDirectionY, - ResourceScannerTargetBodyId = state.ResourceScannerTargetBodyId ?? "", + ResourceScannerTargetBodyId = ReferenceKey( + state.ResourceScannerTargetBodyKey ?? "", + "aetheria.body", + state.ResourceScannerTargetBodyId ?? ""), ResourceScannerAsteroidIndex = state.ResourceScannerAsteroidIndex, ResourceScannerScanTime = state.ResourceScannerScanTime, ResourceScannerRange = state.ResourceScannerRange, ResourceScannerMinimumDensity = state.ResourceScannerMinimumDensity, ResourceScannerScanDuration = state.ResourceScannerScanDuration, - MiningToolAsteroidBeltId = state.MiningToolAsteroidBeltId ?? "", + MiningToolAsteroidBeltId = ReferenceKey( + state.MiningToolAsteroidBeltKey ?? "", + "aetheria.body", + state.MiningToolAsteroidBeltId ?? ""), MiningToolAsteroidIndex = state.MiningToolAsteroidIndex, MiningToolRange = state.MiningToolRange, ThrusterAxis = state.ThrusterAxis, diff --git a/Aetheria.State/README.md b/Aetheria.State/README.md index 017ba3514..43288893b 100644 --- a/Aetheria.State/README.md +++ b/Aetheria.State/README.md @@ -106,6 +106,10 @@ Run checkpoint commit DTOs carry typed `OrbitKey`, `ParentOrbitKey`, and `BodyKey` for zone orbit/body snapshots. The old `OrbitLegacyId`, `ParentLegacyId`, and `BodyLegacyId` fields remain compatibility-only for older pending commits; current Unity projection does not write them. +Behavior-state runtime commits carry typed body keys for resource scanner targets +and mining tool asteroid belts. The old raw body ID commit fields remain +compatibility-only for older pending commits; current Unity projection does not +write them. The package runtime catalog snapshot indexes items by canonical item key; Unity gameplay, HUD, inventory, trade, ship, and zone helper lookups use `ItemKey` directly instead of deriving `ItemId` and searching by legacy GUID. diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index 7583595f4..c1b961cb6 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -971,9 +971,7 @@ public class ActionGameManager : MonoBehaviour { state = new AetheriaRuntimeBehaviorStateCommit { - ResourceScannerTargetBodyId = resourceScanner.ScanTarget == Guid.Empty - ? "" - : resourceScanner.ScanTarget.ToString("D"), + ResourceScannerTargetBodyKey = BodyKey(resourceScanner.ScanTarget), ResourceScannerAsteroidIndex = resourceScanner.Asteroid, ResourceScannerScanTime = resourceScanner.ScanTime, ResourceScannerRange = resourceScanner.Range, @@ -985,9 +983,7 @@ public class ActionGameManager : MonoBehaviour { state = new AetheriaRuntimeBehaviorStateCommit { - MiningToolAsteroidBeltId = miningTool.AsteroidBelt == Guid.Empty - ? "" - : miningTool.AsteroidBelt.ToString("D"), + MiningToolAsteroidBeltKey = BodyKey(miningTool.AsteroidBelt), MiningToolAsteroidIndex = miningTool.Asteroid, MiningToolRange = miningTool.Range }; diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs index 5a46e8e2c..5dab5e8c3 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs @@ -928,5 +928,11 @@ namespace GameCult.Aetheria.State.Unity [Key(54)] public bool TurretControllerPredictShots { get; set; } + + [Key(55)] + public string ResourceScannerTargetBodyKey { get; set; } = ""; + + [Key(56)] + public string MiningToolAsteroidBeltKey { get; set; } = ""; } } diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index f6d85f723..d8993b3ae 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -1241,6 +1241,9 @@ First Aetheria surfaces to publish: - Done: move zone body resource dictionaries from legacy item GUID keys to typed item-key strings; runtime body resource commit projection no longer calls `FromLegacyId`. + - Done: move resource scanner targets and mining tool asteroid belts to + typed body-key runtime commit fields; raw body ID commit fields are now + compatibility-only fallback input. - Remove runtime dependency on `ItemData` DTOs as item instance owners. 5. Mesh host