Mercurial > repos > IBBoard.WarFoundry.API
diff API/Factories/Requirement/UnitRequiresNUnitsForMUnitsRequirementFactory.cs @ 441:d2331ee59d74
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
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 03 Dec 2011 16:55:24 +0000 |
parents | |
children | 5ac76de8ce62 |
line wrap: on
line diff
--- /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<SOURCE_FILE_TYPE, ENTRY_TYPE>(UnitType type, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> raceFactory) + { + RequiresNUnitsForMUnitsRequirement req = new RequiresNUnitsForMUnitsRequirement(type); + Race race = type.Race; + AddRequirements(req, race, data, raceFactory); + return req; + } + + private void AddRequirements<SOURCE_FILE_TYPE, ENTRY_TYPE>(RequiresNUnitsForMUnitsRequirement req, Race race, string data, IRaceFactory<SOURCE_FILE_TYPE, ENTRY_TYPE> 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); + } + } + } + } +} +