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" />