Mercurial > repos > IBBoard.WarFoundry.API
changeset 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 | baa34d91031f |
children | 5ac76de8ce62 |
files | API/Factories/Requirement/UnitRequiresNUnitsForMUnitsRequirementFactory.cs API/Objects/Requirement/RequiresNUnitsForMUnitsRequirement.cs IBBoard.WarFoundry.API.csproj |
diffstat | 3 files changed, 86 insertions(+), 1 deletions(-) [+] |
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); + } + } + } + } +} +
--- 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 @@ /// <param name='minCount'> /// The minimum number of that type that must exist. /// </param> + /// <param name='allowedCount'> + /// The number of units allowed for every minCount units of the supplied unit type. + /// </param> public void AddUnitTypeRequirement(UnitType unitType, int minCount, int allowedCount) { requiredTypes.Add(new UnitCountRequirementData(unitType, minCount, allowedCount)); } /// <summary> + /// Adds a requirement for there to be at least one of a given UnitType, allowing allowedCount of this UnitType + /// </summary> + /// <param name='unitType'> + /// The unit type to require. + /// </param> + /// <param name='allowedCount'> + /// The number of units allowed for each unit of the supplied unit type. + /// </param> + public void AddUnitTypeRequirement(UnitType unitType, int allowedCount) + { + AddUnitTypeRequirement(unitType, 1, allowedCount); + } + + /// <summary> /// Adds a requirement for there to be one or more of a given UnitType, allowing one of this UnitType /// </summary> /// <param name='unitType'> @@ -211,7 +228,7 @@ /// </param> public void AddUnitTypeRequirement(UnitType unitType) { - AddUnitTypeRequirement(unitType, 1, 1); + AddUnitTypeRequirement(unitType, 1); } } }
--- 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 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <Compile Include="API\Objects\Requirement\RequiresNUnitsForMUnitsRequirement.cs" /> + <Compile Include="API\Factories\Requirement\UnitRequiresNUnitsForMUnitsRequirementFactory.cs" /> </ItemGroup> <ItemGroup> <Reference Include="System.Xml" />