# HG changeset patch # User IBBoard # Date 1322931324 0 # Node ID d2331ee59d74b66d965c1cc776fb8533c7c5e8f6 # Parent baa34d91031f67bea41cede7dc3b9ab1599ce2d8 Re #350: Add requirement to allow N of unit for specific other units * Add factory for requirement * Add extra method that assumes "allow N unit for every 1 unit" * Update/fix documentation diff -r baa34d91031f -r d2331ee59d74 API/Factories/Requirement/UnitRequiresNUnitsForMUnitsRequirementFactory.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/API/Factories/Requirement/UnitRequiresNUnitsForMUnitsRequirementFactory.cs Sat Dec 03 16:55:24 2011 +0000 @@ -0,0 +1,67 @@ +// This file (UnitRequiresNUnitsForMUnitsRequirementFactory.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 IBBoard.WarFoundry.API.Objects.Requirement; + +namespace IBBoard.WarFoundry.API.Factories.Requirement +{ + public class UnitRequiresNUnitsForMUnitsRequirementFactory : IRequirementFactory + { + public UnitRequiresNUnitsForMUnitsRequirementFactory() + { + //Do nothing special + } + + public string AppliesToID + { + get + { + return RequiresNUnitsForMUnitsRequirement.REQUIREMENT_ID; + } + } + + public IRequirement CreateRequirement(UnitType type, string data, IRaceFactory raceFactory) + { + RequiresNUnitsForMUnitsRequirement req = new RequiresNUnitsForMUnitsRequirement(type); + Race race = type.Race; + AddRequirements(req, race, data, raceFactory); + return req; + } + + private void AddRequirements(RequiresNUnitsForMUnitsRequirement req, Race race, string data, IRaceFactory raceFactory) + { + foreach (string requirement in data.Split('|')) + { + string[] requirementParts = requirement.Split(':'); + string unitID = requirementParts[0]; + UnitType unitType = raceFactory.GetUnitType(unitID, race); + + if (unitType == null) + { + throw new InvalidRequirementException(String.Format("Invalid unit type '{0}' for 'Requires N units for M units' requirement", unitID)); + } + + if (requirementParts.Length == 2) + { + string amount = requirementParts[1]; + + try + { + req.AddUnitTypeRequirement(unitType, 1, Int32.Parse(amount)); + } + catch (FormatException) + { + throw new InvalidRequirementException(String.Format("Invalid amount '{0}' for unit type '{1}' for 'Requires N units for M units' requirement", amount, unitID)); + } + } + else + { + req.AddUnitTypeRequirement(unitType); + } + } + } + } +} + diff -r baa34d91031f -r d2331ee59d74 API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs --- a/API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs Sat Dec 03 16:14:26 2011 +0000 +++ b/API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs Sat Dec 03 16:55:24 2011 +0000 @@ -198,12 +198,29 @@ /// /// The minimum number of that type that must exist. /// + /// + /// The number of units allowed for every minCount units of the supplied unit type. + /// public void AddUnitTypeRequirement(UnitType unitType, int minCount, int allowedCount) { requiredTypes.Add(new UnitCountRequirementData(unitType, minCount, allowedCount)); } /// + /// Adds a requirement for there to be at least one of a given UnitType, allowing allowedCount of this UnitType + /// + /// + /// The unit type to require. + /// + /// + /// The number of units allowed for each unit of the supplied unit type. + /// + public void AddUnitTypeRequirement(UnitType unitType, int allowedCount) + { + AddUnitTypeRequirement(unitType, 1, allowedCount); + } + + /// /// Adds a requirement for there to be one or more of a given UnitType, allowing one of this UnitType /// /// @@ -211,7 +228,7 @@ /// public void AddUnitTypeRequirement(UnitType unitType) { - AddUnitTypeRequirement(unitType, 1, 1); + AddUnitTypeRequirement(unitType, 1); } } } diff -r baa34d91031f -r d2331ee59d74 IBBoard.WarFoundry.API.csproj --- a/IBBoard.WarFoundry.API.csproj Sat Dec 03 16:14:26 2011 +0000 +++ b/IBBoard.WarFoundry.API.csproj Sat Dec 03 16:55:24 2011 +0000 @@ -192,6 +192,7 @@ PreserveNewest +