Changed all VOID_DataValue declarations to readonly.
[VOID.git] / VOID_VesselInfo.cs
blob:a/VOID_VesselInfo.cs -> blob:b/VOID_VesselInfo.cs
--- a/VOID_VesselInfo.cs
+++ b/VOID_VesselInfo.cs
@@ -1,29 +1,38 @@
-//
-//  VOID_Orbital.cs
-//
-//  Author:
-//       toadicus <>
-//
-//  Copyright (c) 2013 toadicus
-//
-//  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/>.
+// VOID
+//
+// VOID_VesselInfo.cs
+//
+// Copyright © 2014, toadicus
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+//    this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be used
+//    to endorse or promote products derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using Engineer.VesselSimulator;
+using Engineer.Extensions;
 using KSP;
 using System;
 using System.Collections.Generic;
+using ToadicusTools;
 using UnityEngine;
-using Engineer.VesselSimulator;
-using Engineer.Extensions;
 
 namespace VOID
 {
@@ -39,69 +48,41 @@
 
 		public override void ModuleWindow(int _)
 		{
-			base.ModuleWindow (_);
-
 			if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate))
 			{
-				SimManager.Instance.RequestSimulation();
+				SimManager.RequestSimulation();
 			}
 
 			GUILayout.BeginVertical();
 
 			GUILayout.Label(
 				vessel.vesselName,
-				VOID_Core.Instance.LabelStyles["center_bold"],
+				core.LabelStyles["center_bold"],
 				GUILayout.ExpandWidth(true));
 
-			Tools.PostDebugMessage("Starting VesselInfo window.");
-
 			VOID_Data.geeForce.DoGUIHorizontal ("F2");
 
-			Tools.PostDebugMessage("GeeForce done.");
-
 			VOID_Data.partCount.DoGUIHorizontal ();
 
-			Tools.PostDebugMessage("PartCount done.");
-
-			VOID_Data.totalMass.DoGUIHorizontal ("F1");
-
-			Tools.PostDebugMessage("TotalMass done.");
-
-			VOID_Data.resourceMass.DoGUIHorizontal ("F1");
-
-			Tools.PostDebugMessage("ResourceMass done.");
+			VOID_Data.totalMass.DoGUIHorizontal ("F3");
+
+			VOID_Data.comboResourceMass.DoGUIHorizontal ();
 
 			VOID_Data.stageDeltaV.DoGUIHorizontal (3, false);
 
-			Tools.PostDebugMessage("Stage deltaV done.");
-
 			VOID_Data.totalDeltaV.DoGUIHorizontal (3, false);
 
-			Tools.PostDebugMessage("Total deltaV done.");
-
 			VOID_Data.mainThrottle.DoGUIHorizontal ("F0");
 
-			Tools.PostDebugMessage("MainThrottle done.");
-
 			VOID_Data.currmaxThrust.DoGUIHorizontal ();
 
-			Tools.PostDebugMessage("CurrMaxThrust done.");
-
 			VOID_Data.currmaxThrustWeight.DoGUIHorizontal ();
 
-			Tools.PostDebugMessage("CurrMaxTWR done.");
-
 			VOID_Data.surfaceThrustWeight.DoGUIHorizontal ("F2");
 
-			Tools.PostDebugMessage("surfaceTWR done.");
-
 			VOID_Data.intakeAirStatus.DoGUIHorizontal();
 
-			Tools.PostDebugMessage("intakeAirStatus done.");
-
 			GUILayout.EndVertical();
-
-			Tools.PostDebugMessage("VesselInfo window done.");
 
 			GUI.DragWindow();
 		}
@@ -111,19 +92,27 @@
 	{
 		public static readonly VOID_DoubleValue geeForce = new VOID_DoubleValue(
 			"G-force",
-			new Func<double>(() => VOID_Core.Instance.vessel.geeForce),
+			new Func<double>(() => core.vessel.geeForce),
 			"gees"
 		);
 
 		public static readonly VOID_IntValue partCount = new VOID_IntValue(
 			"Parts",
-			new Func<int>(() => VOID_Core.Instance.vessel.Parts.Count),
+			new Func<int>(() => core.vessel.Parts.Count),
 			""
 		);
 
 		public static readonly VOID_DoubleValue totalMass = new VOID_DoubleValue(
 			"Total Mass",
-			new Func<double> (() => SimManager.Instance.TryGetLastMass()),
+			delegate()
+		{
+			if (SimManager.Stages == null || SimManager.LastStage == null)
+			{
+				return double.NaN;
+			}
+
+			return SimManager.LastStage.totalMass;
+		},
 			"tons"
 		);
 
@@ -131,25 +120,45 @@
 			"Resource Mass",
 			delegate()
 			{
-				double rscMass = 0;
-				foreach (Part part in VOID_Core.Instance.vessel.Parts)
+				if (SimManager.Stages == null || SimManager.LastStage == null)
 				{
-					rscMass += part.GetResourceMass();
+					return double.NaN;
 				}
-				return rscMass;
+
+				return SimManager.LastStage.totalMass - SimManager.LastStage.totalBaseMass;
 			},
 			"tons"
+		);
+
+		public static readonly VOID_DoubleValue stageResourceMass = new VOID_DoubleValue(
+			"Resource Mass (Current Stage)",
+			delegate()
+			{
+				if (SimManager.LastStage == null)
+				{
+					return double.NaN;
+				}
+
+				return SimManager.LastStage.mass - SimManager.LastStage.baseMass;
+			},
+			"tons"
+		);
+
+		public static readonly VOID_StrValue comboResourceMass = new VOID_StrValue(
+			"Resource Mass (curr / total)",
+			delegate()
+		{
+			return string.Format("{0} / {1}", stageResourceMass.ValueUnitString(), resourceMass.ValueUnitString());
+		}
 		);
 
 		public static readonly VOID_DoubleValue stageDeltaV = new VOID_DoubleValue(
 			"DeltaV (Current Stage)",
 			delegate()
 			{
-				if (SimManager.Instance.Stages == null ||
-					SimManager.Instance.Stages.Length <= Staging.lastStage
-				)
-					return double.NaN;
-				return SimManager.Instance.Stages[Staging.lastStage].deltaV;
+				if (SimManager.Stages == null || SimManager.LastStage == null)
+					return double.NaN;
+				return SimManager.LastStage.deltaV;
 			},
 			"m/s"
 		);
@@ -158,16 +167,16 @@
 			"DeltaV (Total)",
 			delegate()
 			{
-				if (SimManager.Instance.Stages == null)
-					return double.NaN;
-				return SimManager.Instance.LastStage.totalDeltaV;
+				if (SimManager.Stages == null || SimManager.LastStage == null)
+					return double.NaN;
+				return SimManager.LastStage.totalDeltaV;
 			},
 			"m/s"
 		);
 
 		public static readonly VOID_FloatValue mainThrottle = new VOID_FloatValue(
 			"Throttle",
-			new Func<float>(() => VOID_Core.Instance.vessel.ctrlState.mainThrottle * 100f),
+			new Func<float>(() => core.vessel.ctrlState.mainThrottle * 100f),
 			"%"
 		);
 
@@ -175,11 +184,11 @@
 			"Thrust (curr/max)",
 			delegate()
 			{
-				if (SimManager.Instance.Stages == null)
+				if (SimManager.Stages == null || SimManager.LastStage == null)
 					return "N/A";
 
-				double currThrust = SimManager.Instance.LastStage.actualThrust;
-				double maxThrust = SimManager.Instance.LastStage.thrust;
+				double currThrust = SimManager.LastStage.actualThrust;
+				double maxThrust = SimManager.LastStage.thrust;
 
 				return string.Format(
 					"{0} / {1}",
@@ -189,27 +198,45 @@
 			}
 		);
 
+		public static readonly VOID_DoubleValue currThrustWeight = new VOID_DoubleValue(
+			"T:W Ratio",
+			delegate()
+		{
+			if (SimManager.LastStage == null)
+			{
+				return double.NaN;
+			}
+
+			return SimManager.LastStage.actualThrustToWeight;
+		},
+			""
+		);
+
+		public static readonly VOID_DoubleValue maxThrustWeight = new VOID_DoubleValue(
+			"T:W Ratio",
+			delegate()
+		{
+			if (SimManager.LastStage == null)
+			{
+				return double.NaN;
+			}
+
+			return SimManager.LastStage.thrustToWeight;
+		},
+			""
+		);
+
 		public static readonly VOID_StrValue currmaxThrustWeight = new VOID_StrValue(
 			"T:W (curr/max)",
 			delegate()
 			{
-				if (SimManager.Instance.Stages == null)
+				if (SimManager.Stages == null || SimManager.LastStage == null)
 					return "N/A";
-
-				double currThrust = SimManager.Instance.LastStage.actualThrust;
-				double maxThrust = SimManager.Instance.LastStage.thrust;
-				double mass = SimManager.Instance.TryGetLastMass();
-				double gravity = VOID_Core.Instance.vessel.mainBody.gravParameter /
-					Math.Pow(
-						VOID_Core.Instance.vessel.mainBody.Radius + VOID_Core.Instance.vessel.altitude,
-						2
-					);
-				double weight = mass * gravity;
 
 				return string.Format(
 					"{0} / {1}",
-					(currThrust / weight).ToString("F2"),
-					(maxThrust / weight).ToString("F2")
+					(VOID_Data.currThrustWeight.Value).ToString("F2"),
+					(VOID_Data.maxThrustWeight.Value).ToString("F2")
 				);
 			}
 		);
@@ -218,13 +245,13 @@
 			"Max T:W @ surface",
 			delegate()
 			{
-				if (SimManager.Instance.Stages == null)
-					return double.NaN;
-
-				double maxThrust = SimManager.Instance.LastStage.thrust;
-				double mass = SimManager.Instance.TryGetLastMass();
-				double gravity = (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) /
-					Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2);
+			if (SimManager.Stages == null || SimManager.LastStage == null)
+					return double.NaN;
+
+				double maxThrust = SimManager.LastStage.thrust;
+				double mass = SimManager.LastStage.totalMass;
+				double gravity = (VOID_Core.Constant_G * core.vessel.mainBody.Mass) /
+				(core.vessel.mainBody.Radius * core.vessel.mainBody.Radius);
 				double weight = mass * gravity;
 
 				return maxThrust / weight;
@@ -242,25 +269,40 @@
 				currentAmount = 0d;
 				currentRequirement = 0d;
 
-				foreach (Part part in VOID_Core.Instance.vessel.Parts)
+				foreach (Part part in core.vessel.Parts)
 				{
-					if (part.HasModule<ModuleEngines>() && part.enabled)
+					if (part.enabled)
 					{
-						foreach (Propellant propellant in part.GetModule<ModuleEngines>().propellants)
+						ModuleEngines engineModule;
+						ModuleEnginesFX enginesFXModule;
+						List<Propellant> propellantList = null;
+
+						if (part.tryGetFirstModuleOfType<ModuleEngines>(out engineModule))
 						{
-							if (propellant.name == "IntakeAir")
+							propellantList = engineModule.propellants;
+						}
+						else if (part.tryGetFirstModuleOfType<ModuleEnginesFX>(out enginesFXModule))
+						{
+							propellantList = enginesFXModule.propellants;
+						}
+							
+						if (propellantList != null)
+						{
+							foreach (Propellant propellant in propellantList)
 							{
-								// currentAmount += propellant.currentAmount;
-								currentRequirement += propellant.currentRequirement / TimeWarp.fixedDeltaTime;
-								break;
+								if (propellant.name == "IntakeAir")
+								{
+									currentRequirement += propellant.currentRequirement / TimeWarp.fixedDeltaTime;
+									break;
+								}
 							}
 						}
 					}
 
-					if (part.HasModule<ModuleResourceIntake>() && part.enabled)
+					ModuleResourceIntake intakeModule;
+
+					if (part.enabled && part.tryGetFirstModuleOfType<ModuleResourceIntake>(out intakeModule))
 					{
-						ModuleResourceIntake intakeModule = part.GetModule<ModuleResourceIntake>();
-
 						if (intakeModule.resourceName == "IntakeAir")
 						{
 							currentAmount += intakeModule.airFlow;