# HG changeset patch # User IBBoard # Date 1343592179 -3600 # Node ID e35fc85eda2b015695e86477ca2d580213afd1fa # Parent aac77204ae0ead0219db11c91536a3c983e4cd58 Re #410: Create "N units per M models in parent unit" requirement * Add factory to create requirements * Add methods to allow things other than 1:1 values for N and M diff -r aac77204ae0e -r e35fc85eda2b API/Factories/Requirement/UnitRequiresNParentModelsForMUnitsRequirementFactory.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/API/Factories/Requirement/UnitRequiresNParentModelsForMUnitsRequirementFactory.cs Sun Jul 29 21:02:59 2012 +0100 @@ -0,0 +1,97 @@ +// This file (UnitRequiresNParentModelsForMUnitsRequirementFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2012 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.Requirement; +using IBBoard.WarFoundry.API.Objects; + +namespace IBBoard.WarFoundry.API.Factories.Requirement +{ + public class UnitRequiresNParentModelsForMUnitsRequirementFactory : IRequirementFactory + { + public UnitRequiresNParentModelsForMUnitsRequirementFactory() + { + } + + public IRequirement CreateRequirement(IBBoard.WarFoundry.API.Objects.UnitType type, string data, IRaceFactory raceFactory) + { + UnitRequiresNParentModelsForMUnitsRequirement req = new UnitRequiresNParentModelsForMUnitsRequirement(type); + Race race = type.Race; + AddRequirements(req, race, data, raceFactory); + return req; + } + + private void AddRequirements(UnitRequiresNParentModelsForMUnitsRequirement req, Race race, string data, IRaceFactory raceFactory) + { + foreach (string requirement in data.Split('|')) + { + string[] requirementParts = requirement.Split(':'); + string unitID = requirementParts[0]; + UnitType unitType = GetUnitTypeFromID(unitID, race, raceFactory); + + if (requirementParts.Length == 2) + { + string[] amounts = requirementParts[1].Split(';'); + + if (amounts.Length == 1) + { + req.AddUnitTypeRequirement(unitType, ParseAllowedAmount(amounts[0], unitID)); + } + else + { + req.AddUnitTypeRequirement(unitType, ParseAllowedAmount(amounts[0], unitID), ParseModelCount(amounts[1], unitID)); + } + } + else + { + req.AddUnitTypeRequirement(unitType); + } + } + } + + private UnitType GetUnitTypeFromID(string unitID, Race race, IRaceFactory raceFactory) + { + UnitType unitType = raceFactory.GetUnitType(unitID, race); + + if (unitType == null) + { + throw new InvalidRequirementException(String.Format("Invalid unit type '{0}' for 'Requires N models in parent unit for M units' requirement", unitID)); + } + + return unitType; + } + + private int ParseModelCount(string minCount, string unitID) + { + try + { + return Int32.Parse(minCount); + } + catch (FormatException) + { + throw new InvalidRequirementException(String.Format("Invalid model amount '{0}' for unit types '{1}' for 'Requires N models in parent unit for M units' requirement", minCount, unitID)); + } + } + + private int ParseAllowedAmount(string allowedAmount, string unitID) + { + try + { + return Int32.Parse(allowedAmount); + } + catch (FormatException) + { + throw new InvalidRequirementException(String.Format("Invalid allowed amount '{0}' for unit types '{1}' for 'Requires N models in parent unit for M units' requirement", allowedAmount, unitID)); + } + } + + public string AppliesToID + { + get + { + return UnitRequiresNParentModelsForMUnitsRequirement.REQUIREMENT_ID; + } + } + } +} + diff -r aac77204ae0e -r e35fc85eda2b API/Objects/Requirement/UnitRequiresNParentModelsForMUnitsRequirement.cs --- a/API/Objects/Requirement/UnitRequiresNParentModelsForMUnitsRequirement.cs Sun Jul 29 15:31:09 2012 +0100 +++ b/API/Objects/Requirement/UnitRequiresNParentModelsForMUnitsRequirement.cs Sun Jul 29 21:02:59 2012 +0100 @@ -10,7 +10,7 @@ { public class UnitRequiresNParentModelsForMUnitsRequirement : AbstractUnitRequirement { - public static readonly string N_PER_M_IN_PARENT_REQUIREMENT_ID = "RequiresNoMoreThanNUnitsPerMModelsInParent"; + public static readonly string REQUIREMENT_ID = "RequiresNoMoreThanNUnitsPerMModelsInParent"; public UnitRequiresNParentModelsForMUnitsRequirement(UnitType allowedObject, params UnitType[] limitedUnitTypes) : base(allowedObject, limitedUnitTypes) { @@ -21,7 +21,7 @@ { get { - return N_PER_M_IN_PARENT_REQUIREMENT_ID; + return REQUIREMENT_ID; } } @@ -83,7 +83,17 @@ public override void AddUnitTypeRequirement(UnitType unitType) { - this.ConstraintTypes.Add(new UnitCountRequirementData(unitType, 1, 1)); + AddUnitTypeRequirement(unitType, 1); + } + + public void AddUnitTypeRequirement(UnitType unitType, int allowedCount) + { + AddUnitTypeRequirement(unitType, allowedCount, 1); + } + + public void AddUnitTypeRequirement(UnitType unitType, int allowedCount, int reqsCount) + { + ConstraintTypes.Add(new UnitCountRequirementData(unitType, reqsCount, allowedCount)); } protected override string GetFailedAddingRequirementsString(IWarFoundryObject toAdd, Army toArmy, AddingContext context) diff -r aac77204ae0e -r e35fc85eda2b API/WarFoundryHacks.cs --- a/API/WarFoundryHacks.cs Sun Jul 29 15:31:09 2012 +0100 +++ b/API/WarFoundryHacks.cs Sun Jul 29 21:02:59 2012 +0100 @@ -32,6 +32,7 @@ WarFoundryLoader.RegisterRequirementFactory(new UnitRequiresAtLeastNUnitsRequirementFactory()); WarFoundryLoader.RegisterRequirementFactory(new UnitRequiresNoMoreThanNOfUnitTypeRequirementFactory()); WarFoundryLoader.RegisterRequirementFactory(new UnitRequiresNUnitsForMUnitsRequirementFactory()); + WarFoundryLoader.RegisterRequirementFactory(new UnitRequiresNParentModelsForMUnitsRequirementFactory()); } } } diff -r aac77204ae0e -r e35fc85eda2b IBBoard.WarFoundry.API.csproj --- a/IBBoard.WarFoundry.API.csproj Sun Jul 29 15:31:09 2012 +0100 +++ b/IBBoard.WarFoundry.API.csproj Sun Jul 29 21:02:59 2012 +0100 @@ -164,6 +164,7 @@ +