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);
+				}
+			}
+		}
+	}
+}
+