Mercurial > repos > IBDev-IBBoard.WarFoundry.API
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; + } } }