From 19fdaab6abf94d810aea2c238446028c8304897a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 14 Jun 2026 16:25:23 +0100 Subject: [PATCH] Persist activation state in typed snapshots --- .voidbot/state/aetheria.cc | Bin 85681 -> 85584 bytes Aetheria.State.Smoke/Program.cs | 22 ++++++++++++++- Aetheria.State.Unity.Smoke/Program.cs | 26 ++++++++++++++++-- .../AetheriaRuntimeCommitLogApplier.cs | 4 ++- .../AetheriaRuntimeStateDocuments.cs | 6 ++++ Assets/Scripts/Gameplay/ActionGameManager.cs | 14 ++++++++++ .../Scripts/ServerShared/Behaviors/Trigger.cs | 3 +- .../Runtime/AetheriaRuntimeCatalogSnapshot.cs | 8 +++++- .../Runtime/AetheriaRuntimeCatalogStore.cs | 8 ++++-- .../AetheriaRuntimeStateCommitDocument.cs | 6 ++++ docs/aetheria-perfect-machine-map.md | 5 +++- 11 files changed, 93 insertions(+), 9 deletions(-) diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index bbb302b0881e79e22a6f0cc574d909d0bfaf8b03..aff784580125c1a6541d323d57af665c54d1d67d 100644 GIT binary patch delta 675 zcmdlum-WIN)(y*;xQtA!3{CXR4K1Q3GKx+<%G3=LF){*+nMNGjW94rcq!p)j2 z+cjAjEzCt!5>rbuQj0PZbrX|IGRqQ6GV}AM*H|+~s(1yLXO<*qC?w{kD1;Pcrl+SC zDInA+6qh8Hq)z9yVbu3y4l2!4NX|%2&MwH$%quBYNGvEw1?qws05Lc<1)>MVK#;o3 zymW09j>Te%SCPWQHFOkoV2zQLYRRS)W8cu3%ME7&X3f7vreChPNhNt#CTx5D5L?MJ^A22qsg-a#Weh!^K)}EOLTMc(-n$y^RrVG5{rvdi!j_V zeS;%o7UQ(((oT%JykHM5hlN*$6QeIIc^I34lE?HbPK^6uLMDdLG{iQ2hcjb7Cp58{ dm`pctVVuqZ<4*p_EWZ7j3*$jfm_}2>C;;IH<{Pb;gJxULH6Z{W630@V?;wISyQxUv=c=O(TKkt2hKK<^+^xKzHN3x}h z`OLX|sl4+Pj)xzn9?!(29DYxn3`OGpsH9vRl*}X%^uxvE-eM9;#knO$x=E6=v_mfW zigze&3tvmoN-NDYnP3)j;g|Yc;nvkAr8-*W_-3p%SU(fxRW#&W$l)(hwPh#DZXT^c zU{V#Z;HN28AcKR<)mDR z`@eGGv&$!-YF27++SoPVV9ci)q=zD2Pl$LmAtF_Wt@zjqxlI4qjH<)?F}g6gKan_O gZft-U;q%!+<<|{(5Tjxy*GGH1mtg grid.Name == "temperature" && grid.Values.Length == 2 && grid.Values[1] == 281.0) && @@ -770,7 +790,7 @@ try packageEntities[0].WeaponStates[2].AmmoIntervalProgress != 0.6 || packageEntities[0].WeaponStates[3].LockProgress != 0.65 || packageEntities[0].WeaponStates[3].LockTargetEntityKey != "global:aetheria.run_state.smoke-run.zone.0.entity.0.v1" || - packageEntities[0].BehaviorStates.Count != 11 || + packageEntities[0].BehaviorStates.Count != 13 || packageEntities[0].BehaviorStates[3].CapacitorCharge != 7.5 || packageEntities[0].BehaviorStates[4].AetherDriveRpmY != 900.0 || packageEntities[0].BehaviorStates[4].AetherDriveMaximumRpm != 2400.0 || @@ -783,6 +803,8 @@ try packageEntities[0].BehaviorStates[8].ShieldEfficiency != 0.7 || packageEntities[0].BehaviorStates[9].VelocityLimit != 42.0 || packageEntities[0].BehaviorStates[10].ThermotoggleTargetTemperature != 315.5 || + !packageEntities[0].BehaviorStates[11].SwitchActivated || + !packageEntities[0].BehaviorStates[12].TriggerPulled || packageEntities[0].StatGrids.Count != 2 || packageEntities[0].StatGrids.All(grid => grid.Name != "temperature" || grid.Values.Count != 2 || grid.Values[1] != 281.0)) { diff --git a/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs b/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs index 3615bb0b0..aeb0d328e 100644 --- a/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs +++ b/Aetheria.State/AetheriaRuntimeCommitLogApplier.cs @@ -514,7 +514,9 @@ public static class AetheriaRuntimeCommitLogApplier ShieldEfficiency = state.ShieldEfficiency, ShieldEnergyUsage = state.ShieldEnergyUsage, VelocityLimit = state.VelocityLimit, - ThermotoggleTargetTemperature = state.ThermotoggleTargetTemperature + ThermotoggleTargetTemperature = state.ThermotoggleTargetTemperature, + SwitchActivated = state.SwitchActivated, + TriggerPulled = state.TriggerPulled }) .ToArray(); } diff --git a/Aetheria.State/Documents/AetheriaRuntimeStateDocuments.cs b/Aetheria.State/Documents/AetheriaRuntimeStateDocuments.cs index 1dcb1b008..ba2725507 100644 --- a/Aetheria.State/Documents/AetheriaRuntimeStateDocuments.cs +++ b/Aetheria.State/Documents/AetheriaRuntimeStateDocuments.cs @@ -787,6 +787,12 @@ public sealed class AetheriaBehaviorStateSnapshot [Key(46)] public double ThermotoggleTargetTemperature { get; set; } + + [Key(47)] + public bool SwitchActivated { get; set; } + + [Key(48)] + public bool TriggerPulled { get; set; } } [MessagePackObject] diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index a240c71be..ff4d5e452 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -958,6 +958,20 @@ public class ActionGameManager : MonoBehaviour ThermotoggleTargetTemperature = thermotoggle.TargetTemperature }; } + else if (behavior is Switch switchBehavior) + { + state = new AetheriaRuntimeBehaviorStateCommit + { + SwitchActivated = switchBehavior.Activated + }; + } + else if (behavior is Trigger trigger) + { + state = new AetheriaRuntimeBehaviorStateCommit + { + TriggerPulled = trigger.Pulled + }; + } if (state == null) continue; diff --git a/Assets/Scripts/ServerShared/Behaviors/Trigger.cs b/Assets/Scripts/ServerShared/Behaviors/Trigger.cs index f21ec6d95..b31c8a2d1 100644 --- a/Assets/Scripts/ServerShared/Behaviors/Trigger.cs +++ b/Assets/Scripts/ServerShared/Behaviors/Trigger.cs @@ -20,6 +20,7 @@ public class TriggerData : BehaviorData public class Trigger : Behavior, IActivatedBehavior { public bool _pulled; + public bool Pulled => _pulled; public Trigger(TriggerData data, EquippedItem item) : base(data, item) { } public Trigger(TriggerData data, ConsumableItemEffect item) : base(data, item) { } @@ -43,4 +44,4 @@ public class Trigger : Behavior, IActivatedBehavior public void Deactivate() { } -} \ No newline at end of file +} diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogSnapshot.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogSnapshot.cs index 8dc6c495a..2ef42bef6 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogSnapshot.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogSnapshot.cs @@ -1114,7 +1114,9 @@ namespace GameCult.Aetheria.State.Unity double shieldEfficiency, double shieldEnergyUsage, double velocityLimit, - double thermotoggleTargetTemperature) + double thermotoggleTargetTemperature, + bool switchActivated, + bool triggerPulled) { OwnerKind = ownerKind; OwnerIndex = ownerIndex; @@ -1163,6 +1165,8 @@ namespace GameCult.Aetheria.State.Unity ShieldEnergyUsage = shieldEnergyUsage; VelocityLimit = velocityLimit; ThermotoggleTargetTemperature = thermotoggleTargetTemperature; + SwitchActivated = switchActivated; + TriggerPulled = triggerPulled; } public string OwnerKind { get; } @@ -1212,5 +1216,7 @@ namespace GameCult.Aetheria.State.Unity public double ShieldEnergyUsage { get; } public double VelocityLimit { get; } public double ThermotoggleTargetTemperature { get; } + public bool SwitchActivated { get; } + public bool TriggerPulled { get; } } } diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs index 46eaee748..77607b31a 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeCatalogStore.cs @@ -904,7 +904,9 @@ namespace GameCult.Aetheria.State.Unity var shieldEnergyUsage = ReadFieldDouble(ref reader, behaviorFields, 44); var velocityLimit = ReadFieldDouble(ref reader, behaviorFields, 45); var thermotoggleTargetTemperature = ReadFieldDouble(ref reader, behaviorFields, 46); - SkipRemaining(ref reader, behaviorFields, 47); + var switchActivated = ReadFieldBool(ref reader, behaviorFields, 47); + var triggerPulled = ReadFieldBool(ref reader, behaviorFields, 48); + SkipRemaining(ref reader, behaviorFields, 49); behaviorStates[behavior] = new AetheriaRuntimeBehaviorStateSnapshot( ownerKind, ownerIndex, @@ -952,7 +954,9 @@ namespace GameCult.Aetheria.State.Unity shieldEfficiency, shieldEnergyUsage, velocityLimit, - thermotoggleTargetTemperature); + thermotoggleTargetTemperature, + switchActivated, + triggerPulled); } return behaviorStates; diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs index a290b4cbc..8a2f54121 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeStateCommitDocument.cs @@ -836,5 +836,11 @@ namespace GameCult.Aetheria.State.Unity [Key(46)] public double ThermotoggleTargetTemperature { get; set; } + + [Key(47)] + public bool SwitchActivated { get; set; } + + [Key(48)] + public bool TriggerPulled { get; set; } } } diff --git a/docs/aetheria-perfect-machine-map.md b/docs/aetheria-perfect-machine-map.md index b212a27dc..58e41faca 100644 --- a/docs/aetheria-perfect-machine-map.md +++ b/docs/aetheria-perfect-machine-map.md @@ -177,7 +177,8 @@ legacy catalog cache, and legacy UI paths should be migration-only or deleted. index, and evaluated range rows. Thrusters publish analog axis input, evaluated thrust, and torque rows. Shields publish evaluated efficiency and energy usage, velocity limiters publish evaluated limit, and thermotoggles - publish their active target temperature. + publish their active target temperature. Switches publish activated state, + and triggers publish pending pulled state. `RuntimeEntityBlueprint` still exists for construction/loadout projection, but those live hull grids and session scalars are not blueprint fields and cannot be restored by the old blueprint projector path. @@ -822,6 +823,8 @@ First Aetheria surfaces to publish: so analog propulsion state is typed snapshot/readback state. - Done: extend behavior state rows for Shield efficiency/energy usage, VelocityLimit limit, and Thermotoggle target temperature. + - Done: extend behavior state rows for Switch activation and Trigger + pending pull state. - Done: cut live simulation grids out of `RuntimeEntityBlueprint`; loadout and construction templates no longer capture or restore temperature, armor, max-armor, or hull-conductivity state.