# HG changeset patch # User IBBoard # Date 1303744280 0 # Node ID 51cccccf36698a2c3fd5362330d46fa4ba18c018 # Parent 47712a323cf20ab9d5728acabc79ba125eae75e9 Re #27: Unit requirements * Initial work to try to make unit types return requirements for count limits * Add requirements when limits aren't defaults * Start adding equality/hash code methods diff -r 47712a323cf2 -r 51cccccf3669 API/Objects/Requirement/RequiresNoMoreThanNOfUnitTypeRequirement.cs --- a/API/Objects/Requirement/RequiresNoMoreThanNOfUnitTypeRequirement.cs Mon Apr 25 10:32:51 2011 +0000 +++ b/API/Objects/Requirement/RequiresNoMoreThanNOfUnitTypeRequirement.cs Mon Apr 25 15:11:20 2011 +0000 @@ -1,116 +1,154 @@ -// This file (RequiresNoMoreThanNOfUnitTypeRequirement.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 IBBoard.WarFoundry.API.Objects; -using System.Collections.Generic; - -namespace IBBoard.WarFoundry.API.Objects.Requirement -{ - /// - /// A requirement where a WarFoundryObject cannot be taken in an army if more than N of a UnitType will be in the army. - /// - public class RequiresNoMoreThanNOfUnitTypeRequirement : IRequirement - { - private List limitedTypes; - - public RequiresNoMoreThanNOfUnitTypeRequirement(params UnitType[] limitedUnitTypes) - { - limitedTypes = new List(); - - foreach (UnitType unitType in limitedUnitTypes) - { - AddUnitTypeRequirement(unitType); - } - } +// This file (RequiresNoMoreThanNOfUnitTypeRequirement.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 IBBoard.WarFoundry.API.Objects; +using System.Collections.Generic; + +namespace IBBoard.WarFoundry.API.Objects.Requirement +{ + /// + /// A requirement where a WarFoundryObject cannot be taken in an army if more than N of a UnitType will be in the army. + /// + public class RequiresNoMoreThanNOfUnitTypeRequirement : IRequirement + { + private List limitedTypes; + + public RequiresNoMoreThanNOfUnitTypeRequirement(params UnitType[] limitedUnitTypes) + { + limitedTypes = new List(); + + foreach (UnitType unitType in limitedUnitTypes) + { + AddUnitTypeRequirement(unitType); + } + } + + /// + /// Checks whether the supplied WarFoundryObject can be added to the supplied army. + /// + /// + /// A Validation enum to show the result of the validation + /// + /// + /// The object that we want to add. This may be involved in the check, or it may not affect the evaluation of the requirement + /// + /// + /// The army to add the object to. + /// + public virtual Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy) + { + Validation canAdd = Validation.Passed; + + foreach (UnitCountRequirementData limit in limitedTypes) + { + if (GetUnitTypeCount(toArmy, limit.UnitType, wfObject) > limit.Count) + { + canAdd = Validation.Failed; + break; + } + } + + return canAdd; + } + + 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; + } + + /// + /// Adds a requirement for there to be no more than maxCount of a given UnitType + /// + /// + /// The unit type to limit. + /// + /// + /// The maximum number of that type that must exist. + /// + public void AddUnitTypeRequirement(UnitType unitType, int maxCount) + { + limitedTypes.Add(new UnitCountRequirementData(unitType, maxCount)); + } + + /// + /// Adds a requirement for there to be none of a given UnitType + /// + /// + /// The unit type to limit. + /// + public void AddUnitTypeRequirement(UnitType unitType) + { + AddUnitTypeRequirement(unitType, 0); + } + + /// + /// Checks whether the supplied army is currently valid according to this requirement. + /// + /// + /// A Validation enum to show the result of the validation + /// + /// + /// The army to validate + /// + public Validation ValidatesArmy(Army army) + { + Validation canAdd = Validation.Passed; + + foreach (UnitCountRequirementData limit in limitedTypes) + { + if (army.GetUnitTypeCount(limit.UnitType) > limit.Count) + { + canAdd = Validation.Failed; + break; + } + } + + return canAdd; + } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + else if (!(obj is RequiresNoMoreThanNOfUnitTypeRequirement)) + { + return false; + } + else + { + RequiresNoMoreThanNOfUnitTypeRequirement other = (RequiresNoMoreThanNOfUnitTypeRequirement)obj; - /// - /// Checks whether the supplied WarFoundryObject can be added to the supplied army. - /// - /// - /// A Validation enum to show the result of the validation - /// - /// - /// The object that we want to add. This may be involved in the check, or it may not affect the evaluation of the requirement - /// - /// - /// The army to add the object to. - /// - public virtual Validation AllowsAdding(WarFoundryObject wfObject, Army toArmy) - { - Validation canAdd = Validation.Passed; - - foreach (UnitCountRequirementData limit in limitedTypes) - { - if (GetUnitTypeCount(toArmy, limit.UnitType, wfObject) > limit.Count) + if (limitedTypes.Count != other.limitedTypes.Count) + { + return false; + } + else { - canAdd = Validation.Failed; - break; - } - } - - return canAdd; + foreach (UnitCountRequirementData req in limitedTypes) + { + if (!other.limitedTypes.Contains(req)) + { + + } + } + + return true; + } + } } - 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; - } - - /// - /// Adds a requirement for there to be no more than maxCount of a given UnitType - /// - /// - /// The unit type to limit. - /// - /// - /// The maximum number of that type that must exist. - /// - public void AddUnitTypeRequirement(UnitType unitType, int maxCount) + public override int GetHashCode() { - limitedTypes.Add(new UnitCountRequirementData(unitType, maxCount)); - } - - /// - /// Adds a requirement for there to be none of a given UnitType - /// - /// - /// The unit type to limit. - /// - public void AddUnitTypeRequirement(UnitType unitType) - { - AddUnitTypeRequirement(unitType, 0); - } - - /// - /// Checks whether the supplied army is currently valid according to this requirement. - /// - /// - /// A Validation enum to show the result of the validation - /// - /// - /// The army to validate - /// - public Validation ValidatesArmy(Army army) - { - Validation canAdd = Validation.Passed; - - foreach (UnitCountRequirementData limit in limitedTypes) - { - if (army.GetUnitTypeCount(limit.UnitType) > limit.Count) - { - canAdd = Validation.Failed; - break; - } - } - - return canAdd; - } - } -} - + return base.GetHashCode (); + } + } +} + diff -r 47712a323cf2 -r 51cccccf3669 API/Objects/Requirement/UnitCountRequirementData.cs --- a/API/Objects/Requirement/UnitCountRequirementData.cs Mon Apr 25 10:32:51 2011 +0000 +++ b/API/Objects/Requirement/UnitCountRequirementData.cs Mon Apr 25 15:11:20 2011 +0000 @@ -1,31 +1,53 @@ -// This file (UnitCountRequirementData.cs) is a part of the IBBoard.WarFoundry.API.Tests 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 IBBoard.WarFoundry.API.Objects; - -namespace IBBoard.WarFoundry.API.Objects.Requirement -{ - public class UnitCountRequirementData - { - private UnitType unitType; - private int count; - - public UnitCountRequirementData(UnitType unitType, int count) - { - this.unitType = unitType; - this.count = count; +// This file (UnitCountRequirementData.cs) is a part of the IBBoard.WarFoundry.API.Tests 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 IBBoard.WarFoundry.API.Objects; + +namespace IBBoard.WarFoundry.API.Objects.Requirement +{ + public class UnitCountRequirementData + { + private UnitType unitType; + private int count; + + public UnitCountRequirementData(UnitType unitType, int count) + { + this.unitType = unitType; + this.count = count; + } + + public UnitType UnitType + { + get { return unitType; } + } + + public int Count + { + get { return count; } + } + + public override bool Equals (object obj) + { + if (obj == null) + { + return false; + } + else if (!(obj is UnitCountRequirementData)) + { + return false; + } + else + { + UnitCountRequirementData other = (UnitCountRequirementData)obj; + return UnitType.Equals(other.UnitType) && Count == other.Count; + } } - public UnitType UnitType + public override int GetHashCode() { - get { return unitType; } + return UnitType.GetHashCode() + Count; } - - public int Count - { - get { return count; } - } - } -} - + } +} + diff -r 47712a323cf2 -r 51cccccf3669 API/Objects/UnitType.cs --- a/API/Objects/UnitType.cs Mon Apr 25 10:32:51 2011 +0000 +++ b/API/Objects/UnitType.cs Mon Apr 25 15:11:20 2011 +0000 @@ -19,7 +19,9 @@ { private Category mainCat; private Race race; - private int min, max, baseSize = 0; + private int min = 0; + private int max = WarFoundryCore.INFINITY; + private int baseSize = 0; private int minSize, maxSize; private double baseUnitCost; private double costPerTrooper; @@ -465,7 +467,23 @@ public IRequirement[] GetRequirements() { - return requirements.ToArray(); + List reqs = new List(requirements); + + if (MinNumber != 0) + { + RequiresAtLeastNUnitsRequirement req = new RequiresAtLeastNUnitsRequirement(); + req.AddUnitTypeRequirement(this, MinNumber); + reqs.Add(req); + } + + if (MaxNumber != WarFoundryCore.INFINITY) + { + RequiresNoMoreThanNOfUnitTypeRequirement req = new RequiresNoMoreThanNOfUnitTypeRequirement(); + req.AddUnitTypeRequirement(this, MaxNumber); + reqs.Add(req); + } + + return reqs.ToArray(); } [Obsolete]