RelayExtensions: Added Vessel.HasConnectedRelay.
[AntennaRange.git] / RelayExtensions.cs
blob:a/RelayExtensions.cs -> blob:b/RelayExtensions.cs
--- a/RelayExtensions.cs
+++ b/RelayExtensions.cs
@@ -55,7 +55,7 @@
 		/// <param name="body">A <see cref="CelestialBody"/></param>
 		public static double DistanceTo(this AntennaRelay relay, CelestialBody body)
 		{
-			return relay.vessel.DistanceTo(body);
+			return relay.vessel.DistanceTo(body) - body.Radius;
 		}
 
 		/// <summary>
@@ -68,13 +68,28 @@
 			return relayOne.DistanceTo(relayTwo.vessel);
 		}
 
+		public static double sqrDistanceTo(this AntennaRelay relay, Vessel vessel)
+		{
+			return relay.vessel.sqrDistanceTo(vessel);
+		}
+
+		public static double sqrDistanceTo(this AntennaRelay relay, CelestialBody body)
+		{
+			return relay.vessel.sqrDistanceTo(body);
+		}
+
+		public static double sqrDistanceTo(this AntennaRelay relayOne, IAntennaRelay relayTwo)
+		{
+			return relayOne.vessel.sqrDistanceTo(relayTwo.vessel);
+		}
+
 		/// <summary>
 		/// Returns all of the PartModules or ProtoPartModuleSnapshots implementing IAntennaRelay in this Vessel.
 		/// </summary>
 		/// <param name="vessel">This <see cref="Vessel"/></param>
 		public static IEnumerable<IAntennaRelay> GetAntennaRelays (this Vessel vessel)
 		{
-			return RelayDatabase.Instance[vessel].Values.ToList();
+			return RelayDatabase.Instance[vessel].Values.ToList().AsReadOnly();
 		}
 
 		/// <summary>
@@ -94,6 +109,59 @@
 
 			return false;
 		}
+
+		public static ConnectionStatus GetConnectionStatus(this Vessel vessel)
+		{
+			bool canTransmit = false;
+
+			foreach (IAntennaRelay relay in RelayDatabase.Instance[vessel].Values)
+			{
+				if (relay.CanTransmit())
+				{
+					canTransmit = true;
+					if (relay.transmitDistance <= relay.nominalTransmitDistance)
+					{
+						return ConnectionStatus.Optimal;
+					}
+				}
+			}
+
+			if (canTransmit)
+			{
+				return ConnectionStatus.Suboptimal;
+			}
+			else
+			{
+				return ConnectionStatus.None;
+			}
+		}
+
+		public static IAntennaRelay GetBestRelay(this Vessel vessel)
+		{
+			IAntennaRelay bestRelay = null;
+			double bestScore = double.PositiveInfinity;
+			double relayScore = double.NaN;
+
+			foreach (IAntennaRelay relay in vessel.GetAntennaRelays())
+			{
+				relayScore = relay.transmitDistance / relay.maxTransmitDistance;
+
+				if (relayScore < bestScore)
+				{
+					bestScore = relayScore;
+					bestRelay = relay;
+				}
+			}
+
+			return bestRelay;
+		}
+	}
+
+	public enum ConnectionStatus
+	{
+		None,
+		Suboptimal,
+		Optimal
 	}
 }