From d32fc91faba0566c4bafd4c47cac1b645d4dddda Mon Sep 17 00:00:00 2001 From: Lamont Granquist Date: Thu, 29 Jun 2023 16:18:11 -0700 Subject: [PATCH] support activating RCS Signed-off-by: Lamont Granquist --- MechJeb2/MechJebLib/Simulations/Builder.cs | 33 ++++++++++--------- .../PartModules/SimModuleAnchoredDecoupler.cs | 1 - .../PartModules/SimModuleDecouple.cs | 1 - .../PartModules/SimModuleDockingNode.cs | 1 - .../PartModules/SimModuleEngines.cs | 2 +- .../Simulations/PartModules/SimModuleRCS.cs | 10 ++++++ .../SimProceduralFairingDecoupler.cs | 1 - MechJeb2/MechJebLib/Simulations/SimPart.cs | 1 + .../MechJebLib/Simulations/SimPartModule.cs | 2 ++ MechJeb2/MechJebLib/Simulations/SimVessel.cs | 8 ++++- 10 files changed, 38 insertions(+), 22 deletions(-) diff --git a/MechJeb2/MechJebLib/Simulations/Builder.cs b/MechJeb2/MechJebLib/Simulations/Builder.cs index 7aef5859..8502a37c 100644 --- a/MechJeb2/MechJebLib/Simulations/Builder.cs +++ b/MechJeb2/MechJebLib/Simulations/Builder.cs @@ -224,26 +224,27 @@ private void BuildModules(SimVessel vessel, SimPart part, Part kspPart) ModuleAnchoredDecoupler kspAnchoredDecoupler => BuildModuleAnchoredDecoupler(part, kspAnchoredDecoupler), ModuleDecouple kspModuleDecouple => BuildModuleDecouple(part, kspModuleDecouple), ModuleDockingNode kspModuleDockingNode => BuildDockingNode(part, kspModuleDockingNode), - ModuleRCS kspModuleRCS => BuildModuleRCS(part, kspModuleRCS), + ModuleRCS kspModuleRCS => BuildModuleRCS(vessel, part, kspModuleRCS), _ => null - }; - - - if (m != null) - return m; - - return kspModule.moduleName switch + } ?? kspModule.moduleName switch { "ProceduralFairingDecoupler" => BuildProceduralFairingDecoupler(part, kspModule), _ => null }; + + if (m == null) + return null; + + m.ModuleIsEnabled = kspModule.moduleIsEnabled; + m.StagingEnabled = kspModule.stagingEnabled; + + return m; } private SimPartModule BuildDockingNode(SimPart part, ModuleDockingNode kspModuleDockingNode) { var decoupler = SimModuleDockingNode.Borrow(part); - decoupler.StagingEnabled = kspModuleDockingNode.stagingEnabled; decoupler.Staged = kspModuleDockingNode.staged; if (!(kspModuleDockingNode.referenceNode.attachedPart is null)) @@ -255,7 +256,6 @@ private SimPartModule BuildModuleDecouple(SimPart part, ModuleDecouple kspModule { var decoupler = SimModuleDecouple.Borrow(part); decoupler.IsDecoupled = kspModuleDecouple.isDecoupled; - decoupler.StagingEnabled = kspModuleDecouple.stagingEnabled; decoupler.IsOmniDecoupler = kspModuleDecouple.isOmniDecoupler; decoupler.Staged = kspModuleDecouple.staged; @@ -283,7 +283,6 @@ private SimPartModule BuildModuleAnchoredDecoupler(SimPart part, ModuleAnchoredD { var decoupler = SimModuleAnchoredDecoupler.Borrow(part); decoupler.IsDecoupled = kspAnchoredDecoupler.isDecoupled; - decoupler.StagingEnabled = kspAnchoredDecoupler.stagingEnabled; decoupler.Staged = kspAnchoredDecoupler.staged; Part kspPart = kspAnchoredDecoupler.part; @@ -401,24 +400,26 @@ private SimModuleEngines BuildModuleEngines(SimVessel vessel, SimPart part, Modu return engine; } - private SimPartModule BuildModuleRCS(SimPart part, ModuleRCS kspModuleRCS) + private SimPartModule BuildModuleRCS(SimVessel vessel, SimPart part, ModuleRCS kspModuleRCS) { var rcs = SimModuleRCS.Borrow(part); - rcs.Isp = kspModuleRCS.atmosphereCurve.Evaluate(0) * kspModuleRCS.ispMult; - rcs.G = kspModuleRCS.G; - rcs.Thrust = kspModuleRCS.flowMult * kspModuleRCS.maxFuelFlow * rcs.Isp * rcs.G; + rcs.Isp = kspModuleRCS.atmosphereCurve.Evaluate(0) * kspModuleRCS.ispMult; + rcs.G = kspModuleRCS.G; + rcs.Thrust = kspModuleRCS.flowMult * kspModuleRCS.maxFuelFlow * rcs.Isp * rcs.G; + rcs.rcsEnabled = kspModuleRCS.rcsEnabled; foreach (Propellant p in kspModuleRCS.propellants) rcs.Propellants.Add(new SimPropellant(p.id, p.ignoreForIsp, p.ratio, (SimFlowMode)p.GetFlowMode(), PartResourceLibrary.Instance.GetDefinition(p.id).density)); + vessel.RCSActivatedInStage[kspModuleRCS.part.inverseStage].Add(rcs); + return rcs; } private SimProceduralFairingDecoupler BuildProceduralFairingDecoupler(SimPart part, PartModule kspPartModule) { var decoupler = SimProceduralFairingDecoupler.Borrow(part); - decoupler.StagingEnabled = kspPartModule.stagingEnabled; decoupler.IsDecoupled = kspPartModule.Fields["decoupled"].GetValue(kspPartModule); return decoupler; } diff --git a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleAnchoredDecoupler.cs b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleAnchoredDecoupler.cs index 4ed8b00c..847d298d 100644 --- a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleAnchoredDecoupler.cs +++ b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleAnchoredDecoupler.cs @@ -9,7 +9,6 @@ public class SimModuleAnchoredDecoupler : SimPartModule private static readonly ObjectPool _pool = new ObjectPool(New, Clear); public bool IsDecoupled; - public bool StagingEnabled; public bool Staged; public SimPart? AttachedPart; diff --git a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDecouple.cs b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDecouple.cs index 08559f36..7575836f 100644 --- a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDecouple.cs +++ b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDecouple.cs @@ -9,7 +9,6 @@ public class SimModuleDecouple : SimPartModule private static readonly ObjectPool _pool = new ObjectPool(New, Clear); public bool IsDecoupled; - public bool StagingEnabled; public bool IsOmniDecoupler; public bool Staged; public SimPart? AttachedPart; diff --git a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDockingNode.cs b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDockingNode.cs index e0a8b50e..4f054f35 100644 --- a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDockingNode.cs +++ b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleDockingNode.cs @@ -8,7 +8,6 @@ public class SimModuleDockingNode : SimPartModule { private static readonly ObjectPool _pool = new ObjectPool(New, Clear); - public bool StagingEnabled; public bool Staged; public SimPart? AttachedPart; diff --git a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleEngines.cs b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleEngines.cs index de5b90e5..7aa3cb4d 100644 --- a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleEngines.cs +++ b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleEngines.cs @@ -73,7 +73,7 @@ public class SimModuleEngines : SimPartModule private double _atmDensity => Part.Vessel.ATMDensity; private double _machNumber => Part.Vessel.MachNumber; - public void Ignite() + public void Activate() { Log("igniting engine"); IsOperational = true; diff --git a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleRCS.cs b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleRCS.cs index 37a25b37..9d1ca0bb 100644 --- a/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleRCS.cs +++ b/MechJeb2/MechJebLib/Simulations/PartModules/SimModuleRCS.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using MechJebLib.Utils; +using static MechJebLib.Utils.Statics; namespace MechJebLib.Simulations.PartModules { @@ -15,6 +16,7 @@ public class SimModuleRCS : SimPartModule public double G; public double Isp; public double Thrust; + public bool rcsEnabled; public override void Dispose() { @@ -33,6 +35,14 @@ private static SimModuleRCS New() return new SimModuleRCS(); } + public void Activate() + { + if (StagingEnabled && ModuleIsEnabled) + { + rcsEnabled = true; + } + } + private static void Clear(SimModuleRCS m) { } diff --git a/MechJeb2/MechJebLib/Simulations/PartModules/SimProceduralFairingDecoupler.cs b/MechJeb2/MechJebLib/Simulations/PartModules/SimProceduralFairingDecoupler.cs index 8328b7e9..46629532 100644 --- a/MechJeb2/MechJebLib/Simulations/PartModules/SimProceduralFairingDecoupler.cs +++ b/MechJeb2/MechJebLib/Simulations/PartModules/SimProceduralFairingDecoupler.cs @@ -9,7 +9,6 @@ public class SimProceduralFairingDecoupler : SimPartModule private static readonly ObjectPool _pool = new ObjectPool(New, Clear); public bool IsDecoupled; - public bool StagingEnabled; public override void Dispose() { diff --git a/MechJeb2/MechJebLib/Simulations/SimPart.cs b/MechJeb2/MechJebLib/Simulations/SimPart.cs index e13a3728..49fb1f3a 100644 --- a/MechJeb2/MechJebLib/Simulations/SimPart.cs +++ b/MechJeb2/MechJebLib/Simulations/SimPart.cs @@ -27,6 +27,7 @@ public class SimPart public bool IsThrottleLocked; public int ResourcePriority; public double ResourceRequestRemainingThreshold; + public bool IsEnabled; public double Mass; public double DryMass; diff --git a/MechJeb2/MechJebLib/Simulations/SimPartModule.cs b/MechJeb2/MechJebLib/Simulations/SimPartModule.cs index b92e9cf0..d08e8340 100644 --- a/MechJeb2/MechJebLib/Simulations/SimPartModule.cs +++ b/MechJeb2/MechJebLib/Simulations/SimPartModule.cs @@ -8,6 +8,8 @@ public abstract class SimPartModule : IDisposable { public bool IsEnabled; public SimPart Part = null!; + public bool ModuleIsEnabled; + public bool StagingEnabled; public abstract void Dispose(); } diff --git a/MechJeb2/MechJebLib/Simulations/SimVessel.cs b/MechJeb2/MechJebLib/Simulations/SimVessel.cs index 9b5280b3..4005da62 100644 --- a/MechJeb2/MechJebLib/Simulations/SimVessel.cs +++ b/MechJeb2/MechJebLib/Simulations/SimVessel.cs @@ -18,6 +18,7 @@ public class SimVessel : IDisposable public readonly DictOfLists PartsDroppedInStage = new DictOfLists(10); public readonly DictOfLists EnginesDroppedInStage = new DictOfLists(10); public readonly DictOfLists EnginesActivatedInStage = new DictOfLists(10); + public readonly DictOfLists RCSActivatedInStage = new DictOfLists(10); public readonly List ActiveEngines = new List(10); public int CurrentStage; // FIXME: restorable @@ -62,7 +63,11 @@ public void Stage() foreach (SimModuleEngines e in EnginesActivatedInStage[CurrentStage]) if (e.IsEnabled) - e.Ignite(); + e.Activate(); + + foreach (SimModuleRCS r in RCSActivatedInStage[CurrentStage]) + if (r.IsEnabled) + r.Activate(); UpdateMass(); } @@ -149,6 +154,7 @@ private static void Clear(SimVessel v) v.Parts.Clear(); v.PartsDroppedInStage.Clear(); v.EnginesActivatedInStage.Clear(); + v.RCSActivatedInStage.Clear(); v.ActiveEngines.Clear(); }