Carving a bunch of functionality out into ToadicusTools.
[VOID.git] / VOID_Tools.cs
blob:a/VOID_Tools.cs -> blob:b/VOID_Tools.cs
--- a/VOID_Tools.cs
+++ b/VOID_Tools.cs
@@ -1,10 +1,10 @@
-//
-//  Tools.cs
+//
+//  VOID_Tools.cs
 //
 //  Author:
-//       toadicus
+//       toadicus <>
 //
-//  Copyright (c) 2013 toadicus
+//  Copyright (c) 2014 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
@@ -18,32 +18,16 @@
 //
 //  You should have received a copy of the GNU General Public License
 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-//
-//  This software uses VesselSimulator and Engineer.Extensions from Engineer Redux.
-//  Engineer Redux (c) 2013 cybutek
-//  Used by permission.
-//
-///////////////////////////////////////////////////////////////////////////////
-
+using KSP;
 using System;
-using System.Collections.Generic;
 using UnityEngine;
 
-namespace VOID
+namespace ToadicusTools
 {
-	public static class VOIDLabels
+	public static partial class Tools
 	{
-		public static string void_primary = "Primary";
-		public static string void_altitude_asl = "Altitude (ASL)";
-		public static string void_velocity = "Velocity";
-		public static string void_apoapsis = "Apoapsis";
-		public static string void_periapsis = "Periapsis";
-	}
-
-	public static class Tools
-	{
-		// Toadicus edit: Added re-implementation of the CBAttributeMap.GetAtt function that does not fire a debug message to the game screen.
-		public static CBAttributeMap.MapAttribute Toadicus_GetAtt(Vessel vessel)
+		#region VESSEL_EXTENSIONS_SCIENCE
+		public static CBAttributeMap.MapAttribute GetBiome(this Vessel vessel)
 		{
 			CBAttributeMap.MapAttribute mapAttribute;
 
@@ -117,7 +101,62 @@
 			return mapAttribute;
 		}
 
-		public static string GetLongitudeString(Vessel vessel, string format = "F4")
+		public static ExperimentSituations GetExperimentSituation(this Vessel vessel)
+		{
+			Vessel.Situations situation = vessel.situation;
+
+			switch (situation)
+			{
+				case Vessel.Situations.PRELAUNCH:
+				case Vessel.Situations.LANDED:
+					return ExperimentSituations.SrfLanded;
+				case Vessel.Situations.SPLASHED:
+					return ExperimentSituations.SrfSplashed;
+				case Vessel.Situations.FLYING:
+					if (vessel.altitude < (double)vessel.mainBody.scienceValues.flyingAltitudeThreshold)
+					{
+						return ExperimentSituations.FlyingLow;
+					}
+					else
+					{
+						return ExperimentSituations.FlyingHigh;
+					}
+			}
+
+			if (vessel.altitude < (double)vessel.mainBody.scienceValues.spaceAltitudeThreshold)
+			{
+				return ExperimentSituations.InSpaceLow;
+			}
+			else
+			{
+				return ExperimentSituations.InSpaceHigh;
+			}
+		}
+
+		public static string HumanString(this ExperimentSituations situation)
+		{
+			switch (situation)
+			{
+				case ExperimentSituations.FlyingHigh:
+					return "Upper Atmosphere";
+				case ExperimentSituations.FlyingLow:
+					return "Flying";
+				case ExperimentSituations.SrfLanded:
+					return "Surface";
+				case ExperimentSituations.InSpaceLow:
+					return "Near in Space";
+				case ExperimentSituations.InSpaceHigh:
+					return "High in Space";
+				case ExperimentSituations.SrfSplashed:
+					return "Splashed Down";
+				default:
+					return "Unknown";
+			}
+		}
+		#endregion
+
+		#region VESSEL_EXTENSIONS_LAT_LONG
+		public static string GetLongitudeString(this Vessel vessel, string format = "F4")
 		{
 			string dir_long = "W";
 			double v_long = vessel.longitude;
@@ -139,7 +178,7 @@
 			return string.Format("{0}° {1}", Math.Abs(v_long).ToString(format), dir_long);
 		}
 
-		public static string GetLatitudeString(Vessel vessel, string format = "F4")
+		public static string GetLatitudeString(this Vessel vessel, string format = "F4")
 		{
 			string dir_lat = "S";
 			double v_lat = vessel.latitude;
@@ -148,153 +187,61 @@
 
 			return string.Format("{0}° {1}", Math.Abs(v_lat).ToString(format), dir_lat);
 		}
-
-		/*
-		* MuMechLib Methods
-		* The methods below are adapted from MuMechLib, © 2013-2014 r4m0n
-		* The following methods are a derivative work of the code from MuMechLib in the MechJeb project.
-		* Used under license.
-		* */
-
-		// Derived from MechJeb2/VesselState.cs
-		public static Quaternion getSurfaceRotation(this Vessel vessel)
-		{
-			Vector3 CoM;
-
-			try
-			{
-				CoM = vessel.findWorldCenterOfMass();
-			}
-			catch
-			{
-				return new Quaternion();
-			}
-
-			Vector3 bodyPosition = vessel.mainBody.position;
-			Vector3 bodyUp = vessel.mainBody.transform.up;
-
-			Vector3 surfaceUp = (CoM - vessel.mainBody.position).normalized;
-			Vector3 surfaceNorth = Vector3.Exclude(
-				surfaceUp,
-				(bodyPosition + bodyUp * (float)vessel.mainBody.Radius) - CoM
-			).normalized;
-
-			Quaternion surfaceRotation = Quaternion.LookRotation(surfaceNorth, surfaceUp);
-
-			return Quaternion.Inverse(
-				Quaternion.Euler(90, 0, 0) * Quaternion.Inverse(vessel.GetTransform().rotation) * surfaceRotation
-			);
-		}
-
-		// Derived from MechJeb2/VesselState.cs
-		public static double getSurfaceHeading(this Vessel vessel)
-		{
-			return vessel.getSurfaceRotation().eulerAngles.y;
-		}
-
-		// Derived from MechJeb2/VesselState.cs
-		public static double getSurfacePitch(this Vessel vessel)
-		{
-			Quaternion vesselSurfaceRotation = vessel.getSurfaceRotation();
-
-			return (vesselSurfaceRotation.eulerAngles.x > 180f) ?
-				(360f - vesselSurfaceRotation.eulerAngles.x) :
-				-vesselSurfaceRotation.eulerAngles.x;
-		}
-
-		// Derived from MechJeb2/MuUtils.cs
-		public static string MuMech_ToSI(
-			double d, int digits = 3, int MinMagnitude = 0, int MaxMagnitude = int.MaxValue
-		)
-		{
-			float exponent = (float)Math.Log10(Math.Abs(d));
-			exponent = Mathf.Clamp(exponent, (float)MinMagnitude, (float)MaxMagnitude);
-
-			if (exponent >= 0)
-			{
-				switch ((int)Math.Floor(exponent))
-				{
-					case 0:
-					case 1:
-					case 2:
-						return d.ToString("F" + digits);
-					case 3:
-					case 4:
-					case 5:
-						return (d / 1e3).ToString("F" + digits) + "k";
-					case 6:
-					case 7:
-					case 8:
-						return (d / 1e6).ToString("F" + digits) + "M";
-					case 9:
-					case 10:
-					case 11:
-						return (d / 1e9).ToString("F" + digits) + "G";
-					case 12:
-					case 13:
-					case 14:
-						return (d / 1e12).ToString("F" + digits) + "T";
-					case 15:
-					case 16:
-					case 17:
-						return (d / 1e15).ToString("F" + digits) + "P";
-					case 18:
-					case 19:
-					case 20:
-						return (d / 1e18).ToString("F" + digits) + "E";
-					case 21:
-					case 22:
-					case 23:
-						return (d / 1e21).ToString("F" + digits) + "Z";
-					default:
-						return (d / 1e24).ToString("F" + digits) + "Y";
-				}
-			}
-			else if (exponent < 0)
-			{
-				switch ((int)Math.Floor(exponent))
-				{
-					case -1:
-					case -2:
-					case -3:
-						return (d * 1e3).ToString("F" + digits) + "m";
-					case -4:
-					case -5:
-					case -6:
-						return (d * 1e6).ToString("F" + digits) + "μ";
-					case -7:
-					case -8:
-					case -9:
-						return (d * 1e9).ToString("F" + digits) + "n";
-					case -10:
-					case -11:
-					case -12:
-						return (d * 1e12).ToString("F" + digits) + "p";
-					case -13:
-					case -14:
-					case -15:
-						return (d * 1e15).ToString("F" + digits) + "f";
-					case -16:
-					case -17:
-					case -18:
-						return (d * 1e18).ToString("F" + digits) + "a";
-					case -19:
-					case -20:
-					case -21:
-						return (d * 1e21).ToString("F" + digits) + "z";
-					default:
-						return (d * 1e24).ToString("F" + digits) + "y";
-				}
-			}
-			else
-			{
-				return "0";
-			}
-		}
-
-		/*
-		 * END MuMecLib METHODS
-		 * */
+		#endregion
+
+		#region VESSEL_EXTENSIONS_GENERAL
+		public static double TrueAltitude(Vessel vessel)
+		{
+			double trueAltitude = vessel.orbit.altitude - vessel.terrainAltitude;
+
+			// HACK: This assumes that on worlds with oceans, all water is fixed at 0 m,
+			// and water covers the whole surface at 0 m.
+			if (vessel.terrainAltitude < 0 && vessel.mainBody.ocean)
+			{
+				trueAltitude = vessel.orbit.altitude;
+			}
+
+			return trueAltitude;
+		}
+
+		public static double Radius(this Vessel vessel)
+		{
+			double radius;
+
+			radius = vessel.altitude;
+
+			if (vessel.mainBody != null)
+			{
+				radius += vessel.mainBody.Radius;
+			}
+
+			return radius;
+		}
+		#endregion
+
+		#region GEOMETRY_UTILS
+		public static double FixAngleDomain(double Angle, bool Degrees = false)
+		{
+			double Extent = 2d * Math.PI;
+			if (Degrees)
+			{
+				Extent = 360d;
+			}
+
+			Angle = Angle % (Extent);
+			if (Angle < 0d)
+			{
+				Angle += Extent;
+			}
+
+			return Angle;
+		}
+
+		public static double FixDegreeDomain(double Angle)
+		{
+			return FixAngleDomain(Angle, true);
+		}
+		#endregion
 
 		public static string ConvertInterval(double seconds)
 		{
@@ -356,6 +303,7 @@
 			a[0] = char.ToUpper(a[0]);
 			return new string(a);
 		}
+
 		//transfer angles
 		public static double Nivvy_CalcTransferPhaseAngle(double r_current, double r_target, double grav_param)
 		{
@@ -498,28 +446,6 @@
 			return (phase + 360) % 360;
 		}
 
-		public static double FixAngleDomain(double Angle, bool Degrees = false)
-		{
-			double Extent = 2d * Math.PI;
-			if (Degrees)
-			{
-				Extent = 360d;
-			}
-
-			Angle = Angle % (Extent);
-			if (Angle < 0d)
-			{
-				Angle += Extent;
-			}
-
-			return Angle;
-		}
-
-		public static double FixDegreeDomain(double Angle)
-		{
-			return FixAngleDomain(Angle, true);
-		}
-
 		public static double adjustCurrPhaseAngle(double transfer_angle, double curr_phase)
 		{
 			if (transfer_angle < 0)
@@ -572,18 +498,195 @@
 
 		}
 
-		public static double TrueAltitude(Vessel vessel)
-		{
-			double trueAltitude = vessel.orbit.altitude - vessel.terrainAltitude;
-
-			// HACK: This assumes that on worlds with oceans, all water is fixed at 0 m,
-			// and water covers the whole surface at 0 m.
-			if (vessel.terrainAltitude < 0 && vessel.mainBody.ocean)
-			{
-				trueAltitude = vessel.orbit.altitude;
-			}
-
-			return trueAltitude;
+		public static void display_transfer_angles_SUN2PLANET(CelestialBody body, Vessel vessel)
+		{
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Phase angle (curr/trans):");
+			GUILayout.Label(
+				Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + Tools.Nivvy_CalcTransferPhaseAngle(
+					vessel.orbit.semiMajorAxis,
+					body.orbit.semiMajorAxis,
+					vessel.mainBody.gravParameter
+				).ToString("F3") + "°",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Transfer velocity:");
+			GUILayout.Label(
+				(Tools.Younata_DeltaVToGetToOtherBody(
+					(vessel.mainBody.gravParameter / 1000000000),
+					(vessel.orbit.semiMajorAxis / 1000),
+					(body.orbit.semiMajorAxis / 1000)
+				) * 1000).ToString("F2") + "m/s",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+		}
+
+		public static void display_transfer_angles_PLANET2PLANET(CelestialBody body, Vessel vessel)
+		{
+			double dv1 = Tools.Younata_DeltaVToGetToOtherBody(
+				(vessel.mainBody.referenceBody.gravParameter / 1000000000),
+				(vessel.mainBody.orbit.semiMajorAxis / 1000),
+				(body.orbit.semiMajorAxis / 1000)
+			);
+			double dv2 = Tools.Younata_DeltaVToExitSOI(
+				(vessel.mainBody.gravParameter / 1000000000),
+				(vessel.orbit.semiMajorAxis / 1000),
+				(vessel.mainBody.sphereOfInfluence / 1000),
+				Math.Abs(dv1)
+			);
+
+			double trans_ejection_angle = Tools.Younata_TransferBurnPoint(
+				(vessel.orbit.semiMajorAxis / 1000),
+				dv2,
+				(Math.PI / 2.0),
+				(vessel.mainBody.gravParameter / 1000000000)
+			);
+			double curr_ejection_angle = Tools.Adammada_CurrentEjectionAngle(
+				FlightGlobals.ActiveVessel.longitude,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
+			);
+
+			double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle(
+				vessel.mainBody.orbit.semiMajorAxis,
+				body.orbit.semiMajorAxis,
+				vessel.mainBody.referenceBody.gravParameter
+			) % 360;
+			double curr_phase_angle = Tools.Adammada_CurrrentPhaseAngle(
+				body.orbit.LAN,
+				body.orbit.orbitPercent,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
+			);
+
+			double adj_phase_angle = Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle);
+			double adj_trans_ejection_angle = Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle);
+			double adj_curr_ejection_angle = Tools.adjust_current_ejection_angle(curr_ejection_angle);
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Phase angle (curr/trans):");
+			GUILayout.Label(
+				adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Ejection angle (curr/trans):");
+			GUILayout.Label(
+				adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Transfer velocity:");
+			GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false));
+			GUILayout.EndHorizontal();
+		}
+
+		public static void display_transfer_angles_PLANET2MOON(CelestialBody body, Vessel vessel)
+		{
+			double dv1 = Tools.Younata_DeltaVToGetToOtherBody(
+				(vessel.mainBody.gravParameter / 1000000000),
+				(vessel.orbit.semiMajorAxis / 1000),
+				(body.orbit.semiMajorAxis / 1000)
+			);
+
+			double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle(
+				vessel.orbit.semiMajorAxis,
+				body.orbit.semiMajorAxis,
+				vessel.mainBody.gravParameter
+			);
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Phase angle (curr/trans):");
+			GUILayout.Label(
+				Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Transfer velocity:");
+			GUILayout.Label((dv1 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false));
+			GUILayout.EndHorizontal();
+		}
+
+		public static void display_transfer_angles_MOON2MOON(CelestialBody body, Vessel vessel)
+		{
+			double dv1 = Tools.Younata_DeltaVToGetToOtherBody(
+				(vessel.mainBody.referenceBody.gravParameter / 1000000000),
+				(vessel.mainBody.orbit.semiMajorAxis / 1000),
+				(body.orbit.semiMajorAxis / 1000)
+			);
+			double dv2 = Tools.Younata_DeltaVToExitSOI(
+				(vessel.mainBody.gravParameter / 1000000000),
+				(vessel.orbit.semiMajorAxis / 1000),
+				(vessel.mainBody.sphereOfInfluence / 1000),
+				Math.Abs(dv1)
+			);
+			double trans_ejection_angle = Tools.Younata_TransferBurnPoint(
+				(vessel.orbit.semiMajorAxis / 1000),
+				dv2,
+				(Math.PI / 2.0),
+				(vessel.mainBody.gravParameter / 1000000000)
+			);
+
+			double curr_phase_angle = Tools.Adammada_CurrrentPhaseAngle(
+				body.orbit.LAN,
+				body.orbit.orbitPercent,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
+			);
+			double curr_ejection_angle = Tools.Adammada_CurrentEjectionAngle(
+				FlightGlobals.ActiveVessel.longitude,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
+				FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
+			);
+
+			double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle(
+				vessel.mainBody.orbit.semiMajorAxis,
+				body.orbit.semiMajorAxis,
+				vessel.mainBody.referenceBody.gravParameter
+			) % 360;
+
+			double adj_phase_angle = Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle);
+			//double adj_ejection_angle = adjustCurrEjectionAngle(trans_phase_angle, curr_ejection_angle);
+
+			//new stuff
+			//
+			double adj_trans_ejection_angle = Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle);
+			double adj_curr_ejection_angle = Tools.adjust_current_ejection_angle(curr_ejection_angle);
+			//
+			//
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Phase angle (curr/trans):");
+			GUILayout.Label(
+				adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Ejection angle (curr/trans):");
+			GUILayout.Label(
+				adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°",
+				GUILayout.ExpandWidth(false)
+			);
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+			GUILayout.Label("Transfer velocity:");
+			GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false));
+			GUILayout.EndHorizontal();
 		}
 
 		public static string get_heading_text(double heading)
@@ -623,402 +726,7 @@
 			else
 				return "";
 		}
-
-		public static void display_transfer_angles_SUN2PLANET(CelestialBody body, Vessel vessel)
-		{
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Phase angle (curr/trans):");
-			GUILayout.Label(
-				Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + Tools.Nivvy_CalcTransferPhaseAngle(
-					vessel.orbit.semiMajorAxis,
-					body.orbit.semiMajorAxis,
-					vessel.mainBody.gravParameter
-				).ToString("F3") + "°",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Transfer velocity:");
-			GUILayout.Label(
-				(Tools.Younata_DeltaVToGetToOtherBody(
-					(vessel.mainBody.gravParameter / 1000000000),
-					(vessel.orbit.semiMajorAxis / 1000),
-					(body.orbit.semiMajorAxis / 1000)
-				) * 1000).ToString("F2") + "m/s",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-		}
-
-		public static void display_transfer_angles_PLANET2PLANET(CelestialBody body, Vessel vessel)
-		{
-			double dv1 = Tools.Younata_DeltaVToGetToOtherBody(
-				             (vessel.mainBody.referenceBody.gravParameter / 1000000000),
-				             (vessel.mainBody.orbit.semiMajorAxis / 1000),
-				             (body.orbit.semiMajorAxis / 1000)
-			             );
-			double dv2 = Tools.Younata_DeltaVToExitSOI(
-				             (vessel.mainBody.gravParameter / 1000000000),
-				             (vessel.orbit.semiMajorAxis / 1000),
-				             (vessel.mainBody.sphereOfInfluence / 1000),
-				             Math.Abs(dv1)
-			             );
-
-			double trans_ejection_angle = Tools.Younata_TransferBurnPoint(
-				                              (vessel.orbit.semiMajorAxis / 1000),
-				                              dv2,
-				                              (Math.PI / 2.0),
-				                              (vessel.mainBody.gravParameter / 1000000000)
-			                              );
-			double curr_ejection_angle = Tools.Adammada_CurrentEjectionAngle(
-				                             FlightGlobals.ActiveVessel.longitude,
-				                             FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle,
-				                             FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
-				                             FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
-			                             );
-
-			double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle(
-				                           vessel.mainBody.orbit.semiMajorAxis,
-				                           body.orbit.semiMajorAxis,
-				                           vessel.mainBody.referenceBody.gravParameter
-			                           ) % 360;
-			double curr_phase_angle = Tools.Adammada_CurrrentPhaseAngle(
-				                          body.orbit.LAN,
-				                          body.orbit.orbitPercent,
-				                          FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
-				                          FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
-			                          );
-
-			double adj_phase_angle = Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle);
-			double adj_trans_ejection_angle = Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle);
-			double adj_curr_ejection_angle = Tools.adjust_current_ejection_angle(curr_ejection_angle);
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Phase angle (curr/trans):");
-			GUILayout.Label(
-				adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Ejection angle (curr/trans):");
-			GUILayout.Label(
-				adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Transfer velocity:");
-			GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false));
-			GUILayout.EndHorizontal();
-		}
-
-		public static void display_transfer_angles_PLANET2MOON(CelestialBody body, Vessel vessel)
-		{
-			double dv1 = Tools.Younata_DeltaVToGetToOtherBody(
-				             (vessel.mainBody.gravParameter / 1000000000),
-				             (vessel.orbit.semiMajorAxis / 1000),
-				             (body.orbit.semiMajorAxis / 1000)
-			             );
-
-			double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle(
-				                           vessel.orbit.semiMajorAxis,
-				                           body.orbit.semiMajorAxis,
-				                           vessel.mainBody.gravParameter
-			                           );
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Phase angle (curr/trans):");
-			GUILayout.Label(
-				Tools.mrenigma03_calcphase(vessel, body).ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Transfer velocity:");
-			GUILayout.Label((dv1 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false));
-			GUILayout.EndHorizontal();
-		}
-
-		public static void display_transfer_angles_MOON2MOON(CelestialBody body, Vessel vessel)
-		{
-			double dv1 = Tools.Younata_DeltaVToGetToOtherBody(
-				             (vessel.mainBody.referenceBody.gravParameter / 1000000000),
-				             (vessel.mainBody.orbit.semiMajorAxis / 1000),
-				             (body.orbit.semiMajorAxis / 1000)
-			             );
-			double dv2 = Tools.Younata_DeltaVToExitSOI(
-				             (vessel.mainBody.gravParameter / 1000000000),
-				             (vessel.orbit.semiMajorAxis / 1000),
-				             (vessel.mainBody.sphereOfInfluence / 1000),
-				             Math.Abs(dv1)
-			             );
-			double trans_ejection_angle = Tools.Younata_TransferBurnPoint(
-				                              (vessel.orbit.semiMajorAxis / 1000),
-				                              dv2,
-				                              (Math.PI / 2.0),
-				                              (vessel.mainBody.gravParameter / 1000000000)
-			                              );
-
-			double curr_phase_angle = Tools.Adammada_CurrrentPhaseAngle(
-				                          body.orbit.LAN,
-				                          body.orbit.orbitPercent,
-				                          FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
-				                          FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
-			                          );
-			double curr_ejection_angle = Tools.Adammada_CurrentEjectionAngle(
-				                             FlightGlobals.ActiveVessel.longitude,
-				                             FlightGlobals.ActiveVessel.orbit.referenceBody.rotationAngle,
-				                             FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.LAN,
-				                             FlightGlobals.ActiveVessel.orbit.referenceBody.orbit.orbitPercent
-			                             );
-
-			double trans_phase_angle = Tools.Nivvy_CalcTransferPhaseAngle(
-				                           vessel.mainBody.orbit.semiMajorAxis,
-				                           body.orbit.semiMajorAxis,
-				                           vessel.mainBody.referenceBody.gravParameter
-			                           ) % 360;
-
-			double adj_phase_angle = Tools.adjustCurrPhaseAngle(trans_phase_angle, curr_phase_angle);
-			//double adj_ejection_angle = adjustCurrEjectionAngle(trans_phase_angle, curr_ejection_angle);
-
-			//new stuff
-			//
-			double adj_trans_ejection_angle = Tools.adjust_transfer_ejection_angle(trans_ejection_angle, trans_phase_angle);
-			double adj_curr_ejection_angle = Tools.adjust_current_ejection_angle(curr_ejection_angle);
-			//
-			//
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Phase angle (curr/trans):");
-			GUILayout.Label(
-				adj_phase_angle.ToString("F3") + "° / " + trans_phase_angle.ToString("F3") + "°",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Ejection angle (curr/trans):");
-			GUILayout.Label(
-				adj_curr_ejection_angle.ToString("F3") + "° / " + adj_trans_ejection_angle.ToString("F3") + "°",
-				GUILayout.ExpandWidth(false)
-			);
-			GUILayout.EndHorizontal();
-
-			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
-			GUILayout.Label("Transfer velocity:");
-			GUILayout.Label((dv2 * 1000).ToString("F2") + "m/s", GUILayout.ExpandWidth(false));
-			GUILayout.EndHorizontal();
-		}
-		// This implementation is adapted from FARGUIUtils.ClampToScreen
-		public static Rect ClampRectToScreen(Rect window, int xMargin, int yMargin)
-		{
-			window.x = Mathf.Clamp(window.x, xMargin - window.width, Screen.width - xMargin);
-			window.y = Mathf.Clamp(window.y, yMargin - window.height, Screen.height - yMargin);
-
-			return window;
-		}
-
-		public static Rect ClampRectToScreen(Rect window, int Margin)
-		{
-			return ClampRectToScreen(window, Margin, Margin);
-		}
-
-		public static Rect ClampRectToScreen(Rect window)
-		{
-			return ClampRectToScreen(window, 30);
-		}
-
-		public static Vector2 ClampV2ToScreen(Vector2 vec, uint xMargin, uint yMargin)
-		{
-			vec.x = Mathf.Clamp(vec.x, xMargin, Screen.width - xMargin);
-			vec.y = Mathf.Clamp(vec.y, yMargin, Screen.height - yMargin);
-
-			return vec;
-		}
-
-		public static Vector2 ClampV2ToScreen(Vector2 vec, uint Margin)
-		{
-			return ClampV2ToScreen(vec, Margin, Margin);
-		}
-
-		public static Vector2 ClampV2ToScreen(Vector2 vec)
-		{
-			return ClampV2ToScreen(vec, 15);
-		}
-		// UNDONE: This seems messy.  Can we clean it up?
-		public static Rect DockToWindow(Rect icon, Rect window)
-		{
-			// We can't set the x and y of the center point directly, so build a new vector.
-			Vector2 center = new Vector2();
-
-			// If we are near the top or bottom of the screen...
-			if (window.yMax > Screen.height - icon.height ||
-			    window.yMin < icon.height)
-			{
-				// If we are in a corner...
-				if (window.xMax > Screen.width - icon.width ||
-				    window.xMin < icon.width)
-				{
-					// If it is a top corner, put the icon below the window.
-					if (window.yMax < Screen.height / 2)
-					{
-						center.y = window.yMax + icon.height / 2;
-					}
-					// If it is a bottom corner, put the icon above the window.
-					else
-					{
-						center.y = window.yMin - icon.height / 2;
-					}
-				}
-				// If we are not in a corner...
-				else
-				{
-					// If we are along the top edge, align the icon's top edge with the top edge of the window
-					if (window.yMax > Screen.height / 2)
-					{
-						center.y = window.yMax - icon.height / 2;
-					}
-					// If we are along the bottom edge, align the icon's bottom edge with the bottom edge of the window
-					else
-					{
-						center.y = window.yMin + icon.height / 2;
-					}
-				}
-
-				// At the top or bottom, if we are towards the right, put the icon to the right of the window
-				if (window.center.x < Screen.width / 2)
-				{
-					center.x = window.xMin - icon.width / 2;
-				}
-				// At the top or bottom, if we are towards the left, put the icon to the left of the window
-				else
-				{
-					center.x = window.xMax + icon.width / 2;
-				}
-
-			}
-			// If we are not along the top or bottom of the screen...
-			else
-			{
-				// By default, center the icon above the window
-				center.y = window.yMin - icon.height / 2;
-				center.x = window.center.x;
-
-				// If we are along a side...
-				if (window.xMax > Screen.width - icon.width ||
-				    window.xMin < icon.width)
-				{
-					// UNDONE: I'm not sure I like the feel of this part.
-					// If we are along a side towards the bottom, put the icon below the window
-					if (window.center.y > Screen.height / 2)
-					{
-						center.y = window.yMax + icon.height / 2;
-					}
-
-					// Along the left side, align the left edge of the icon with the left edge of the window.
-					if (window.xMax > Screen.width - icon.width)
-					{
-						center.x = window.xMax - icon.width / 2;
-					}
-					// Along the right side, align the right edge of the icon with the right edge of the window.
-					else if (window.xMin < icon.width)
-					{
-						center.x = window.xMin + icon.width / 2;
-					}
-				}
-			}
-
-			// Assign the vector to the center of the rect.
-			icon.center = center;
-
-			// Return the icon's position.
-			return icon;
-		}
-
-		public static ExperimentSituations GetExperimentSituation(this Vessel vessel)
-		{
-			Vessel.Situations situation = vessel.situation;
-
-			switch (situation)
-			{
-				case Vessel.Situations.PRELAUNCH:
-				case Vessel.Situations.LANDED:
-					return ExperimentSituations.SrfLanded;
-				case Vessel.Situations.SPLASHED:
-					return ExperimentSituations.SrfSplashed;
-				case Vessel.Situations.FLYING:
-					if (vessel.altitude < (double)vessel.mainBody.scienceValues.flyingAltitudeThreshold)
-					{
-						return ExperimentSituations.FlyingLow;
-					}
-					else
-					{
-						return ExperimentSituations.FlyingHigh;
-					}
-			}
-
-			if (vessel.altitude < (double)vessel.mainBody.scienceValues.spaceAltitudeThreshold)
-			{
-				return ExperimentSituations.InSpaceLow;
-			}
-			else
-			{
-				return ExperimentSituations.InSpaceHigh;
-			}
-		}
-
-		public static double Radius(this Vessel vessel)
-		{
-			double radius;
-
-			radius = vessel.altitude;
-
-			if (vessel.mainBody != null)
-			{
-				radius += vessel.mainBody.Radius;
-			}
-
-			return radius;
-		}
-
-		public static string HumanString(this ExperimentSituations situation)
-		{
-			switch (situation)
-			{
-				case ExperimentSituations.FlyingHigh:
-					return "Upper Atmosphere";
-				case ExperimentSituations.FlyingLow:
-					return "Flying";
-				case ExperimentSituations.SrfLanded:
-					return "Surface";
-				case ExperimentSituations.InSpaceLow:
-					return "Near in Space";
-				case ExperimentSituations.InSpaceHigh:
-					return "High in Space";
-				case ExperimentSituations.SrfSplashed:
-					return "Splashed Down";
-				default:
-					return "Unknown";
-			}
-		}
-
-		private static ScreenMessage debugmsg = new ScreenMessage("", 2f, ScreenMessageStyle.UPPER_RIGHT);
-
-		[System.Diagnostics.Conditional("DEBUG")]
-		public static void PostDebugMessage(string Msg)
-		{
-			if (HighLogic.LoadedScene > GameScenes.SPACECENTER)
-			{
-				debugmsg.message = Msg;
-				ScreenMessages.PostScreenMessage(debugmsg, true);
-			}
-
-			KSPLog.print(Msg);
-		}
 	}
 }
+
+