EngineSim objects are now pooled.
Binary files a/Assets/CurseLogo.png and b/Assets/CurseLogo.png differ
Binary files a/Assets/CurseLogo.psd and b/Assets/CurseLogo.psd differ
--- a/Documents/CHANGES.txt
+++ b/Documents/CHANGES.txt
@@ -1,5 +1,62 @@
-1.0.13, 16-12-2014
- Updated for KSP version 0.90
+1.0.16.3, 27-04-2015
+ Fixed issue with the toolbar icons not being created.
+ Removed superfluous 'm/s' on the mach slider in the build engineer.
+
+1.0.16.2, 27-04-2015
+ Changed the atmospheric slider on the build engineer to default to 0km when changing bodies.
+
+1.0.16.1, 26-04-2015, KSP Build #828
+ Merged Sarbian's mach adjustments.
+ Fixed bugs relating to thrust and atmosphere/velocity curves.
+ Changed the atmospheric slider on the Build Engineer to work based on altitude.
+ Changed the atmospheric slider to clamp to the maximum altitude for the selected body.
+ Changed the velocity slider to clamp to the maximum usable mach value for the current vessel.
+
+1.0.16.0, 25-04-2015, KSP Build #821
+ Fixed errors relating to KSP 1.0 update.
+ Fixed fuel simulation to account for new thrust system.
+ Fixed atmospheric engines to use the new velocity curve.
+ Fixed atmospheric readouts to work with the new atmospheric model.
+
+1.0.15.2, 13-02-2015
+ Padishar's Fixes:
+ Fixed: Calculation of per-stage resource mass.
+
+1.0.15.1, 13-02-2015
+ Rebuild
+
+1.0.15.0, 08-02-2015
+ Padishar's Fixes:
+ Added: Support KIDS ISP thrust correction.
+ Fixed: Log spam for stage priority mode.
+ Fixed: Locked tanks preventing simulation from staging.
+ Fixed: No flow and all vessel modes to respect flow states.
+
+1.0.14.1, 28-12-2014
+ Fixed: Missing texture on the ER-7500 model.
+
+1.0.14.0, 28-12-2014
+ Added: Career mode that limits the Flight Engineer by:
+ - Requiring an Engineer Kerbal of any level, or placement of an Engineer Chip or ER-7500 part.
+ - Tracking station level 3 enables Flight Engineer everywhere.
+
+ Added: New readouts to the orbital category:
+ - Mean Anomaly at Epoc
+
+ Added: New readouts to the miscellaneous category:
+ - System Time
+
+ Added: Editor Overlay Tab's X position is now changable in the BuildOverlay.xml settings file.
+ Changed: Editor Overlay Tabs start position moved over as to not overlap the parts menu.
+ Fixed: Bug where STAGE_PRIORITY_FLOW resources would not be corrently disabled/enabled.
+ Fixed: Issue with the formatting large Mass and Cost values.
+ Fixed: Error when loading the Engineer7500 part model.
+
+1.0.13.1, 16-12-2014
+ Fixed: Issue with manoeuvre node readouts and low tier tracking station.
+
+1.0.13.0, 16-12-2014
+ Updated for KSP version 0.90
Added: New readouts to the vessel category:
- Heading Rate
@@ -7,30 +64,30 @@
- Roll Rate
Changed: Simulation to look for fuel lines that use CModuleFuelLine module.
- Fixed: Editor Overlay now loads the saved visibility value properly.
+ Fixed: Editor Overlay now loads the saved visibility value properly.
Fixed: Altitude (Terrain) will no longer give a reading below sea level.
Fixed: Suicide burn now uses radar altitude that clamps to sea level.
1.0.12.0, 01-12-2014
- Added: Setting in Build Engineer to enable/disable vectored thrust calculations.
- Added: Thrust torque field in Build Engineer (courtesy of mic_e).
- Added: New readouts to the vessel category:
- - Thrust Offset Angle (courtesy of mic_e)
- - Thrust Torque (courtesy of mic_e)
- - Part Count: stage/total
- - Heading
- - Pitch
- - Roll
-
- Added: New readouts to the surface category:
- - Situation
-
- Added: New readouts to the miscellaneous category:
- - Vectored Thrust Toggle
-
- Fixed: The category selection within the section editors now do not always reset back to 'Orbital'.
- Fixed: Issue where the vessel simulation can sometimes permanently freeze.
- Fixed: Issue where the vessel simulation would not show updates when the delay was set lower than the frame rate.
+ Added: Setting in Build Engineer to enable/disable vectored thrust calculations.
+ Added: Thrust torque field in Build Engineer (courtesy of mic_e).
+ Added: New readouts to the vessel category:
+ - Thrust Offset Angle (courtesy of mic_e)
+ - Thrust Torque (courtesy of mic_e)
+ - Part Count: stage/total
+ - Heading
+ - Pitch
+ - Roll
+
+ Added: New readouts to the surface category:
+ - Situation
+
+ Added: New readouts to the miscellaneous category:
+ - Vectored Thrust Toggle
+
+ Fixed: The category selection within the section editors now do not always reset back to 'Orbital'.
+ Fixed: Issue where the vessel simulation can sometimes permanently freeze.
+ Fixed: Issue where the vessel simulation would not show updates when the delay was set lower than the frame rate.
1.0.11.3, 11-11-2014
Changed: Gravity measurements for Isp to 9.82.
--- a/KerbalEngineer/CelestialBodies.cs
+++ b/KerbalEngineer/CelestialBodies.cs
@@ -17,16 +17,12 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
-#region Using Directives
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-#endregion
-
namespace KerbalEngineer
{
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+
/*
*
* With thanks to Nathaniel R. Lewis (aka. Teknoman117) (linux.robotdude@gmail.com) for working out
@@ -36,8 +32,6 @@
public static class CelestialBodies
{
- #region Constructors
-
static CelestialBodies()
{
try
@@ -55,16 +49,8 @@
}
}
- #endregion
-
- #region Properties
-
public static BodyInfo SelectedBody { get; private set; }
public static BodyInfo SystemBody { get; private set; }
-
- #endregion
-
- #region Public Methods
/// <summary>
/// Gets a body given a supplied body name.
@@ -89,7 +75,7 @@
{
try
{
- var body = GetBodyInfo(bodyName);
+ BodyInfo body = GetBodyInfo(bodyName);
if (body != null)
{
if (SelectedBody != null)
@@ -108,33 +94,26 @@
return false;
}
- #endregion
-
- #region Nested type: BodyInfo
-
public class BodyInfo
{
- #region Constructors
-
public BodyInfo(CelestialBody body, BodyInfo parent = null)
{
try
{
// Set the body information.
- this.CelestialBody = body;
- this.Name = body.bodyName;
- this.Gravity = 9.81 * body.GeeASL;
- this.Atmosphere = body.atmosphere ? 101.325 * body.atmosphereMultiplier : 0;
- this.Parent = parent;
+ CelestialBody = body;
+ Name = body.bodyName;
+ Gravity = 9.81 * body.GeeASL;
+ Parent = parent;
// Set orbiting bodies information.
- this.Children = new List<BodyInfo>();
- foreach (var orbitingBody in body.orbitingBodies)
- {
- this.Children.Add(new BodyInfo(orbitingBody, this));
- }
-
- this.SelectedDepth = 0;
+ Children = new List<BodyInfo>();
+ foreach (CelestialBody orbitingBody in body.orbitingBodies)
+ {
+ Children.Add(new BodyInfo(orbitingBody, this));
+ }
+
+ SelectedDepth = 0;
}
catch (Exception ex)
{
@@ -142,37 +121,28 @@
}
}
- #endregion
-
- #region Properties
-
+ public CelestialBody CelestialBody { get; private set; }
+ public List<BodyInfo> Children { get; private set; }
+ public double Gravity { get; private set; }
public string Name { get; private set; }
- public double Gravity { get; private set; }
- public double Atmosphere { get; private set; }
public BodyInfo Parent { get; private set; }
- public List<BodyInfo> Children { get; private set; }
- public CelestialBody CelestialBody { get; private set; }
public bool Selected { get; private set; }
public int SelectedDepth { get; private set; }
- #endregion
-
- #region Public Methods
-
public BodyInfo GetBodyInfo(string bodyName)
{
try
{
// This is the searched body.
- if (String.Equals(this.Name, bodyName, StringComparison.CurrentCultureIgnoreCase))
+ if (String.Equals(Name, bodyName, StringComparison.CurrentCultureIgnoreCase))
{
return this;
}
// Check to see if any of this bodies children are the searched body.
- foreach (var child in this.Children)
- {
- var body = child.GetBodyInfo(bodyName);
+ foreach (BodyInfo child in Children)
+ {
+ BodyInfo body = child.GetBodyInfo(bodyName);
if (body != null)
{
return body;
@@ -188,33 +158,44 @@
return null;
}
+ public double GetDensity(double altitude)
+ {
+ return CelestialBody.GetDensity(GetPressure(altitude), GetTemperature(altitude));
+ }
+
+ public double GetPressure(double altitude)
+ {
+ return CelestialBody.GetPressure(altitude);
+ }
+
+ public double GetTemperature(double altitude)
+ {
+ return CelestialBody.GetTemperature(altitude);
+ }
+
+ public double GetAtmospheres(double altitude)
+ {
+ return GetPressure(altitude) * PhysicsGlobals.KpaToAtmospheres;
+ }
+
public void SetSelected(bool state, int depth = 0)
{
- this.Selected = state;
- this.SelectedDepth = depth;
- if (this.Parent != null)
- {
- this.Parent.SetSelected(state, depth + 1);
- }
- }
-
- #endregion
-
- #region Debugging
+ Selected = state;
+ SelectedDepth = depth;
+ if (Parent != null)
+ {
+ Parent.SetSelected(state, depth + 1);
+ }
+ }
public override string ToString()
{
- var log = "\n" + this.Name +
- "\n\tGravity: " + this.Gravity +
- "\n\tAtmosphere: " + this.Atmosphere +
- "\n\tSelected: " + this.Selected;
-
- return this.Children.Aggregate(log, (current, child) => current + "\n" + child);
- }
-
- #endregion
- }
-
- #endregion
+ string log = "\n" + Name +
+ "\n\tGravity: " + Gravity +
+ "\n\tSelected: " + Selected;
+
+ return Children.Aggregate(log, (current, child) => current + "\n" + child);
+ }
+ }
}
}
--- a/KerbalEngineer/Editor/BuildAdvanced.cs
+++ b/KerbalEngineer/Editor/BuildAdvanced.cs
@@ -37,11 +37,11 @@
public class BuildAdvanced : MonoBehaviour
{
#region Fields
+ public static float Altitude = 0.0f;
private GUIStyle areaSettingStyle;
private GUIStyle areaStyle;
- private float atmosphericPercentage = 1.0f;
- private float atmosphericVelocity;
+ private float atmosphericMach;
private GUIStyle bodiesButtonActiveStyle;
private GUIStyle bodiesButtonStyle;
private DropDown bodiesList;
@@ -133,6 +133,7 @@
this.bodiesList.DrawCallback = this.DrawBodiesList;
this.Load();
+ SimManager.UpdateModSettings();
SimManager.OnReady -= this.GetStageInfo;
SimManager.OnReady += this.GetStageInfo;
}
@@ -168,11 +169,6 @@
}
}
- private void GetStageInfo()
- {
- this.stages = SimManager.Stages;
- }
-
protected void OnGUI()
{
try
@@ -260,14 +256,14 @@
if (this.showAtmosphericDetails)
{
- SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01d * this.atmosphericPercentage;
+ SimManager.Atmosphere = CelestialBodies.SelectedBody.GetAtmospheres(Altitude);
}
else
{
SimManager.Atmosphere = 0;
}
- SimManager.Velocity = this.atmosphericVelocity;
+ SimManager.Mach = this.atmosphericMach;
SimManager.RequestSimulation();
SimManager.TryStartSimulation();
@@ -300,18 +296,18 @@
{
GUILayout.BeginHorizontal();
GUILayout.BeginVertical();
- GUILayout.Label("Pressure: " + (this.atmosphericPercentage * 100.0f).ToString("F1") + "%", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
+ GUILayout.Label("Altitude: " + (Altitude * 0.001f).ToString("F1") + "km", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
GUI.skin = HighLogic.Skin;
- this.atmosphericPercentage = GUILayout.HorizontalSlider(this.atmosphericPercentage, 0, 1.0f);
+ Altitude = GUILayout.HorizontalSlider(Altitude, 0.0f, (float)(CelestialBodies.SelectedBody.CelestialBody.atmosphereDepth));
GUI.skin = null;
GUILayout.EndVertical();
GUILayout.Space(5.0f);
-
+
GUILayout.BeginVertical();
- GUILayout.Label("Velocity: " + this.atmosphericVelocity.ToString("F1") + "m/s", this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
+ GUILayout.Label("Mach: " + this.atmosphericMach.ToString("F1"), this.settingAtmoStyle, GUILayout.Width(125.0f * GuiDisplaySize.Offset));
GUI.skin = HighLogic.Skin;
- this.atmosphericVelocity = GUILayout.HorizontalSlider(this.atmosphericVelocity, 0, 2500f);
+ atmosphericMach = GUILayout.HorizontalSlider(Mathf.Clamp(atmosphericMach, 0.0f, SimManager.LastStage.maxMach), 0.0f, SimManager.LastStage.maxMach);
GUI.skin = null;
GUILayout.EndVertical();
GUILayout.EndHorizontal();
@@ -339,6 +335,7 @@
if (GUILayout.Button(bodyInfo.Children.Count > 0 ? bodyInfo.Name + " [" + bodyInfo.Children.Count + "]" : bodyInfo.Name, bodyInfo.Selected && bodyInfo.SelectedDepth == 0 ? this.bodiesButtonActiveStyle : this.bodiesButtonStyle))
{
CelestialBodies.SetSelectedBody(bodyInfo.Name);
+ Altitude = 0.0f;
this.bodiesList.Resize = true;
}
GUILayout.EndHorizontal();
@@ -380,7 +377,7 @@
{
if (this.showAllStages || stage.deltaV > 0)
{
- GUILayout.Label(Units.Concat(stage.cost, stage.totalCost), this.infoStyle);
+ GUILayout.Label(Units.Cost(stage.cost, stage.totalCost), this.infoStyle);
}
}
GUILayout.EndVertical();
@@ -479,8 +476,14 @@
GUILayout.BeginHorizontal();
GUILayout.Label("Flight Engineer activation mode:", this.settingStyle);
- FlightEngineerPartless.IsPartless = GUILayout.Toggle(FlightEngineerPartless.IsPartless, "PARTLESS", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
- FlightEngineerPartless.IsPartless = !GUILayout.Toggle(!FlightEngineerPartless.IsPartless, "MODULE", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+ FlightEngineerCore.IsCareerMode = GUILayout.Toggle(FlightEngineerCore.IsCareerMode, "CAREER", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+ FlightEngineerCore.IsCareerMode = !GUILayout.Toggle(!FlightEngineerCore.IsCareerMode, "PARTLESS", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+ GUILayout.Label("Flight Engineer Career Limitations:", this.settingStyle);
+ FlightEngineerCore.IsKerbalLimited = GUILayout.Toggle(FlightEngineerCore.IsKerbalLimited, "KERBAL", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
+ FlightEngineerCore.IsTrackingStationLimited = GUILayout.Toggle(FlightEngineerCore.IsTrackingStationLimited, "TRACKING", this.buttonStyle, GUILayout.Width(100.0f * GuiDisplaySize.Offset));
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
@@ -583,6 +586,11 @@
BuildOverlayPartInfo.Hidden = false;
this.isEditorLocked = false;
}
+ }
+
+ private void GetStageInfo()
+ {
+ this.stages = SimManager.Stages;
}
/// <summary>
--- a/KerbalEngineer/Editor/BuildOverlay.cs
+++ b/KerbalEngineer/Editor/BuildOverlay.cs
@@ -19,17 +19,21 @@
#region Using Directives
-using System;
-
-using KerbalEngineer.Helpers;
-using KerbalEngineer.Settings;
-
-using UnityEngine;
+
#endregion
namespace KerbalEngineer.Editor
{
+ #region Using Directives
+
+ using System;
+ using Helpers;
+ using Settings;
+ using UnityEngine;
+
+ #endregion
+
[KSPAddon(KSPAddon.Startup.EditorAny, false)]
public class BuildOverlay : MonoBehaviour
{
@@ -191,7 +195,7 @@
#endregion
- #region Methods: public
+ #region Methods
public static void Load()
{
@@ -201,6 +205,7 @@
BuildOverlayPartInfo.ClickToOpen = handler.GetSet("clickToOpen", BuildOverlayPartInfo.ClickToOpen);
buildOverlayVessel.Open = handler.GetSet("vesselOpen", buildOverlayVessel.Open);
buildOverlayResources.Open = handler.GetSet("resourcesOpen", buildOverlayResources.Open);
+ buildOverlayVessel.WindowX = handler.GetSet("vesselWindowX", buildOverlayVessel.WindowX);
handler.Save("BuildOverlay.xml");
}
@@ -212,12 +217,9 @@
handler.Set("clickToOpen", BuildOverlayPartInfo.ClickToOpen);
handler.Set("vesselOpen", buildOverlayVessel.Open);
handler.Set("resourcesOpen", buildOverlayResources.Open);
+ handler.Set("vesselWindowX", buildOverlayVessel.WindowX);
handler.Save("BuildOverlay.xml");
}
-
- #endregion
-
- #region Methods: protected
protected void Awake()
{
--- a/KerbalEngineer/Editor/BuildOverlayPartInfo.cs
+++ b/KerbalEngineer/Editor/BuildOverlayPartInfo.cs
@@ -195,7 +195,7 @@
private void SetCostInfo()
{
- this.infoItems.Add(new PartInfoItem("Cost", Units.Concat(this.selectedPart.GetCostDry(), this.selectedPart.GetCostWet())));
+ this.infoItems.Add(new PartInfoItem("Cost", Units.ConcatF(this.selectedPart.GetCostDry(), this.selectedPart.GetCostWet())));
}
private void SetDecouplerInfo()
@@ -222,7 +222,7 @@
var engine = this.selectedPart.GetProtoModuleEngine();
this.infoItems.Add(new PartInfoItem("Thrust", Units.ToForce(engine.MinimumThrust, engine.MaximumThrust)));
- this.infoItems.Add(new PartInfoItem("Isp", Units.Concat(engine.GetSpecificImpulse(1.0f), engine.GetSpecificImpulse(0.0f)) + "s"));
+ this.infoItems.Add(new PartInfoItem("Isp", Units.ConcatF(engine.GetSpecificImpulse(1.0f), engine.GetSpecificImpulse(0.0f)) + "s"));
if (engine.Propellants.Count > 0)
{
this.infoItems.Add(new PartInfoItem("Propellants"));
@@ -291,7 +291,7 @@
}
var parachute = this.selectedPart.GetModule<ModuleParachute>();
- this.infoItems.Add(new PartInfoItem("Deployed Drag", Units.Concat(parachute.semiDeployedDrag, parachute.fullyDeployedDrag)));
+ this.infoItems.Add(new PartInfoItem("Deployed Drag", Units.ConcatF(parachute.semiDeployedDrag, parachute.fullyDeployedDrag)));
this.infoItems.Add(new PartInfoItem("Deployment Altitude", parachute.deployAltitude.ToDistance()));
this.infoItems.Add(new PartInfoItem("Deployment Pressure", parachute.minAirPressureToOpen.ToString("F2")));
}
@@ -305,7 +305,7 @@
var rcs = this.selectedPart.GetModule<ModuleRCS>();
this.infoItems.Add(new PartInfoItem("Thruster Power", rcs.thrusterPower.ToForce()));
- this.infoItems.Add(new PartInfoItem("Specific Impulse", Units.Concat(rcs.atmosphereCurve.Evaluate(1.0f), rcs.atmosphereCurve.Evaluate(0.0f)) + "s"));
+ this.infoItems.Add(new PartInfoItem("Specific Impulse", Units.ConcatF(rcs.atmosphereCurve.Evaluate(1.0f), rcs.atmosphereCurve.Evaluate(0.0f)) + "s"));
}
private void SetReactionWheelInfo()
--- a/KerbalEngineer/Editor/BuildOverlayVessel.cs
+++ b/KerbalEngineer/Editor/BuildOverlayVessel.cs
@@ -19,18 +19,20 @@
#region Using Directives
-using System;
-using System.Collections.Generic;
-
-using KerbalEngineer.Helpers;
-using KerbalEngineer.VesselSimulator;
-
-using UnityEngine;
-
#endregion
namespace KerbalEngineer.Editor
{
+ #region Using Directives
+
+ using System;
+ using System.Collections.Generic;
+ using Helpers;
+ using UnityEngine;
+ using VesselSimulator;
+
+ #endregion
+
public class BuildOverlayVessel : MonoBehaviour
{
#region Constants
@@ -51,7 +53,7 @@
private GUIContent tabContent;
private Rect tabPosition;
private Vector2 tabSize;
- private Rect windowPosition = new Rect(300.0f, 0.0f, Width, 0.0f);
+ private Rect windowPosition = new Rect(330.0f, 0.0f, Width, 0.0f);
#endregion
@@ -74,9 +76,28 @@
get { return this.windowPosition; }
}
- #endregion
-
- #region Methods: protected
+ public float WindowX
+ {
+ get { return this.windowPosition.x; }
+ set { this.windowPosition.x = value; }
+ }
+
+ #endregion
+
+ #region Methods
+
+ protected void Awake()
+ {
+ try
+ {
+ SimManager.OnReady -= this.GetStageInfo;
+ SimManager.OnReady += this.GetStageInfo;
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
protected void OnGUI()
{
@@ -99,19 +120,6 @@
}
}
- protected void Awake()
- {
- try
- {
- SimManager.OnReady -= this.GetStageInfo;
- SimManager.OnReady += this.GetStageInfo;
- }
- catch (Exception ex)
- {
- Logger.Exception(ex);
- }
- }
-
protected void Start()
{
try
@@ -147,9 +155,10 @@
}
}
- #endregion
-
- #region Methods: private
+ private void GetStageInfo()
+ {
+ this.lastStage = SimManager.LastStage;
+ }
private void SetSlidePosition()
{
@@ -173,18 +182,13 @@
this.tabPosition.y = this.windowPosition.y - this.tabPosition.height;
}
- private void GetStageInfo()
- {
- this.lastStage = SimManager.LastStage;
- }
-
private void SetVesselInfo()
{
SimManager.Gravity = CelestialBodies.SelectedBody.Gravity;
if (BuildAdvanced.Instance.ShowAtmosphericDetails)
{
- SimManager.Atmosphere = CelestialBodies.SelectedBody.Atmosphere * 0.01;
+ SimManager.Atmosphere = CelestialBodies.SelectedBody.GetAtmospheres(BuildAdvanced.Altitude);
}
else
{
--- a/KerbalEngineer/Editor/BuildToolbar.cs
+++ b/KerbalEngineer/Editor/BuildToolbar.cs
@@ -42,6 +42,14 @@
{
GameEvents.onGUIApplicationLauncherReady.Add(this.OnGuiAppLauncherReady);
Logger.Log("BuildToolbar->Awake");
+ }
+
+ private void Start()
+ {
+ if (button == null)
+ {
+ OnGuiAppLauncherReady();
+ }
}
private void OnDestroy()
--- a/KerbalEngineer/EngineerGlobals.cs
+++ b/KerbalEngineer/EngineerGlobals.cs
@@ -33,7 +33,7 @@
/// <summary>
/// Current version of the Kerbal Engineer assembly.
/// </summary>
- public const string AssemblyVersion = "1.0.13";
+ public const string AssemblyVersion = "1.0.16.3";
#endregion
--- a/KerbalEngineer/Extensions/PartExtensions.cs
+++ b/KerbalEngineer/Extensions/PartExtensions.cs
@@ -464,7 +464,7 @@
/// </summary>
public static bool IsSolidRocket(this Part part)
{
- return part.HasModule<ModuleEngines>() && part.GetModuleEngines().throttleLocked;
+ return (part.HasModule<ModuleEngines>() && part.GetModuleEngines().throttleLocked) || (part.HasModule<ModuleEnginesFX>() && part.GetModuleEnginesFx().throttleLocked);
}
#endregion
--- a/KerbalEngineer/Flight/ActionMenu.cs
+++ b/KerbalEngineer/Flight/ActionMenu.cs
@@ -55,6 +55,14 @@
Logger.Log("ActionMenu was created.");
}
+ protected void Start()
+ {
+ if (button == null)
+ {
+ OnGuiAppLauncherReady();
+ }
+ }
+
protected void OnDestroy()
{
try
@@ -62,7 +70,10 @@
GameEvents.onGUIApplicationLauncherReady.Remove(this.OnGuiAppLauncherReady);
GameEvents.onHideUI.Remove(this.OnHide);
GameEvents.onShowUI.Remove(this.OnShow);
- ApplicationLauncher.Instance.RemoveModApplication(this.button);
+ if (button != null)
+ {
+ ApplicationLauncher.Instance.RemoveModApplication(this.button);
+ }
}
catch (Exception ex)
{
@@ -79,11 +90,11 @@
{
return;
}
- if (FlightEngineerCore.Instance != null && this.button.State == RUIToggleButton.ButtonState.DISABLED)
+ if (FlightEngineerCore.IsDisplayable && this.button.State == RUIToggleButton.ButtonState.DISABLED)
{
this.button.Enable();
}
- else if (FlightEngineerCore.Instance == null && this.button.State != RUIToggleButton.ButtonState.DISABLED)
+ else if (!FlightEngineerCore.IsDisplayable && this.button.State != RUIToggleButton.ButtonState.DISABLED)
{
this.button.Disable();
}
--- a/KerbalEngineer/Flight/ActionMenuGui.cs
+++ b/KerbalEngineer/Flight/ActionMenuGui.cs
@@ -132,7 +132,7 @@
{
try
{
- if (this.Hidden)
+ if (this.Hidden || !FlightEngineerCore.IsDisplayable)
{
return;
}
--- a/KerbalEngineer/Flight/DisplayStack.cs
+++ b/KerbalEngineer/Flight/DisplayStack.cs
@@ -33,6 +33,8 @@
namespace KerbalEngineer.Flight
{
+ using Upgradeables;
+
/// <summary>
/// Graphical controller for displaying stacked sections.
/// </summary>
@@ -150,7 +152,7 @@
{
try
{
- if (FlightEngineerCore.Instance == null)
+ if (!FlightEngineerCore.IsDisplayable)
{
return;
}
@@ -177,7 +179,7 @@
{
try
{
- if (FlightEngineerCore.Instance == null)
+ if (!FlightEngineerCore.IsDisplayable)
{
return;
}
--- a/KerbalEngineer/Flight/FlightEngineerCore.cs
+++ b/KerbalEngineer/Flight/FlightEngineerCore.cs
@@ -19,21 +19,28 @@
#region Using Directives
-using System;
-using System.Collections.Generic;
-
-using KerbalEngineer.Flight.Readouts;
-using KerbalEngineer.Flight.Sections;
-
-using UnityEngine;
-
#endregion
namespace KerbalEngineer.Flight
{
+ #region Using Directives
+
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using Extensions;
+ using Readouts;
+ using Sections;
+ using Settings;
+ using UnityEngine;
+ using VesselSimulator;
+
+ #endregion
+
/// <summary>
/// Core management system for the Flight Engineer.
/// </summary>
+ [KSPAddon(KSPAddon.Startup.Flight, false)]
public sealed class FlightEngineerCore : MonoBehaviour
{
#region Instance
@@ -45,7 +52,210 @@
#endregion
+ #region Fields
+
+ private static bool isCareerMode = true;
+ private static bool isKerbalLimited = true;
+ private static bool isTrackingStationLimited = true;
+
+ #endregion
+
#region Constructors
+
+ static FlightEngineerCore()
+ {
+ try
+ {
+ var handler = SettingHandler.Load("FlightEngineerCore.xml");
+ handler.Get("isCareerMode", ref isCareerMode);
+ handler.Get("isKerbalLimited", ref isKerbalLimited);
+ handler.Get("isTrackingStationLimited", ref isTrackingStationLimited);
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets and sets whether to the Flight Engineer should be run using career limitations.
+ /// </summary>
+ public static bool IsCareerMode
+ {
+ get { return isCareerMode; }
+ set
+ {
+ try
+ {
+ if (isCareerMode != value)
+ {
+ var handler = SettingHandler.Load("FlightEngineerCore.xml");
+ handler.Set("isCareerMode", value);
+ handler.Save("FlightEngineerCore.xml");
+ }
+ isCareerMode = value;
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets whether the FlightEngineer should be displayed.
+ /// </summary>
+ public static bool IsDisplayable
+ {
+ get
+ {
+ if (isCareerMode)
+ {
+ if (isKerbalLimited && FlightGlobals.ActiveVessel.GetVesselCrew().Exists(c => c.experienceTrait.TypeName == "Engineer"))
+ {
+ return true;
+ }
+ if (isTrackingStationLimited && ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.TrackingStation) == 1.0f)
+ {
+ return true;
+ }
+ return FlightGlobals.ActiveVessel.parts.Any(p => p.HasModule<FlightEngineerModule>());
+ }
+
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets and sets whether to the Flight Engineer should be kerbal limited.
+ /// </summary>
+ public static bool IsKerbalLimited
+ {
+ get { return isKerbalLimited; }
+ set
+ {
+ try
+ {
+ if (isKerbalLimited != value)
+ {
+ var handler = SettingHandler.Load("FlightEngineerCore.xml");
+ handler.Set("isKerbalLimited", value);
+ handler.Save("FlightEngineerCore.xml");
+ }
+ isKerbalLimited = value;
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets and sets whether to the Flight Engineer should be tracking station limited.
+ /// </summary>
+ public static bool IsTrackingStationLimited
+ {
+ get { return isTrackingStationLimited; }
+ set
+ {
+ try
+ {
+ if (isTrackingStationLimited != value)
+ {
+ var handler = SettingHandler.Load("FlightEngineerCore.xml");
+ handler.Set("isTrackingStationLimited", value);
+ handler.Save("FlightEngineerCore.xml");
+ }
+ isTrackingStationLimited = value;
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the editor windows for sections with open editors.
+ /// </summary>
+ public List<SectionEditor> SectionEditors { get; private set; }
+
+ /// <summary>
+ /// Gets the section windows for floating sections.
+ /// </summary>
+ public List<SectionWindow> SectionWindows { get; private set; }
+
+ /// <summary>
+ /// Gets the list of currently running updatable modules.
+ /// </summary>
+ public List<IUpdatable> UpdatableModules { get; private set; }
+
+ #endregion
+
+ #region Methods
+
+ /// <summary>
+ /// Creates a section editor, adds it to the FlightEngineerCore and returns a reference to it.
+ /// </summary>
+ public SectionEditor AddSectionEditor(SectionModule section)
+ {
+ try
+ {
+ var editor = this.gameObject.AddComponent<SectionEditor>();
+ editor.ParentSection = section;
+ editor.Position = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);
+ this.SectionEditors.Add(editor);
+ return editor;
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// Creates a section window, adds it to the FlightEngineerCore and returns a reference to it.
+ /// </summary>
+ public SectionWindow AddSectionWindow(SectionModule section)
+ {
+ try
+ {
+ var window = this.gameObject.AddComponent<SectionWindow>();
+ window.ParentSection = section;
+ window.WindowPosition = new Rect(section.FloatingPositionX, section.FloatingPositionY, 0, 0);
+ this.SectionWindows.Add(window);
+ return window;
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// Adds an updatable object to be automatically updated every frame and will ignore duplicate objects.
+ /// </summary>
+ public void AddUpdatable(IUpdatable updatable)
+ {
+ try
+ {
+ if (!this.UpdatableModules.Contains(updatable))
+ {
+ this.UpdatableModules.Add(updatable);
+ }
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
/// <summary>
/// Create base Flight Engineer child objects.
@@ -59,11 +269,58 @@
this.SectionWindows = new List<SectionWindow>();
this.SectionEditors = new List<SectionEditor>();
this.UpdatableModules = new List<IUpdatable>();
+
+ SimManager.UpdateModSettings();
+
Logger.Log("FlightEngineerCore->Awake");
}
catch (Exception ex)
{
- Logger.Exception(ex, "FlightEngineerCore->Awake");
+ Logger.Exception(ex);
+ }
+ }
+
+ /// <summary>
+ /// Fixed update all required Flight Engineer objects.
+ /// </summary>
+ private void FixedUpdate()
+ {
+ try
+ {
+ SectionLibrary.FixedUpdate();
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
+ }
+ }
+
+ /// <summary>
+ /// Force the destruction of child objects on core destruction.
+ /// </summary>
+ private void OnDestroy()
+ {
+ try
+ {
+ SectionLibrary.Save();
+
+ foreach (var window in this.SectionWindows)
+ {
+ print("[FlightEngineer]: Destroying Floating Window for " + window.ParentSection.Name);
+ Destroy(window);
+ }
+
+ foreach (var editor in this.SectionEditors)
+ {
+ print("[FlightEngineer]: Destroying Editor Window for " + editor.ParentSection.Name);
+ Destroy(editor);
+ }
+
+ Logger.Log("FlightEngineerCore->OnDestroy");
+ }
+ catch (Exception ex)
+ {
+ Logger.Exception(ex);
}
}
@@ -80,44 +337,6 @@
}
catch (Exception ex)
{
- Logger.Exception(ex, "FlightEngineerCore->Start");
- }
- }
-
- #endregion
-
- #region Properties
-
- /// <summary>
- /// Gets the section windows for floating sections.
- /// </summary>
- public List<SectionWindow> SectionWindows { get; private set; }
-
- /// <summary>
- /// Gets the editor windows for sections with open editors.
- /// </summary>
- public List<SectionEditor> SectionEditors { get; private set; }
-
- /// <summary>
- /// Gets the list of currently running updatable modules.
- /// </summary>
- public List<IUpdatable> UpdatableModules { get; private set; }
-
- #endregion
-
- #region Updating
-
- /// <summary>
- /// Fixed update all required Flight Engineer objects.
- /// </summary>
- private void FixedUpdate()
- {
- try
- {
- SectionLibrary.FixedUpdate();
- }
- catch (Exception ex)
- {
Logger.Exception(ex);
}
}
@@ -134,7 +353,7 @@
}
catch (Exception ex)
{
- Logger.Exception(ex, "FlightEngineerCore->Update");
+ Logger.Exception(ex);
}
}
@@ -164,102 +383,7 @@
}
catch (Exception ex)
{
- Logger.Exception(ex, "FlightEngineerCore->UpdateModules");
- }
- }
-
- #endregion
-
- #region Destruction
-
- /// <summary>
- /// Force the destruction of child objects on core destruction.
- /// </summary>
- private void OnDestroy()
- {
- try
- {
- SectionLibrary.Save();
-
- foreach (var window in this.SectionWindows)
- {
- print("[FlightEngineer]: Destroying Floating Window for " + window.ParentSection.Name);
- Destroy(window);
- }
-
- foreach (var editor in this.SectionEditors)
- {
- print("[FlightEngineer]: Destroying Editor Window for " + editor.ParentSection.Name);
- Destroy(editor);
- }
-
- Logger.Log("FlightEngineerCore->OnDestroy");
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerCore->OnDestroy");
- }
- }
-
- #endregion
-
- #region Methods
-
- /// <summary>
- /// Creates a section window, adds it to the FlightEngineerCore and returns a reference to it.
- /// </summary>
- public SectionWindow AddSectionWindow(SectionModule section)
- {
- try
- {
- var window = this.gameObject.AddComponent<SectionWindow>();
- window.ParentSection = section;
- window.WindowPosition = new Rect(section.FloatingPositionX, section.FloatingPositionY, 0, 0);
- this.SectionWindows.Add(window);
- return window;
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerCore->AddSectionWindow");
- return null;
- }
- }
-
- /// <summary>
- /// Creates a section editor, adds it to the FlightEngineerCore and returns a reference to it.
- /// </summary>
- public SectionEditor AddSectionEditor(SectionModule section)
- {
- try
- {
- var editor = this.gameObject.AddComponent<SectionEditor>();
- editor.ParentSection = section;
- editor.Position = new Rect(section.EditorPositionX, section.EditorPositionY, SectionEditor.Width, SectionEditor.Height);
- this.SectionEditors.Add(editor);
- return editor;
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerCore->AddSectionEditor");
- return null;
- }
- }
-
- /// <summary>
- /// Adds an updatable object to be automatically updated every frame and will ignore duplicate objects.
- /// </summary>
- public void AddUpdatable(IUpdatable updatable)
- {
- try
- {
- if (!this.UpdatableModules.Contains(updatable))
- {
- this.UpdatableModules.Add(updatable);
- }
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerCore->AddUpdatable");
+ Logger.Exception(ex);
}
}
--- a/KerbalEngineer/Flight/FlightEngineerModule.cs
+++ b/KerbalEngineer/Flight/FlightEngineerModule.cs
@@ -19,9 +19,6 @@
#region Using Directives
-using System;
-using System.Linq;
-
#endregion
namespace KerbalEngineer.Flight
@@ -29,73 +26,5 @@
/// <summary>
/// Module that can be attached to parts, giving them FlightEngineerCore management.
/// </summary>
- public sealed class FlightEngineerModule : PartModule
- {
- #region Fields
-
- /// <summary>
- /// Contains the current FlightEngineerCore through the lifespan of this part.
- /// </summary>
- private FlightEngineerCore flightEngineerCore;
-
- #endregion
-
- #region Updating
-
- /// <summary>
- /// Logic to create and destroy the FlightEngineerCore.
- /// </summary>
- private void Update()
- {
- try
- {
- if (!HighLogic.LoadedSceneIsFlight || FlightEngineerPartless.IsPartless)
- {
- return;
- }
-
- if (this.vessel == FlightGlobals.ActiveVessel)
- {
- // Checks for an existing instance of FlightEngineerCore, and if this part is the first part containing FlightEngineerModule within the vessel.
- if (flightEngineerCore == null && this.part == this.vessel.parts.FirstOrDefault(p => p.Modules.Contains("FlightEngineerModule")))
- {
- this.flightEngineerCore = this.gameObject.AddComponent<FlightEngineerCore>();
- }
- }
- else if (flightEngineerCore != null)
- {
- // Using DestroyImmediate to force early destruction and keep saving/loading in synch when switching vessels.
- DestroyImmediate(flightEngineerCore);
- }
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerModule->Update");
- }
- }
-
- #endregion
-
- #region Destruction
-
- /// <summary>
- /// Force the destruction of the FlightEngineerCore on part destruction.
- /// </summary>
- private void OnDestroy()
- {
- try
- {
- if (flightEngineerCore != null)
- {
- DestroyImmediate(flightEngineerCore);
- }
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerModule->OnDestroy");
- }
- }
-
- #endregion
- }
+ public class FlightEngineerModule : PartModule { }
}
--- a/KerbalEngineer/Flight/FlightEngineerPartless.cs
+++ /dev/null
@@ -1,101 +1,1 @@
-//
-// Kerbal Engineer Redux
-//
-// Copyright (C) 2014 CYBUTEK
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
-#region Using Directives
-
-using System;
-
-using KerbalEngineer.Settings;
-
-using UnityEngine;
-
-#endregion
-
-namespace KerbalEngineer.Flight
-{
- [KSPAddon(KSPAddon.Startup.Flight, false)]
- public class FlightEngineerPartless : MonoBehaviour
- {
- #region Fields
-
- private FlightEngineerCore flightEngineerCore;
-
- #endregion
-
- #region Initialisation
-
- static FlightEngineerPartless()
- {
- try
- {
- var handler = SettingHandler.Load("FlightEngineerPartless.xml");
- handler.Get("isPartless", ref isPartless);
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerPartless->FlightEngineerPartless");
- }
- }
-
- private void Awake()
- {
- try
- {
- if (isPartless)
- {
- this.flightEngineerCore = this.gameObject.AddComponent<FlightEngineerCore>();
- }
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerPartless->Awake");
- }
- }
-
- #endregion
-
- #region Properties
-
- private static bool isPartless = true;
-
- public static bool IsPartless
- {
- get { return isPartless; }
- set
- {
- try
- {
- if (isPartless != value)
- {
- var handler = SettingHandler.Load("FlightEngineerPartless.xml");
- handler.Set("isPartless", value);
- handler.Save("FlightEngineerPartless.xml");
- }
- isPartless = value;
- }
- catch (Exception ex)
- {
- Logger.Exception(ex, "FlightEngineerPartless->IsPartless");
- }
- }
- }
-
- #endregion
- }
-}
--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Miscellaneous/SystemTime.cs
@@ -1,1 +1,59 @@
+//
+// Kerbal Engineer Redux
+//
+// Copyright (C) 2014 CYBUTEK
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+#region Using Directives
+
+using System;
+
+using KerbalEngineer.Flight.Sections;
+using KerbalEngineer.Helpers;
+
+using UnityEngine;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Miscellaneous
+{
+ public class SystemTime : ReadoutModule
+ {
+
+
+ #region Constructors
+
+ public SystemTime()
+ {
+ this.Name = "System Time";
+ this.Category = ReadoutCategory.GetCategory("Miscellaneous");
+ this.HelpString = String.Empty;
+ this.IsDefault = false;
+ }
+
+ #endregion
+
+ #region Methods: public
+
+ public override void Draw(SectionModule section)
+ {
+ this.DrawLine(DateTime.Now.ToLongTimeString(), section.IsHud);
+ }
+
+ #endregion
+
+ }
+}
--- /dev/null
+++ b/KerbalEngineer/Flight/Readouts/Orbital/MeanAnomalyAtEpoc.cs
@@ -1,1 +1,54 @@
+//
+// Kerbal Engineer Redux
+//
+// Copyright (C) 2014 CYBUTEK
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+#region Using Directives
+
+using System;
+
+using KerbalEngineer.Extensions;
+using KerbalEngineer.Flight.Sections;
+
+#endregion
+
+namespace KerbalEngineer.Flight.Readouts.Orbital
+{
+ public class MeanAnomalyAtEpoc : ReadoutModule
+ {
+ #region Constructors
+
+ public MeanAnomalyAtEpoc()
+ {
+ this.Name = "Mean Anomaly at Epoc";
+ this.Category = ReadoutCategory.GetCategory("Orbital");
+ this.HelpString = String.Empty;
+ this.IsDefault = false;
+ }
+
+ #endregion
+
+ #region Methods: public
+
+ public override void Draw(SectionModule section)
+ {
+ this.DrawLine(FlightGlobals.ship_orbit.meanAnomalyAtEpoch.ToAngle(), section.IsHud);
+ }
+
+ #endregion
+ }
+}
--- a/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
+++ b/KerbalEngineer/Flight/Readouts/ReadoutLibrary.cs
@@ -85,6 +85,7 @@
readouts.Add(new ArgumentOfPeriapsis());
readouts.Add(new TrueAnomaly());
readouts.Add(new MeanAnomaly());
+ readouts.Add(new MeanAnomalyAtEpoc());
readouts.Add(new EccentricAnomaly());
readouts.Add(new SemiMajorAxis());
readouts.Add(new SemiMinorAxis());
@@ -170,13 +171,14 @@
readouts.Add(new Rendezvous.OrbitalPeriod());
readouts.Add(new Rendezvous.SemiMajorAxis());
readouts.Add(new Rendezvous.SemiMinorAxis());
-
+
// Misc
readouts.Add(new Separator());
readouts.Add(new GuiSizeAdjustor());
readouts.Add(new SimulationDelay());
readouts.Add(new TimeReference());
readouts.Add(new VectoredThrustToggle());
+ readouts.Add(new SystemTime());
LoadHelpStrings();
}
--- a/KerbalEngineer/Flight/Readouts/Surface/AtmosphericProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Surface/AtmosphericProcessor.cs
@@ -29,6 +29,8 @@
namespace KerbalEngineer.Flight.Readouts.Surface
{
+ using UnityEngine;
+
public class AtmosphericProcessor : IUpdatable, IUpdateRequest
{
#region Instance
@@ -46,7 +48,10 @@
/// </summary>
public static AtmosphericProcessor Instance
{
- get { return instance; }
+ get
+ {
+ return instance;
+ }
}
#endregion
@@ -122,13 +127,13 @@
}
else
{
- var mass = FlightGlobals.ActiveVessel.parts.Sum(p => p.GetWetMass());
- var drag = FlightGlobals.ActiveVessel.parts.Sum(p => p.GetWetMass() * p.maximum_drag);
- var grav = FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude;
- var atmo = FlightGlobals.ActiveVessel.atmDensity;
- var coef = FlightGlobals.DragMultiplier;
-
- TerminalVelocity = Math.Sqrt((2 * mass * grav) / (atmo * drag * coef));
+ var m = FlightGlobals.ActiveVessel.parts.Sum(part => part.GetWetMass()) * 1000.0;
+ var g = FlightGlobals.getGeeForceAtPosition(FlightGlobals.ship_position).magnitude;
+ var a = FlightGlobals.ActiveVessel.parts.Sum(part => part.DragCubes.AreaDrag) * PhysicsGlobals.DragCubeMultiplier;
+ var p = FlightGlobals.ActiveVessel.atmDensity;
+ var c = PhysicsGlobals.DragMultiplier;
+
+ TerminalVelocity = Math.Sqrt((2.0 * m * g) / (p * a * c));
}
Efficiency = FlightGlobals.ship_srfSpeed / TerminalVelocity;
--- a/KerbalEngineer/Flight/Readouts/Vessel/AttitudeProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/AttitudeProcessor.cs
@@ -123,7 +123,8 @@
// This code was derived from MechJeb2's implementation for getting the vessel's surface relative rotation.
this.centreOfMass = FlightGlobals.ActiveVessel.findWorldCenterOfMass();
this.up = (this.centreOfMass - FlightGlobals.ActiveVessel.mainBody.position).normalized;
- this.north = Vector3.Exclude(this.up, (FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - this.centreOfMass).normalized;
+ this.north = Vector3.ProjectOnPlane((FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - this.centreOfMass, this.up).normalized;
+
return Quaternion.Inverse(Quaternion.Euler(90.0f, 0.0f, 0.0f) * Quaternion.Inverse(FlightGlobals.ActiveVessel.transform.rotation) * Quaternion.LookRotation(this.north, this.up));
}
--- a/KerbalEngineer/Flight/Readouts/Vessel/PartCount.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/PartCount.cs
@@ -46,7 +46,7 @@
{
if (SimulationProcessor.ShowDetails)
{
- this.DrawLine(Units.Concat(SimulationProcessor.LastStage.partCount, SimulationProcessor.LastStage.totalPartCount), section.IsHud);
+ this.DrawLine(Units.ConcatF(SimulationProcessor.LastStage.partCount, SimulationProcessor.LastStage.totalPartCount), section.IsHud);
}
}
--- a/KerbalEngineer/Flight/Readouts/Vessel/SimulationProcessor.cs
+++ b/KerbalEngineer/Flight/Readouts/Vessel/SimulationProcessor.cs
@@ -119,7 +119,7 @@
SimManager.Gravity = FlightGlobals.ActiveVessel.mainBody.gravParameter /
Math.Pow(FlightGlobals.ActiveVessel.mainBody.Radius +
FlightGlobals.ActiveVessel.mainBody.GetAltitude(FlightGlobals.ActiveVessel.CoM), 2);
- SimManager.Velocity = FlightGlobals.ActiveVessel.srfSpeed;
+ SimManager.Mach = FlightGlobals.ActiveVessel.mach;
}
}
--- a/KerbalEngineer/Flight/Sections/SectionWindow.cs
+++ b/KerbalEngineer/Flight/Sections/SectionWindow.cs
@@ -118,7 +118,7 @@
/// </summary>
private void Draw()
{
- if (this.ParentSection == null || !this.ParentSection.IsVisible || (DisplayStack.Instance.Hidden && !this.ParentSection.IsHud))
+ if (this.ParentSection == null || !this.ParentSection.IsVisible || (DisplayStack.Instance.Hidden && !this.ParentSection.IsHud) || !FlightEngineerCore.IsDisplayable)
{
return;
}
--- /dev/null
+++ b/KerbalEngineer/Helpers/Pool.cs
@@ -1,1 +1,53 @@
+namespace KerbalEngineer.VesselSimulator
+{
+ using System.Collections.Generic;
+ public class Pool<T> where T : new()
+ {
+ private static List<T> available = new List<T>();
+ private static List<T> inUse = new List<T>();
+
+ public static int PoolCount
+ {
+ get
+ {
+ return available.Count + inUse.Count;
+ }
+ }
+
+ public static T GetPoolObject()
+ {
+ T obj;
+ if (available.Count > 0)
+ {
+ obj = available[0];
+ available.RemoveAt(0);
+ }
+ else
+ {
+ obj = new T();
+ }
+
+ inUse.Add(obj);
+ return obj;
+ }
+
+ public static void Release(T obj)
+ {
+ if (inUse.Contains(obj))
+ {
+ inUse.Remove(obj);
+ available.Add(obj);
+ }
+ }
+
+ public static void ReleaseAll()
+ {
+ for (int i = 0; i < inUse.Count; ++i)
+ {
+ available.Add(inUse[i]);
+ }
+ inUse.Clear();
+ }
+ }
+}
--- a/KerbalEngineer/Helpers/Units.cs
+++ b/KerbalEngineer/Helpers/Units.cs
@@ -20,7 +20,6 @@
namespace KerbalEngineer.Helpers
{
#region Using Directives
-
using System;
#endregion
@@ -28,20 +27,49 @@
public static class Units
{
#region Methods
+ public const double GRAVITY = 9.80665;
public static string Concat(int value1, int value2)
{
return value1 + " / " + value2;
}
- public static string Concat(double value1, double value2, int decimals = 1)
+ public static string ConcatF(double value1, double value2, int decimals = 1)
{
return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals);
}
- public static string Concat(double value1, double value2, double value3, int decimals = 1)
+ public static string ConcatF(double value1, double value2, double value3, int decimals = 1)
{
return value1.ToString("F" + decimals) + " / " + value2.ToString("F" + decimals) + " / " + value3.ToString("F" + decimals);
+ }
+
+ public static string ConcatN(double value1, double value2, int decimals = 1)
+ {
+ return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals);
+ }
+
+ public static string ConcatN(double value1, double value2, double value3, int decimals = 1)
+ {
+ return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + " / " + value3.ToString("N" + decimals);
+ }
+
+ public static string Cost(double value, int decimals = 1)
+ {
+ if (value >= 1000000.0)
+ {
+ return (value / 1000.0).ToString("N" + decimals) + "K";
+ }
+ return value.ToString("N" + decimals);
+ }
+
+ public static string Cost(double value1, double value2, int decimals = 1)
+ {
+ if (value1 >= 1000000.0 || value2 >= 1000000.0)
+ {
+ return (value1 / 1000.0).ToString("N" + decimals) + " / " + (value2 / 1000.0).ToString("N" + decimals) + "K";
+ }
+ return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals);
}
public static string ToAcceleration(double value, int decimals = 2)
@@ -95,19 +123,29 @@
public static string ToForce(double value1, double value2)
{
- var format1 = (value1 < 100000.0) ? (value1 < 10000.0) ? (value1 < 100.0) ? (Math.Abs(value1) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0";
- var format2 = (value2 < 100000.0) ? (value2 < 10000.0) ? (value2 < 100.0) ? (Math.Abs(value2) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0";
+ string format1 = (value1 < 100000.0) ? (value1 < 10000.0) ? (value1 < 100.0) ? (Math.Abs(value1) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0";
+ string format2 = (value2 < 100000.0) ? (value2 < 10000.0) ? (value2 < 100.0) ? (Math.Abs(value2) < Double.Epsilon) ? "N0" : "N3" : "N2" : "N1" : "N0";
return value1.ToString(format1) + " / " + value2.ToString(format2) + "kN";
}
public static string ToMass(double value, int decimals = 0)
{
+ if (value >= 1000.0)
+ {
+ return value.ToString("N" + decimals + 2) + "t";
+ }
+
value *= 1000.0;
return value.ToString("N" + decimals) + "kg";
}
public static string ToMass(double value1, double value2, int decimals = 0)
{
+ if (value1 >= 1000.0f || value2 >= 1000.0f)
+ {
+ return value1.ToString("N" + decimals + 2) + " / " + value2.ToString("N" + decimals + 2) + "t";
+ }
+
value1 *= 1000.0;
value2 *= 1000.0;
return value1.ToString("N" + decimals) + " / " + value2.ToString("N" + decimals) + "kg";
@@ -142,7 +180,6 @@
{
return value.ToString((value < 100.0) ? (Math.Abs(value) < Double.Epsilon) ? "N0" : "N1" : "N0") + "kNm";
}
-
#endregion
}
}
--- a/KerbalEngineer/KerbalEngineer.csproj
+++ b/KerbalEngineer/KerbalEngineer.csproj
@@ -49,8 +49,8 @@
<Compile Include="Extensions\FloatExtensions.cs" />
<Compile Include="Extensions\OrbitExtensions.cs" />
<Compile Include="Flight\ActionMenuGui.cs" />
- <Compile Include="Flight\FlightEngineerPartless.cs" />
<Compile Include="Flight\Presets\Preset.cs" />
+ <Compile Include="Flight\Readouts\Miscellaneous\SystemTime.cs" />
<Compile Include="Flight\Readouts\Miscellaneous\VectoredThrustToggle.cs" />
<Compile Include="Flight\Readouts\Miscellaneous\TimeReference.cs" />
<Compile Include="Flight\Readouts\Miscellaneous\Separator.cs" />
@@ -70,6 +70,7 @@
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeAngleToPrograde.cs" />
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeTotalDeltaV.cs" />
<Compile Include="Flight\Readouts\Orbital\ManoeuvreNode\NodeProgradeDeltaV.cs" />
+ <Compile Include="Flight\Readouts\Orbital\MeanAnomalyAtEpoc.cs" />
<Compile Include="Flight\Readouts\Orbital\MeanAnomaly.cs" />
<Compile Include="Flight\Readouts\Orbital\EccentricAnomaly.cs" />
<Compile Include="Flight\Readouts\Orbital\ArgumentOfPeriapsis.cs" />
@@ -198,6 +199,7 @@
<Compile Include="UIControls\WindowObject.cs" />
<Compile Include="VesselSimulator\AttachNodeSim.cs" />
<Compile Include="VesselSimulator\EngineSim.cs" />
+ <Compile Include="Helpers\Pool.cs" />
<Compile Include="VesselSimulator\PartSim.cs" />
<Compile Include="VesselSimulator\ResourceContainer.cs" />
<Compile Include="VesselSimulator\SimManager.cs" />
--- a/KerbalEngineer/VesselSimulator/EngineSim.cs
+++ b/KerbalEngineer/VesselSimulator/EngineSim.cs
@@ -17,166 +17,89 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
-#region Using Directives
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-using UnityEngine;
-
-#endregion
-
namespace KerbalEngineer.VesselSimulator
{
- public class EngineSim
+ using System;
+ using System.Collections.Generic;
+ using System.Text;
+ using Editor;
+ using Helpers;
+ using UnityEngine;
+
+ public class EngineSim : Pool<EngineSim>
{
- private readonly ResourceContainer resourceConsumptions = new ResourceContainer();
-
- public double actualThrust = 0;
+ public double actualThrust = 0.0;
+ public List<AppliedForce> appliedForces = new List<AppliedForce>();
public bool isActive = false;
public double isp = 0;
public PartSim partSim;
- public List<AppliedForce> appliedForces;
+ public float maxMach;
public double thrust = 0;
// Add thrust vector to account for directional losses
public Vector3 thrustVec;
-
- public EngineSim(PartSim theEngine,
- double atmosphere,
- double velocity,
- float maxThrust,
- float minThrust,
- float thrustPercentage,
- float requestedThrust,
- Vector3 vecThrust,
- float realIsp,
- FloatCurve atmosphereCurve,
- FloatCurve velocityCurve,
- bool throttleLocked,
- List<Propellant> propellants,
- bool active,
- bool correctThrust,
- List<Transform> thrustTransforms)
+ private readonly ResourceContainer resourceConsumptions = new ResourceContainer();
+
+ public EngineSim Init(PartSim theEngine,
+ double atmosphere,
+ float machNumber,
+ float maxFuelFlow,
+ float minFuelFlow,
+ float thrustPercentage,
+ Vector3 vecThrust,
+ FloatCurve atmosphereCurve,
+ bool atmChangeFlow,
+ FloatCurve atmCurve,
+ FloatCurve velCurve,
+ float currentThrottle,
+ bool throttleLocked,
+ List<Propellant> propellants,
+ bool active,
+ float resultingThrust,
+ List<Transform> thrustTransforms)
{
StringBuilder buffer = null;
- //MonoBehaviour.print("Create EngineSim for " + theEngine.name);
- //MonoBehaviour.print("maxThrust = " + maxThrust);
- //MonoBehaviour.print("minThrust = " + minThrust);
- //MonoBehaviour.print("thrustPercentage = " + thrustPercentage);
- //MonoBehaviour.print("requestedThrust = " + requestedThrust);
- //MonoBehaviour.print("velocity = " + velocity);
-
- this.partSim = theEngine;
-
- this.isActive = active;
- this.thrust = (maxThrust - minThrust) * (thrustPercentage / 100f) + minThrust;
- //MonoBehaviour.print("thrust = " + thrust);
-
- this.thrustVec = vecThrust;
-
- double flowRate = 0d;
- if (this.partSim.hasVessel)
- {
- //MonoBehaviour.print("hasVessel is true");
- this.actualThrust = isActive ? requestedThrust : 0.0;
- if (velocityCurve != null)
- {
- this.actualThrust *= velocityCurve.Evaluate((float)velocity);
- //MonoBehaviour.print("actualThrust at velocity = " + actualThrust);
- }
-
- this.isp = atmosphereCurve.Evaluate((float)this.partSim.part.staticPressureAtm);
- if (this.isp == 0d)
- {
- MonoBehaviour.print("Isp at " + this.partSim.part.staticPressureAtm + " is zero. Flow rate will be NaN");
- }
-
- if (correctThrust && realIsp == 0)
- {
- float ispsl = atmosphereCurve.Evaluate(0);
- if (ispsl != 0)
- {
- this.thrust = this.thrust * this.isp / ispsl;
+
+ isp = 0.0;
+ maxMach = 0.0f;
+ actualThrust = 0.0;
+ partSim = theEngine;
+ isActive = active;
+ thrustVec = vecThrust;
+ resourceConsumptions.Reset();
+ appliedForces.Clear();
+
+ double flowRate = 0.0;
+ if (partSim.hasVessel)
+ {
+ float flowModifier = GetFlowModifier(atmChangeFlow, atmCurve, partSim.part.atmDensity, velCurve, machNumber, ref maxMach);
+ isp = atmosphereCurve.Evaluate((float)atmosphere);
+ thrust = GetThrust(Mathf.Lerp(minFuelFlow, maxFuelFlow, GetThrustPercent(thrustPercentage)) * flowModifier, isp);
+ actualThrust = isActive ? resultingThrust : 0.0;
+
+ if (throttleLocked)
+ {
+ flowRate = GetFlowRate(thrust, isp);
+ }
+ else
+ {
+ if (currentThrottle > 0.0f && partSim.isLanded == false)
+ {
+ flowRate = GetFlowRate(actualThrust, isp);
}
else
{
- MonoBehaviour.print("Isp at sea level is zero. Unable to correct thrust.");
- }
- //MonoBehaviour.print("corrected thrust = " + thrust);
- }
-
- if (velocityCurve != null)
- {
- this.thrust *= velocityCurve.Evaluate((float)velocity);
- //MonoBehaviour.print("thrust at velocity = " + thrust);
- }
-
- if (throttleLocked)
- {
- //MonoBehaviour.print("throttleLocked is true");
- flowRate = this.thrust / (this.isp * 9.82);
- }
- else
- {
- if (this.partSim.isLanded)
- {
- //MonoBehaviour.print("partSim.isLanded is true, mainThrottle = " + FlightInputHandler.state.mainThrottle);
- flowRate = Math.Max(0.000001d, this.thrust * FlightInputHandler.state.mainThrottle) / (this.isp * 9.82);
- }
- else
- {
- if (requestedThrust > 0)
- {
- if (velocityCurve != null)
- {
- requestedThrust *= velocityCurve.Evaluate((float)velocity);
- //MonoBehaviour.print("requestedThrust at velocity = " + requestedThrust);
- }
-
- //MonoBehaviour.print("requestedThrust > 0");
- flowRate = requestedThrust / (this.isp * 9.82);
- }
- else
- {
- //MonoBehaviour.print("requestedThrust <= 0");
- flowRate = this.thrust / (this.isp * 9.82);
- }
+ flowRate = GetFlowRate(thrust, isp);
}
}
}
else
{
- //MonoBehaviour.print("hasVessel is false");
- this.isp = atmosphereCurve.Evaluate((float)atmosphere);
- if (this.isp == 0d)
- {
- MonoBehaviour.print("Isp at " + atmosphere + " is zero. Flow rate will be NaN");
- }
- if (correctThrust)
- {
- float ispsl = atmosphereCurve.Evaluate(0);
- if (ispsl != 0)
- {
- this.thrust = this.thrust * this.isp / ispsl;
- }
- else
- {
- MonoBehaviour.print("Isp at sea level is zero. Unable to correct thrust.");
- }
- //MonoBehaviour.print("corrected thrust = " + thrust);
- }
-
- if (velocityCurve != null)
- {
- this.thrust *= velocityCurve.Evaluate((float)velocity);
- //MonoBehaviour.print("thrust at velocity = " + thrust);
- }
-
- flowRate = this.thrust / (this.isp * 9.82);
+ float flowModifier = GetFlowModifier(atmChangeFlow, atmCurve, CelestialBodies.SelectedBody.GetDensity(BuildAdvanced.Altitude), velCurve, machNumber, ref maxMach);
+ isp = atmosphereCurve.Evaluate((float)atmosphere);
+ thrust = GetThrust(Mathf.Lerp(minFuelFlow, maxFuelFlow, GetThrustPercent(thrustPercentage)) * flowModifier, isp);
+ flowRate = GetFlowRate(thrust, isp);
}
if (SimManager.logOutput)
@@ -208,7 +131,7 @@
{
buffer.AppendFormat("Add consumption({0}, {1}:{2:d}) = {3:g6}\n", ResourceContainer.GetResourceName(propellant.id), theEngine.name, theEngine.partId, consumptionRate);
}
- this.resourceConsumptions.Add(propellant.id, consumptionRate);
+ resourceConsumptions.Add(propellant.id, consumptionRate);
}
if (SimManager.logOutput)
@@ -216,18 +139,78 @@
MonoBehaviour.print(buffer);
}
- appliedForces = new List<AppliedForce>();
+ appliedForces.Clear();
double thrustPerThrustTransform = thrust / thrustTransforms.Count;
- foreach (Transform thrustTransform in thrustTransforms) {
+ foreach (Transform thrustTransform in thrustTransforms)
+ {
Vector3d direction = thrustTransform.forward.normalized;
Vector3d position = thrustTransform.position;
appliedForces.Add(new AppliedForce(direction * thrustPerThrustTransform, position));
}
+
+ return this;
}
public ResourceContainer ResourceConsumptions
{
- get { return this.resourceConsumptions; }
+ get
+ {
+ return resourceConsumptions;
+ }
+ }
+
+ public static double GetExhaustVelocity(double isp)
+ {
+ return isp * Units.GRAVITY;
+ }
+
+ public static float GetFlowModifier(bool atmChangeFlow, FloatCurve atmCurve, double atmDensity, FloatCurve velCurve, float machNumber, ref float maxMach)
+ {
+ float flowModifier = 1.0f;
+ if (atmChangeFlow)
+ {
+ flowModifier = (float)(atmDensity / 1.225);
+ if (atmCurve != null)
+ {
+ flowModifier = atmCurve.Evaluate(flowModifier);
+ }
+ }
+ if (velCurve != null)
+ {
+ flowModifier = flowModifier * velCurve.Evaluate(machNumber);
+ maxMach = velCurve.maxTime;
+ }
+ if (flowModifier < float.Epsilon)
+ {
+ flowModifier = float.Epsilon;
+ }
+ return flowModifier;
+ }
+
+ public static double GetFlowRate(double thrust, double isp)
+ {
+ return thrust / GetExhaustVelocity(isp);
+ }
+
+ public static float GetThrottlePercent(float currentThrottle, float thrustPercentage)
+ {
+ return currentThrottle * GetThrustPercent(thrustPercentage);
+ }
+
+ public static double GetThrust(double flowRate, double isp)
+ {
+ return flowRate * GetExhaustVelocity(isp);
+ }
+
+ public static float GetThrustPercent(float thrustPercentage)
+ {
+ return thrustPercentage * 0.01f;
+ }
+
+ public void DumpEngineToBuffer(StringBuilder buffer, String prefix)
+ {
+ buffer.Append(prefix);
+ buffer.AppendFormat("[thrust = {0:g6}, actual = {1:g6}, isp = {2:g6}\n", thrust, actualThrust, isp);
}
public bool SetResourceDrains(List<PartSim> allParts, List<PartSim> allFuelLines, HashSet<PartSim> drainingParts)
@@ -237,24 +220,24 @@
// A dictionary to hold a set of parts for each resource
Dictionary<int, HashSet<PartSim>> sourcePartSets = new Dictionary<int, HashSet<PartSim>>();
- foreach (int type in this.resourceConsumptions.Types)
+ foreach (int type in resourceConsumptions.Types)
{
HashSet<PartSim> sourcePartSet = null;
switch (ResourceContainer.GetResourceFlowMode(type))
{
case ResourceFlowMode.NO_FLOW:
- if (this.partSim.resources[type] > SimManager.RESOURCE_MIN)
+ if (partSim.resources[type] > SimManager.RESOURCE_MIN && partSim.resourceFlowStates[type] != 0)
{
sourcePartSet = new HashSet<PartSim>();
//MonoBehaviour.print("SetResourceDrains(" + name + ":" + partId + ") setting sources to just this");
- sourcePartSet.Add(this.partSim);
+ sourcePartSet.Add(partSim);
}
break;
case ResourceFlowMode.ALL_VESSEL:
foreach (PartSim aPartSim in allParts)
{
- if (aPartSim.resources[type] > SimManager.RESOURCE_MIN)
+ if (aPartSim.resources[type] > SimManager.RESOURCE_MIN && aPartSim.resourceFlowStates[type] != 0)
{
if (sourcePartSet == null)
{
@@ -267,15 +250,18 @@
break;
case ResourceFlowMode.STAGE_PRIORITY_FLOW:
- var stagePartSets = new Dictionary<int, HashSet<PartSim>>();
- var maxStage = -1;
-
- Logger.Log(type);
- foreach (var aPartSim in allParts)
- {
- if (aPartSim.resources[type] <= SimManager.RESOURCE_MIN) continue;
-
- var stage = aPartSim.DecouplerCount();
+ Dictionary<int, HashSet<PartSim>> stagePartSets = new Dictionary<int, HashSet<PartSim>>();
+ int maxStage = -1;
+
+ //Logger.Log(type);
+ foreach (PartSim aPartSim in allParts)
+ {
+ if (aPartSim.resources[type] <= SimManager.RESOURCE_MIN || aPartSim.resourceFlowStates[type] == 0)
+ {
+ continue;
+ }
+
+ int stage = aPartSim.DecouplerCount();
if (stage > maxStage)
{
maxStage = stage;
@@ -289,7 +275,7 @@
sourcePartSet.Add(aPartSim);
}
- for (var i = 0; i <= maxStage; i++)
+ for (int i = 0; i <= maxStage; i++)
{
HashSet<PartSim> stagePartSet;
if (stagePartSets.TryGetValue(i, out stagePartSet) && stagePartSet.Count > 0)
@@ -305,9 +291,9 @@
if (SimManager.logOutput)
{
log = new LogMsg();
- log.buf.AppendLine("Find " + ResourceContainer.GetResourceName(type) + " sources for " + this.partSim.name + ":" + this.partSim.partId);
- }
- sourcePartSet = this.partSim.GetSourceSet(type, allParts, visited, log, "");
+ log.buf.AppendLine("Find " + ResourceContainer.GetResourceName(type) + " sources for " + partSim.name + ":" + partSim.partId);
+ }
+ sourcePartSet = partSim.GetSourceSet(type, allParts, visited, log, "");
if (SimManager.logOutput)
{
MonoBehaviour.print(log.buf);
@@ -315,7 +301,7 @@
break;
default:
- MonoBehaviour.print("SetResourceDrains(" + this.partSim.name + ":" + this.partSim.partId + ") Unexpected flow type for " + ResourceContainer.GetResourceName(type) + ")");
+ MonoBehaviour.print("SetResourceDrains(" + partSim.name + ":" + partSim.partId + ") Unexpected flow type for " + ResourceContainer.GetResourceName(type) + ")");
break;
}
@@ -336,7 +322,7 @@
}
// If we don't have sources for all the needed resources then return false without setting up any drains
- foreach (int type in this.resourceConsumptions.Types)
+ foreach (int type in resourceConsumptions.Types)
{
if (!sourcePartSets.ContainsKey(type))
{
@@ -345,17 +331,17 @@
MonoBehaviour.print("No source of " + ResourceContainer.GetResourceName(type));
}
- this.isActive = false;
+ isActive = false;
return false;
}
}
// Now we set the drains on the members of the sets and update the draining parts set
- foreach (int type in this.resourceConsumptions.Types)
+ foreach (int type in resourceConsumptions.Types)
{
HashSet<PartSim> sourcePartSet = sourcePartSets[type];
// Loop through the members of the set
- double amount = this.resourceConsumptions[type] / sourcePartSet.Count;
+ double amount = resourceConsumptions[type] / sourcePartSet.Count;
foreach (PartSim partSim in sourcePartSet)
{
if (SimManager.logOutput)
@@ -370,11 +356,5 @@
return true;
}
-
- public void DumpEngineToBuffer(StringBuilder buffer, String prefix)
- {
- buffer.Append(prefix);
- buffer.AppendFormat("[thrust = {0:g6}, actual = {1:g6}, isp = {2:g6}\n", this.thrust, this.actualThrust, this.isp);
- }
}
}
--- a/KerbalEngineer/VesselSimulator/PartSim.cs
+++ b/KerbalEngineer/VesselSimulator/PartSim.cs
@@ -164,7 +164,7 @@
get { return this.resourceDrains; }
}
- public void CreateEngineSims(List<EngineSim> allEngines, double atmosphere, double velocity, bool vectoredThrust, LogMsg log)
+ public void CreateEngineSims(List<EngineSim> allEngines, double atmosphere, double mach, bool vectoredThrust, bool fullThrust, LogMsg log)
{
bool correctThrust = SimManager.DoesEngineUseCorrectedThrust(this.part);
if (log != null)
@@ -196,31 +196,32 @@
Vector3 thrustvec = this.CalculateThrustVector(vectoredThrust ? engine.thrustTransforms : null, log);
- EngineSim engineSim = new EngineSim(this,
- atmosphere,
- velocity,
- engine.maxThrust,
- engine.minThrust,
- engine.thrustPercentage,
- engine.requestedThrust,
- thrustvec,
- engine.realIsp,
- engine.atmosphereCurve,
- engine.useVelocityCurve ? engine.velocityCurve : null,
- engine.throttleLocked,
- engine.propellants,
- engine.isOperational,
- correctThrust,
- engine.thrustTransforms);
+ EngineSim engineSim = EngineSim.GetPoolObject().Init(this,
+ atmosphere,
+ (float)mach,
+ engine.maxFuelFlow,
+ engine.minFuelFlow,
+ engine.thrustPercentage,
+ thrustvec,
+ engine.atmosphereCurve,
+ engine.atmChangeFlow,
+ engine.useAtmCurve ? engine.atmCurve : null,
+ engine.useVelCurve ? engine.velCurve : null,
+ engine.currentThrottle,
+ engine.throttleLocked || fullThrust,
+ engine.propellants,
+ engine.isOperational,
+ engine.resultingThrust,
+ engine.thrustTransforms);
allEngines.Add(engineSim);
}
}
}
else
{
- if (this.hasModuleEnginesFX)
- {
- foreach (ModuleEnginesFX engine in this.part.GetModules<ModuleEnginesFX>())
+ if (this.hasModuleEngines)
+ {
+ foreach (ModuleEngines engine in this.part.GetModules<ModuleEngines>())
{
if (log != null)
{
@@ -229,53 +230,23 @@
Vector3 thrustvec = this.CalculateThrustVector(vectoredThrust ? engine.thrustTransforms : null, log);
- EngineSim engineSim = new EngineSim(this,
- atmosphere,
- velocity,
- engine.maxThrust,
- engine.minThrust,
- engine.thrustPercentage,
- engine.requestedThrust,
- thrustvec,
- engine.realIsp,
- engine.atmosphereCurve,
- engine.useVelocityCurve ? engine.velocityCurve : null,
- engine.throttleLocked,
- engine.propellants,
- engine.isOperational,
- correctThrust,
- engine.thrustTransforms);
- allEngines.Add(engineSim);
- }
- }
-
- if (this.hasModuleEngines)
- {
- foreach (ModuleEngines engine in this.part.GetModules<ModuleEngines>())
- {
- if (log != null)
- {
- log.buf.AppendLine("Module: " + engine.moduleName);
- }
-
- Vector3 thrustvec = this.CalculateThrustVector(vectoredThrust ? engine.thrustTransforms : null, log);
-
- EngineSim engineSim = new EngineSim(this,
- atmosphere,
- velocity,
- engine.maxThrust,
- engine.minThrust,
- engine.thrustPercentage,
- engine.requestedThrust,
- thrustvec,
- engine.realIsp,
- engine.atmosphereCurve,
- engine.useVelocityCurve ? engine.velocityCurve : null,
- engine.throttleLocked,
- engine.propellants,
- engine.isOperational,
- correctThrust,
- engine.thrustTransforms);
+ EngineSim engineSim = EngineSim.GetPoolObject().Init(this,
+ atmosphere,
+ (float)mach,
+ engine.maxFuelFlow,
+ engine.minFuelFlow,
+ engine.thrustPercentage,
+ thrustvec,
+ engine.atmosphereCurve,
+ engine.atmChangeFlow,
+ engine.useAtmCurve ? engine.atmCurve : null,
+ engine.useVelCurve ? engine.velCurve : null,
+ engine.currentThrottle,
+ engine.throttleLocked || fullThrust,
+ engine.propellants,
+ engine.isOperational,
+ engine.resultingThrust,
+ engine.thrustTransforms);
allEngines.Add(engineSim);
}
}
@@ -677,6 +648,19 @@
return time;
}
+ public bool EmptyOf(HashSet<int> types)
+ {
+ foreach (int type in types)
+ {
+ if (this.resources.HasType(type) && this.resourceFlowStates[type] != 0 && (double)this.resources[type] > SimManager.RESOURCE_MIN)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
public int DecouplerCount()
{
int count = 0;
--- a/KerbalEngineer/VesselSimulator/ResourceContainer.cs
+++ b/KerbalEngineer/VesselSimulator/ResourceContainer.cs
@@ -134,7 +134,7 @@
public void Reset()
{
- this.resources = new Hashtable();
+ this.resources.Clear();
}
public void Debug()
--- a/KerbalEngineer/VesselSimulator/SimManager.cs
+++ b/KerbalEngineer/VesselSimulator/SimManager.cs
@@ -22,6 +22,7 @@
#region Using Directives
using System;
+ using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
@@ -46,17 +47,23 @@
private static readonly object locker = new object();
private static readonly Stopwatch timer = new Stopwatch();
- // Support for RealFuels using reflection to check localCorrectThrust without dependency
-
- private static FieldInfo RF_ModuleEngineConfigs_locaCorrectThrust;
- private static FieldInfo RF_ModuleHybridEngine_locaCorrectThrust;
- private static FieldInfo RF_ModuleHybridEngines_locaCorrectThrust;
private static bool bRequested;
private static bool bRunning;
private static TimeSpan delayBetweenSims;
- private static bool hasCheckedForRealFuels;
+
+ // Support for RealFuels using reflection to check localCorrectThrust without dependency
+
+ private static bool hasCheckedForMods;
private static bool hasInstalledRealFuels;
-
+ private static FieldInfo RF_ModuleEngineConfigs_localCorrectThrust;
+ private static FieldInfo RF_ModuleHybridEngine_localCorrectThrust;
+ private static FieldInfo RF_ModuleHybridEngines_localCorrectThrust;
+ private static bool hasInstalledKIDS;
+ private static MethodInfo KIDS_Utils_GetIspMultiplier;
+ private static bool bKIDSThrustISP = false;
+ private static List<Part> parts = new List<Part>();
+
+ private static Simulation simulation = new Simulation();
#endregion
#region Delegates
@@ -81,7 +88,7 @@
public static Stage[] Stages { get; private set; }
- public static double Velocity { get; set; }
+ public static double Mach { get; set; }
public static String failMessage { get; private set; }
@@ -89,54 +96,112 @@
#region Methods
+ private static void CheckForMods()
+ {
+ hasCheckedForMods = true;
+
+ foreach (var assembly in AssemblyLoader.loadedAssemblies)
+ {
+ MonoBehaviour.print("Assembly:" + assembly.assembly);
+
+ var name = assembly.assembly.ToString().Split(',')[0];
+
+ if (name == "RealFuels")
+ {
+ MonoBehaviour.print("Found RealFuels mod");
+
+ var RF_ModuleEngineConfigs_Type = assembly.assembly.GetType("RealFuels.ModuleEngineConfigs");
+ if (RF_ModuleEngineConfigs_Type != null)
+ {
+ RF_ModuleEngineConfigs_localCorrectThrust = RF_ModuleEngineConfigs_Type.GetField("localCorrectThrust");
+ }
+
+ var RF_ModuleHybridEngine_Type = assembly.assembly.GetType("RealFuels.ModuleHybridEngine");
+ if (RF_ModuleHybridEngine_Type != null)
+ {
+ RF_ModuleHybridEngine_localCorrectThrust = RF_ModuleHybridEngine_Type.GetField("localCorrectThrust");
+ }
+
+ var RF_ModuleHybridEngines_Type = assembly.assembly.GetType("RealFuels.ModuleHybridEngines");
+ if (RF_ModuleHybridEngines_Type != null)
+ {
+ RF_ModuleHybridEngines_localCorrectThrust = RF_ModuleHybridEngines_Type.GetField("localCorrectThrust");
+ }
+
+ hasInstalledRealFuels = true;
+ break;
+ }
+ else if (name == "KerbalIspDifficultyScaler")
+ {
+ var KIDS_Utils_Type = assembly.assembly.GetType("KerbalIspDifficultyScaler.KerbalIspDifficultyScalerUtils");
+ if (KIDS_Utils_Type != null)
+ {
+ KIDS_Utils_GetIspMultiplier = KIDS_Utils_Type.GetMethod("GetIspMultiplier");
+ }
+
+ hasInstalledKIDS = true;
+ }
+ }
+ }
+
public static bool DoesEngineUseCorrectedThrust(Part theEngine)
{
- if (!hasInstalledRealFuels /*|| HighLogic.LoadedSceneIsFlight*/)
- {
- return false;
- }
-
- // Look for any of the Real Fuels engine modules and call the relevant method to find out
- if (RF_ModuleEngineConfigs_locaCorrectThrust != null && theEngine.Modules.Contains("ModuleEngineConfigs"))
- {
- var modEngineConfigs = theEngine.Modules["ModuleEngineConfigs"];
- if (modEngineConfigs != null)
- {
- // Check the localCorrectThrust
- if ((bool)RF_ModuleEngineConfigs_locaCorrectThrust.GetValue(modEngineConfigs))
- {
- return true;
- }
- }
- }
-
- if (RF_ModuleHybridEngine_locaCorrectThrust != null && theEngine.Modules.Contains("ModuleHybridEngine"))
- {
- var modHybridEngine = theEngine.Modules["ModuleHybridEngine"];
- if (modHybridEngine != null)
- {
- // Check the localCorrectThrust
- if ((bool)RF_ModuleHybridEngine_locaCorrectThrust.GetValue(modHybridEngine))
- {
- return true;
- }
- }
- }
-
- if (RF_ModuleHybridEngines_locaCorrectThrust != null && theEngine.Modules.Contains("ModuleHybridEngines"))
- {
- var modHybridEngines = theEngine.Modules["ModuleHybridEngines"];
- if (modHybridEngines != null)
- {
- // Check the localCorrectThrust
- if ((bool)RF_ModuleHybridEngines_locaCorrectThrust.GetValue(modHybridEngines))
- {
- return true;
- }
- }
+ if (hasInstalledRealFuels)
+ {
+ // Look for any of the Real Fuels engine modules and call the relevant method to find out
+ if (RF_ModuleEngineConfigs_localCorrectThrust != null && theEngine.Modules.Contains("ModuleEngineConfigs"))
+ {
+ var modEngineConfigs = theEngine.Modules["ModuleEngineConfigs"];
+ if (modEngineConfigs != null)
+ {
+ // Return the localCorrectThrust
+ return (bool)RF_ModuleEngineConfigs_localCorrectThrust.GetValue(modEngineConfigs);
+ }
+ }
+
+ if (RF_ModuleHybridEngine_localCorrectThrust != null && theEngine.Modules.Contains("ModuleHybridEngine"))
+ {
+ var modHybridEngine = theEngine.Modules["ModuleHybridEngine"];
+ if (modHybridEngine != null)
+ {
+ // Return the localCorrectThrust
+ return (bool)RF_ModuleHybridEngine_localCorrectThrust.GetValue(modHybridEngine);
+ }
+ }
+
+ if (RF_ModuleHybridEngines_localCorrectThrust != null && theEngine.Modules.Contains("ModuleHybridEngines"))
+ {
+ var modHybridEngines = theEngine.Modules["ModuleHybridEngines"];
+ if (modHybridEngines != null)
+ {
+ // Return the localCorrectThrust
+ return (bool)RF_ModuleHybridEngines_localCorrectThrust.GetValue(modHybridEngines);
+ }
+ }
+ }
+
+ if (hasInstalledKIDS && HighLogic.LoadedSceneIsEditor)
+ {
+ return bKIDSThrustISP;
}
return false;
+ }
+
+ public static void UpdateModSettings()
+ {
+ if (!hasCheckedForMods)
+ {
+ CheckForMods();
+ }
+
+ if (hasInstalledKIDS)
+ {
+ // (out ispMultiplierVac, out ispMultiplierAtm, out extendToZeroIsp, out thrustCorrection, out ispCutoff, out thrustCutoff);
+ object[] parameters = new object[6];
+ KIDS_Utils_GetIspMultiplier.Invoke(null, parameters);
+ bKIDSThrustISP = (bool)parameters[3];
+ }
}
public static String GetVesselTypeString(VesselType vesselType)
@@ -171,9 +236,9 @@
public static void RequestSimulation()
{
- if (!hasCheckedForRealFuels)
- {
- GetRealFuelsTypes();
+ if (!hasCheckedForMods)
+ {
+ CheckForMods();
}
lock (locker)
@@ -217,47 +282,12 @@
LastStage = null;
}
- private static void GetRealFuelsTypes()
- {
- hasCheckedForRealFuels = true;
-
- foreach (var assembly in AssemblyLoader.loadedAssemblies)
- {
- MonoBehaviour.print("Assembly:" + assembly.assembly);
-
- if (assembly.assembly.ToString().Split(',')[0] == "RealFuels")
- {
- MonoBehaviour.print("Found RealFuels mod");
-
- var RF_ModuleEngineConfigs_Type = assembly.assembly.GetType("RealFuels.ModuleEngineConfigs");
- if (RF_ModuleEngineConfigs_Type != null)
- {
- RF_ModuleEngineConfigs_locaCorrectThrust = RF_ModuleEngineConfigs_Type.GetField("localCorrectThrust");
- }
-
- var RF_ModuleHybridEngine_Type = assembly.assembly.GetType("RealFuels.ModuleHybridEngine");
- if (RF_ModuleHybridEngine_Type != null)
- {
- RF_ModuleHybridEngine_locaCorrectThrust = RF_ModuleHybridEngine_Type.GetField("localCorrectThrust");
- }
-
- var RF_ModuleHybridEngines_Type = assembly.assembly.GetType("RealFuels.ModuleHybridEngines");
- if (RF_ModuleHybridEngines_Type != null)
- {
- RF_ModuleHybridEngines_locaCorrectThrust = RF_ModuleHybridEngines_Type.GetField("localCorrectThrust");
- }
-
- hasInstalledRealFuels = true;
- break;
- }
- }
- }
-
private static void RunSimulation(object simObject)
{
try
{
Stages = (simObject as Simulation).RunSimulation();
+
if (Stages != null && Stages.Length > 0)
{
if (logOutput)
@@ -325,15 +355,21 @@
timer.Start();
}
- var parts = HighLogic.LoadedSceneIsEditor ? EditorLogic.fetch.ship.parts : FlightGlobals.ActiveVessel.Parts;
-
- // Create the Simulation object in this thread
- var sim = new Simulation();
+ if (HighLogic.LoadedSceneIsEditor)
+ {
+ parts = EditorLogic.fetch.ship.parts;
+ }
+ else
+ {
+ parts = FlightGlobals.ActiveVessel.Parts;
+ Atmosphere = FlightGlobals.ActiveVessel.staticPressurekPa * PhysicsGlobals.KpaToAtmospheres;
+ }
// This call doesn't ever fail at the moment but we'll check and return a sensible error for display
- if (sim.PrepareSimulation(parts, Gravity, Atmosphere, Velocity, dumpTree, vectoredThrust))
- {
- ThreadPool.QueueUserWorkItem(RunSimulation, sim);
+ if (simulation.PrepareSimulation(parts, Gravity, Atmosphere, Mach, dumpTree, vectoredThrust))
+ {
+ //ThreadPool.QueueUserWorkItem(RunSimulation, simulation);
+ RunSimulation(simulation);
}
else
{
--- a/KerbalEngineer/VesselSimulator/Simulation.cs
+++ b/KerbalEngineer/VesselSimulator/Simulation.cs
@@ -38,21 +38,24 @@
private const double STD_GRAVITY = 9.82;
private const double SECONDS_PER_DAY = 86400;
private readonly Stopwatch _timer = new Stopwatch();
- private List<EngineSim> activeEngines;
- private List<EngineSim> allEngines;
- private List<PartSim> allFuelLines;
- private List<PartSim> allParts;
+ private List<EngineSim> activeEngines = new List<EngineSim>();
+ private List<EngineSim> allEngines = new List<EngineSim>();
+ private List<PartSim> allFuelLines = new List<PartSim>();
+ private List<PartSim> allParts = new List<PartSim>();
+ private Dictionary<Part, PartSim> partSimLookup = new Dictionary<Part, PartSim>();
private double atmosphere;
private int currentStage;
private double currentisp;
private bool doingCurrent;
- private List<PartSim> dontStageParts;
- private HashSet<PartSim> drainingParts;
- private HashSet<int> drainingResources;
+ private List<PartSim> dontStageParts = new List<PartSim>();
+ List<List<PartSim>> dontStagePartsLists = new List<List<PartSim>>();
+ private HashSet<PartSim> drainingParts = new HashSet<PartSim>();
+ private HashSet<int> drainingResources = new HashSet<int>();
+ private HashSet<PartSim> decoupledParts = new HashSet<PartSim>();
private double gravity;
private int lastStage;
- private List<Part> partList;
+ private List<Part> partList = new List<Part>();
private double simpleTotalThrust;
private double stageStartMass;
private Vector3d stageStartCom;
@@ -67,7 +70,8 @@
private Vector3 vecActualThrust;
private Vector3 vecStageDeltaV;
private Vector3 vecThrust;
- private double velocity;
+ private double mach;
+ private float maxMach;
public String vesselName;
public VesselType vesselType;
@@ -113,7 +117,7 @@
// need during the simulation. All required data is copied from the core game data structures
// so that the simulation itself can be run in a background thread without having issues with
// the core game changing the data while the simulation is running.
- public bool PrepareSimulation(List<Part> parts, double theGravity, double theAtmosphere = 0, double theVelocity = 0, bool dumpTree = false, bool vectoredThrust = false)
+ public bool PrepareSimulation(List<Part> parts, double theGravity, double theAtmosphere = 0, double theMach = 0, bool dumpTree = false, bool vectoredThrust = false, bool fullThrust = false)
{
LogMsg log = null;
if (SimManager.logOutput)
@@ -128,20 +132,22 @@
this.partList = parts;
this.gravity = theGravity;
this.atmosphere = theAtmosphere;
- this.velocity = theVelocity;
+ this.mach = theMach;
this.lastStage = Staging.lastStage;
//MonoBehaviour.print("lastStage = " + lastStage);
- // Create the lists for our simulation parts
- this.allParts = new List<PartSim>();
- this.allFuelLines = new List<PartSim>();
- this.drainingParts = new HashSet<PartSim>();
- this.allEngines = new List<EngineSim>();
- this.activeEngines = new List<EngineSim>();
- this.drainingResources = new HashSet<int>();
+ // Clear the lists for our simulation parts
+ allParts.Clear();
+ allFuelLines.Clear();
+ drainingParts.Clear();
+ allEngines.Clear();
+ activeEngines.Clear();
+ drainingResources.Clear();
+
+ EngineSim.ReleaseAll();
// A dictionary for fast lookup of Part->PartSim during the preparation phase
- Dictionary<Part, PartSim> partSimLookup = new Dictionary<Part, PartSim>();
+ partSimLookup.Clear();
if (this.partList.Count > 0 && this.partList[0].vessel != null)
{
@@ -175,10 +181,15 @@
}
if (partSim.isEngine)
{
- partSim.CreateEngineSims(this.allEngines, this.atmosphere, this.velocity, vectoredThrust, log);
+ partSim.CreateEngineSims(this.allEngines, this.atmosphere, this.mach, vectoredThrust, fullThrust, log);
}
partId++;
+ }
+
+ for (int i = 0; i < allEngines.Count; ++i)
+ {
+ maxMach = Mathf.Max(maxMach, allEngines[i].maxMach);
}
this.UpdateActiveEngines();
@@ -341,7 +352,7 @@
}
// Create a list of lists of PartSims that prevent decoupling
- List<List<PartSim>> dontStagePartsLists = this.BuildDontStageLists(log);
+ BuildDontStageLists(log);
if (log != null)
{
@@ -531,7 +542,7 @@
// Store the magnitude of the deltaV vector
stage.deltaV = this.vecStageDeltaV.magnitude;
- stage.resourceMass = this.stepStartMass - this.stepEndMass;
+ stage.resourceMass = this.stageStartMass - this.stepEndMass;
// Recalculate effective stage isp from the stage deltaV (flip the standard deltaV calculation around)
// Note: If the mass doesn't change then this is a divide by zero
@@ -548,6 +559,7 @@
stage.time = (this.stageTime < SECONDS_PER_DAY) ? this.stageTime : 0d;
stage.number = this.doingCurrent ? -1 : this.currentStage; // Set the stage number to -1 if doing current engines
stage.totalPartCount = this.allParts.Count;
+ stage.maxMach = maxMach;
stages[this.currentStage] = stage;
// Now activate the next stage
@@ -610,16 +622,24 @@
return stages;
}
- private List<List<PartSim>> BuildDontStageLists(LogMsg log)
+ private void BuildDontStageLists(LogMsg log)
{
if (log != null)
{
log.buf.AppendLine("Creating list with capacity of " + (this.currentStage + 1));
}
- List<List<PartSim>> lists = new List<List<PartSim>>();
+
+ dontStagePartsLists.Clear();
for (int i = 0; i <= this.currentStage; i++)
{
- lists.Add(new List<PartSim>());
+ if (i < dontStagePartsLists.Count)
+ {
+ dontStagePartsLists[i].Clear();
+ }
+ else
+ {
+ dontStagePartsLists.Add(new List<PartSim>());
+ }
}
foreach (PartSim partSim in this.allParts)
@@ -640,20 +660,18 @@
}
else
{
- lists[partSim.decoupledInStage + 1].Add(partSim);
+ dontStagePartsLists[partSim.decoupledInStage + 1].Add(partSim);
}
}
}
for (int i = 1; i <= this.lastStage; i++)
{
- if (lists[i].Count == 0)
- {
- lists[i] = lists[i - 1];
- }
- }
-
- return lists;
+ if (dontStagePartsLists[i].Count == 0)
+ {
+ dontStagePartsLists[i] = dontStagePartsLists[i - 1];
+ }
+ }
}
// This function simply rebuilds the active engines by testing the isActive flag of all the engines
@@ -783,7 +801,7 @@
}
//buffer.AppendFormat("isSepratron = {0}\n", partSim.isSepratron ? "true" : "false");
- if (!partSim.isSepratron && !partSim.Resources.EmptyOf(this.drainingResources))
+ if (!partSim.isSepratron && !partSim.EmptyOf(this.drainingResources))
{
if (SimManager.logOutput)
{
@@ -834,7 +852,7 @@
private void ActivateStage()
{
// Build a set of all the parts that will be decoupled
- HashSet<PartSim> decoupledParts = new HashSet<PartSim>();
+ decoupledParts.Clear();
foreach (PartSim partSim in this.allParts)
{
if (partSim.decoupledInStage >= this.currentStage)
--- a/KerbalEngineer/VesselSimulator/Stage.cs
+++ b/KerbalEngineer/VesselSimulator/Stage.cs
@@ -29,27 +29,29 @@
{
public class Stage
{
- public double actualThrust = 0f;
- public double actualThrustToWeight = 0f;
- public double cost = 0d;
- public double deltaV = 0f;
- public double inverseTotalDeltaV = 0f;
- public double isp = 0f;
- public double mass = 0f;
- public double maxThrustToWeight = 0f;
+ public double actualThrust = 0.0;
+ public double actualThrustToWeight = 0.0;
+ public double cost = 0.0;
+ public double deltaV = 0.0;
+ public double inverseTotalDeltaV = 0.0;
+ public double isp = 0.0;
+ public double mass = 0.0;
+ public double rcsMass = 0.0;
+ public double maxThrustToWeight = 0.0;
public int number = 0;
- public double thrust = 0f;
- public double thrustToWeight = 0f;
- public double time = 0f;
- public double totalCost = 0;
- public double totalDeltaV = 0f;
- public double totalMass = 0f;
- public double totalTime = 0f;
+ public double thrust = 0.0;
+ public double thrustToWeight = 0.0;
+ public double time = 0.0;
+ public double totalCost = 0.0;
+ public double totalDeltaV = 0.0;
+ public double totalMass = 0.0;
+ public double totalTime = 0.0;
public int totalPartCount = 0;
public int partCount = 0;
public double resourceMass = 0.0;
- public double maxThrustTorque = 0f;
- public double thrustOffsetAngle = 0f;
+ public double maxThrustTorque = 0.0;
+ public double thrustOffsetAngle = 0.0;
+ public float maxMach = 0.0f;
public void Dump()
{
Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ
--- a/Output/KerbalEngineer/KerbalEngineer.version
+++ b/Output/KerbalEngineer/KerbalEngineer.version
@@ -5,13 +5,13 @@
{
"MAJOR":1,
"MINOR":0,
- "PATCH":13,
- "BUILD":0
+ "PATCH":16,
+ "BUILD":3
},
"KSP_VERSION":
{
- "MAJOR":0,
- "MINOR":90,
+ "MAJOR":1,
+ "MINOR":0,
"PATCH":0
}
}
Binary files /dev/null and b/Output/KerbalEngineer/Parts/Engineer7500/model000.mbm differ
--- a/Output/KerbalEngineer/Parts/Engineer7500/part.cfg
+++ b/Output/KerbalEngineer/Parts/Engineer7500/part.cfg
@@ -7,7 +7,6 @@
// --- asset parameters ---
mesh = model.mu
- texture = model000.mbm
rescaleFactor = 0.8
PhysicsSignificance = 1
Binary files a/Output/KerbalEngineer/Parts/Engineer7500/textures/model000.mbm and /dev/null differ