diff API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs @ 357:50d0d3b39a0b

Re #140: Add equality methods * Add equality method for RequiresAtLeastNUnitsRequirement * Update equality method on GameSystem and No More Than limit to use new helper class * Add equality methods on Race and UnitType as a dependent of equality of requirements
author IBBoard <dev@ibboard.co.uk>
date Tue, 26 Apr 2011 19:19:08 +0000
parents 6c0404277cad
children dbe7ccb1e557
line wrap: on
line diff
--- a/API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs	Mon Apr 25 15:11:20 2011 +0000
+++ b/API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs	Tue Apr 26 19:19:08 2011 +0000
@@ -1,174 +1,198 @@
-// This file (UnitRequiresAtLeastNUnitsRequirement.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard
+// This file (UnitRequiresAtLeastNUnitsRequirement.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 IBBoard
 // 
 // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
-using System;
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using IBBoard.WarFoundry.API.Objects;
 
 namespace IBBoard.WarFoundry.API.Objects.Requirement
-{
-	/// <summary>
-	/// A requirement where a WarFoundryObject requires at least N units of one or more unit types before any number of that object can be taken in an army.
+{
+	/// <summary>
+	/// A requirement where a WarFoundryObject requires at least N units of one or more unit types before any number of that object can be taken in an army.
 	/// </summary>
 	public class RequiresAtLeastNUnitsRequirement : IRequirement
-	{
-		private List<UnitCountRequirementData> requiredTypes;
+	{
+		private List<UnitCountRequirementData> requiredTypes;
 
 		public RequiresAtLeastNUnitsRequirement(params UnitType[] requiredUnitTypes)
-		{
-			requiredTypes = new List<UnitCountRequirementData>();
-
-			foreach (UnitType unitType in requiredUnitTypes)
-			{
-				AddUnitTypeRequirement(unitType);
+		{
+			requiredTypes = new List<UnitCountRequirementData>();
+
+			foreach (UnitType unitType in requiredUnitTypes)
+			{
+				AddUnitTypeRequirement(unitType);
+			}
+		}
+
+		public override bool Equals (object obj)
+		{
+			if (obj == null)
+			{
+				return false;
+			}
+			else if (obj.GetType().Equals(this.GetType()))
+			{
+				RequiresAtLeastNUnitsRequirement otherReq = (RequiresAtLeastNUnitsRequirement)obj;
+				if (!Collections.Collections.AreEqual(requiredTypes, otherReq.requiredTypes))
+				{
+					return false;
+				}
+				else
+				{
+					return true;
+				}
+			}
+			else
+			{
+				return false;
+			}
+		}
+
+		/// <summary>
+		/// Checks whether the supplied WarFoundryObject can be added to the supplied army.
+		/// </summary>
+		/// <returns>
+		/// A <code>Validation</code> enum to show the result of the validation
+		/// </returns>
+		/// <param name='wfObject'>
+		/// The object that we want to add. This may be involved in the check, or it may not affect the evaluation of the requirement
+		/// </param>
+		/// <param name='toArmy'>
+		/// The army to add the object to.
+		/// </param>
+		public virtual Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy)
+		{
+			return IsApplicable(wfObject, toArmy) ? CheckAllowsAdding(wfObject, toArmy) : Validation.NotApplicable;
+		}
+
+		private bool IsApplicable(WarFoundryObject toObjectAdded, Army toArmy)
+		{
+			return IsApplicable(toArmy) || IsApplicable(toObjectAdded);
+		}
+
+		protected virtual bool IsApplicable(Army toArmy)
+		{
+			return false;
+		}
+
+		protected virtual bool IsApplicable(WarFoundryObject toObject)
+		{
+			bool isApplicable = false;
+			UnitType unitType = GetUnitTypeFromObject(toObject);
+
+			if (unitType != null)
+			{
+				isApplicable = IsApplicable(unitType);
+			}
+
+			return isApplicable;
+		}
+
+		protected UnitType GetUnitTypeFromObject (WarFoundryObject toObject)
+		{
+			UnitType unitType = null;
+
+			if (toObject is UnitType)
+			{
+				unitType = (UnitType)toObject;
+			}
+			else if (toObject is Unit)
+			{
+				unitType = ((Unit)toObject).UnitType;
 			}
-		}
-
-		/// <summary>
-		/// Checks whether the supplied WarFoundryObject can be added to the supplied army.
-		/// </summary>
-		/// <returns>
-		/// A <code>Validation</code> enum to show the result of the validation
-		/// </returns>
-		/// <param name='wfObject'>
-		/// The object that we want to add. This may be involved in the check, or it may not affect the evaluation of the requirement
-		/// </param>
-		/// <param name='toArmy'>
-		/// The army to add the object to.
-		/// </param>
-		public virtual Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy)
-		{
-			return IsApplicable(wfObject, toArmy) ? CheckAllowsAdding(wfObject, toArmy) : Validation.NotApplicable;
-		}
-
-		private bool IsApplicable(WarFoundryObject toObjectAdded, Army toArmy)
-		{
-			return IsApplicable(toArmy) || IsApplicable(toObjectAdded);
-		}
-
-		protected virtual bool IsApplicable(Army toArmy)
-		{
-			return false;
-		}
-
-		protected virtual bool IsApplicable(WarFoundryObject toObject)
-		{
-			bool isApplicable = false;
-			UnitType unitType = GetUnitTypeFromObject(toObject);
-
-			if (unitType != null)
-			{
-				isApplicable = IsApplicable(unitType);
-			}
-
-			return isApplicable;
-		}
-
-		protected UnitType GetUnitTypeFromObject (WarFoundryObject toObject)
-		{
-			UnitType unitType = null;
-
-			if (toObject is UnitType)
-			{
-				unitType = (UnitType)toObject;
-			}
-			else if (toObject is Unit)
-			{
-				unitType = ((Unit)toObject).UnitType;
-			}
-
-			return unitType;
-		}
-
-		private bool IsApplicable (UnitType unitType)
-		{
-			bool isApplicable = false;
-			foreach (UnitCountRequirementData requirement in requiredTypes)
-			{
-				if (requirement.UnitType.Equals(unitType))
-				{
-					isApplicable = true;
-					break;
-				}
-			}
-			return isApplicable;
-		}
-
-		private Validation CheckAllowsAdding(WarFoundryObject wfObject, Army toArmy)
-		{
-			Validation isValid = Validation.Passed;
-			
-			foreach (UnitCountRequirementData requirement in requiredTypes)
-			{
-				if (GetUnitTypeCount(toArmy, requirement.UnitType, wfObject) < requirement.Count)
-				{
-					isValid = Validation.Failed;
-					break;
-				}
-			}
-			
-			return isValid;
-		}
-
-		private int GetUnitTypeCount(Army toArmy, UnitType unitType, WarFoundryObject wfObject)
-		{
-			return toArmy.GetUnitTypeCount(unitType) + GetCountFromObject(wfObject, unitType);
-		}
-
-		private int GetCountFromObject(WarFoundryObject wfObject, UnitType limitedType)
-		{
-			return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0;
-		}
-
-		/// <summary>
-		/// Adds a requirement for there to be at least minCount of a given UnitType
-		/// </summary>
-		/// <param name='unitType'>
-		/// The unit type to require.
-		/// </param>
-		/// <param name='minCount'>
-		/// The minimum number of that type that must exist.
-		/// </param>
-		public void AddUnitTypeRequirement(UnitType unitType, int minCount)
-		{
-			requiredTypes.Add(new UnitCountRequirementData(unitType, minCount));
+
+			return unitType;
+		}
+
+		private bool IsApplicable (UnitType unitType)
+		{
+			bool isApplicable = false;
+			foreach (UnitCountRequirementData requirement in requiredTypes)
+			{
+				if (requirement.UnitType.Equals(unitType))
+				{
+					isApplicable = true;
+					break;
+				}
+			}
+			return isApplicable;
+		}
+
+		private Validation CheckAllowsAdding(WarFoundryObject wfObject, Army toArmy)
+		{
+			Validation isValid = Validation.Passed;
+			
+			foreach (UnitCountRequirementData requirement in requiredTypes)
+			{
+				if (GetUnitTypeCount(toArmy, requirement.UnitType, wfObject) < requirement.Count)
+				{
+					isValid = Validation.Failed;
+					break;
+				}
+			}
+			
+			return isValid;
+		}
+
+		private int GetUnitTypeCount(Army toArmy, UnitType unitType, WarFoundryObject wfObject)
+		{
+			return toArmy.GetUnitTypeCount(unitType) + GetCountFromObject(wfObject, unitType);
+		}
+
+		private int GetCountFromObject(WarFoundryObject wfObject, UnitType limitedType)
+		{
+			return (limitedType.Equals(wfObject) || (wfObject is Unit && ((Unit)wfObject).UnitType.Equals(limitedType))) ? 1 : 0;
 		}
-
-		/// <summary>
-		/// Adds a requirement for there to be one or more of a given UnitType
-		/// </summary>
-		/// <param name='unitType'>
-		/// The unit type to require.
-		/// </param>
-		public void AddUnitTypeRequirement (UnitType unitType)
-		{
-			AddUnitTypeRequirement(unitType, 1);
-		}
-
-		/// <summary>
-		/// Checks whether the supplied army is currently valid according to this requirement.
-		/// </summary>
-		/// <returns>
-		/// A <code>Validation</code> enum to show the result of the validation
-		/// </returns>
-		/// <param name='toValidate'>
-		/// The army to validate
-		/// </param>
-		public virtual Validation ValidatesArmy(Army toValidate)
-		{
-			Validation isValid = Validation.Passed;
-
-			foreach (UnitCountRequirementData requirement in requiredTypes)
-			{
-				if (toValidate.GetUnitTypeCount(requirement.UnitType) < requirement.Count)
-				{
-					isValid = Validation.Failed;
-					break;
-				}
-			}
-
-			return isValid;
-		}
+
+		/// <summary>
+		/// Adds a requirement for there to be at least minCount of a given UnitType
+		/// </summary>
+		/// <param name='unitType'>
+		/// The unit type to require.
+		/// </param>
+		/// <param name='minCount'>
+		/// The minimum number of that type that must exist.
+		/// </param>
+		public void AddUnitTypeRequirement(UnitType unitType, int minCount)
+		{
+			requiredTypes.Add(new UnitCountRequirementData(unitType, minCount));
+		}
+
+		/// <summary>
+		/// Adds a requirement for there to be one or more of a given UnitType
+		/// </summary>
+		/// <param name='unitType'>
+		/// The unit type to require.
+		/// </param>
+		public void AddUnitTypeRequirement (UnitType unitType)
+		{
+			AddUnitTypeRequirement(unitType, 1);
+		}
+
+		/// <summary>
+		/// Checks whether the supplied army is currently valid according to this requirement.
+		/// </summary>
+		/// <returns>
+		/// A <code>Validation</code> enum to show the result of the validation
+		/// </returns>
+		/// <param name='toValidate'>
+		/// The army to validate
+		/// </param>
+		public virtual Validation ValidatesArmy(Army toValidate)
+		{
+			Validation isValid = Validation.Passed;
+
+			foreach (UnitCountRequirementData requirement in requiredTypes)
+			{
+				if (toValidate.GetUnitTypeCount(requirement.UnitType) < requirement.Count)
+				{
+					isValid = Validation.Failed;
+					break;
+				}
+			}
+
+			return isValid;
+		}
 	}
 }