diff API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs @ 455:afc6410e4efc

Re #379: Fix validation of requirements to check for unit * Move to "Unit" requirements, since we assume things depend on units * Rename some classes to more meaningful names from unit-based change * Rename "requires N for M" requirement as we can make it more flexible
author IBBoard <dev@ibboard.co.uk>
date Wed, 22 Feb 2012 20:45:39 +0000
parents dace3b7779ca
children 52baffdd2ab9
line wrap: on
line diff
--- a/API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs	Tue Jan 31 20:58:09 2012 +0000
+++ b/API/Objects/Requirement/RequiresAtLeastNUnitsRequirement.cs	Wed Feb 22 20:45:39 2012 +0000
@@ -13,19 +13,13 @@
 	///
 	/// The definition for how this requirement is built from a data file is defined in the <see cref="UnitRequiresAtLeastNUnitsRequirementFactory"/> class.
 	/// </summary>
-	public class RequiresAtLeastNUnitsRequirement : AbstractRequirement
+	public class RequiresAtLeastNUnitsRequirement<OBJECT_TYPE> : AbstractUnitRequirement<OBJECT_TYPE> where OBJECT_TYPE : IWarFoundryObject
 	{
 		public static readonly string REQUIREMENT_ID = "RequiresAtLeastNUnits";
-		private List<UnitCountRequirementData> requiredTypes;
 
-		public RequiresAtLeastNUnitsRequirement(params UnitType[] requiredUnitTypes)
+		public RequiresAtLeastNUnitsRequirement(OBJECT_TYPE requirementOn, params UnitType[] requiredUnitTypes) : base(requirementOn, requiredUnitTypes)
 		{
-			requiredTypes = new List<UnitCountRequirementData>();
-
-			foreach (UnitType unitType in requiredUnitTypes)
-			{
-				AddUnitTypeRequirement(unitType);
-			}
+			//Do nothing
 		}
 
 		public override string RequirementID
@@ -38,8 +32,8 @@
 
 		protected override bool TypeEquals(object obj)
 		{
-			RequiresAtLeastNUnitsRequirement otherReq = (RequiresAtLeastNUnitsRequirement)obj;
-			if (!Collections.Collections.AreEqual(requiredTypes, otherReq.requiredTypes))
+			RequiresAtLeastNUnitsRequirement<OBJECT_TYPE> otherReq = (RequiresAtLeastNUnitsRequirement<OBJECT_TYPE>)obj;
+			if (!Collections.Collections.AreEqual(RequiredTypes, otherReq.RequiredTypes))
 			{
 				return false;
 			}
@@ -53,7 +47,7 @@
 		{
 			int hash = 0;
 
-			foreach (UnitCountRequirementData req in requiredTypes)
+			foreach (UnitCountRequirementData req in RequiredTypes)
 			{
 				hash += req.UnitType.GetHashCode();
 			}
@@ -73,7 +67,7 @@
 		/// <param name='toArmy'>
 		/// The army to add the object to.
 		/// </param>
-		public override Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy)
+		public override Validation AllowsAdding(IWarFoundryObject wfObject, Army toArmy)
 		{
 			return IsApplicable(wfObject, toArmy) ? CheckAllowsAdding(wfObject, toArmy) : Validation.NotApplicable;
 		}
@@ -83,7 +77,7 @@
 			return false;
 		}
 
-		protected override bool IsApplicable(WarFoundryObject toObject)
+		protected override bool IsApplicable(IWarFoundryObject toObject)
 		{
 			bool isApplicable = false;
 			UnitType unitType = GetUnitTypeFromObject(toObject);
@@ -96,26 +90,10 @@
 			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)
+			foreach (UnitCountRequirementData requirement in RequiredTypes)
 			{
 				if (requirement.UnitType.Equals(unitType))
 				{
@@ -126,11 +104,11 @@
 			return isApplicable;
 		}
 
-		private Validation CheckAllowsAdding(WarFoundryObject wfObject, Army toArmy)
+		private Validation CheckAllowsAdding(IWarFoundryObject wfObject, Army toArmy)
 		{
 			Validation isValid = Validation.Passed;
 			
-			foreach (UnitCountRequirementData requirement in requiredTypes)
+			foreach (UnitCountRequirementData requirement in RequiredTypes)
 			{
 				if (GetUnitTypeCount(toArmy, requirement.UnitType, wfObject) < requirement.Count)
 				{
@@ -142,16 +120,6 @@
 			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>
@@ -163,7 +131,7 @@
 		/// </param>
 		public void AddUnitTypeRequirement(UnitType unitType, int minCount)
 		{
-			requiredTypes.Add(new UnitCountRequirementData(unitType, minCount));
+			RequiredTypes.Add(new UnitCountRequirementData(unitType, minCount));
 		}
 
 		/// <summary>
@@ -172,7 +140,7 @@
 		/// <param name='unitType'>
 		/// The unit type to require.
 		/// </param>
-		public void AddUnitTypeRequirement(UnitType unitType)
+		public override void AddUnitTypeRequirement(UnitType unitType)
 		{
 			AddUnitTypeRequirement(unitType, 1);
 		}
@@ -190,7 +158,7 @@
 		{
 			Validation isValid = Validation.Passed;
 
-			foreach (UnitCountRequirementData requirement in requiredTypes)
+			foreach (UnitCountRequirementData requirement in RequiredTypes)
 			{
 				if (toValidate.GetUnitTypeCount(requirement.UnitType) < requirement.Count)
 				{
@@ -211,7 +179,7 @@
 		{
 			List<string> failures = new List<string>();
 
-			foreach (UnitCountRequirementData requirement in requiredTypes)
+			foreach (UnitCountRequirementData requirement in RequiredTypes)
 			{
 				int unitCount = army.GetUnitTypeCount(requirement.UnitType);
 
@@ -224,18 +192,18 @@
 			return failures;
 		}
 
-		protected override string GetFailedAddingRequirementsString(UnitType toAdd, Army toArmy)
+		protected override string GetFailedAddingRequirementsString(IWarFoundryObject toAdd, Army toArmy)
 		{
 			return String.Join("; ", GetFailedAddingRequirements(toAdd, toArmy).ToArray());
 		}
 
-		private List<string> GetFailedAddingRequirements(UnitType unitType, Army army)
+		private List<string> GetFailedAddingRequirements(IWarFoundryObject toAdd, Army army)
 		{
 			List<string> failures = new List<string>();
 
-			foreach (UnitCountRequirementData requirement in requiredTypes)
+			foreach (UnitCountRequirementData requirement in RequiredTypes)
 			{
-				int unitCount = GetUnitTypeCount(army, requirement.UnitType, unitType);
+				int unitCount = GetUnitTypeCount(army, requirement.UnitType, toAdd);
 
 				if (unitCount < requirement.Count)
 				{
@@ -245,6 +213,11 @@
 
 			return failures;
 		}
+
+		protected override int GetObjectCountFromArmy(Army toArmy)
+		{
+			return 0;
+		}
 	}
 }