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