diff --git a/.voidbot/state/aetheria.cc b/.voidbot/state/aetheria.cc index bbb302b08..aff784580 100644 Binary files a/.voidbot/state/aetheria.cc and b/.voidbot/state/aetheria.cc differ diff --git a/Aetheria.State.Smoke/Program.cs b/Aetheria.State.Smoke/Program.cs index 74765c9b8..54be8c134 100644 --- a/Aetheria.State.Smoke/Program.cs +++ b/Aetheria.State.Smoke/Program.cs @@ -329,6 +329,22 @@ await using (var node = await AetheriaStateNode.OpenAsync(statePath, "aetheria-s BehaviorIndex = 6, BehaviorKind = "Thermotoggle", ThermotoggleTargetTemperature = 315.5 + }, + new AetheriaBehaviorStateSnapshot + { + OwnerKind = "equipment", + OwnerIndex = 0, + BehaviorIndex = 7, + BehaviorKind = "Switch", + SwitchActivated = true + }, + new AetheriaBehaviorStateSnapshot + { + OwnerKind = "equipment", + OwnerIndex = 0, + BehaviorIndex = 8, + BehaviorKind = "Trigger", + TriggerPulled = true } ], StatGrids = @@ -592,7 +608,7 @@ await using (var reopened = await AetheriaStateNode.OpenAsync(statePath, "aether entitySnapshot.WeaponStates[0].BehaviorKind != "LockWeapon" || entitySnapshot.WeaponStates[0].LockProgress != 0.65 || entitySnapshot.WeaponStates[0].LockTargetEntityKey != entityKey.ToString() || - entitySnapshot.BehaviorStates.Length != 7 || + entitySnapshot.BehaviorStates.Length != 9 || entitySnapshot.BehaviorStates[0].BehaviorKind != "AetherDrive" || entitySnapshot.BehaviorStates[0].AetherDriveAxisX != 0.5 || entitySnapshot.BehaviorStates[0].AetherDriveRpmY != 900.0 || @@ -617,6 +633,10 @@ await using (var reopened = await AetheriaStateNode.OpenAsync(statePath, "aether entitySnapshot.BehaviorStates[5].VelocityLimit != 42.0 || entitySnapshot.BehaviorStates[6].BehaviorKind != "Thermotoggle" || entitySnapshot.BehaviorStates[6].ThermotoggleTargetTemperature != 315.5 || + entitySnapshot.BehaviorStates[7].BehaviorKind != "Switch" || + !entitySnapshot.BehaviorStates[7].SwitchActivated || + entitySnapshot.BehaviorStates[8].BehaviorKind != "Trigger" || + !entitySnapshot.BehaviorStates[8].TriggerPulled || entitySnapshot.StatGrids.Length != 1 || entitySnapshot.StatGrids[0].Values.Length != 4) { diff --git a/Aetheria.State.Unity.Smoke/Program.cs b/Aetheria.State.Unity.Smoke/Program.cs index 85e8d11be..3a9ec6561 100644 --- a/Aetheria.State.Unity.Smoke/Program.cs +++ b/Aetheria.State.Unity.Smoke/Program.cs @@ -558,6 +558,22 @@ try BehaviorIndex = 0, BehaviorKind = "Thermotoggle", ThermotoggleTargetTemperature = 315.5 + }, + new AetheriaRuntimeBehaviorStateCommit + { + OwnerKind = "equipment", + OwnerIndex = 11, + BehaviorIndex = 0, + BehaviorKind = "Switch", + SwitchActivated = true + }, + new AetheriaRuntimeBehaviorStateCommit + { + OwnerKind = "equipment", + OwnerIndex = 12, + BehaviorIndex = 0, + BehaviorKind = "Trigger", + TriggerPulled = true } }, StatGrids = new[] @@ -678,7 +694,7 @@ try entity.WeaponStates[3].BehaviorKind == "LockWeapon" && entity.WeaponStates[3].LockProgress == 0.65 && entity.WeaponStates[3].LockTargetEntityKey == "global:aetheria.run_state.smoke-run.zone.0.entity.0.v1" && - entity.BehaviorStates.Length == 11 && + entity.BehaviorStates.Length == 13 && entity.BehaviorStates[0].BehaviorKind == "Sensor" && entity.BehaviorStates[0].Pinging && entity.BehaviorStates[0].PingRadius == 1200.0 && @@ -715,6 +731,10 @@ try entity.BehaviorStates[9].VelocityLimit == 42.0 && entity.BehaviorStates[10].BehaviorKind == "Thermotoggle" && entity.BehaviorStates[10].ThermotoggleTargetTemperature == 315.5 && + entity.BehaviorStates[11].BehaviorKind == "Switch" && + entity.BehaviorStates[11].SwitchActivated && + entity.BehaviorStates[12].BehaviorKind == "Trigger" && + entity.BehaviorStates[12].TriggerPulled && entity.WeaponGroups.Length == 1 && entity.StatGrids.Length == 2 && entity.StatGrids.Any(grid => 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.