VOID_VesselInfo: Minor tweak to the VesselSimulator failsafes.
[VOID.git] / VOID_VesselInfo.cs
blob:a/VOID_VesselInfo.cs -> blob:b/VOID_VesselInfo.cs
// //
// VOID_Orbital.cs // VOID_Orbital.cs
// //
// Author: // Author:
// toadicus <> // toadicus <>
// //
// Copyright (c) 2013 toadicus // Copyright (c) 2013 toadicus
// //
// This program is free software: you can redistribute it and/or modify // 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 // it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or // the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version. // (at your option) any later version.
// //
// This program is distributed in the hope that it will be useful, // This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of // but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details. // GNU General Public License for more details.
// //
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
using KSP; using KSP;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
  using Engineer.VesselSimulator;
  using Engineer.Extensions;
   
namespace VOID namespace VOID
{ {
public class VOID_VesselInfo : VOID_WindowModule public class VOID_VesselInfo : VOID_WindowModule
{ {
[AVOID_SaveValue("toggleExtended")]  
protected VOID_SaveValue<bool> toggleExtended = false;  
   
protected VOID_DoubleValue geeForce = new VOID_DoubleValue( protected VOID_DoubleValue geeForce = new VOID_DoubleValue(
"G-force", "G-force",
new Func<double>(() => VOID_Core.Instance.vessel.geeForce), new Func<double>(() => VOID_Core.Instance.vessel.geeForce),
"gees" "gees"
); );
   
protected VOID_IntValue partCount = new VOID_IntValue( protected VOID_IntValue partCount = new VOID_IntValue(
"Parts", "Parts",
new Func<int>(() => VOID_Core.Instance.vessel.Parts.Count), new Func<int>(() => VOID_Core.Instance.vessel.Parts.Count),
"" ""
); );
   
protected VOID_DoubleValue totalMass = new VOID_DoubleValue( protected VOID_DoubleValue totalMass = new VOID_DoubleValue(
"Total Mass", "Total Mass",
new Func<double>(() => VOID_Core.Instance.vessel.GetTotalMass()), new Func<double> (() => SimManager.Instance.TryGetLastMass()),
"tons" "tons"
); );
   
protected VOID_DoubleValue resourceMass = new VOID_DoubleValue( protected VOID_DoubleValue resourceMass = new VOID_DoubleValue(
"Resource Mass", "Resource Mass",
delegate() delegate()
{ {
double rscMass = 0; double rscMass = 0;
foreach (Part part in VOID_Core.Instance.vessel.Parts) foreach (Part part in VOID_Core.Instance.vessel.Parts)
{ {
rscMass += part.GetResourceMass(); rscMass += part.GetResourceMass();
} }
return rscMass; return rscMass;
}, },
"tons" "tons"
); );
   
protected VOID_DoubleValue stageDeltaV = new VOID_DoubleValue( protected VOID_DoubleValue stageDeltaV = new VOID_DoubleValue(
"DeltaV (Current Stage)", "DeltaV (Current Stage)",
delegate() delegate()
{ {
if (Engineer.VesselSimulator.SimManager.Instance.Stages == null) if (SimManager.Instance.Stages == null ||
  SimManager.Instance.Stages.Length <= Staging.lastStage
  )
return double.NaN; return double.NaN;
return Engineer.VesselSimulator.SimManager.Instance.Stages[Staging.lastStage].deltaV; return SimManager.Instance.Stages[Staging.lastStage].deltaV;
}, },
"m/s" "m/s"
); );
   
protected VOID_DoubleValue totalDeltaV = new VOID_DoubleValue( protected VOID_DoubleValue totalDeltaV = new VOID_DoubleValue(
"DeltaV (Total)", "DeltaV (Total)",
delegate() delegate()
{ {
if (Engineer.VesselSimulator.SimManager.Instance.Stages == null) if (SimManager.Instance.Stages == null)
return double.NaN; return double.NaN;
return Engineer.VesselSimulator.SimManager.Instance.LastStage.totalDeltaV; return SimManager.Instance.LastStage.totalDeltaV;
}, },
"m/s" "m/s"
); );
   
protected VOID_FloatValue mainThrottle = new VOID_FloatValue( protected VOID_FloatValue mainThrottle = new VOID_FloatValue(
"Throttle", "Throttle",
new Func<float>(() => VOID_Core.Instance.vessel.ctrlState.mainThrottle * 100f), new Func<float>(() => VOID_Core.Instance.vessel.ctrlState.mainThrottle * 100f),
"%" "%"
); );
   
protected VOID_StrValue currmaxThrust = new VOID_StrValue( protected VOID_StrValue currmaxThrust = new VOID_StrValue(
"Thrust (curr/max)", "Thrust (curr/max)",
delegate() delegate()
{ {
if (Engineer.VesselSimulator.SimManager.Instance.Stages == null) if (SimManager.Instance.Stages == null)
return "N/A"; return "N/A";
   
double currThrust = Engineer.VesselSimulator.SimManager.Instance.LastStage.actualThrust; double currThrust = SimManager.Instance.LastStage.actualThrust;
double maxThrust = Engineer.VesselSimulator.SimManager.Instance.LastStage.thrust; double maxThrust = SimManager.Instance.LastStage.thrust;
   
return string.Format( return string.Format(
"{0} / {1}", "{0} / {1}",
currThrust.ToString("F1"), currThrust.ToString("F1"),
maxThrust.ToString("F1") maxThrust.ToString("F1")
); );
} }
); );
   
protected VOID_StrValue currmaxThrustWeight = new VOID_StrValue( protected VOID_StrValue currmaxThrustWeight = new VOID_StrValue(
"T:W (curr/max)", "T:W (curr/max)",
delegate() delegate()
{ {
if (Engineer.VesselSimulator.SimManager.Instance.Stages == null) if (SimManager.Instance.Stages == null)
return "N/A"; return "N/A";
   
double currThrust = Engineer.VesselSimulator.SimManager.Instance.LastStage.actualThrust; double currThrust = SimManager.Instance.LastStage.actualThrust;
double maxThrust = Engineer.VesselSimulator.SimManager.Instance.LastStage.thrust; double maxThrust = SimManager.Instance.LastStage.thrust;
double mass = VOID_Core.Instance.vessel.GetTotalMass(); double mass = SimManager.Instance.TryGetLastMass();
double gravity = VOID_Core.Instance.vessel.mainBody.gravParameter / double gravity = VOID_Core.Instance.vessel.mainBody.gravParameter /
Math.Pow( Math.Pow(
VOID_Core.Instance.vessel.mainBody.Radius + VOID_Core.Instance.vessel.altitude, VOID_Core.Instance.vessel.mainBody.Radius + VOID_Core.Instance.vessel.altitude,
2 2
); );
double weight = mass * gravity; double weight = mass * gravity;
   
return string.Format( return string.Format(
"{0} / {1}", "{0} / {1}",
(currThrust / weight).ToString("F2"), (currThrust / weight).ToString("F2"),
(maxThrust / weight).ToString("F2") (maxThrust / weight).ToString("F2")
); );
} }
); );
   
protected VOID_DoubleValue surfaceThrustWeight = new VOID_DoubleValue( protected VOID_DoubleValue surfaceThrustWeight = new VOID_DoubleValue(
"Max T:W @ surface", "Max T:W @ surface",
delegate() delegate()
{ {
if (Engineer.VesselSimulator.SimManager.Instance.Stages == null) if (SimManager.Instance.Stages == null)
return double.NaN; return double.NaN;
   
double maxThrust = Engineer.VesselSimulator.SimManager.Instance.LastStage.thrust; double maxThrust = SimManager.Instance.LastStage.thrust;
double mass = VOID_Core.Instance.vessel.GetTotalMass(); double mass = SimManager.Instance.TryGetLastMass();
double gravity = (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) / double gravity = (VOID_Core.Constant_G * VOID_Core.Instance.vessel.mainBody.Mass) /
Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2); Math.Pow(VOID_Core.Instance.vessel.mainBody.Radius, 2);
double weight = mass * gravity; double weight = mass * gravity;
   
return maxThrust / weight; return maxThrust / weight;
}, },
"" ""
); );
   
  protected VOID_StrValue intakeAirStatus = new VOID_StrValue(
  "Intake Air (Curr / Req)",
  delegate()
  {
  double currentAmount;
  double currentRequirement;
   
  currentAmount = 0d;
  currentRequirement = 0d;
   
  foreach (Part part in VOID_Core.Instance.vessel.Parts)
  {
  if (part.HasModule<ModuleEngines>() && part.enabled)
  {
  foreach (Propellant propellant in part.GetModule<ModuleEngines>().propellants)
  {
  if (propellant.name == "IntakeAir")
  {
  // currentAmount += propellant.currentAmount;
  currentRequirement += propellant.currentRequirement / TimeWarp.fixedDeltaTime;
  break;
  }
  }
  }
   
  if (part.HasModule<ModuleResourceIntake>() && part.enabled)
  {
  ModuleResourceIntake intakeModule = part.GetModule<ModuleResourceIntake>();
   
  if (intakeModule.resourceName == "IntakeAir")
  {
  currentAmount += intakeModule.airFlow;
  }
  }
  }
   
  if (currentAmount == 0 && currentRequirement == 0)
  {
  return "N/A";
  }
   
  return string.Format("{0:F3} / {1:F3}", currentAmount, currentRequirement);
  }
  );
   
public VOID_VesselInfo() : base() public VOID_VesselInfo() : base()
{ {
this._Name = "Vessel Information"; this._Name = "Vessel Information";
   
this.WindowPos.x = Screen.width - 260; this.WindowPos.x = Screen.width - 260;
this.WindowPos.y = 450; this.WindowPos.y = 450;
} }
   
public override void ModuleWindow(int _) public override void ModuleWindow(int _)
{ {
base.ModuleWindow (_); base.ModuleWindow (_);
   
if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate)) if ((TimeWarp.WarpMode == TimeWarp.Modes.LOW) || (TimeWarp.CurrentRate <= TimeWarp.MaxPhysicsRate))
{ {
Engineer.VesselSimulator.SimManager.Instance.RequestSimulation(); SimManager.Instance.RequestSimulation();
} }
   
Engineer.VesselSimulator.Stage[] stages = Engineer.VesselSimulator.SimManager.Instance.Stages;  
   
GUILayout.BeginVertical(); GUILayout.BeginVertical();
   
GUILayout.Label( GUILayout.Label(
vessel.vesselName, vessel.vesselName,
VOID_Core.Instance.LabelStyles["center_bold"], VOID_Core.Instance.LabelStyles["center_bold"],
GUILayout.ExpandWidth(true)); GUILayout.ExpandWidth(true));
   
this.geeForce.DoGUIHorizontal ("F2"); this.geeForce.DoGUIHorizontal ("F2");
   
this.partCount.DoGUIHorizontal (); this.partCount.DoGUIHorizontal ();
   
this.totalMass.DoGUIHorizontal ("F1"); this.totalMass.DoGUIHorizontal ("F1");
   
this.resourceMass.DoGUIHorizontal ("F1"); this.resourceMass.DoGUIHorizontal ("F1");
   
this.stageDeltaV.DoGUIHorizontal (3, false); this.stageDeltaV.DoGUIHorizontal (3, false);
   
this.totalDeltaV.DoGUIHorizontal (3, false); this.totalDeltaV.DoGUIHorizontal (3, false);
   
this.mainThrottle.DoGUIHorizontal ("F0"); this.mainThrottle.DoGUIHorizontal ("F0");
   
this.currmaxThrust.DoGUIHorizontal (); this.currmaxThrust.DoGUIHorizontal ();
   
this.currmaxThrustWeight.DoGUIHorizontal (); this.currmaxThrustWeight.DoGUIHorizontal ();
   
this.surfaceThrustWeight.DoGUIHorizontal ("F2"); this.surfaceThrustWeight.DoGUIHorizontal ("F2");
   
  this.intakeAirStatus.DoGUIHorizontal();
   
GUILayout.EndVertical(); GUILayout.EndVertical();
GUI.DragWindow(); GUI.DragWindow();
} }
} }
} }