Mercurial > repos > snowblizz-super-API-ideas
changeset 356:51cccccf3669
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
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Mon, 25 Apr 2011 15:11:20 +0000 |
parents | 47712a323cf2 |
children | 50d0d3b39a0b |
files | API/Objects/Requirement/RequiresNoMoreThanNOfUnitTypeRequirement.cs API/Objects/Requirement/UnitCountRequirementData.cs API/Objects/UnitType.cs |
diffstat | 3 files changed, 218 insertions(+), 140 deletions(-) [+] |
line wrap: on
line diff
--- 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 -{ - /// <summary> - /// A requirement where a WarFoundryObject cannot be taken in an army if more than N of a UnitType will be in the army. - /// </summary> - public class RequiresNoMoreThanNOfUnitTypeRequirement : IRequirement - { - private List<UnitCountRequirementData> limitedTypes; - - public RequiresNoMoreThanNOfUnitTypeRequirement(params UnitType[] limitedUnitTypes) - { - limitedTypes = new List<UnitCountRequirementData>(); - - 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 +{ + /// <summary> + /// A requirement where a WarFoundryObject cannot be taken in an army if more than N of a UnitType will be in the army. + /// </summary> + public class RequiresNoMoreThanNOfUnitTypeRequirement : IRequirement + { + private List<UnitCountRequirementData> limitedTypes; + + public RequiresNoMoreThanNOfUnitTypeRequirement(params UnitType[] limitedUnitTypes) + { + limitedTypes = new List<UnitCountRequirementData>(); + + foreach (UnitType unitType in limitedUnitTypes) + { + AddUnitTypeRequirement(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) + { + 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; + } + + /// <summary> + /// Adds a requirement for there to be no more than maxCount of a given UnitType + /// </summary> + /// <param name='unitType'> + /// The unit type to limit. + /// </param> + /// <param name='minCount'> + /// The maximum number of that type that must exist. + /// </param> + public void AddUnitTypeRequirement(UnitType unitType, int maxCount) + { + limitedTypes.Add(new UnitCountRequirementData(unitType, maxCount)); + } + + /// <summary> + /// Adds a requirement for there to be none of a given UnitType + /// </summary> + /// <param name='unitType'> + /// The unit type to limit. + /// </param> + public void AddUnitTypeRequirement(UnitType unitType) + { + AddUnitTypeRequirement(unitType, 0); + } + + /// <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 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; - /// <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) - { - 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; - } - - /// <summary> - /// Adds a requirement for there to be no more than maxCount of a given UnitType - /// </summary> - /// <param name='unitType'> - /// The unit type to limit. - /// </param> - /// <param name='minCount'> - /// The maximum number of that type that must exist. - /// </param> - public void AddUnitTypeRequirement(UnitType unitType, int maxCount) + public override int GetHashCode() { - limitedTypes.Add(new UnitCountRequirementData(unitType, maxCount)); - } - - /// <summary> - /// Adds a requirement for there to be none of a given UnitType - /// </summary> - /// <param name='unitType'> - /// The unit type to limit. - /// </param> - public void AddUnitTypeRequirement(UnitType unitType) - { - AddUnitTypeRequirement(unitType, 0); - } - - /// <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 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 (); + } + } +} +
--- 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; } - } - } -} - + } +} +
--- 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<IRequirement> reqs = new List<IRequirement>(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]