changeset 82:3ea0ab04352b

* Fix line terminators no-open-ticket
author IBBoard <dev@ibboard.co.uk>
date Sat, 27 Jun 2009 18:59:49 +0000
parents 032b174fc17a
children 89cc29b4c012
files AssemblyInfo.cs api/Commands/CreateAndAddUnitCommand.cs api/Commands/RemoveUnitCommand.cs api/Commands/ReplaceUnitEquipmentCommand.cs api/Commands/SetNameCommand.cs api/Commands/SetUnitEquipmentAmountCommand.cs api/Commands/SetUnitSizeCommand.cs api/Delegates.cs api/Factories/AbstractNativeWarFoundryFactory.cs api/Factories/Xml/WarFoundryXmlFactory.cs api/Factories/Xml/WarFoundryXmlSaver.cs api/Objects/Army.cs api/Objects/ArmyCategory.cs api/Objects/Category.cs api/Objects/EquipmentItem.cs api/Objects/GameSystem.cs api/Objects/IWarFoundryObject.cs api/Objects/Race.cs api/Objects/Stat.cs api/Objects/StatSlot.cs api/Objects/SystemStats.cs api/Objects/Unit.cs api/Objects/UnitEquipmentItem.cs api/Objects/UnitType.cs api/Objects/WarFoundryObject.cs api/Requirements/AbstractFailedRequirement.cs api/Requirements/AbstractRequirement.cs api/Requirements/Delegates.cs api/Requirements/FailedUnitRequirement.cs api/Requirements/RequirementAND.cs api/Requirements/RequirementOR.cs api/Requirements/UnitExcludesRequirement.cs api/Requirements/UnitExclusion.cs api/Requirements/UnitMaxNumberReached.cs api/Requirements/UnitMinNumberReached.cs api/Requirements/UnitRequirement.cs api/Requirements/UnitRequirementItem.cs api/Requirements/UnitRequiresAtLeastRequirement.cs api/WarFoundryCore.cs api/WarFoundryLoader.cs
diffstat 40 files changed, 2262 insertions(+), 2259 deletions(-) [+]
line wrap: on
line diff
--- a/AssemblyInfo.cs	Wed May 27 19:43:09 2009 +0000
+++ b/AssemblyInfo.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -1,58 +1,58 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-
-//
-// General Information about an assembly is controlled through the following 
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//
-[assembly: AssemblyTitle("WarFoundry API")]
-[assembly: AssemblyDescription("The API for the WarFoundry army builder")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("IBBoard.WarFoundry.API")]
-[assembly: AssemblyCopyright("IBBoard 2009")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-//
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version 
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Revision and Build Numbers 
-// by using the '*' as shown below:
-
-[assembly: AssemblyVersion("1.0.0.*")]
-
-//
-// In order to sign your assembly you must specify a key to use. Refer to the 
-// Microsoft .NET Framework documentation for more information on assembly signing.
-//
-// Use the attributes below to control which key is used for signing. 
-//
-// Notes: 
-//   (*) If no key is specified, the assembly is not signed.
-//   (*) KeyName refers to a key that has been installed in the Crypto Service
-//       Provider (CSP) on your machine. KeyFile refers to a file which contains
-//       a key.
-//   (*) If the KeyFile and the KeyName values are both specified, the 
-//       following processing occurs:
-//       (1) If the KeyName can be found in the CSP, that key is used.
-//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
-//           in the KeyFile is installed into the CSP and used.
-//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
-//       When specifying the KeyFile, the location of the KeyFile should be
-//       relative to the project output directory which is
-//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
-//       located in the project directory, you would specify the AssemblyKeyFile 
-//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
-//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
-//       documentation for more information on this.
-//
-[assembly: AssemblyDelaySign(false)]
-[assembly: AssemblyKeyFile("")]
-[assembly: AssemblyKeyName("")]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("WarFoundry API")]
+[assembly: AssemblyDescription("The API for the WarFoundry army builder")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("IBBoard.WarFoundry.API")]
+[assembly: AssemblyCopyright("IBBoard 2009")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the 
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing. 
+//
+// Notes: 
+//   (*) If no key is specified, the assembly is not signed.
+//   (*) KeyName refers to a key that has been installed in the Crypto Service
+//       Provider (CSP) on your machine. KeyFile refers to a file which contains
+//       a key.
+//   (*) If the KeyFile and the KeyName values are both specified, the 
+//       following processing occurs:
+//       (1) If the KeyName can be found in the CSP, that key is used.
+//       (2) If the KeyName does not exist and the KeyFile does exist, the key 
+//           in the KeyFile is installed into the CSP and used.
+//   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+//       When specifying the KeyFile, the location of the KeyFile should be
+//       relative to the project output directory which is
+//       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+//       located in the project directory, you would specify the AssemblyKeyFile 
+//       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+//   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+//       documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
--- a/api/Commands/CreateAndAddUnitCommand.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Commands/CreateAndAddUnitCommand.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -1,72 +1,72 @@
 // This file (CreateAndAddUnitCommand.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard.
 //
-// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
-
-using System;
+// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
+
+using System;
 using IBBoard.Commands;
 using IBBoard.Lang;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Commands
-{
-	public class CreateAndAddUnitCommand : Command
-	{
-		private UnitType addedUnitType;
-		private Army army;
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Commands
+{
+	public class CreateAndAddUnitCommand : Command
+	{
+		private UnitType addedUnitType;
+		private Army army;
 		private Unit addedUnit;
 		
 		public CreateAndAddUnitCommand(UnitType toAdd, Army armyTo)
 		{
 			addedUnitType = toAdd;
 			army = armyTo;
-		}
+		}
+
+		[Obsolete("Use two parameter constructor instead")]
+		public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory catTo, Army armyTo) : this(toAdd, armyTo)
+		{
+		}
 
-		[Obsolete("Use two parameter constructor instead")]
-		public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory catTo, Army armyTo) : this(toAdd, armyTo)
-		{
-		}
+		[Obsolete("Use two parameter constructor instead")]
+		public CreateAndAddUnitCommand(UnitType toAdd, Category catTo, Army armyTo) : this (toAdd, armyTo.GetCategory(catTo), armyTo)
+		{
+		}
+
+		public override bool CanExecute()
+		{
+			return (addedUnitType!=null && army!=null);
+		}
+
+		public override string Description
+		{
+			get { return "Add unit of "+StringManipulation.CutToLength(addedUnitType.Name, 20)+" to the army"; }
+		}
 
-		[Obsolete("Use two parameter constructor instead")]
-		public CreateAndAddUnitCommand(UnitType toAdd, Category catTo, Army armyTo) : this (toAdd, armyTo.GetCategory(catTo), armyTo)
-		{
-		}
-
-		public override bool CanExecute()
-		{
-			return (addedUnitType!=null && army!=null);
-		}
-
-		public override string Description
-		{
-			get { return "Add unit of "+StringManipulation.CutToLength(addedUnitType.Name, 20)+" to the army"; }
-		}
-
-		public override string UndoDescription
-		{
-			get { return "Remove unit of "+StringManipulation.CutToLength(addedUnitType.Name, 20)+" from army"; }
-		}
-
-		public override bool Execute()
-		{
-			addedUnit = new Unit(addedUnitType, army);
-			this.Redo();
-			return true;
-		}
-
-		public override void Redo()
-		{
-			army.AddUnit(addedUnit);
-		}
-
-		public override void Undo()
-		{
-			army.RemoveUnit(addedUnit);
-		}
-
-
-		public override string Name
-		{
-			get { return "Add new unit"; }
-		}
-	}
-}
+		public override string UndoDescription
+		{
+			get { return "Remove unit of "+StringManipulation.CutToLength(addedUnitType.Name, 20)+" from army"; }
+		}
+
+		public override bool Execute()
+		{
+			addedUnit = new Unit(addedUnitType, army);
+			this.Redo();
+			return true;
+		}
+
+		public override void Redo()
+		{
+			army.AddUnit(addedUnit);
+		}
+
+		public override void Undo()
+		{
+			army.RemoveUnit(addedUnit);
+		}
+
+
+		public override string Name
+		{
+			get { return "Add new unit"; }
+		}
+	}
+}
--- a/api/Commands/RemoveUnitCommand.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Commands/RemoveUnitCommand.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -1,61 +1,61 @@
 // This file (RemoveUnitCommand.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard.
 //
-// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
-
-using System;
+// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
+
+using System;
 using IBBoard.Commands;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Commands
-{
-	/// <summary>
-	/// Summary description for RemoveUnitCommand.
-	/// </summary>
-	public class RemoveUnitCommand : Command
-	{
-		private Unit unit;
-		private ArmyCategory cat;
-
-		public RemoveUnitCommand(Unit toRemove)
-		{
-			unit = toRemove;
-			cat = unit.Category;
-		}
-
-		public override bool CanExecute()
-		{
-			return (unit!=null);
-		}
-
-		public override string Description
-		{
-			get { return "Remove an existing unit from the army"; }
-		}
-
-		public override string UndoDescription
-		{
-			get { return "Replace a removed unit"; }
-		}
-
-		public override bool Execute()
-		{
-			this.Redo();
-			return true;
-		}
-
-		public override void Redo()
-		{
-			cat.RemoveUnit(unit);
-		}
-
-		public override void Undo()
-		{
-			cat.AddUnit(unit);
-		}
-
-		public override string Name
-		{
-			get { return "Remove unit"; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Commands
+{
+	/// <summary>
+	/// Summary description for RemoveUnitCommand.
+	/// </summary>
+	public class RemoveUnitCommand : Command
+	{
+		private Unit unit;
+		private ArmyCategory cat;
+
+		public RemoveUnitCommand(Unit toRemove)
+		{
+			unit = toRemove;
+			cat = unit.Category;
+		}
+
+		public override bool CanExecute()
+		{
+			return (unit!=null);
+		}
+
+		public override string Description
+		{
+			get { return "Remove an existing unit from the army"; }
+		}
+
+		public override string UndoDescription
+		{
+			get { return "Replace a removed unit"; }
+		}
+
+		public override bool Execute()
+		{
+			this.Redo();
+			return true;
+		}
+
+		public override void Redo()
+		{
+			cat.RemoveUnit(unit);
+		}
+
+		public override void Undo()
+		{
+			cat.AddUnit(unit);
+		}
+
+		public override string Name
+		{
+			get { return "Remove unit"; }
+		}
+	}
+}
--- a/api/Commands/ReplaceUnitEquipmentCommand.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Commands/ReplaceUnitEquipmentCommand.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,63 +2,63 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using IBBoard.Commands;
 using IBBoard.Lang;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Commands
-{
-	/// <summary>
-	/// Summary description for ReplaceUnitEquipmentCommand.
-	/// </summary>
-	public class ReplaceUnitEquipmentCommand : Command
-	{
-		private SetUnitEquipmentAmountCommand removeOldCommand, addNewCommand;
-		
-		public ReplaceUnitEquipmentCommand(Unit unit, UnitEquipmentItem oldItem, UnitEquipmentItem newItem, double amount)
-		{
-			removeOldCommand = new SetUnitEquipmentAmountCommand(unit, oldItem, 0);
-			addNewCommand = new SetUnitEquipmentAmountCommand(unit, newItem, amount);
-		}
-
-		public override bool CanExecute()
-		{
-			return removeOldCommand.CanExecute() && addNewCommand.CanExecute();
-		}
-
-		public override string Description
-		{
-			get { return "Replace "+StringManipulation.CutToLength(removeOldCommand.EquipItem.Name, 20)+" with "+StringManipulation.CutToLength(addNewCommand.EquipItem.Name, 20)+ " for "+StringManipulation.CutToLength(removeOldCommand.Unit.Name, 20); }
-		}
-
-		public override string UndoDescription
-		{
-			get { return "Replace "+StringManipulation.CutToLength(addNewCommand.EquipItem.Name, 20)+" with "+StringManipulation.CutToLength(removeOldCommand.EquipItem.Name, 20)+ " for "+StringManipulation.CutToLength(removeOldCommand.Unit.Name, 20); }
-		}
-
-		public override bool Execute()
-		{
-			this.Redo();
-			return true;
-		}
-
-		public override void Redo()
-		{
-			removeOldCommand.Redo();
-			addNewCommand.Redo();
-		}
-
-		public override void Undo()
-		{
-			addNewCommand.Undo();
-			removeOldCommand.Undo();
-		}
-
-
-		public override string Name
-		{
-			get { return "Replace required equipment"; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Commands
+{
+	/// <summary>
+	/// Summary description for ReplaceUnitEquipmentCommand.
+	/// </summary>
+	public class ReplaceUnitEquipmentCommand : Command
+	{
+		private SetUnitEquipmentAmountCommand removeOldCommand, addNewCommand;
+		
+		public ReplaceUnitEquipmentCommand(Unit unit, UnitEquipmentItem oldItem, UnitEquipmentItem newItem, double amount)
+		{
+			removeOldCommand = new SetUnitEquipmentAmountCommand(unit, oldItem, 0);
+			addNewCommand = new SetUnitEquipmentAmountCommand(unit, newItem, amount);
+		}
+
+		public override bool CanExecute()
+		{
+			return removeOldCommand.CanExecute() && addNewCommand.CanExecute();
+		}
+
+		public override string Description
+		{
+			get { return "Replace "+StringManipulation.CutToLength(removeOldCommand.EquipItem.Name, 20)+" with "+StringManipulation.CutToLength(addNewCommand.EquipItem.Name, 20)+ " for "+StringManipulation.CutToLength(removeOldCommand.Unit.Name, 20); }
+		}
+
+		public override string UndoDescription
+		{
+			get { return "Replace "+StringManipulation.CutToLength(addNewCommand.EquipItem.Name, 20)+" with "+StringManipulation.CutToLength(removeOldCommand.EquipItem.Name, 20)+ " for "+StringManipulation.CutToLength(removeOldCommand.Unit.Name, 20); }
+		}
+
+		public override bool Execute()
+		{
+			this.Redo();
+			return true;
+		}
+
+		public override void Redo()
+		{
+			removeOldCommand.Redo();
+			addNewCommand.Redo();
+		}
+
+		public override void Undo()
+		{
+			addNewCommand.Undo();
+			removeOldCommand.Undo();
+		}
+
+
+		public override string Name
+		{
+			get { return "Replace required equipment"; }
+		}
+	}
+}
--- a/api/Commands/SetNameCommand.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Commands/SetNameCommand.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,61 +2,61 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using IBBoard.Commands;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Commands
-{
-	/// <summary>
-	/// Summary description for SetNameCommand.
-	/// </summary>
-	public class SetNameCommand : Command
-	{
-		private WarFoundryObject obj;
-		private string newName, oldName;
-
-		public SetNameCommand(WarFoundryObject toRename, string name)
-		{
-			obj = toRename;
-			newName = name;
-			oldName = obj.Name;
-		}
-
-		public override bool CanExecute()
-		{
-			return (obj!=null && newName!=null && newName!="");
-		}
-
-		public override string Description
-		{
-			get { return "Rename "+oldName; }
-		}
-
-		public override string UndoDescription
-		{
-			get { return "Revert name of "+newName; }
-		}
-
-		public override bool Execute()
-		{
-			this.Redo();
-			return true;
-		}
-
-		public override void Redo()
-		{
-			obj.Name = newName;
-		}
-
-		public override void Undo()
-		{
-			obj.Name = oldName;
-		}
-
-		public override string Name
-		{
-			get { return "Rename item"; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Commands
+{
+	/// <summary>
+	/// Summary description for SetNameCommand.
+	/// </summary>
+	public class SetNameCommand : Command
+	{
+		private WarFoundryObject obj;
+		private string newName, oldName;
+
+		public SetNameCommand(WarFoundryObject toRename, string name)
+		{
+			obj = toRename;
+			newName = name;
+			oldName = obj.Name;
+		}
+
+		public override bool CanExecute()
+		{
+			return (obj!=null && newName!=null && newName!="");
+		}
+
+		public override string Description
+		{
+			get { return "Rename "+oldName; }
+		}
+
+		public override string UndoDescription
+		{
+			get { return "Revert name of "+newName; }
+		}
+
+		public override bool Execute()
+		{
+			this.Redo();
+			return true;
+		}
+
+		public override void Redo()
+		{
+			obj.Name = newName;
+		}
+
+		public override void Undo()
+		{
+			obj.Name = oldName;
+		}
+
+		public override string Name
+		{
+			get { return "Rename item"; }
+		}
+	}
+}
--- a/api/Commands/SetUnitEquipmentAmountCommand.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Commands/SetUnitEquipmentAmountCommand.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,65 +2,65 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using IBBoard.Commands;
 using IBBoard.Lang;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Commands
-{
-	/// <summary>
-	/// Summary description for SetUnitEquipmentAmountCommand.
-	/// </summary>
-	public class SetUnitEquipmentAmountCommand : Command
-	{
-		private Unit unit;
-		private UnitEquipmentItem equip;
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Commands
+{
+	/// <summary>
+	/// Summary description for SetUnitEquipmentAmountCommand.
+	/// </summary>
+	public class SetUnitEquipmentAmountCommand : Command
+	{
+		private Unit unit;
+		private UnitEquipmentItem equip;
 		private double newAmount;
-		private double oldAmount;
-		
-		public SetUnitEquipmentAmountCommand(Unit unit, UnitEquipmentItem item, double amount)
-		{
-			this.unit = unit;
-			equip = item;
-			newAmount = amount;
-			oldAmount = unit.GetEquipmentAmount(equip.ID);
-		}
-
-		public override bool CanExecute()
-		{
-			return (unit!=null && equip!=null);
-		}
-
-		public override string Description
-		{
-			get { return "Set "+StringManipulation.CutToLength(equip.Name, 20)+" amount for "+StringManipulation.CutToLength(unit.Name, 20)+" to "+UnitEquipmentItem.FormatEquipmentAmount(equip, newAmount); }
-		}
-
-		public override string UndoDescription
-		{
-			get { return "Set "+StringManipulation.CutToLength(equip.Name, 20)+" amount for "+StringManipulation.CutToLength(unit.Name, 20)+" to "+UnitEquipmentItem.FormatEquipmentAmount(equip, oldAmount); }
-		}
-
-		public override bool Execute()
-		{
-			this.Redo();
-			return true;
-		}
-
-		public override void Redo()
+		private double oldAmount;
+		
+		public SetUnitEquipmentAmountCommand(Unit unit, UnitEquipmentItem item, double amount)
+		{
+			this.unit = unit;
+			equip = item;
+			newAmount = amount;
+			oldAmount = unit.GetEquipmentAmount(equip.ID);
+		}
+
+		public override bool CanExecute()
+		{
+			return (unit!=null && equip!=null);
+		}
+
+		public override string Description
+		{
+			get { return "Set "+StringManipulation.CutToLength(equip.Name, 20)+" amount for "+StringManipulation.CutToLength(unit.Name, 20)+" to "+UnitEquipmentItem.FormatEquipmentAmount(equip, newAmount); }
+		}
+
+		public override string UndoDescription
+		{
+			get { return "Set "+StringManipulation.CutToLength(equip.Name, 20)+" amount for "+StringManipulation.CutToLength(unit.Name, 20)+" to "+UnitEquipmentItem.FormatEquipmentAmount(equip, oldAmount); }
+		}
+
+		public override bool Execute()
+		{
+			this.Redo();
+			return true;
+		}
+
+		public override void Redo()
 		{
 			if (equip.IsRatioLimit)
-			{
+			{
 				unit.SetEquipmentRatio(equip, newAmount);
 			}
 			else
 			{
 				unit.SetEquipmentAmount(equip, (int)newAmount);
-			}
-		}
-
-		public override void Undo()
+			}
+		}
+
+		public override void Undo()
 		{
 			if (equip.IsRatioLimit)
 			{
@@ -69,22 +69,22 @@
 			else
 			{
 				unit.SetEquipmentAmount(equip, (int)oldAmount);
-			}
-		}
-
-		public override string Name
-		{
-			get { return "Set equipment amount"; }
-		}
-
-		public UnitEquipmentItem EquipItem
-		{
-			get { return equip; }
-		}
-
-		public Unit Unit
-		{
-			get { return unit; }
-		}
-	}
-}
+			}
+		}
+
+		public override string Name
+		{
+			get { return "Set equipment amount"; }
+		}
+
+		public UnitEquipmentItem EquipItem
+		{
+			get { return equip; }
+		}
+
+		public Unit Unit
+		{
+			get { return unit; }
+		}
+	}
+}
--- a/api/Commands/SetUnitSizeCommand.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Commands/SetUnitSizeCommand.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -1,62 +1,62 @@
 // This file (SetUnitSizeCommand.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard.
 //
-// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
-
-using System;
+// The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
+
+using System;
 using IBBoard.Commands;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Commands
-{
-	/// <summary>
-	/// Summary description for SetNameCommand.
-	/// </summary>
-	public class SetUnitSizeCommand : Command
-	{
-		private Unit unit;
-		private int newSize, oldSize;
-
-		public SetUnitSizeCommand(Unit toResize, int size)
-		{
-			unit = toResize;
-			newSize = size;
-			oldSize = unit.Size;
-		}
-
-		public override bool CanExecute()
-		{
-			return (unit!=null && newSize >0 && oldSize > 0);
-		}
-
-		public override string Description
-		{
-			get { return "Change size of "+unit.Name; }
-		}
-
-		public override string UndoDescription
-		{
-			get { return "Revert size of "+unit.Name; }
-		}
-
-		public override bool Execute()
-		{
-			this.Redo();
-			return true;
-		}
-
-		public override void Redo()
-		{
-			unit.Size = newSize;
-		}
-
-		public override void Undo()
-		{
-			unit.Size = oldSize;
-		}
-
-		public override string Name
-		{
-			get { return "Change unit size"; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Commands
+{
+	/// <summary>
+	/// Summary description for SetNameCommand.
+	/// </summary>
+	public class SetUnitSizeCommand : Command
+	{
+		private Unit unit;
+		private int newSize, oldSize;
+
+		public SetUnitSizeCommand(Unit toResize, int size)
+		{
+			unit = toResize;
+			newSize = size;
+			oldSize = unit.Size;
+		}
+
+		public override bool CanExecute()
+		{
+			return (unit!=null && newSize >0 && oldSize > 0);
+		}
+
+		public override string Description
+		{
+			get { return "Change size of "+unit.Name; }
+		}
+
+		public override string UndoDescription
+		{
+			get { return "Revert size of "+unit.Name; }
+		}
+
+		public override bool Execute()
+		{
+			this.Redo();
+			return true;
+		}
+
+		public override void Redo()
+		{
+			unit.Size = newSize;
+		}
+
+		public override void Undo()
+		{
+			unit.Size = oldSize;
+		}
+
+		public override string Name
+		{
+			get { return "Change unit size"; }
+		}
+	}
+}
--- a/api/Delegates.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Delegates.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -4,20 +4,20 @@
 
 using System;
 using System.Collections.Generic;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API
-{
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API
+{
 	public delegate void ObjectChangedDelegate(WarFoundryObject oldValue, WarFoundryObject newValue);
 	public delegate void ArmyChangedDelegate(Army oldValue, Army newValue);
-	public delegate void GameSystemChangedDelegate(GameSystem oldValue, GameSystem newValue);
+	public delegate void GameSystemChangedDelegate(GameSystem oldValue, GameSystem newValue);
 	public delegate void ObjectAddDelegate(WarFoundryObject val);
-	public delegate void ObjectRemoveDelegate(WarFoundryObject val);	
+	public delegate void ObjectRemoveDelegate(WarFoundryObject val);	
 	public delegate void UnitAddDelegate(Unit val);
-	public delegate void UnitRemoveDelegate(Unit val);
-	public delegate void ObjectUpdatedDelegate(WarFoundryObject val, string updatedValName);
-	public delegate void DoubleValChangedDelegate(WarFoundryObject obj, double oldValue, double newValue);
-	public delegate void FloatValChangedDelegate(WarFoundryObject obj, float oldValue, float newValue);
-	public delegate void StringValChangedDelegate(WarFoundryObject obj, string oldValue, string newValue);
-	public delegate void IntValChangedDelegate(WarFoundryObject obj, int oldValue, int newValue);
-}
+	public delegate void UnitRemoveDelegate(Unit val);
+	public delegate void ObjectUpdatedDelegate(WarFoundryObject val, string updatedValName);
+	public delegate void DoubleValChangedDelegate(WarFoundryObject obj, double oldValue, double newValue);
+	public delegate void FloatValChangedDelegate(WarFoundryObject obj, float oldValue, float newValue);
+	public delegate void StringValChangedDelegate(WarFoundryObject obj, string oldValue, string newValue);
+	public delegate void IntValChangedDelegate(WarFoundryObject obj, int oldValue, int newValue);
+}
--- a/api/Factories/AbstractNativeWarFoundryFactory.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Factories/AbstractNativeWarFoundryFactory.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,7 +3,7 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using System.IO;
+using System.IO;
 using System.Xml;
 using System.Xml.Schema;
 using System.Collections.Generic;
@@ -14,22 +14,22 @@
 using IBBoard.Logging;
 using IBBoard.Xml;
 using IBBoard.WarFoundry.API.Objects;
-using ICSharpCode.SharpZipLib.Zip;
-
-namespace IBBoard.WarFoundry.API.Factories
-{
-	/// <summary>
-	/// Base abstract class for all factories that load native WarFoundry data.
-	/// </summary>
-	public abstract class AbstractNativeWarFoundryFactory : AbstractWarFoundryFactory<ZipFile>, INativeWarFoundryFactory
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace IBBoard.WarFoundry.API.Factories
+{
+	/// <summary>
+	/// Base abstract class for all factories that load native WarFoundry data.
+	/// </summary>
+	public abstract class AbstractNativeWarFoundryFactory : AbstractWarFoundryFactory<ZipFile>, INativeWarFoundryFactory
 	{
 		protected static readonly string SYSTEM_ZIP_IDENTIFIER = "WarFoundry_System";
 		protected static readonly string RACE_ZIP_IDENTIFIER = "WarFoundry_Race";
 		protected static readonly string ARMY_ZIP_IDENTIFIER = "WarFoundry_Army";
 				
-		protected AbstractNativeWarFoundryFactory()
+		protected AbstractNativeWarFoundryFactory()
 		{
-			//Do nothing - just make the constructor non-public
+			//Do nothing - just make the constructor non-public
 		}
 				
 		protected override ZipFile GetFileAsSupportedType (FileInfo file)
@@ -135,7 +135,7 @@
 		}
 		
 		protected abstract Stream GetGameSystemDataStream(ZipFile file);
-		protected abstract GameSystem CreateGameSystemFromStream(ZipFile file, Stream dataStream);
+		protected abstract GameSystem CreateGameSystemFromStream(ZipFile file, Stream dataStream);
 		
 		public override bool Equals (object o)
 		{
@@ -154,6 +154,6 @@
 		public override int GetHashCode ()
 		{
 			return GetType().FullName.GetHashCode();
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Factories/Xml/WarFoundryXmlFactory.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Factories/Xml/WarFoundryXmlFactory.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,7 +3,7 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using System.IO;
+using System.IO;
 using System.Xml;
 using System.Xml.Schema;
 using System.Xml.XPath;
@@ -16,14 +16,14 @@
 using IBBoard.Xml;
 using IBBoard.WarFoundry.API.Requirements;
 using IBBoard.WarFoundry.API.Objects;
-using ICSharpCode.SharpZipLib.Zip;
-
-namespace IBBoard.WarFoundry.API.Factories.Xml
-{
-	/// <summary>
-	/// The WarFoundryXmlFactory loads WarFoundry classes from the native "XML in a zip" file format. Files are validated using the schema for the file type, so structurally invalid files should be identified at initial load.
-	/// </summary>
-	public class WarFoundryXmlFactory : AbstractNativeWarFoundryFactory
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace IBBoard.WarFoundry.API.Factories.Xml
+{
+	/// <summary>
+	/// The WarFoundryXmlFactory loads WarFoundry classes from the native "XML in a zip" file format. Files are validated using the schema for the file type, so structurally invalid files should be identified at initial load.
+	/// </summary>
+	public class WarFoundryXmlFactory : AbstractNativeWarFoundryFactory
 	{
 		private static WarFoundryXmlFactory factory;
 		private WarFoundryXmlGameSystemFactory gameSystemFactory;
@@ -40,11 +40,11 @@
 			return factory;
 		}
 		
-		private WarFoundryXmlFactory() : base()
+		private WarFoundryXmlFactory() : base()
 		{
 			gameSystemFactory = new WarFoundryXmlGameSystemFactory(this);
 			raceFactory = new WarFoundryXmlRaceFactory(this);
-			armyFactory = new WarFoundryXmlArmyFactory();
+			armyFactory = new WarFoundryXmlArmyFactory();
 		}
 		
 		protected override bool CheckCanFindArmyFileContent(ZipFile file)
@@ -123,5 +123,5 @@
 				raceFactory.CompleteLoading((Race)obj);
 			}
 		}
-	}
+	}
 }
\ No newline at end of file
--- a/api/Factories/Xml/WarFoundryXmlSaver.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Factories/Xml/WarFoundryXmlSaver.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -29,7 +29,7 @@
 			return saver;
 		}
 		
-		public bool SaveAs(WarFoundryObject toSave, string saveAsPath)
+		public bool SaveAs(WarFoundryObject toSave, string saveAsPath)
 		{
 			if (CanSaveType(toSave))
 			{
@@ -37,12 +37,12 @@
 				bool success = false;
 				
 				try
-				{
-					fs = new FileStream(saveAsPath, FileMode.Create, FileAccess.Write);
-					byte[] bytes = StringManipulation.StringToBytes(CreateXmlString(toSave));
-					fs.Write(bytes, 0, bytes.Length);
+				{
+					fs = new FileStream(saveAsPath, FileMode.Create, FileAccess.Write);
+					byte[] bytes = StringManipulation.StringToBytes(CreateXmlString(toSave));
+					fs.Write(bytes, 0, bytes.Length);
 					fs.Flush();
-					savePaths.Add(toSave, saveAsPath);
+					savePaths.Add(toSave, saveAsPath);
 					success = true;
 				}
 				finally
@@ -58,7 +58,7 @@
 			else
 			{
 				throw new ArgumentException("Cannot directly save objects of type "+toSave.GetType());
-			}
+			}
 		}
 		
 		public bool Save(WarFoundryObject toSave)
--- a/api/Objects/Army.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/Army.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,52 +2,52 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.IO;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
 using IBBoard.WarFoundry.API;
 using IBBoard.WarFoundry.API.Factories;
 using IBBoard.WarFoundry.API.Requirements;
-using ICSharpCode.SharpZipLib.Zip;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for Army.
-	/// </summary>
-	public class Army : WarFoundryObject
-	{
-		//private GameSystem system;
-		private Race armyRace;
-		private int maxPoints;
-		private double pointsTotal;
-		private Dictionary<Category, ArmyCategory> categories;
-
-		public event ObjectAddDelegate UnitAdded;
-		public event ObjectRemoveDelegate UnitRemoved;
-		public event FailedUnitRequirementDelegate FailedRequirement;
-		public event DoubleValChangedDelegate PointsValueChanged;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for Army.
+	/// </summary>
+	public class Army : WarFoundryObject
+	{
+		//private GameSystem system;
+		private Race armyRace;
+		private int maxPoints;
+		private double pointsTotal;
+		private Dictionary<Category, ArmyCategory> categories;
+
+		public event ObjectAddDelegate UnitAdded;
+		public event ObjectRemoveDelegate UnitRemoved;
+		public event FailedUnitRequirementDelegate FailedRequirement;
+		public event DoubleValChangedDelegate PointsValueChanged;
 		private DoubleValChangedDelegate PointsValueChangedMethod;
 		
 		public Army(Race race, string armyName, int maxArmyPoints) : this(race, armyName, maxArmyPoints, null)
 		{
-		}
-
-		public Army(Race race, string armyName, int maxArmyPoints, ZipFile file) : base(armyName)
-		{
-			armyRace = race;
-			Name = armyName;
-			maxPoints = maxArmyPoints;
-			PointsValueChangedMethod = new DoubleValChangedDelegate(PointsValueChangedHandler);
 		}
-		
-		public ArmyCategory GetCategory(Category cat)
-		{
-			ArmyCategory armyCat = null;
-			ArmyCategories.TryGetValue(cat, out armyCat);
-			return armyCat;
+
+		public Army(Race race, string armyName, int maxArmyPoints, ZipFile file) : base(armyName)
+		{
+			armyRace = race;
+			Name = armyName;
+			maxPoints = maxArmyPoints;
+			PointsValueChangedMethod = new DoubleValChangedDelegate(PointsValueChangedHandler);
+		}
+		
+		public ArmyCategory GetCategory(Category cat)
+		{
+			ArmyCategory armyCat = null;
+			ArmyCategories.TryGetValue(cat, out armyCat);
+			return armyCat;
 		}
 		
 		private Dictionary<Category, ArmyCategory> ArmyCategories
@@ -74,197 +74,194 @@
 				
 				return categories;
 			}
-		}
-
-		public ArmyCategory[] Categories
-		{
-			get 
-			{
-				return DictionaryUtils.ToArray<Category, ArmyCategory>(ArmyCategories);
-			}
-		}
-
-		public Race Race
-		{
-			get { return armyRace; }
-		}
-
-		public GameSystem GameSystem
-		{
-			get { return (armyRace!=null ? armyRace.GameSystem : null); }
-		}
-
-		protected void OnUnitAdded(Unit unit)
-		{
-			OnUnitAdded(unit, null);
-		}
-
-		protected void OnUnitAdded(Unit unit, List<FailedUnitRequirement> failedReqs)
-		{
-			if (UnitAdded!=null)
-			{
-				UnitAdded(unit);
-			}
-
-			if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0)
-			{
-				FailedRequirement(failedReqs);
-			}
-		}
-
-		protected void OnUnitRemoved(Unit unit)
-		{
-			OnUnitRemoved(unit, null);
-		}
-
-		protected void OnUnitRemoved(Unit unit, List<FailedUnitRequirement> failedReqs)
-		{
-			if (UnitRemoved!=null)
-			{
-				UnitRemoved(unit);
-			}
-
-			if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0)
-			{
-				FailedRequirement(failedReqs);
-			}
-		}
-
-		private void OnPointsValueChanged(double oldValue, double newValue)
-		{
-			if (PointsValueChanged!=null)
-			{
-				PointsValueChanged(this, oldValue, newValue);
-			}
+		}
+
+		public ArmyCategory[] Categories
+		{
+			get 
+			{
+				return DictionaryUtils.ToArray<Category, ArmyCategory>(ArmyCategories);
+			}
+		}
+
+		public Race Race
+		{
+			get { return armyRace; }
+		}
+
+		public GameSystem GameSystem
+		{
+			get { return (armyRace!=null ? armyRace.GameSystem : null); }
+		}
+
+		protected void OnUnitAdded(Unit unit)
+		{
+			OnUnitAdded(unit, null);
+		}
+
+		protected void OnUnitAdded(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitAdded!=null)
+			{
+				UnitAdded(unit);
+			}
+
+			if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0)
+			{
+				FailedRequirement(failedReqs);
+			}
 		}
-		
-		private double TotalPoints
-		{
-			get { return pointsTotal; }
-			set
-			{
-				double oldPoints = pointsTotal;
-				pointsTotal = value;
-
-				if (oldPoints!=pointsTotal)
-				{
-					OnPointsValueChanged(oldPoints, pointsTotal);
-				}
-			}
-		}
-
-		public double PointsTotal
-		{
-			get { return TotalPoints; }
+
+		protected void OnUnitRemoved(Unit unit)
+		{
+			OnUnitRemoved(unit, null);
+		}
+
+		protected void OnUnitRemoved(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitRemoved!=null)
+			{
+				UnitRemoved(unit);
+			}
+
+			if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0)
+			{
+				FailedRequirement(failedReqs);
+			}
+		}
+
+		private void OnPointsValueChanged(double oldValue, double newValue)
+		{
+			if (PointsValueChanged!=null)
+			{
+				PointsValueChanged(this, oldValue, newValue);
+			}
+		}
+		
+		private double TotalPoints
+		{
+			get { return pointsTotal; }
+			set
+			{
+				double oldPoints = pointsTotal;
+				pointsTotal = value;
+
+				if (oldPoints!=pointsTotal)
+				{
+					OnPointsValueChanged(oldPoints, pointsTotal);
+				}
+			}
+		}
+
+		public double PointsTotal
+		{
+			get { return TotalPoints; }
 		}
 		
 		public void AddUnit(Unit unit)
 		{
-			List<FailedUnitRequirement> failedReqs = CanAddUnit(unit);
 			unit.Army = this;
 			ArmyCategory armyCat = GetCategory(unit.UnitType.MainCategory);
 			armyCat.AddUnit(unit);
-			OnUnitAdded(unit, failedReqs);
 		}
 		
 		public void RemoveUnit(Unit unit)
 		{
 			List<FailedUnitRequirement> failedReqs = CanRemoveUnit(unit);
 			unit.Army = null;
-			ArmyCategory armyCat = GetCategory(unit.UnitType.MainCategory);
-			armyCat.RemoveUnit(unit);
+			unit.Category.RemoveUnit(unit);
 			OnUnitRemoved(unit, failedReqs);
-		}
-
-		public Unit[] GetUnits(Category cat)
-		{
-			return GetUnits(this.GetCategory(cat));
-		}
-
-		public Unit[] GetUnits(ArmyCategory cat)
-		{
-			return cat.GetUnits();
-		}
-
-		public Unit[] GetUnits()
-		{
-			List<Unit> fullList = new List<Unit>();
-
-			foreach(ArmyCategory cat in Categories)
+		}
+
+		public Unit[] GetUnits(Category cat)
+		{
+			return GetUnits(this.GetCategory(cat));
+		}
+
+		public Unit[] GetUnits(ArmyCategory cat)
+		{
+			return cat.GetUnits();
+		}
+
+		public Unit[] GetUnits()
+		{
+			List<Unit> fullList = new List<Unit>();
+
+			foreach(ArmyCategory cat in Categories)
+			{
+				fullList.AddRange(cat.GetUnits());
+			}
+
+			return fullList.ToArray();
+		}
+
+		public int MaxPoints
+		{
+			get { return maxPoints; }
+			set 
+			{
+				if (value > 0)
+				{
+					maxPoints = value;
+				}
+			}
+		}
+
+		private void PointsValueChangedHandler(WarFoundryObject obj, double oldVal, double newVal)
+		{
+			if (obj is ArmyCategory)
 			{
-				fullList.AddRange(cat.GetUnits());
-			}
-
-			return fullList.ToArray();
-		}
-
-		public int MaxPoints
-		{
-			get { return maxPoints; }
-			set 
-			{
-				if (value > 0)
-				{
-					maxPoints = value;
-				}
-			}
-		}
-
-		private void PointsValueChangedHandler(WarFoundryObject obj, double oldVal, double newVal)
-		{
-			if (obj is ArmyCategory)
-			{
-				double points = 0;
-
-				foreach (ArmyCategory cat in Categories)
-				{
-					points+= cat.PointsTotal;
-				}
-
-				TotalPoints = points;
-			}
-		}
-
-		public List<FailedUnitRequirement> CanAddUnit(Unit unit)
-		{
-			return CanAddUnitType(unit.UnitType);
-		}
-
-		public List<FailedUnitRequirement> CanAddUnitType(UnitType unitType)
-		{
-			return unitType.CanAddToArmy(this);
-		}
-
-		public List<FailedUnitRequirement> CanRemoveUnit(Unit unit)
-		{
-			return CanRemoveUnitType(unit.UnitType);
-		}
-
-		public List<FailedUnitRequirement> CanRemoveUnitType(UnitType unitType)
-		{
-			return unitType.CanRemoveFromArmy(this);
-		}
-
-		public int GetUnitTypeCount(UnitType unitType)
-		{
-			int count = 0;
-
-			foreach (ArmyCategory cat in Categories)
-			{
-				count+= cat.GetUnitTypeCount(unitType);
-			}
-
-			return count;
-		}
-
-		private void Army_UnitAdded(object val)
-		{
-			OnUnitAdded((Unit)val);
-		}
-
-		private void Army_UnitRemoved(object val)
-		{
-			OnUnitRemoved((Unit)val);
-		}
-	}
-}
+				double points = 0;
+
+				foreach (ArmyCategory cat in Categories)
+				{
+					points+= cat.PointsTotal;
+				}
+
+				TotalPoints = points;
+			}
+		}
+
+		public List<FailedUnitRequirement> CanAddUnit(Unit unit)
+		{
+			return CanAddUnitType(unit.UnitType);
+		}
+
+		public List<FailedUnitRequirement> CanAddUnitType(UnitType unitType)
+		{
+			return unitType.CanAddToArmy(this);
+		}
+
+		public List<FailedUnitRequirement> CanRemoveUnit(Unit unit)
+		{
+			return CanRemoveUnitType(unit.UnitType);
+		}
+
+		public List<FailedUnitRequirement> CanRemoveUnitType(UnitType unitType)
+		{
+			return unitType.CanRemoveFromArmy(this);
+		}
+
+		public int GetUnitTypeCount(UnitType unitType)
+		{
+			int count = 0;
+
+			foreach (ArmyCategory cat in Categories)
+			{
+				count+= cat.GetUnitTypeCount(unitType);
+			}
+
+			return count;
+		}
+
+		private void Army_UnitAdded(object val)
+		{
+			OnUnitAdded((Unit)val);
+		}
+
+		private void Army_UnitRemoved(object val)
+		{
+			OnUnitRemoved((Unit)val);
+		}
+	}
+}
--- a/api/Objects/ArmyCategory.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/ArmyCategory.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,160 +2,161 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.Collections.Generic;
-using IBBoard.WarFoundry.API.Requirements;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for ArmyCategory.
-	/// </summary>
-	public class ArmyCategory : WarFoundryObject
-	{
-		private Category category;
-		private Army parentArmy;
-		private double pointsTotal;
-		private List<Unit> units;
-		private Dictionary<string, int> unitTypes;
-		private DoubleValChangedDelegate PointsValueChangedMethod;
-		public event DoubleValChangedDelegate PointsValueChanged;
-		public event ObjectAddDelegate UnitAdded;
-		public event ObjectRemoveDelegate UnitRemoved;
-
-		public ArmyCategory(Army army, Category cat) : base()
-		{
-			parentArmy = army;
-			category = cat;
-			cat.NameChanged+=new StringValChangedDelegate(cat_NameChanged);
-			PointsValueChangedMethod = new DoubleValChangedDelegate(PointsValueChangedHandler);
-			units = new List<Unit>();
-			unitTypes = new Dictionary<string,int>();
-		}
-
-		public Category Category
-		{
-			get { return category; }
-		}
-
-		public Army ParentArmy
-		{
-			get { return parentArmy; }
-		}
-
-		public override string ID
-		{
-			get
-			{
-				return Category.ID;
-			}
-			set
-			{
-				Category.ID = value;
-			}
-		}
-
-		public override string Name
-		{
-			get { return category.Name; }
-			set 
-			{
-				category.Name = value;
-			}
-		}
-
-		internal void AddUnit(Unit unit)
-		{
-			units.Add(unit);
-			unit.Category = this;
+using IBBoard.WarFoundry.API.Requirements;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for ArmyCategory.
+	/// </summary>
+	public class ArmyCategory : WarFoundryObject
+	{
+		private Category category;
+		private Army parentArmy;
+		private double pointsTotal;
+		private List<Unit> units;
+		private Dictionary<string, int> unitTypes;
+		private DoubleValChangedDelegate PointsValueChangedMethod;
+		public event DoubleValChangedDelegate PointsValueChanged;
+		public event ObjectAddDelegate UnitAdded;
+		public event ObjectRemoveDelegate UnitRemoved;
+
+		public ArmyCategory(Army army, Category cat) : base()
+		{
+			parentArmy = army;
+			category = cat;
+			cat.NameChanged+=new StringValChangedDelegate(cat_NameChanged);
+			PointsValueChangedMethod = new DoubleValChangedDelegate(PointsValueChangedHandler);
+			units = new List<Unit>();
+			unitTypes = new Dictionary<string,int>();
+		}
+
+		public Category Category
+		{
+			get { return category; }
+		}
+
+		public Army ParentArmy
+		{
+			get { return parentArmy; }
+		}
+
+		public override string ID
+		{
+			get
+			{
+				return Category.ID;
+			}
+			set
+			{
+				Category.ID = value;
+			}
+		}
+
+		public override string Name
+		{
+			get { return category.Name; }
+			set 
+			{
+				category.Name = value;
+			}
+		}
+
+		internal void AddUnit(Unit unit)
+		{
+			List<FailedUnitRequirement> failedReqs = ParentArmy.CanAddUnit(unit);
+			units.Add(unit);
+			unit.Category = this;
 			unit.PointsValueChanged+= PointsValueChangedMethod;
-			int unitTypeCount;
-			unitTypes.TryGetValue(unit.UnitType.ID, out unitTypeCount);
-			unitTypes[unit.UnitType.ID] = (int)unitTypeCount + 1;
+			int unitTypeCount;
+			unitTypes.TryGetValue(unit.UnitType.ID, out unitTypeCount);
+			unitTypes[unit.UnitType.ID] = (int)unitTypeCount + 1;
 			TotalPoints+= unit.PointsValue;
-			OnUnitAdded(unit);
-		}
-
-		internal void RemoveUnit(Unit unit)
-		{
-			units.Remove(unit);
-			unitTypes[unit.UnitType.ID] = ((int)unitTypes[unit.UnitType.ID])-1;
-			TotalPoints-= unit.PointsValue;
+			OnUnitAdded(unit);
+		}
+
+		internal void RemoveUnit(Unit unit)
+		{
+			units.Remove(unit);
+			unitTypes[unit.UnitType.ID] = ((int)unitTypes[unit.UnitType.ID])-1;
+			TotalPoints-= unit.PointsValue;
 			unit.PointsValueChanged-= PointsValueChangedMethod;
-			OnUnitRemoved(unit);
-		}
-
-		public int GetUnitTypeCount(UnitType unitType)
-		{
-			return unitTypes.ContainsKey(unitType.ID) ? (int)unitTypes[unitType.ID] : 0;
-		}
-
-		public Unit[] GetUnits()
-		{
-			return units.ToArray();
-		}
-
-		private double TotalPoints
-		{
-			get { return pointsTotal; }
-			set 
-			{
-				double oldVal = pointsTotal;
-				pointsTotal = value;
-
-				if (oldVal!=pointsTotal)
-				{
-					OnPointsValueChanged(oldVal, pointsTotal);
-				}
-			}
-		}
-
-		public double PointsTotal
-		{
-			get { return TotalPoints; }
-		}
-
-		private void PointsValueChangedHandler(WarFoundryObject obj, double oldVal, double newVal)
-		{
-			if (obj is Unit)
-			{
-				double diff = newVal - oldVal;
-				TotalPoints+= diff;
-			}
-		}
-
-		private void OnUnitAdded(Unit unit)
-		{
-			if (UnitAdded!=null)
-			{
-				UnitAdded(unit);
-			}
-		}
-
-		private void OnUnitRemoved(Unit unit)
-		{
-			if (UnitRemoved!=null)
-			{
-				UnitRemoved(unit);
-			}
-		}
-
-		protected virtual void OnPointsValueChanged(double oldValue, double newValue)
-		{
-			if (PointsValueChanged!=null)
-			{
-				PointsValueChanged(this, oldValue, newValue);
-			}
-		}
-
-		protected void cat_NameChanged(WarFoundryObject obj, string oldValue, string newValue)
-		{
-			OnNameChanged(oldValue, newValue);
-		}
-				
-		public int GetPointsPercentage()
-		{
-			return (int)Math.Round((PointsTotal / ParentArmy.MaxPoints) * 100, 0);
-		}
-	}
-}
+			OnUnitRemoved(unit);
+		}
+
+		public int GetUnitTypeCount(UnitType unitType)
+		{
+			return unitTypes.ContainsKey(unitType.ID) ? (int)unitTypes[unitType.ID] : 0;
+		}
+
+		public Unit[] GetUnits()
+		{
+			return units.ToArray();
+		}
+
+		private double TotalPoints
+		{
+			get { return pointsTotal; }
+			set 
+			{
+				double oldVal = pointsTotal;
+				pointsTotal = value;
+
+				if (oldVal!=pointsTotal)
+				{
+					OnPointsValueChanged(oldVal, pointsTotal);
+				}
+			}
+		}
+
+		public double PointsTotal
+		{
+			get { return TotalPoints; }
+		}
+
+		private void PointsValueChangedHandler(WarFoundryObject obj, double oldVal, double newVal)
+		{
+			if (obj is Unit)
+			{
+				double diff = newVal - oldVal;
+				TotalPoints+= diff;
+			}
+		}
+
+		private void OnUnitAdded(Unit unit)
+		{
+			if (UnitAdded!=null)
+			{
+				UnitAdded(unit);
+			}
+		}
+
+		private void OnUnitRemoved(Unit unit)
+		{
+			if (UnitRemoved!=null)
+			{
+				UnitRemoved(unit);
+			}
+		}
+
+		protected virtual void OnPointsValueChanged(double oldValue, double newValue)
+		{
+			if (PointsValueChanged!=null)
+			{
+				PointsValueChanged(this, oldValue, newValue);
+			}
+		}
+
+		protected void cat_NameChanged(WarFoundryObject obj, string oldValue, string newValue)
+		{
+			OnNameChanged(oldValue, newValue);
+		}
+				
+		public int GetPointsPercentage()
+		{
+			return (int)Math.Round((PointsTotal / ParentArmy.MaxPoints) * 100, 0);
+		}
+	}
+}
--- a/api/Objects/Category.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/Category.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,27 +2,27 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-using System.Xml;
-using IBBoard.Logging;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// A Category is a definition at the <see cref=" GameSystem"/> or <see cref=" Race"/> level of a group that <see cref=" UnitType"/>s belong to. Each category has a name and a min/max limit on points or percentage of a total army cost that units in the category can total.
-	/// </summary>
-	public class Category : WarFoundryObject
-	{
-		private int minPts = 0;
-		private int maxPts = WarFoundryCore.INFINITY;
-		private int minPc = 0;
-		private int maxPc = 100;
-
-		
-		public Category(string id, string name) : base(id, name)
-		{
+using System;
+using System.Xml;
+using IBBoard.Logging;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// A Category is a definition at the <see cref=" GameSystem"/> or <see cref=" Race"/> level of a group that <see cref=" UnitType"/>s belong to. Each category has a name and a min/max limit on points or percentage of a total army cost that units in the category can total.
+	/// </summary>
+	public class Category : WarFoundryObject
+	{
+		private int minPts = 0;
+		private int maxPts = WarFoundryCore.INFINITY;
+		private int minPc = 0;
+		private int maxPc = 100;
+
+		
+		public Category(string id, string name) : base(id, name)
+		{
 		}
-
+
 		[Obsolete("Use the two argument constructor and the appropriate 'set' methods")]
 		public Category(string id, string name, int minPoints, int maxPoints, int minPercent, int maxPercent, int minChoices, int maxChoices, int baseValue, int incrementValue, int incrementAmount) : base(id, name)
 		{
@@ -30,99 +30,99 @@
 			MaximumPoints = maxPoints;
 			MinimumPercentage = minPercent;
 			MaximumPercentage = maxPercent;
-		}
-
-		protected override string DefaultName()
-		{
-			return "";
+		}
+
+		protected override string DefaultName()
+		{
+			return "";
 		}
 		
 		/// <value>
 		/// Gets or sets the minimum number of points that the units of this category can cost. Note: This should be set AFTER MaximumPoints, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MinimumPoints
-		{
-			get { return minPts; }
-			set
-			{
-				minPts = (value >= 0 ? value : 0);
-				CheckMinimumPoints();
-			}
-		}
+		/// </value>
+		public int MinimumPoints
+		{
+			get { return minPts; }
+			set
+			{
+				minPts = (value >= 0 ? value : 0);
+				CheckMinimumPoints();
+			}
+		}
 		
 		/// <value>
 		/// Gets or sets the maximum number of points that the units of this category can cost. Note: This should be set BEFORE MinimumPoints, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MaximumPoints
-		{
-			get { return maxPts; }
-			set
-			{
-				maxPts = (value >= 0 ? value : WarFoundryCore.INFINITY);
-				CheckMinimumPoints();
-			}
+		/// </value>
+		public int MaximumPoints
+		{
+			get { return maxPts; }
+			set
+			{
+				maxPts = (value >= 0 ? value : WarFoundryCore.INFINITY);
+				CheckMinimumPoints();
+			}
 		}
 		
 		/// <summary>
 		/// Makes sure that the minimum points value isn't more than the maximum points value, hence the warning on the properties
-		/// </summary>
-		private void CheckMinimumPoints()
-		{
+		/// </summary>
+		private void CheckMinimumPoints()
+		{
 			if (MinimumPoints > MaximumPoints && MaximumPoints!=WarFoundryCore.INFINITY)
 			{
 				MinimumPoints = MaximumPoints;
 				LogNotifier.WarnFormat(GetType(), "Category {0} ({1}) had a minimum points limit greater than its maximum points limit.", Name, ID);
-			}
+			}
 		}
 		
 		/// <value>
 		/// Gets or sets the minimum percentage of the total army points value that the units of this category can cost. Note: This should be set AFTER MaximumPercentage, otherwise an unintended default value may be set for the minimum
 		/// </value>
-		public int MinimumPercentage
-		{
-			get { return minPc; }
-			set
-			{
-				minPc = (value >= 0 ? value : 0);
-				CheckMinimumPercentage();
-			}
+		public int MinimumPercentage
+		{
+			get { return minPc; }
+			set
+			{
+				minPc = (value >= 0 ? value : 0);
+				CheckMinimumPercentage();
+			}
 		}
 		
 		/// <value>
 		/// Gets or sets the maximum percentage of the total army points value that the units of this category can cost. Note: This should be set BEFORE MinimumPercentage, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MaximumPercentage
-		{
-			get { return maxPc; }
-			set
-			{
-				if (value < 0)
-				{
-					maxPc = 0;
-				}
-				else if (value > 100)
-				{
-					maxPc = 100;
-				}
-				else
-				{
-					maxPc = value;
-				}
-				
-				CheckMinimumPercentage();
-			}
+		/// </value>
+		public int MaximumPercentage
+		{
+			get { return maxPc; }
+			set
+			{
+				if (value < 0)
+				{
+					maxPc = 0;
+				}
+				else if (value > 100)
+				{
+					maxPc = 100;
+				}
+				else
+				{
+					maxPc = value;
+				}
+				
+				CheckMinimumPercentage();
+			}
 		}
 		
 		/// <summary>
 		/// Makes sure that the minimum percentage value isn't more than the maximum points value, hence the warning on the properties
-		/// </summary>
-		private void CheckMinimumPercentage()
-		{
+		/// </summary>
+		private void CheckMinimumPercentage()
+		{
 			if (MinimumPercentage > MaximumPercentage)
 			{
 				MinimumPercentage = MaximumPercentage;
 				LogNotifier.WarnFormat(GetType(), "Category {0} ({1}) had a minimum percentage limit greater than its maximum percentage limit.", Name, ID);
-			}
-		}
-	}
-}
+			}
+		}
+	}
+}
--- a/api/Objects/EquipmentItem.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/EquipmentItem.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,18 +2,18 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-using System.Xml;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for EquipmentItem.
-	/// </summary>
-	public class EquipmentItem : WarFoundryObject
-	{
+using System;
+using System.Xml;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for EquipmentItem.
+	/// </summary>
+	public class EquipmentItem : WarFoundryObject
+	{
 		private double cost;
-		private string description;
+		private string description;
 		private ArmourType armourType;
 		private Race equipForRace;
 		
@@ -22,30 +22,30 @@
 			equipForRace = race;
 			description = "";
 			armourType = ArmourType.None;
-		}
+		}
 
 		[Obsolete("Use the three argument constructor and the appropriate 'set' methods")]
 		public EquipmentItem(string id, string name, double itemCost, double minimum, double maximum, ArmourType itemArmourType, Race race) : this(id, name, race)
 		{
 			ItemArmourType = itemArmourType;
-		}
-
-		public ArmourType ItemArmourType
-		{
-			get { return armourType; }
-			set { armourType = value; }
-		}
-
-		public double Cost
-		{
-			get { return cost; }
+		}
+
+		public ArmourType ItemArmourType
+		{
+			get { return armourType; }
+			set { armourType = value; }
+		}
+
+		public double Cost
+		{
+			get { return cost; }
 			set
 			{
 				if (value >= 0)
 				{
 					cost = value;
 				}
-			}
+			}
 		}
 		
 		public string Description
@@ -57,16 +57,16 @@
 		public Race EquipmentForRace
 		{
 			get { return equipForRace; }
-		}
-
-		public bool CanBeUsedWithItem(EquipmentItem item)
-		{
-			return CanBeUsedWithArmourType(item.ItemArmourType);
-		}
-
-		public bool CanBeUsedWithArmourType(ArmourType otherItemType)
-		{
-			return (this.ItemArmourType & otherItemType) == 0;
-		}
-	}
-}
+		}
+
+		public bool CanBeUsedWithItem(EquipmentItem item)
+		{
+			return CanBeUsedWithArmourType(item.ItemArmourType);
+		}
+
+		public bool CanBeUsedWithArmourType(ArmourType otherItemType)
+		{
+			return (this.ItemArmourType & otherItemType) == 0;
+		}
+	}
+}
--- a/api/Objects/GameSystem.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/GameSystem.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,26 +2,26 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-using System.Collections.Generic;
-using System.Xml;
-using System.IO;
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.IO;
 using IBBoard.Logging;
-using IBBoard.WarFoundry.API.Factories;
+using IBBoard.WarFoundry.API.Factories;
 using ICSharpCode.SharpZipLib.Zip;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for GameSystem.
-	/// </summary>
-	public class GameSystem : WarFoundryStagedLoadingObject
-	{
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for GameSystem.
+	/// </summary>
+	public class GameSystem : WarFoundryStagedLoadingObject
+	{
 		private bool warnOnError;
-		private bool allowAllies;
-		private Dictionary<string, Category> categories = new Dictionary<string,Category>();
+		private bool allowAllies;
+		private Dictionary<string, Category> categories = new Dictionary<string,Category>();
 		private Dictionary<string, SystemStats> stats = new Dictionary<string,SystemStats>();
-		private string defaultStats;
+		private string defaultStats;
 
 		public GameSystem(string systemID, string systemName, IWarFoundryFactory creatingFactory) : base(systemID, systemName, creatingFactory)
 		{
@@ -37,37 +37,37 @@
 		public void AddCategory(Category cat)
 		{
 			RawCategories[cat.ID] = cat;
-		}
-
-		public Category GetCategory(string id)
+		}
+
+		public Category GetCategory(string id)
 		{
 			EnsureFullyLoaded();
 			Category cat = null;
 			RawCategories.TryGetValue(id, out cat);
-			return cat;
-		}
-
-		public Category[] Categories
-		{
-			get 
+			return cat;
+		}
+
+		public Category[] Categories
+		{
+			get 
 			{ 
-				EnsureFullyLoaded();
-				return DictionaryUtils.ToArray<string, Category>(RawCategories); 
-			}
+				EnsureFullyLoaded();
+				return DictionaryUtils.ToArray<string, Category>(RawCategories); 
+			}
 		}
 		
 		protected Dictionary<string, Category> RawCategories
 		{
 			get { return categories; }
-		}
-
-		public bool WarnOnError
-		{
+		}
+
+		public bool WarnOnError
+		{
 			get
 			{
 				return warnOnError;
-			}
-			set { warnOnError = value; }
+			}
+			set { warnOnError = value; }
 		}
 		
 		public void AddSystemStats(SystemStats sysStats)
@@ -98,17 +98,17 @@
 					defaultStats = value;
 				}
 			}
-		}
-
-		public SystemStats[] SystemStats
-		{
-			get 
+		}
+
+		public SystemStats[] SystemStats
+		{
+			get 
 			{ 
 				EnsureFullyLoaded();
 				SystemStats[] statsArray = new SystemStats[stats.Count];
-				stats.Values.CopyTo(statsArray, 0);
-				return statsArray;
-			}
+				stats.Values.CopyTo(statsArray, 0);
+				return statsArray;
+			}
 		}
 		
 		public SystemStats GetSystemStatsForID(string id)
@@ -122,50 +122,50 @@
 		public Race SystemDefaultRace
 		{
 			get { return WarFoundryLoader.GetDefault().GetRace(this, Race.SYSTEM_DEFAULT_RACE_ID); }
-		}
-
-		public bool Matches(GameSystem otherSystem)
-		{
-			if (otherSystem==null)
-			{
-				return false;
-			}
-
-			return this.ID == otherSystem.ID;
-		}
-
-		public override bool Equals(object obj)
+		}
+
+		public bool Matches(GameSystem otherSystem)
+		{
+			if (otherSystem==null)
+			{
+				return false;
+			}
+
+			return this.ID == otherSystem.ID;
+		}
+
+		public override bool Equals(object obj)
 		{
 			if (obj == null)
 			{
 				return false;		
 			}
-			
-			if (obj.GetType().Equals(this.GetType()))
-			{
-				GameSystem otherSystem = (GameSystem)obj;
-
-				return this.ID == otherSystem.ID && this.Name == otherSystem.Name && ((this.RawCategories == null && otherSystem.RawCategories == null) || this.RawCategories.Equals(otherSystem.RawCategories));
-			}
-			else
-			{
-				return false;
-			}
-		}
-
-		public override int GetHashCode()
-		{
-			return ID.GetHashCode() + Name.GetHashCode() + (RawCategories!=null ? RawCategories.GetHashCode() : 0) + warnOnError.GetHashCode();
-		}
-
-		public bool UnitTypeMaxed(UnitType unitType, Army army)
-		{
-			return unitType.MaxNumber!=WarFoundryCore.INFINITY && army.GetUnitTypeCount(unitType) >= unitType.MaxNumber;
-		}
-
-		public bool UnitTypeMinned(UnitType unitType, Army army)
-		{
-			return army.GetUnitTypeCount(unitType) <= unitType.MinNumber;
+			
+			if (obj.GetType().Equals(this.GetType()))
+			{
+				GameSystem otherSystem = (GameSystem)obj;
+
+				return this.ID == otherSystem.ID && this.Name == otherSystem.Name && ((this.RawCategories == null && otherSystem.RawCategories == null) || this.RawCategories.Equals(otherSystem.RawCategories));
+			}
+			else
+			{
+				return false;
+			}
+		}
+
+		public override int GetHashCode()
+		{
+			return ID.GetHashCode() + Name.GetHashCode() + (RawCategories!=null ? RawCategories.GetHashCode() : 0) + warnOnError.GetHashCode();
+		}
+
+		public bool UnitTypeMaxed(UnitType unitType, Army army)
+		{
+			return unitType.MaxNumber!=WarFoundryCore.INFINITY && army.GetUnitTypeCount(unitType) >= unitType.MaxNumber;
+		}
+
+		public bool UnitTypeMinned(UnitType unitType, Army army)
+		{
+			return army.GetUnitTypeCount(unitType) <= unitType.MinNumber;
 		}
 		
 		public List<EquipmentItem> GetSystemEquipmentList()
@@ -244,6 +244,6 @@
 			}
 			
 			return ability;
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Objects/IWarFoundryObject.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/IWarFoundryObject.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -12,11 +12,11 @@
 		/// <value>
 		/// The unique identifier for the object
 		/// </value>
-		string ID { get; set; }
+		string ID { get; set; }
 
 		/// <value>
 		/// The display name of the WarFoundry object
-		/// </value>
+		/// </value>
 		string Name { get; set;	}
 	}
 }
--- a/api/Objects/Race.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/Race.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,9 +2,9 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-using System.Collections.Generic;
-using System.IO;
+using System;
+using System.Collections.Generic;
+using System.IO;
 using System.Xml;
 using IBBoard.IO;
 using IBBoard.WarFoundry.API.Factories;
@@ -14,13 +14,13 @@
 	public class Race : WarFoundryStagedLoadingObject
 	{		
 		public static string SYSTEM_DEFAULT_RACE_ID = "GameDefault"; 
-		
+		
 		private string subID;
-		private GameSystem system;
-		private Dictionary<Category, Dictionary<string, UnitType>> unitTypesByCat;
-		private Dictionary<string, UnitType> unitTypes = new Dictionary<string,UnitType>();
+		private GameSystem system;
+		private Dictionary<Category, Dictionary<string, UnitType>> unitTypesByCat;
+		private Dictionary<string, UnitType> unitTypes = new Dictionary<string,UnitType>();
 		private Dictionary<string, EquipmentItem> equipment = new Dictionary<string,EquipmentItem>();
-		private Dictionary<string, Ability> abilities = new Dictionary<string,Ability>();
+		private Dictionary<string, Ability> abilities = new Dictionary<string,Ability>();
 		private Dictionary<string, Category> categories = new Dictionary<string,Category>();
 		
 		public Race(string raceID, string raceName, GameSystem gameSystem, IWarFoundryFactory creatingFactory) : this(raceID, "", raceName, gameSystem, creatingFactory)
@@ -41,17 +41,17 @@
 		[Obsolete("Use constructor with GameSystem argument instead")]
 		public Race(string raceID, string raceSubID, string raceName, string gameSystemID, IWarFoundryFactory creatingFactory) : this(raceID, raceSubID, raceName, WarFoundryLoader.GetDefault().GetGameSystem(gameSystemID), creatingFactory)
 		{
-		}
-
-		public string SubID
-		{
-			get { return subID; }
-			set { subID = (value == null ? "" : value.Trim()); }
-		}
-
-		public GameSystem GameSystem
-		{
-			get { return system; }
+		}
+
+		public string SubID
+		{
+			get { return subID; }
+			set { subID = (value == null ? "" : value.Trim()); }
+		}
+
+		public GameSystem GameSystem
+		{
+			get { return system; }
 			set
 			{
 				if (value == null)
@@ -60,13 +60,13 @@
 				}
 				
 				system = value;
-			}
+			}
 		}
 		
 		public void AddCategory(Category cat)
 		{
 			categories[cat.ID] = cat;
-		}
+		}
 
 		/// <summary>
 		/// Gets a category from its ID. Attempts to get the category from the race's overrides, or else it falls back to getting the Game System's category with that ID.
@@ -76,8 +76,8 @@
 		/// </param>
 		/// <returns>
 		/// The <code>Category</code> with the specified ID, or null if one doesn't exist. 
-		/// </returns>
-		public Category GetCategory(string id)
+		/// </returns>
+		public Category GetCategory(string id)
 		{
 			EnsureFullyLoaded();
 			Category cat = null;
@@ -88,12 +88,12 @@
 				cat = GameSystem.GetCategory(id);
 			}
 						
-			return cat;
-		}
+			return cat;
+		}
 
-		public Category[] Categories
-		{
-			get 
+		public Category[] Categories
+		{
+			get 
 			{ 
 				EnsureFullyLoaded();
 				Category[] cats;
@@ -106,14 +106,14 @@
 				{
 					cats = DictionaryUtils.ToArray<string, Category>(categories);
 				}
-				
-				return cats;
-			}
-		}
-
-		public bool HasCategoryOverrides()
-		{
-			return categories.Count > 0;
+				
+				return cats;
+			}
+		}
+
+		public bool HasCategoryOverrides()
+		{
+			return categories.Count > 0;
 		}
 
 		public void AddEquipmentItem(EquipmentItem item)
@@ -129,12 +129,12 @@
 			{
 				AddEquipmentItem(item);
 			}
-		}
-
-		public  EquipmentItem GetEquipmentItem(string id)
+		}
+
+		public  EquipmentItem GetEquipmentItem(string id)
 		{
-			EnsureFullyLoaded();
-			return (EquipmentItem)equipment[id];
+			EnsureFullyLoaded();
+			return (EquipmentItem)equipment[id];
 		}
 		
 		public List<EquipmentItem> GetEquipmentList()
@@ -162,9 +162,9 @@
 			{
 				AddUnitType(type);
 			}
-		}
-
-		public UnitType[] GetUnitTypes(Category cat)
+		}
+
+		public UnitType[] GetUnitTypes(Category cat)
 		{		
 			BuildUnitTypesByCategoryCache();
 			Dictionary<string, UnitType> unitTypesDictionary;
@@ -179,21 +179,21 @@
 			{
 				unitTypesArray = DictionaryUtils.ToArray<string, UnitType>(unitTypesDictionary);
 			}
-			
-			return unitTypesArray;
+			
+			return unitTypesArray;
 		}
 
 		private void CacheUnitType(UnitType unit)
 		{
 			BuildUnitTypesByCategoryCache();
-			Dictionary<string,UnitType> catUnitTypes;
-			unitTypesByCat.TryGetValue(unit.MainCategory, out catUnitTypes);
-
-			if (catUnitTypes == null)
-			{
-				throw new InvalidFileException(String.Format("Unit type {0} with name {1} is a unit of an undefined category", unit.ID, unit.Name));
-			}
-
+			Dictionary<string,UnitType> catUnitTypes;
+			unitTypesByCat.TryGetValue(unit.MainCategory, out catUnitTypes);
+
+			if (catUnitTypes == null)
+			{
+				throw new InvalidFileException(String.Format("Unit type {0} with name {1} is a unit of an undefined category", unit.ID, unit.Name));
+			}
+
 			catUnitTypes.Add(unit.ID, unit);
 		}
 		
@@ -209,22 +209,22 @@
 		{
 			unitTypesByCat = new Dictionary<Category,Dictionary<string,UnitType>>();
 				
-			foreach (Category category in Categories)
-			{ 
-				unitTypesByCat.Add(category, new Dictionary<string, UnitType>());
+			foreach (Category category in Categories)
+			{ 
+				unitTypesByCat.Add(category, new Dictionary<string, UnitType>());
 			}
 			
 			foreach (UnitType unit in unitTypes.Values)
 			{
 				CacheUnitType(unit);
 			}
-		}
-
-		public UnitType GetUnitType(string id)
+		}
+
+		public UnitType GetUnitType(string id)
 		{
 			UnitType type = null;
-			unitTypes.TryGetValue(id, out type);
-			return type;
+			unitTypes.TryGetValue(id, out type);
+			return type;
 		}
 		
 		public List<Ability> GetAbilityList()
@@ -255,13 +255,13 @@
 			abilities.TryGetValue(id, out ability);
 			return ability;
 		}
-		
+		
 		protected virtual Dictionary<string, UnitType> RaceUnitTypes
 		{
 			get { return RaceRawUnitTypes; }
 			set	{ RaceRawUnitTypes = value; }
 		}
-		
+		
 		protected virtual Dictionary<string, EquipmentItem> RaceEquipment
 		{
 			get { return RaceRawEquipment; }
@@ -273,13 +273,13 @@
 			get { return RaceRawAbilities; }
 			set { RaceRawAbilities = value; }
 		}
-		
+		
 		protected Dictionary<string, UnitType> RaceRawUnitTypes
 		{
 			get { return unitTypes; }
 			set	{ unitTypes = value; }
 		}
-		
+		
 		protected Dictionary<string, EquipmentItem> RaceRawEquipment
 		{
 			get { return equipment; }
--- a/api/Objects/Stat.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/Stat.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,34 +2,39 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for Stat.
-	/// </summary>
-	public class Stat
-	{
-		private StatSlot parentStatSlot;
-		private string statString;
-
-		public Stat(StatSlot parentSlot, string statValue)
-		{
-				parentStatSlot = parentSlot;
-				statString = statValue;
-		}
-
-		public StatSlot ParentSlot
-		{
-			get { return parentStatSlot; }
-			set { parentStatSlot = value; }
-		}
-
-		public string SlotValueString
-		{
-			get { return statString; }
-			set { statString = (value == null ? "" : value); }
-		}
-	}
-}
+using System;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for Stat.
+	/// </summary>
+	public class Stat
+	{
+		private StatSlot parentStatSlot;
+		private string statString;
+
+		public Stat(StatSlot parentSlot, string statValue)
+		{
+				parentStatSlot = parentSlot;
+				statString = statValue;
+		}
+
+		public StatSlot ParentSlot
+		{
+			get { return parentStatSlot; }
+			set { parentStatSlot = value; }
+		}
+
+		public string ParentSlotName
+		{
+			get { return ParentSlot.Name; }
+		}
+
+		public string SlotValueString
+		{
+			get { return statString; }
+			set { statString = (value == null ? "" : value); }
+		}
+	}
+}
--- a/api/Objects/StatSlot.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/StatSlot.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,36 +2,36 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-using System.Text.RegularExpressions;
-using System.Xml;
-using IBBoard;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for StatSlot.
-	/// </summary>
-	public class StatSlot
-	{
+using System;
+using System.Text.RegularExpressions;
+using System.Xml;
+using IBBoard;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for StatSlot.
+	/// </summary>
+	public class StatSlot
+	{
 		private string name;
-		private SystemStats sysStats;
-
-		public StatSlot(String statName)
+		private SystemStats sysStats;
+
+		public StatSlot(String statName)
 		{
-			name = statName;
-		}
-
-		public string Name
-		{
-			get { return name; }
-			set { value = name; }
+			name = statName;
+		}
+
+		public string Name
+		{
+			get { return name; }
+			set { value = name; }
 		}
 		
 		public SystemStats SystemStats
 		{
 			get { return sysStats; }
 			set { sysStats = value; }
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Objects/SystemStats.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/SystemStats.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,24 +3,24 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using System.Collections.Generic;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// SystemStats defines the available statistics/attributes that entity types can use (either a unit or an equipment item that has a stats line). Statistic/attribute values will be defined by a <see cref="Stats"/> object.
-	/// </summary>
-	public class SystemStats
-	{
+using System.Collections.Generic;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// SystemStats defines the available statistics/attributes that entity types can use (either a unit or an equipment item that has a stats line). Statistic/attribute values will be defined by a <see cref="Stats"/> object.
+	/// </summary>
+	public class SystemStats
+	{
 		private Dictionary<string, StatSlot> statsByName;
 		private List<StatSlot> stats;
-		private string id;
-
-		public SystemStats(string statsID)
+		private string id;
+
+		public SystemStats(string statsID)
 		{
-			id = statsID;
+			id = statsID;
 			statsByName = new Dictionary<string, StatSlot>();
-			stats = new List<StatSlot>();
+			stats = new List<StatSlot>();
 		}
 
 		public void AddStatSlot(string slotName)
@@ -29,14 +29,14 @@
 			slot.SystemStats = this;
 			statsByName[slot.Name] = slot;
 			stats.Add(slot);
-		}		
-
-		public StatSlot[] StatSlots
-		{
+		}		
+
+		public StatSlot[] StatSlots
+		{
 			get
 			{
 				return stats.ToArray();
-			}
+			}
 		}
 		
 		public StatSlot this[string statName]
@@ -51,15 +51,15 @@
 		{
 			return stats.IndexOf(slot);
 		}
-		
-        public int SlotCount
-        {
-            get { return stats.Count; }
+		
+        public int SlotCount
+        {
+            get { return stats.Count; }
         }
 		
 		public string ID
 		{
 			get { return id; }
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Objects/Unit.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/Unit.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,198 +2,198 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System;
+using System.Collections.Generic;
+using System.Text;
 using System.Xml;
-using IBBoard.Lang;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for UnitInstance.
-	/// </summary>
-	public class Unit : WarFoundryObject
-	{
-		private UnitType type;
-		private int size;
+using IBBoard.Lang;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for UnitInstance.
+	/// </summary>
+	public class Unit : WarFoundryObject
+	{
+		private UnitType type;
+		private int size;
 		private Army army;
-		private Unit parentUnit;
-		private double points;
-		private ArmyCategory cat;
+		private Unit parentUnit;
+		private double points;
+		private ArmyCategory cat;
 		private Dictionary<UnitEquipmentItem, double> equipment = new Dictionary<UnitEquipmentItem, double>();
-		private List<Unit> containedUnits = new List<Unit>();
-		public event DoubleValChangedDelegate PointsValueChanged;
-		public event IntValChangedDelegate UnitSizeChanged;
-		public event DoubleValChangedDelegate UnitEquipmentAmountChanged;
-
-		public Unit(UnitType unitType, Army parentArmy) : this(unitType, unitType.MinSize, parentArmy){}
-
-		public Unit(UnitType unitType, int startSize, Army parentArmy)
-		{
-			Army = parentArmy;
-			type = unitType;
-			Size = startSize;
-			SetInitialEquipment();
-			CalcCost();
-		}
-
-		protected override string DefaultName()
-		{
-			if (type != null)
-			{
-				if (size == 1)
-				{
-					return type.Name;
-				}
-				else
-				{
-					return String.Format(Translation.GetTranslation("defaultUnitName"), size, type.Name);
-				}
-			}
-			else
-			{
-				return "Unknown Unit";
-			}
-		}
-
-		private void SetInitialEquipment()
-		{
-			foreach (UnitEquipmentItem unitEquip in UnitType.GetEquipmentItems())
-			{
-				if (unitEquip.IsRequired)
-				{
-					if (CanEquipWithItem(unitEquip))
-					{
-						equipment[unitEquip] = unitEquip.MinNumber;
-					}
-				}
-			}
-		}
-
-		private void CalcCost()
-		{
-			String oldName = HasDefaultName() ? Name : null;
-			double oldpoints = points;
-			points = type.CostPerTrooper * AdditionalTroopers + type.BaseUnitCost;
-
-			foreach (UnitEquipmentItem unitEquipItem in equipment.Keys)
-			{
-				double count = equipment[unitEquipItem];
-				
-				if (unitEquipItem.IsRatioLimit)
-				{
-					if (unitEquipItem.RoundNumberUp)
-					{
-						points += Math.Ceiling(size * count) * unitEquipItem.Cost;
-					}
-					else
-					{
-						points += Math.Floor(size * count) * unitEquipItem.Cost;
-					}
-				}
-				else
-				{
-					if (count == WarFoundryCore.INFINITY)
-					{
-						points += size * unitEquipItem.Cost;
-					}
-					else
-					{
-						points += count * unitEquipItem.Cost;
-					}
-				}
-			}
-
-			if (oldpoints!=points)
-			{
-				OnPointsValueChanged(oldpoints, points);
-			}
-
-			if (oldName!=null)
-			{
-				OnNameChanged(oldName, Name);
-			}
+		private List<Unit> containedUnits = new List<Unit>();
+		public event DoubleValChangedDelegate PointsValueChanged;
+		public event IntValChangedDelegate UnitSizeChanged;
+		public event DoubleValChangedDelegate UnitEquipmentAmountChanged;
+
+		public Unit(UnitType unitType, Army parentArmy) : this(unitType, unitType.MinSize, parentArmy){}
+
+		public Unit(UnitType unitType, int startSize, Army parentArmy)
+		{
+			Army = parentArmy;
+			type = unitType;
+			Size = startSize;
+			SetInitialEquipment();
+			CalcCost();
+		}
+
+		protected override string DefaultName()
+		{
+			if (type != null)
+			{
+				if (size == 1)
+				{
+					return type.Name;
+				}
+				else
+				{
+					return String.Format(Translation.GetTranslation("defaultUnitName"), size, type.Name);
+				}
+			}
+			else
+			{
+				return "Unknown Unit";
+			}
+		}
+
+		private void SetInitialEquipment()
+		{
+			foreach (UnitEquipmentItem unitEquip in UnitType.GetEquipmentItems())
+			{
+				if (unitEquip.IsRequired)
+				{
+					if (CanEquipWithItem(unitEquip))
+					{
+						equipment[unitEquip] = unitEquip.MinNumber;
+					}
+				}
+			}
+		}
+
+		private void CalcCost()
+		{
+			String oldName = HasDefaultName() ? Name : null;
+			double oldpoints = points;
+			points = type.CostPerTrooper * AdditionalTroopers + type.BaseUnitCost;
+
+			foreach (UnitEquipmentItem unitEquipItem in equipment.Keys)
+			{
+				double count = equipment[unitEquipItem];
+				
+				if (unitEquipItem.IsRatioLimit)
+				{
+					if (unitEquipItem.RoundNumberUp)
+					{
+						points += Math.Ceiling(size * count) * unitEquipItem.Cost;
+					}
+					else
+					{
+						points += Math.Floor(size * count) * unitEquipItem.Cost;
+					}
+				}
+				else
+				{
+					if (count == WarFoundryCore.INFINITY)
+					{
+						points += size * unitEquipItem.Cost;
+					}
+					else
+					{
+						points += count * unitEquipItem.Cost;
+					}
+				}
+			}
+
+			if (oldpoints!=points)
+			{
+				OnPointsValueChanged(oldpoints, points);
+			}
+
+			if (oldName!=null)
+			{
+				OnNameChanged(oldName, Name);
+			}
 		}
 		
 		public int AdditionalTroopers
 		{
 			get { return Math.Max(Size - type.BaseSize, 0); }
-		}
-
-		public int Size
-		{
-			get { return size; }
-			set 
-			{
-				if (value!=size)
-				{
-					int oldValue = size;
-					size = (value>0 ? value : 1);
-					CalcCost();
-					OnUnitSizeChanged(oldValue, size);
-				}
-			}
-		}
-
-		public UnitType UnitType
-		{
-			get { return type; }
-		}
-
-		public Army Army
-		{
-			get { return army; }
-			set 
-			{
-				army = value;
-
-				if (army == null)
-				{
-					Category = null;
-				}
-			}
-		}
-
-		public Race Race
+		}
+
+		public int Size
+		{
+			get { return size; }
+			set 
+			{
+				if (value!=size)
+				{
+					int oldValue = size;
+					size = (value>0 ? value : 1);
+					CalcCost();
+					OnUnitSizeChanged(oldValue, size);
+				}
+			}
+		}
+
+		public UnitType UnitType
 		{
-			get { return UnitType.Race; }
-		}
-
-		public ArmyCategory Category
-		{
-			get 
-			{ 
-				if (cat==null)
+			get { return type; }
+		}
+
+		public Army Army
+		{
+			get { return army; }
+			set 
+			{
+				army = value;
+
+				if (army == null)
+				{
+					Category = null;
+				}
+			}
+		}
+
+		public Race Race
+		{
+			get { return UnitType.Race; }
+		}
+
+		public ArmyCategory Category
+		{
+			get 
+			{ 
+				if (cat==null)
 				{
 					if (Army!=null)
-					{
+					{
 						return Army.GetCategory(UnitType.MainCategory);
 					}
 					else
 					{
 						return null;
-					}
-				}
-				else
-				{
-					return cat; 
-				}
-			}
-			set { cat = value; }
-		}
-
-		public double PointsValue
-		{
-			get 
-			{
-				if (points == 0)
-				{
-					CalcCost();
-				}
-
-				return points;
-			}
+					}
+				}
+				else
+				{
+					return cat; 
+				}
+			}
+			set { cat = value; }
+		}
+
+		public double PointsValue
+		{
+			get 
+			{
+				if (points == 0)
+				{
+					CalcCost();
+				}
+
+				return points;
+			}
 		}
 		
 		public Unit[] ContainedUnits
@@ -238,63 +238,63 @@
 					}
 				}
 			}
-		}
-
-		public UnitEquipmentItem[] GetAllowedOptionalEquipment()
-		{
-			List<UnitEquipmentItem> list = new List<UnitEquipmentItem>();
-
-			foreach (UnitEquipmentItem item in UnitType.GetEquipmentItems())
-			{
-				if (!item.IsRequired)
-				{
-					list.Add(item);
-				}
-			}
-
-			return list.ToArray();
-		}
-
-		public UnitEquipmentItem[] GetEquipment()
-		{
-			return DictionaryUtils.ToKeyArray(equipment);
-		}
-
-		public EquipmentItem[] GetRequiredEquipment()
-		{
-			List<EquipmentItem> list = new List<EquipmentItem>();
-
-			foreach(UnitEquipmentItem item in GetEquipment())
-			{
-				if (item.IsRequired)
-				{
-					list.Add(item.EquipmentItem);
-				}
-			}
-
-			return list.ToArray();
-		}
+		}
+
+		public UnitEquipmentItem[] GetAllowedOptionalEquipment()
+		{
+			List<UnitEquipmentItem> list = new List<UnitEquipmentItem>();
+
+			foreach (UnitEquipmentItem item in UnitType.GetEquipmentItems())
+			{
+				if (!item.IsRequired)
+				{
+					list.Add(item);
+				}
+			}
+
+			return list.ToArray();
+		}
+
+		public UnitEquipmentItem[] GetEquipment()
+		{
+			return DictionaryUtils.ToKeyArray(equipment);
+		}
+
+		public EquipmentItem[] GetRequiredEquipment()
+		{
+			List<EquipmentItem> list = new List<EquipmentItem>();
+
+			foreach(UnitEquipmentItem item in GetEquipment())
+			{
+				if (item.IsRequired)
+				{
+					list.Add(item.EquipmentItem);
+				}
+			}
+
+			return list.ToArray();
+		}
 
 		public double GetEquipmentAmount(UnitEquipmentItem item)
 		{
 			return GetEquipmentAmount(item.ID);
-		}
-
-		public double GetEquipmentAmount(string equipID)
+		}
+
+		public double GetEquipmentAmount(string equipID)
 		{
-			return GetEquipmentAmount(UnitType.GetEquipmentItem(equipID));
+			return GetEquipmentAmount(UnitType.GetEquipmentItem(equipID));
 		}
 		
 		public void SetEquipmentAmount(UnitEquipmentItem equip, int amount)
 		{
-			if (equip.IsRatioLimit)
-			{
-				throw new InvalidOperationException("Equipment with ID "+equip.ID+" for unit of type "+UnitType.ID+" has a ratio limit, not an absolute limit");
-			}
-			
-			if (amount <1 && amount != WarFoundryCore.INFINITY)
-			{
-				amount = 0;
+			if (equip.IsRatioLimit)
+			{
+				throw new InvalidOperationException("Equipment with ID "+equip.ID+" for unit of type "+UnitType.ID+" has a ratio limit, not an absolute limit");
+			}
+			
+			if (amount <1 && amount != WarFoundryCore.INFINITY)
+			{
+				amount = 0;
 			}
 			
 			SetEquipmentAmount(equip, amount);
@@ -320,28 +320,28 @@
 		}
 		
 		private void SetEquipmentAmount(UnitEquipmentItem equip, double amount)
-		{
-			double oldAmount = 0;
-
-			if (equipment.ContainsKey(equip))
-			{
-				oldAmount = equipment[equip];
-			}
-
-			if (amount!=oldAmount)
-			{
-				if (amount != 0)
-				{
-					equipment[equip] = amount;
-				}
-				else
-				{
-					equipment.Remove(equip);
-				}
-
-				OnUnitEquipmentAmountChanged(equip, oldAmount, amount);
-				CalcCost();
-			}
+		{
+			double oldAmount = 0;
+
+			if (equipment.ContainsKey(equip))
+			{
+				oldAmount = equipment[equip];
+			}
+
+			if (amount!=oldAmount)
+			{
+				if (amount != 0)
+				{
+					equipment[equip] = amount;
+				}
+				else
+				{
+					equipment.Remove(equip);
+				}
+
+				OnUnitEquipmentAmountChanged(equip, oldAmount, amount);
+				CalcCost();
+			}
 		}
 		
 		public bool CanEquipWithItem(UnitEquipmentItem item)
@@ -362,40 +362,40 @@
 			}
 
 			return true;
-		}
-
-		public bool CanEquipWithItem(string equipID)
-		{
-			return CanEquipWithItem(UnitType.GetEquipmentItem(equipID));
-		}
-
-		private void OnPointsValueChanged(double oldValue, double newValue)
-		{
-			if (PointsValueChanged!=null)
-			{
-				PointsValueChanged(this, oldValue, newValue);
-			}
-		}
-
-		private void OnUnitSizeChanged(int oldValue, int newValue)
-		{
-			if (UnitSizeChanged!=null)
-			{
-				UnitSizeChanged(this, oldValue, newValue);
-			}
-		}
-
-		private void OnUnitEquipmentAmountChanged(UnitEquipmentItem equip, double oldValue, double newValue)
-		{
-			if (UnitEquipmentAmountChanged!=null)
-			{
-				UnitEquipmentAmountChanged(equip, oldValue, newValue);
-			}
-		}
-
-		public Stat[] UnitStatsArray
-		{
-			get { return UnitType.UnitStatsArray; }
+		}
+
+		public bool CanEquipWithItem(string equipID)
+		{
+			return CanEquipWithItem(UnitType.GetEquipmentItem(equipID));
+		}
+
+		private void OnPointsValueChanged(double oldValue, double newValue)
+		{
+			if (PointsValueChanged!=null)
+			{
+				PointsValueChanged(this, oldValue, newValue);
+			}
+		}
+
+		private void OnUnitSizeChanged(int oldValue, int newValue)
+		{
+			if (UnitSizeChanged!=null)
+			{
+				UnitSizeChanged(this, oldValue, newValue);
+			}
+		}
+
+		private void OnUnitEquipmentAmountChanged(UnitEquipmentItem equip, double oldValue, double newValue)
+		{
+			if (UnitEquipmentAmountChanged!=null)
+			{
+				UnitEquipmentAmountChanged(equip, oldValue, newValue);
+			}
+		}
+
+		public Stat[] UnitStatsArray
+		{
+			get { return UnitType.UnitStatsArray; }
 		}
 
 		public Stat[] UnitStatsArrayWithName
@@ -406,6 +406,6 @@
 		public string GetStatValue(string statName)
 		{
 			return UnitType.GetStatValue(statName);
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Objects/UnitEquipmentItem.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/UnitEquipmentItem.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,18 +2,18 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.Xml;
-using IBBoard.Lang;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for UnitEquipmentItem.
-	/// </summary>
-	public class UnitEquipmentItem : WarFoundryObject
+using IBBoard.Lang;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for UnitEquipmentItem.
+	/// </summary>
+	public class UnitEquipmentItem : WarFoundryObject
 	{
-		private EquipmentItem item;
+		private EquipmentItem item;
 		private bool required;
 		private bool roundUp;
 		private int minNum;
@@ -21,9 +21,9 @@
 		private double minPercentage;
 		private double maxPercentage;
 		private double costMultiplier;
-		private RoundType roundType;
-		private string mutexGroup;
-		private UnitType unitType;
+		private RoundType roundType;
+		private string mutexGroup;
+		private UnitType unitType;
 
 		protected UnitEquipmentItem(EquipmentItem equipmentItem, UnitType equipForType)
 		{
@@ -44,14 +44,14 @@
 		public string EquipmentItemID
 		{
 			get { return item.ID; }
-		}
-
-        public double Cost
-        {
+		}
+
+        public double Cost
+        {
             get
 			{
 				return IBBMath.Round(EquipmentItem.Cost * CostMultiplier, CostRoundType);
-			}
+			}
         }
 
 		public double CostMultiplier
@@ -70,36 +70,36 @@
 			{
 				roundType = value;
 			}	
-		}
-
-		public bool IsRequired
-		{
-			get { return required; }
-			set { required = value; }
-		}
-
-		public bool RoundNumberUp
-		{
-			get { return roundUp; }
-			set { roundUp = value; }
-		}
-
-		public string MutexGroup
-		{
-			get { return mutexGroup; }
-			set { mutexGroup = (value == null ? "" : value.Trim()); }
-		}
-
-		public UnitType EquipmentForUnit
-		{
-			get { return unitType; }
-			set 
-			{ 
-				if (value != null)
-				{
-					unitType = value;
-				}
-			}
+		}
+
+		public bool IsRequired
+		{
+			get { return required; }
+			set { required = value; }
+		}
+
+		public bool RoundNumberUp
+		{
+			get { return roundUp; }
+			set { roundUp = value; }
+		}
+
+		public string MutexGroup
+		{
+			get { return mutexGroup; }
+			set { mutexGroup = (value == null ? "" : value.Trim()); }
+		}
+
+		public UnitType EquipmentForUnit
+		{
+			get { return unitType; }
+			set 
+			{ 
+				if (value != null)
+				{
+					unitType = value;
+				}
+			}
 		}
 		
 		public bool IsRatioLimit
@@ -157,29 +157,29 @@
 				}
 				//TODO: Check Min<Max
 			}
-		}
-
-		public EquipmentItem EquipmentItem
-		{
-			get { return item; }
-		}
-
-		public override string ToString()
-		{
-			return EquipmentItem.Name+ " ("+EquipmentItem.Cost+"pts each)";
-		}
-
-		public bool HasAlternatives()
-		{
-			if (MutexGroup=="")
-			{
-				return false;
-			}
-			else
-			{
-				//If the number of items in the MutEx group is greater than one then it must be this item plus another
-				return EquipmentForUnit.GetEquipmentItemsByExclusionGroup(MutexGroup).Length > 1;
-			}
+		}
+
+		public EquipmentItem EquipmentItem
+		{
+			get { return item; }
+		}
+
+		public override string ToString()
+		{
+			return EquipmentItem.Name+ " ("+EquipmentItem.Cost+"pts each)";
+		}
+
+		public bool HasAlternatives()
+		{
+			if (MutexGroup=="")
+			{
+				return false;
+			}
+			else
+			{
+				//If the number of items in the MutEx group is greater than one then it must be this item plus another
+				return EquipmentForUnit.GetEquipmentItemsByExclusionGroup(MutexGroup).Length > 1;
+			}
 		}
 
 		public ArmourType ItemArmourType
@@ -224,6 +224,6 @@
 					return amount.ToString();
 				}
 			}
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Objects/UnitType.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/UnitType.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,41 +3,41 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Xml;
 using IBBoard.Logging;
-using IBBoard.WarFoundry.API.Requirements;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// A UnitType is a type for a <see cref=" Unit"/>, normally relating to an entry in an army list. The UnitType defines the name, cost, minimum and maximum limits of a unit, and the equipment units of the type can take.
-	/// </summary>
-	public class UnitType : WarFoundryObject
+using IBBoard.WarFoundry.API.Requirements;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// A UnitType is a type for a <see cref=" Unit"/>, normally relating to an entry in an army list. The UnitType defines the name, cost, minimum and maximum limits of a unit, and the equipment units of the type can take.
+	/// </summary>
+	public class UnitType : WarFoundryObject
 	{
 		private Category mainCat;
-		private Race race;
-		private int min, max, baseSize = 0;
+		private Race race;
+		private int min, max, baseSize = 0;
 		private int minSize, maxSize;
-		private double baseUnitCost;
-		private double costPerTrooper;
-		private Stats stats;
-		private List<UnitRequirement> requirements = new List<UnitRequirement>();
-		private Dictionary<string, UnitEquipmentItem> equipment = new Dictionary<string, UnitEquipmentItem>();
-		private Dictionary<string, List<UnitEquipmentItem>> equipmentExclusionGroups = new Dictionary<string, List<UnitEquipmentItem>>();
+		private double baseUnitCost;
+		private double costPerTrooper;
+		private Stats stats;
+		private List<UnitRequirement> requirements = new List<UnitRequirement>();
+		private Dictionary<string, UnitEquipmentItem> equipment = new Dictionary<string, UnitEquipmentItem>();
+		private Dictionary<string, List<UnitEquipmentItem>> equipmentExclusionGroups = new Dictionary<string, List<UnitEquipmentItem>>();
 		private List<string> equipmentKeyOrder = new List<string>();
 		private Dictionary<string, Ability> requiredAbilities = new Dictionary<string, Ability>();
 		private Dictionary<string, Ability> optionalAbilities = new Dictionary<string, Ability>();
 		private String notes = "";
 		private List<UnitType> containedTypes = new List<UnitType>();
-		private Dictionary<string, string> extraData = new Dictionary<string, string>();
-
-
-		public UnitType(string id, string typeName, Race parentRace) : base(id, typeName)
-		{
-			race = parentRace;
-		}
-
+		private Dictionary<string, string> extraData = new Dictionary<string, string>();
+
+
+		public UnitType(string id, string typeName, Race parentRace) : base(id, typeName)
+		{
+			race = parentRace;
+		}
+
 		[Obsolete("Use three parameter constructor and setters")]
 		public UnitType(string id, string typeName, string mainCategoryID, string[] allCategoryIDs, int minNum, int maxNum, int minimumSize, int maximumSize, double unitCost, double trooperCost, Stats unitStats, UnitRequirement[] unitRequirements, Race parentRace) : this (id, typeName, parentRace)
 		{
@@ -48,13 +48,13 @@
 			MaxSize = maximumSize;
 			BaseUnitCost = unitCost;
 			CostPerTrooper = trooperCost;
-			SetUnitStats(unitStats);
-
-			foreach (UnitRequirement requirement in requirements)
-			{
-				AddRequirement(requirement);
+			SetUnitStats(unitStats);
+
+			foreach (UnitRequirement requirement in requirements)
+			{
+				AddRequirement(requirement);
 			}
-		}
+		}
 
 		public GameSystem GameSystem
 		{
@@ -63,101 +63,101 @@
 		
 		/// <value>
 		/// Gets the <see cref=" Race"/> that this unit belongs to.
-		/// </value>
-		public Race Race
-		{
-			get { return race; }
-		}
+		/// </value>
+		public Race Race
+		{
+			get { return race; }
+		}
 
 		/// <value>
 		/// Gets or sets the <see cref=" Category"/> that this unit type is a member of.
-		/// </value>
-		public virtual Category MainCategory
-		{
+		/// </value>
+		public virtual Category MainCategory
+		{
 			get
 			{					
 				return mainCat;
-			}
-			set
-			{
-				mainCat = value;
-			}
-		}
+			}
+			set
+			{
+				mainCat = value;
+			}
+		}
 
 		/// <value>
 		/// Gets or sets the minimum size of each unit of this type. Note: This should be set AFTER MaxSize, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MinSize
-		{
-			get { return minSize; }
-			set
+		/// </value>
+		public int MinSize
+		{
+			get { return minSize; }
+			set
 			{
-				minSize = (value >= 0 ? value : 0);
-				CheckMinimumSize();
-			}
-		}
+				minSize = (value >= 0 ? value : 0);
+				CheckMinimumSize();
+			}
+		}
 
 		/// <value>
 		/// Gets or sets the maximum size of each unit of this type. Note: This should be set BEFORE MinSize, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MaxSize
-		{
-			get { return maxSize; }
-			set
-			{
-				maxSize = (value >= 0 ? value : WarFoundryCore.INFINITY);
-				CheckMinimumSize();
-			}
+		/// </value>
+		public int MaxSize
+		{
+			get { return maxSize; }
+			set
+			{
+				maxSize = (value >= 0 ? value : WarFoundryCore.INFINITY);
+				CheckMinimumSize();
+			}
 		}
-		
+		
 		/// <value>
 		/// Gets or sets the minimum number of units of this type that must be taken in an army. Note: This should be set AFTER MaxNumber, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MinNumber
-		{
-			get { return min; }
-			set
+		/// </value>
+		public int MinNumber
+		{
+			get { return min; }
+			set
 			{
-				min = (value >= 0 ? value : 0);
-				CheckMinimumNumber();
-			}
-		}
+				min = (value >= 0 ? value : 0);
+				CheckMinimumNumber();
+			}
+		}
 
 		/// <value>
 		/// Gets or sets the maximum number of units of this type that can be taken in an army. Note: This should be set BEFORE MinNumber, otherwise an unintended default value may be set for the minimum
-		/// </value>
-		public int MaxNumber
-		{
-			get { return max; }
-			set
-			{
-				max = (value >= 0 ? value : WarFoundryCore.INFINITY);
-				CheckMinimumNumber();
-			}
-		}
+		/// </value>
+		public int MaxNumber
+		{
+			get { return max; }
+			set
+			{
+				max = (value >= 0 ? value : WarFoundryCore.INFINITY);
+				CheckMinimumNumber();
+			}
+		}
 
 		/// <summary>
 		/// Makes sure that the minimum number isn't more than the maximum number, hence the warning on the properties
-		/// </summary>
-		private void CheckMinimumNumber()
-		{
+		/// </summary>
+		private void CheckMinimumNumber()
+		{
 			if (MinNumber > MaxNumber && MaxNumber!=WarFoundryCore.INFINITY)
 			{
 				MinNumber = MaxNumber;
 				LogNotifier.WarnFormat(GetType(), "Unit type {0} ({1}) had a minimum number greater than their maximum number.", Name, ID);
-			}
-		}
+			}
+		}
 
 		/// <summary>
 		/// Makes sure that the minimum unit size isn't more than the maximum unit size, hence the warning on the properties
-		/// </summary>
-		private void CheckMinimumSize()
-		{
+		/// </summary>
+		private void CheckMinimumSize()
+		{
 			if (MinSize > MaxSize && MaxSize!=WarFoundryCore.INFINITY)
 			{
 				MinSize = MaxSize;
 				LogNotifier.WarnFormat(GetType(), "Unit type {0} ({1}) had a minimum size greater than their maximum size.", Name, ID);
-			}
+			}
 		}
 		
 		//// <value>
@@ -174,33 +174,33 @@
 		/// </value>
 		public double BaseUnitCost
 		{
-			get { return baseUnitCost; }
+			get { return baseUnitCost; }
 			set { baseUnitCost = (value >= 0 ? value : 0); }
-		}
+		}
 
 		//// <value>
 		/// The cost of an individual trooper. This value is the cost for a basic trooper without weapons, which are added on top of the cost before calculating a unit cost.
-		/// </value>
-		public double CostPerTrooper
-		{
-			get { return costPerTrooper; }
-			set { costPerTrooper = (value >= 0 ? value : 0); }
-		}
-
-		protected override string DefaultName()
-		{
-			throw new InvalidOperationException("Unit type with id "+id+" did not have a name specified");
-		}
+		/// </value>
+		public double CostPerTrooper
+		{
+			get { return costPerTrooper; }
+			set { costPerTrooper = (value >= 0 ? value : 0); }
+		}
+
+		protected override string DefaultName()
+		{
+			throw new InvalidOperationException("Unit type with id "+id+" did not have a name specified");
+		}
 
 		/// <value>
 		/// The set of <see cref="Stat"/>s for the unit in a format that is valid for the game system.
-		/// </value>
-		public Stat[] UnitStatsArray
-		{
-			get 
-			{
-				return stats.StatsArray;
-			}
+		/// </value>
+		public Stat[] UnitStatsArray
+		{
+			get 
+			{
+				return stats.StatsArray;
+			}
 		}
 
 		//// <value>
@@ -250,7 +250,7 @@
 				
 				items.Add(item);
 			}
-		}
+		}
 
 		/// <summary>
 		/// Gets a <see cref="UnitEquipmentItem"/> for the given ID string, or <code>null</code> if nothing exists for that ID
@@ -260,10 +260,10 @@
 		/// </param>
 		/// <returns>
 		/// The <see cref="UnitEquipmentItem"/> for the given ID string, or <code>null</code> if nothing exists for that ID
-		/// </returns>
-		public UnitEquipmentItem GetEquipmentItem(string id)
+		/// </returns>
+		public UnitEquipmentItem GetEquipmentItem(string id)
 		{
-			return DictionaryUtils.GetValue(equipment, id);
+			return DictionaryUtils.GetValue(equipment, id);
 		}
 		
 		/// <summary>
@@ -278,17 +278,17 @@
 		public UnitEquipmentItem GetEquipmentItem(EquipmentItem item)
 		{
 			return GetEquipmentItem(item.ID);
-		}
+		}
 
 		/// <summary>
 		/// Gets an array of all available <see cref="UnitEquipmentItem"/>s for this UnitType
 		/// </summary>
 		/// <returns>
 		/// An array of all available <see cref="UnitEquipmentItem"/>s for this UnitType
-		/// </returns>
-		public UnitEquipmentItem[] GetEquipmentItems()
-		{
-			return DictionaryUtils.ToArray<string, UnitEquipmentItem>(equipment);
+		/// </returns>
+		public UnitEquipmentItem[] GetEquipmentItems()
+		{
+			return DictionaryUtils.ToArray<string, UnitEquipmentItem>(equipment);
 		}
 
 		public UnitEquipmentItem[] GetEquipmentItemsByExclusionGroup(string group)
@@ -342,23 +342,23 @@
 					optionalAbilities[id] = ability;
 				}
 			}
-		}
-
-		public void AddRequirement(UnitRequirement requirement)
-		{
-			requirements.Add(requirement);
+		}
+
+		public void AddRequirement(UnitRequirement requirement)
+		{
+			requirements.Add(requirement);
 		}
 		
 		public UnitRequirement[] Requirements
 		{
 			get { return requirements.ToArray(); }
-		}
+		}
 		
 		public List<FailedUnitRequirement> CanAddToArmy(Army army)
 		{
 			List<FailedUnitRequirement> failures = new List<FailedUnitRequirement>();
 			
-			if (requirements!=null && requirements.Count > 0)
+			if (requirements!=null && requirements.Count > 0)
 			{
 				foreach (UnitRequirement requirement in requirements)
 				{
@@ -378,7 +378,7 @@
 		{
 			List<FailedUnitRequirement> failures = new List<FailedUnitRequirement>();
 			
-			if (requirements!=null && requirements.Count > 0)
+			if (requirements!=null && requirements.Count > 0)
 			{
 				foreach (UnitRequirement requirement in requirements)
 				{
@@ -428,6 +428,6 @@
 		public string GetExtraData(string id)
 		{
 			return DictionaryUtils.GetValue(extraData, id);
-		}
-	}
+		}
+	}
 }
\ No newline at end of file
--- a/api/Objects/WarFoundryObject.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Objects/WarFoundryObject.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,17 +3,17 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using IBBoard.WarFoundry.API.Factories;
-
-namespace IBBoard.WarFoundry.API.Objects
-{
-	/// <summary>
-	/// Summary description for WarFoundryObject.
-	/// </summary>
-	public abstract class WarFoundryObject : IWarFoundryObject
+using IBBoard.WarFoundry.API.Factories;
+
+namespace IBBoard.WarFoundry.API.Objects
+{
+	/// <summary>
+	/// Summary description for WarFoundryObject.
+	/// </summary>
+	public abstract class WarFoundryObject : IWarFoundryObject
 	{
-		protected string id;
-		protected string name;
+		protected string id;
+		protected string name;
 		public event StringValChangedDelegate NameChanged;
 		
 		protected WarFoundryObject()
@@ -28,10 +28,10 @@
 		protected WarFoundryObject(string objId, string objName) : this(objName)
 		{
 			ID = objId;
-		}	
-
-		public virtual string ID
-		{
+		}	
+
+		public virtual string ID
+		{
 			get
 			{
 				if (id == null)
@@ -41,56 +41,56 @@
 				
 				return id;
 			}
-			
-			set { id = (value == null ? GenerateID() : value.Trim()); }
-		}
-
-		public virtual string Name
-		{
-			get 
-			{
-				if (HasDefaultName())
-				{
-					return DefaultName();
-				}
-				else
-				{
-					return name;
-				} 
-			}
-			set 
-			{ 
-				string oldValue = name;
-				name = value;
-
-				if (name!=oldValue)
-				{
-					OnNameChanged(oldValue, name);
-				}
-			}
-		}
-
-		protected bool HasDefaultName()
-		{
-			return (name == null || name == "");
-		}
-
-		protected void OnNameChanged(string oldValue, string newValue)
-		{
-			if (NameChanged!=null)
-			{
-				NameChanged(this, oldValue, newValue);
-			}
-		}
-
-		protected virtual string DefaultName()
-		{
-			return "-";
-		}
-
-		protected string GenerateID()
-		{
-			return "ID" + UnixTimestamp.GetTimestamp(DateTime.Now) + "." + DateTime.Now.Millisecond;
-		}
-	}
-}
+			
+			set { id = (value == null ? GenerateID() : value.Trim()); }
+		}
+
+		public virtual string Name
+		{
+			get 
+			{
+				if (HasDefaultName())
+				{
+					return DefaultName();
+				}
+				else
+				{
+					return name;
+				} 
+			}
+			set 
+			{ 
+				string oldValue = name;
+				name = value;
+
+				if (name!=oldValue)
+				{
+					OnNameChanged(oldValue, name);
+				}
+			}
+		}
+
+		protected bool HasDefaultName()
+		{
+			return (name == null || name == "");
+		}
+
+		protected void OnNameChanged(string oldValue, string newValue)
+		{
+			if (NameChanged!=null)
+			{
+				NameChanged(this, oldValue, newValue);
+			}
+		}
+
+		protected virtual string DefaultName()
+		{
+			return "-";
+		}
+
+		protected string GenerateID()
+		{
+			return "ID" + UnixTimestamp.GetTimestamp(DateTime.Now) + "." + DateTime.Now.Millisecond;
+		}
+	}
+}
--- a/api/Requirements/AbstractFailedRequirement.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/AbstractFailedRequirement.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -14,7 +14,7 @@
 		{
 			failedReq = req;
 		}
-		
+		
 		public abstract string Description { get; }
 	}
 }
--- a/api/Requirements/AbstractRequirement.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/AbstractRequirement.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -11,7 +11,7 @@
 	/// The base class for Requirements. Specific types of abstract requirement should extend this class.
 	/// </summary>
 	public abstract class AbstractRequirement
-	{				
+	{				
 		public abstract string Description { get; }
 		public abstract AbstractFailedRequirement CanAddToWarFoundryObject(WarFoundryObject obj);
 		public abstract AbstractFailedRequirement CanRemoveFromWarFoundryObject(WarFoundryObject obj);
--- a/api/Requirements/Delegates.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/Delegates.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -6,6 +6,6 @@
 using System.Collections.Generic;
 
 namespace IBBoard.WarFoundry.API.Requirements
-{
+{
 	public delegate void FailedUnitRequirementDelegate(List<FailedUnitRequirement> failedRequirements);
 }
--- a/api/Requirements/FailedUnitRequirement.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/FailedUnitRequirement.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,14 +2,14 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitRequirement.
-	/// </summary>
-	public class FailedUnitRequirement : AbstractFailedRequirement
+using System;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitRequirement.
+	/// </summary>
+	public class FailedUnitRequirement : AbstractFailedRequirement
 	{
 		public FailedUnitRequirement(UnitRequirement requirement) : base(requirement)
 		{
@@ -19,6 +19,6 @@
 		{
 			get { return failedReq.Description; }
 		}
-
-	}
-}
+
+	}
+}
--- a/api/Requirements/RequirementAND.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/RequirementAND.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -5,62 +5,62 @@
 using System;
 using System.Collections.Generic;
 using IBBoard.Lang;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for RequirementAND.
-	/// </summary>
-	public class RequirementAND : AbstractRequirement
-	{
-		private static string and;
-
-		static RequirementAND()
-		{
-			and = Translation.GetTranslation("requirement_and", true);
-
-			if (and == null)
-			{
-				and = "{0}; and {1}";
-			}
-		}
-
-		private AbstractRequirement reqA, reqB;
-
-		public RequirementAND(AbstractRequirement requirementA, AbstractRequirement requirementB)
-		{
-			reqA = requirementA;
-			reqB = requirementB;
-		}
-
-		public override AbstractFailedRequirement CanAddToWarFoundryObject(WarFoundryObject obj)
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for RequirementAND.
+	/// </summary>
+	public class RequirementAND : AbstractRequirement
+	{
+		private static string and;
+
+		static RequirementAND()
+		{
+			and = Translation.GetTranslation("requirement_and", true);
+
+			if (and == null)
+			{
+				and = "{0}; and {1}";
+			}
+		}
+
+		private AbstractRequirement reqA, reqB;
+
+		public RequirementAND(AbstractRequirement requirementA, AbstractRequirement requirementB)
+		{
+			reqA = requirementA;
+			reqB = requirementB;
+		}
+
+		public override AbstractFailedRequirement CanAddToWarFoundryObject(WarFoundryObject obj)
 		{	
 			FailedRequirement failed = null;
-			
+			
 			if (reqA.CanAddToWarFoundryObject(obj) !=null || reqB.CanAddToWarFoundryObject(obj)!=null)
 			{
 				failed = new FailedRequirement(this);
 			}
 			
-			return failed;
-		}
-
-		public override AbstractFailedRequirement CanRemoveFromWarFoundryObject(WarFoundryObject obj)
+			return failed;
+		}
+
+		public override AbstractFailedRequirement CanRemoveFromWarFoundryObject(WarFoundryObject obj)
 		{
 			FailedRequirement failed = null;
-			
+			
 			if (reqA.CanRemoveFromWarFoundryObject(obj) !=null || reqB.CanRemoveFromWarFoundryObject(obj)!=null)
 			{
 				failed = new FailedRequirement(this);
 			}
 			
-			return failed;
-		}
-
-		public override string Description 
-		{
-			get { return String.Format(and, reqA.Description, reqB.Description); }
-		}
-	}
-}
+			return failed;
+		}
+
+		public override string Description 
+		{
+			get { return String.Format(and, reqA.Description, reqB.Description); }
+		}
+	}
+}
--- a/api/Requirements/RequirementOR.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/RequirementOR.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,65 +2,65 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.Collections.Generic;
 using IBBoard.Lang;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitRequirementOR.
-	/// </summary>
-	public class RequirementOR : AbstractRequirement
-	{
-		private static string or;
-
-		static RequirementOR()
-		{
-			or = Translation.GetTranslation("requirement_or", true);
-
-			if (or == null)
-			{
-				or = "{0} or {1}";
-			}
-		}
-
-		private AbstractRequirement reqA, reqB;
-
-		public RequirementOR(AbstractRequirement requirementA, AbstractRequirement requirementB)
-		{
-			reqA = requirementA;
-			reqB = requirementB;
-		}
-
-		public override AbstractFailedRequirement CanAddToWarFoundryObject(WarFoundryObject obj)
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitRequirementOR.
+	/// </summary>
+	public class RequirementOR : AbstractRequirement
+	{
+		private static string or;
+
+		static RequirementOR()
+		{
+			or = Translation.GetTranslation("requirement_or", true);
+
+			if (or == null)
+			{
+				or = "{0} or {1}";
+			}
+		}
+
+		private AbstractRequirement reqA, reqB;
+
+		public RequirementOR(AbstractRequirement requirementA, AbstractRequirement requirementB)
+		{
+			reqA = requirementA;
+			reqB = requirementB;
+		}
+
+		public override AbstractFailedRequirement CanAddToWarFoundryObject(WarFoundryObject obj)
 		{		
 			FailedRequirement failed = null;
-			
+			
 			if (reqA.CanAddToWarFoundryObject(obj) !=null && reqB.CanAddToWarFoundryObject(obj)!=null)
 			{
 				failed = new FailedRequirement(this);
 			}
 			
-			return failed;
-		}
-
-		public override AbstractFailedRequirement CanRemoveFromWarFoundryObject(WarFoundryObject obj)
+			return failed;
+		}
+
+		public override AbstractFailedRequirement CanRemoveFromWarFoundryObject(WarFoundryObject obj)
 		{		
 			FailedRequirement failed = null;
-			
+			
 			if (reqA.CanRemoveFromWarFoundryObject(obj)!=null && reqB.CanRemoveFromWarFoundryObject(obj)!=null)
 			{
 				failed = new FailedRequirement(this);
 			}
 			
-			return failed;
-		}
-
-		public override string Description 
-		{
-			get { return String.Format(or, reqA.Description, reqB.Description); }
-		}
-	}
-}
+			return failed;
+		}
+
+		public override string Description 
+		{
+			get { return String.Format(or, reqA.Description, reqB.Description); }
+		}
+	}
+}
--- a/api/Requirements/UnitExcludesRequirement.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitExcludesRequirement.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -4,50 +4,50 @@
 
 using System;
 using System.Collections.Generic;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitExcludesRequirement.
-	/// </summary>
-	public class UnitExcludesRequirement : UnitRequirement
-	{
-		private UnitRequirementItem[] excludingTypes;
-
-		public UnitExcludesRequirement(UnitType type, UnitRequirementItem[] excludingUnitTypes) : base(type)
-		{
-			excludingTypes = excludingUnitTypes;
-		}
-
-		public override string Description
-		{
-			get 
-			{
-				return "Some units are already included that excluded this unit";
-			}
-		}
-
-		protected override AbstractFailedRequirement CanAddToArmy(Army army, UnitType type)
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitExcludesRequirement.
+	/// </summary>
+	public class UnitExcludesRequirement : UnitRequirement
+	{
+		private UnitRequirementItem[] excludingTypes;
+
+		public UnitExcludesRequirement(UnitType type, UnitRequirementItem[] excludingUnitTypes) : base(type)
+		{
+			excludingTypes = excludingUnitTypes;
+		}
+
+		public override string Description
+		{
+			get 
+			{
+				return "Some units are already included that excluded this unit";
+			}
+		}
+
+		protected override AbstractFailedRequirement CanAddToArmy(Army army, UnitType type)
 		{		
-			FailedUnitRequirement failed = null;
-
-			for (int i = 0; i<excludingTypes.Length; i++)
-			{
-				if (army.GetUnitTypeCount(excludingTypes[i].UnitType) > 0)
-				{
+			FailedUnitRequirement failed = null;
+
+			for (int i = 0; i<excludingTypes.Length; i++)
+			{
+				if (army.GetUnitTypeCount(excludingTypes[i].UnitType) > 0)
+				{
 					failed = new FailedUnitRequirement(this);
-					break;
-				}
+					break;
+				}
 			}
 			
-			return failed;
-		}
-
-		protected override AbstractFailedRequirement CanRemoveFromArmy(Army army, UnitType type)
-		{
-			return null;
-		}
-
-	}
-}
+			return failed;
+		}
+
+		protected override AbstractFailedRequirement CanRemoveFromArmy(Army army, UnitType type)
+		{
+			return null;
+		}
+
+	}
+}
--- a/api/Requirements/UnitExclusion.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitExclusion.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,44 +2,44 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.Text;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitMaxNumberRequirement.
-	/// </summary>
-	public class UnitExclusion : FailedUnitRequirement
-	{
-		private string unitList;
-		private UnitType type;
-
-		public UnitExclusion(UnitRequirement req, UnitType unitType, UnitType[] excludingTypes) : base(req)
-		{
-			type = unitType;
-
-			if (excludingTypes.Length > 1)
-			{
-				StringBuilder sb = new StringBuilder(excludingTypes[0].Name);
-
-				for (int i = 1; i<excludingTypes.Length; i++)
-				{
-					sb.Append(", "+excludingTypes[i].Name);
-				}
-
-				unitList = sb.ToString();
-			}
-			else
-			{
-				unitList = excludingTypes[0].Name;
-			}
-		}
-
-		public override string Description
-		{
-			get { return "The army cannot have any of the following units to include a unit of type "+type.Name+": "+unitList; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitMaxNumberRequirement.
+	/// </summary>
+	public class UnitExclusion : FailedUnitRequirement
+	{
+		private string unitList;
+		private UnitType type;
+
+		public UnitExclusion(UnitRequirement req, UnitType unitType, UnitType[] excludingTypes) : base(req)
+		{
+			type = unitType;
+
+			if (excludingTypes.Length > 1)
+			{
+				StringBuilder sb = new StringBuilder(excludingTypes[0].Name);
+
+				for (int i = 1; i<excludingTypes.Length; i++)
+				{
+					sb.Append(", "+excludingTypes[i].Name);
+				}
+
+				unitList = sb.ToString();
+			}
+			else
+			{
+				unitList = excludingTypes[0].Name;
+			}
+		}
+
+		public override string Description
+		{
+			get { return "The army cannot have any of the following units to include a unit of type "+type.Name+": "+unitList; }
+		}
+	}
+}
--- a/api/Requirements/UnitMaxNumberReached.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitMaxNumberReached.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,28 +2,28 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using IBBoard;
 using IBBoard.Lang;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitMaxNumberRequirement.
-	/// </summary>
-	public class UnitMaxNumberReached : FailedUnitRequirement
-	{
-		private UnitType type;
-
-		public UnitMaxNumberReached(UnitType unitType, UnitRequirementMaxNumber requirement) : base(requirement)
-		{
-			type = unitType;
-		}
-
-		public override string Description
-		{
-			get { return String.Format(Translation.GetTranslation("ErrorUnitMaxNumberReached", "The maximum number of units of type \"{0}\" has already been reached or exceeded."), type.Name); }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitMaxNumberRequirement.
+	/// </summary>
+	public class UnitMaxNumberReached : FailedUnitRequirement
+	{
+		private UnitType type;
+
+		public UnitMaxNumberReached(UnitType unitType, UnitRequirementMaxNumber requirement) : base(requirement)
+		{
+			type = unitType;
+		}
+
+		public override string Description
+		{
+			get { return String.Format(Translation.GetTranslation("ErrorUnitMaxNumberReached", "The maximum number of units of type \"{0}\" has already been reached or exceeded."), type.Name); }
+		}
+	}
+}
--- a/api/Requirements/UnitMinNumberReached.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitMinNumberReached.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,25 +3,25 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitMaxNumberRequirement.
-	/// </summary>
-	public class UnitMinNumberReached : FailedUnitRequirement
-	{
-		private UnitType type;
-
-		public UnitMinNumberReached(UnitType unitType, UnitRequirementMinNumber requirement) : base(requirement)
-		{
-			type = unitType;
-		}
-
-		public override string Description
-		{
-			get { return "The minimum number of units of type "+type.Name+" is not currently met"; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitMaxNumberRequirement.
+	/// </summary>
+	public class UnitMinNumberReached : FailedUnitRequirement
+	{
+		private UnitType type;
+
+		public UnitMinNumberReached(UnitType unitType, UnitRequirementMinNumber requirement) : base(requirement)
+		{
+			type = unitType;
+		}
+
+		public override string Description
+		{
+			get { return "The minimum number of units of type "+type.Name+" is not currently met"; }
+		}
+	}
+}
--- a/api/Requirements/UnitRequirement.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitRequirement.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,17 +2,17 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.Collections.Generic;
 using IBBoard.WarFoundry.API;
 using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitRequirement.
-	/// </summary>
-	public abstract class UnitRequirement : AbstractArmyRequirement
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitRequirement.
+	/// </summary>
+	public abstract class UnitRequirement : AbstractArmyRequirement
 	{
 		protected UnitType unitType;
 		
@@ -82,15 +82,15 @@
 		{
 			return CanRemoveFromArmy(army, unit.UnitType);
 		}
-				
+				
 		protected override AbstractFailedRequirement CanAddToArmy(Army army)
 		{
 			return CanAddToArmy(army, unitType);
 		}
-		
+		
 		protected override AbstractFailedRequirement CanRemoveFromArmy(Army army)
 		{
 			return CanRemoveFromArmy(army, unitType);
-		}
-	}
-}
+		}
+	}
+}
--- a/api/Requirements/UnitRequirementItem.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitRequirementItem.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -3,34 +3,34 @@
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
 using System;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitRequirementItem.
-	/// </summary>
-	public class UnitRequirementItem
-	{
-		private UnitType type;
-		private int requiredNum;
-
-		public UnitRequirementItem(UnitType unitType, int reqNumber)
-		{
-			type = unitType;
-			requiredNum = reqNumber;
-		}
-
-		public UnitRequirementItem(UnitType type) : this(type, 1) { }
-
-		public UnitType UnitType
-		{
-			get { return type; }
-		}
-
-		public int Amount
-		{
-			get { return requiredNum; }
-		}
-	}
-}
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitRequirementItem.
+	/// </summary>
+	public class UnitRequirementItem
+	{
+		private UnitType type;
+		private int requiredNum;
+
+		public UnitRequirementItem(UnitType unitType, int reqNumber)
+		{
+			type = unitType;
+			requiredNum = reqNumber;
+		}
+
+		public UnitRequirementItem(UnitType type) : this(type, 1) { }
+
+		public UnitType UnitType
+		{
+			get { return type; }
+		}
+
+		public int Amount
+		{
+			get { return requiredNum; }
+		}
+	}
+}
--- a/api/Requirements/UnitRequiresAtLeastRequirement.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/Requirements/UnitRequiresAtLeastRequirement.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -2,28 +2,28 @@
 //
 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license.
 
-using System;
+using System;
 using System.Collections.Generic;
 using System.Text;
 using IBBoard.WarFoundry.API;
-using IBBoard.WarFoundry.API.Objects;
-
-namespace IBBoard.WarFoundry.API.Requirements
-{
-	/// <summary>
-	/// Summary description for UnitRequiresRequirement.
-	/// </summary>
-	public class UnitRequiresAtLeastRequirement : UnitRequirement
-	{
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Requirements
+{
+	/// <summary>
+	/// Summary description for UnitRequiresRequirement.
+	/// </summary>
+	public class UnitRequiresAtLeastRequirement : UnitRequirement
+	{
 		private UnitType[] requiredTypes;
 		private int[] requiredCounts;
-		private String unitList;
-
-		public UnitRequiresAtLeastRequirement(UnitType type, UnitType requiredUnitType) : this(type, new UnitType[]{requiredUnitType}, new int[]{1})
-		{
+		private String unitList;
+
+		public UnitRequiresAtLeastRequirement(UnitType type, UnitType requiredUnitType) : this(type, new UnitType[]{requiredUnitType}, new int[]{1})
+		{
 		}
 		
-		public UnitRequiresAtLeastRequirement(UnitType type, UnitType[] requiredUnitTypes, int[] minNumsRequired) : base(type)
+		public UnitRequiresAtLeastRequirement(UnitType type, UnitType[] requiredUnitTypes, int[] minNumsRequired) : base(type)
 		{
 			if (requiredUnitTypes.Length != minNumsRequired.Length)
 			{
@@ -33,52 +33,52 @@
 			{
 				throw new ArgumentException("List of required unit types must not be empty");
 			}
-			
+			
 			requiredTypes = requiredUnitTypes;
-			requiredCounts = minNumsRequired;
-
-			if (requiredTypes.Length > 1)
-			{
-				StringBuilder sb = new StringBuilder(requiredCounts[0]+" x "+requiredTypes[0].Name);
-
-				for (int i = 1; i<requiredTypes.Length; i++)
-				{
-					sb.Append(", "+requiredCounts[i]+" x "+requiredTypes[i].Name);
-				}
-
-				unitList = sb.ToString();
-			}
-			else
-			{
-				unitList = requiredTypes[0].Name;
-			}
-		}
-
-		public override string Description
-		{
-			get { return "The army must include at least the following units to include a unit of type "+unitType.Name+": "+unitList; }
-		}
-
-		protected override AbstractFailedRequirement CanRemoveFromArmy(Army army, UnitType type)
-		{
-			return null;
-		}
-
-		protected override AbstractFailedRequirement CanAddToArmy(Army army, UnitType type)
+			requiredCounts = minNumsRequired;
+
+			if (requiredTypes.Length > 1)
+			{
+				StringBuilder sb = new StringBuilder(requiredCounts[0]+" x "+requiredTypes[0].Name);
+
+				for (int i = 1; i<requiredTypes.Length; i++)
+				{
+					sb.Append(", "+requiredCounts[i]+" x "+requiredTypes[i].Name);
+				}
+
+				unitList = sb.ToString();
+			}
+			else
+			{
+				unitList = requiredTypes[0].Name;
+			}
+		}
+
+		public override string Description
+		{
+			get { return "The army must include at least the following units to include a unit of type "+unitType.Name+": "+unitList; }
+		}
+
+		protected override AbstractFailedRequirement CanRemoveFromArmy(Army army, UnitType type)
+		{
+			return null;
+		}
+
+		protected override AbstractFailedRequirement CanAddToArmy(Army army, UnitType type)
 		{
 			FailedRequirement failure = null;
 			int count = requiredTypes.Length;
 			
 			for (int i = 0; i < count; i++)
-			{
-				if (army.GetUnitTypeCount(requiredTypes[i]) < requiredCounts[i])
-				{				
+			{
+				if (army.GetUnitTypeCount(requiredTypes[i]) < requiredCounts[i])
+				{				
 					failure = new FailedRequirement(this);
-					break;
+					break;
 				}
 			}
 						
-			return failure;
-		}
-	}
-}
+			return failure;
+		}
+	}
+}
--- a/api/WarFoundryCore.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/WarFoundryCore.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -11,20 +11,20 @@
 	public class WarFoundryCore
 	{		
 		public static readonly int INFINITY = -1;
-		public static event GameSystemChangedDelegate GameSystemChanged;
+		public static event GameSystemChangedDelegate GameSystemChanged;
 		public static event ArmyChangedDelegate ArmyChanged;
 		
 		private static GameSystem system;
 		private static Army currentArmy;
 				
-		public static GameSystem CurrentGameSystem
-		{
-			get { return system; }
-			set
-			{
-				if (system==null || !system.Equals(value))
+		public static GameSystem CurrentGameSystem
+		{
+			get { return system; }
+			set
+			{
+				if (system==null || !system.Equals(value))
 				{
-					GameSystem oldSystem = system;
+					GameSystem oldSystem = system;
 					system = value;
 					
 					if (system==null)
@@ -34,55 +34,55 @@
 					else
 					{
 						LogNotifier.DebugFormat(typeof(WarFoundryCore), "Game system set to {0} with ID {1}", system.Name, system.ID); 
-					}
-
-					if (GameSystemChanged!=null)
-					{
-						GameSystemChanged(oldSystem, system);
+					}
+
+					if (GameSystemChanged!=null)
+					{
+						GameSystemChanged(oldSystem, system);
 					}
 					
 					//If we've changed the game system then we can't keep the current army
-					CurrentArmy = null;
-				}
-			}
+					CurrentArmy = null;
+				}
+			}
 		}
 		
-		public static Army CurrentArmy
-		{
-			get { return currentArmy; }
-			set
-			{
-				if (currentArmy==null || !currentArmy.Equals(value))
-				{
-					/*if (currentArmy!=null)
-					{
-						currentArmy.UnitAdded-= UnitAddedMethod;
-						currentArmy.UnitRemoved-= UnitRemovedMethod;
-						currentArmy.PointsValueChanged-= PointsValueChangedMethod;
-						currentArmy.FailedRequirement-=FailedUnitRequirementMethod;
-					}*/
-					Army oldArmy = currentArmy;
+		public static Army CurrentArmy
+		{
+			get { return currentArmy; }
+			set
+			{
+				if (currentArmy==null || !currentArmy.Equals(value))
+				{
+					/*if (currentArmy!=null)
+					{
+						currentArmy.UnitAdded-= UnitAddedMethod;
+						currentArmy.UnitRemoved-= UnitRemovedMethod;
+						currentArmy.PointsValueChanged-= PointsValueChangedMethod;
+						currentArmy.FailedRequirement-=FailedUnitRequirementMethod;
+					}*/
+					Army oldArmy = currentArmy;
 					currentArmy = value;
 					
 					if (currentArmy!=null)
 					{
 						CurrentGameSystem = currentArmy.GameSystem; //Set the game system in case the new army is from a different system
-					}
-
-					/*if (currentArmy!=null)
-					{
-						currentArmy.UnitAdded+= UnitAddedMethod;
-						currentArmy.UnitRemoved+= UnitRemovedMethod;
-						currentArmy.PointsValueChanged+= PointsValueChangedMethod;
-						currentArmy.FailedRequirement+=FailedUnitRequirementMethod;
-					}*/
-
-					if (ArmyChanged!=null)
-					{
-						ArmyChanged(oldArmy, currentArmy);
-					}
-				}
-			}
+					}
+
+					/*if (currentArmy!=null)
+					{
+						currentArmy.UnitAdded+= UnitAddedMethod;
+						currentArmy.UnitRemoved+= UnitRemovedMethod;
+						currentArmy.PointsValueChanged+= PointsValueChangedMethod;
+						currentArmy.FailedRequirement+=FailedUnitRequirementMethod;
+					}*/
+
+					if (ArmyChanged!=null)
+					{
+						ArmyChanged(oldArmy, currentArmy);
+					}
+				}
+			}
 		}
 	}
 }
--- a/api/WarFoundryLoader.cs	Wed May 27 19:43:09 2009 +0000
+++ b/api/WarFoundryLoader.cs	Sat Jun 27 18:59:49 2009 +0000
@@ -482,14 +482,14 @@
 		protected void StoreGameSystem(GameSystem system)
 		{
 			string sysid = system.ID.ToLower();
-					
-			if (systemsTable.ContainsKey(sysid))
-			{
-				LogNotifier.WarnFormat(GetType(), "System {0} ({1}) has already been loaded. Duplicate file ({3}) discarded", system.Name, system.ID, system.SourceFile.FullName);
-			}
-			else
+					
+			if (systemsTable.ContainsKey(sysid))
 			{
-				systemsTable.Add(sysid, (GameSystem)system);
+				LogNotifier.WarnFormat(GetType(), "System {0} ({1}) has already been loaded. Duplicate file ({3}) discarded", system.Name, system.ID, system.SourceFile.FullName);
+			}
+			else
+			{
+				systemsTable.Add(sysid, (GameSystem)system);
 			}
 		}
 		
@@ -538,14 +538,14 @@
 		/// An array of <see cref="GameSystem"/>s that are currently available.
 		/// </returns>
 		public GameSystem[] GetGameSystems()
-		{
-			if (systemsTable==null)
-			{
-				LoadFiles();
+		{
+			if (systemsTable==null)
+			{
+				LoadFiles();
 			}
 			
 			return DictionaryUtils.ToArray<string, GameSystem>(systemsTable);
-		}
+		}
 
 		/// <summary>
 		/// Gets a single <see cref="GameSystem"/> with a given ID. 
@@ -555,18 +555,18 @@
 		/// </param>
 		/// <returns>
 		/// The <see cref="GameSystem"/> with the given ID, or <code>null</code> if one doesn't exist.
-		/// </returns>
-		public GameSystem GetGameSystem(string systemID)
-		{
-			if (systemsTable==null)
-			{
-				LoadFiles();
+		/// </returns>
+		public GameSystem GetGameSystem(string systemID)
+		{
+			if (systemsTable==null)
+			{
+				LoadFiles();
 			}
 			
 			GameSystem system;
-			systemsTable.TryGetValue(systemID.ToLower(), out system);
-			return system;
-		}
+			systemsTable.TryGetValue(systemID.ToLower(), out system);
+			return system;
+		}
 
 		/// <summary>
 		/// Gets an array of the races for the specified <see cref="GameSystem"/>.
@@ -576,11 +576,11 @@
 		/// </param>
 		/// <returns>
 		/// An array of <see cref="Race"/>s for the <see cref="GameSystem"/>
-		/// </returns>
-		public Race[] GetRaces(GameSystem system)
-		{
-			return GetRaces(system.ID);
-		}
+		/// </returns>
+		public Race[] GetRaces(GameSystem system)
+		{
+			return GetRaces(system.ID);
+		}
 
 		/// <summary>
 		/// Gets an array of the races for a game system by ID.
@@ -590,43 +590,43 @@
 		/// </param>
 		/// <returns>
 		/// An array of <see cref="Race"/>s for the specified game system
-		/// </returns>
-		public Race[] GetRaces(string systemID)
-		{
-			if (racesTable==null)
-			{
-				LoadFiles();
+		/// </returns>
+		public Race[] GetRaces(string systemID)
+		{
+			if (racesTable==null)
+			{
+				LoadFiles();
 			}
 			
-			systemID = systemID.ToLower();
+			systemID = systemID.ToLower();
 			Dictionary<string, Dictionary<string, Race>> system;
-			racesTable.TryGetValue(systemID, out system);
-			
-			if (system==null)
-			{
-				return new Race[0];
-			}
-
-			int count = 0;
-
-			foreach (Dictionary<string, Race> racesDict in system.Values)
-			{
-				count+= racesDict.Count;
-			}
-
-			Race[] races = new Race[count];
-			int i = 0;
-
-			foreach (string raceID in system.Keys)
-			{
-				foreach (string raceSubId in system[raceID].Keys)
-				{
-					races[i++] = GetRace(systemID, raceID, raceSubId);
-				}
-			}
-
-			return races;
-		}
+			racesTable.TryGetValue(systemID, out system);
+			
+			if (system==null)
+			{
+				return new Race[0];
+			}
+
+			int count = 0;
+
+			foreach (Dictionary<string, Race> racesDict in system.Values)
+			{
+				count+= racesDict.Count;
+			}
+
+			Race[] races = new Race[count];
+			int i = 0;
+
+			foreach (string raceID in system.Keys)
+			{
+				foreach (string raceSubId in system[raceID].Keys)
+				{
+					races[i++] = GetRace(systemID, raceID, raceSubId);
+				}
+			}
+
+			return races;
+		}
 
 		/// <summary>
 		/// Gets a single race for a given <see cref="GameSystem"/> by ID of the race.
@@ -639,11 +639,11 @@
 		/// </param>
 		/// <returns>
 		/// A <see cref="Race"/> with the specified ID from the <see cref="GameSystem"/>, or <code>null</code> if one doesn't exist.
-		/// </returns>
-		public Race GetRace(GameSystem system, string raceID)
-		{
-			return GetRace(system.ID, raceID);
-		}
+		/// </returns>
+		public Race GetRace(GameSystem system, string raceID)
+		{
+			return GetRace(system.ID, raceID);
+		}
 
 		/// <summary>
 		/// Gets a single race for a given game system by ID of the game system and race.
@@ -656,11 +656,11 @@
 		/// </param>
 		/// <returns>
 		/// A <see cref="Race"/> with the specified ID from the game system with the specified ID, or <code>null</code> if there is no race or game system with those IDs.
-		/// </returns>
-		public Race GetRace(string systemID, string raceID)
-		{
-			return GetRace(systemID, raceID, "");
-		}
+		/// </returns>
+		public Race GetRace(string systemID, string raceID)
+		{
+			return GetRace(systemID, raceID, "");
+		}
 
 		/// <summary>
 		/// Gets a single race for a given <see cref="GameSystem"/> by the race's ID and sub-race ID.
@@ -676,11 +676,11 @@
 		/// </param>
 		/// <returns>
 		/// A <see cref="Race"/>
-		/// </returns>
-		public Race GetRace(GameSystem system, string raceID, string raceSubID)
-		{
-			return GetRace(system.ID, raceID, raceSubID);
-		}
+		/// </returns>
+		public Race GetRace(GameSystem system, string raceID, string raceSubID)
+		{
+			return GetRace(system.ID, raceID, raceSubID);
+		}
 
 		/// <summary>
 		/// Gets a single race for a given game system by the game system's ID and the race's ID and sub-race ID.
@@ -696,57 +696,57 @@
 		/// </param>
 		/// <returns>
 		/// A <see cref="Race"/>
-		/// </returns>
-		public Race GetRace(string systemID, string raceID, string raceSubID)
-		{
-			if (racesTable==null)
-			{
-				LoadFiles();
+		/// </returns>
+		public Race GetRace(string systemID, string raceID, string raceSubID)
+		{
+			if (racesTable==null)
+			{
+				LoadFiles();
 			}
 			
 			Race race = null;
 			
-			systemID = systemID.ToLower();
-
+			systemID = systemID.ToLower();
+
 			Dictionary<string, Dictionary<string, Race>> races;
-			racesTable.TryGetValue(systemID, out races);
-
-			if (races!=null)
-			{
+			racesTable.TryGetValue(systemID, out races);
+
+			if (races!=null)
+			{
 				Dictionary<string, Race> subraces;
-				races.TryGetValue(raceID, out subraces);
-
-				if (subraces!=null)
+				races.TryGetValue(raceID, out subraces);
+
+				if (subraces!=null)
 				{
-					subraces.TryGetValue(raceSubID, out race);
-				}
+					subraces.TryGetValue(raceSubID, out race);
+				}
 			}
 			
-			return race;
-		}
+			return race;
+		}
 
 		/// <summary>
 		/// Gets the IDs of all of the game systems currently available.
 		/// </summary>
 		/// <returns>
 		/// An array of <see cref="System.String"/>s representing the IDs of the game systems.
-		/// </returns>
-		public string[] GetGameSystemIDs()
-		{
-			if (systemsTable==null)
-			{
-				LoadFiles();
-			}
-
-			string[] keys = new string[systemsTable.Keys.Count];
-			int i = 0;
-
-			foreach (string key in systemsTable.Keys)
-			{
-				keys[i++] = key;
-			}
-
-			return keys;
+		/// </returns>
+		public string[] GetGameSystemIDs()
+		{
+			if (systemsTable==null)
+			{
+				LoadFiles();
+			}
+
+			string[] keys = new string[systemsTable.Keys.Count];
+			int i = 0;
+
+			foreach (string key in systemsTable.Keys)
+			{
+				keys[i++] = key;
+			}
+
+			return keys;
 		}
 		
 		/// <summary>
@@ -761,7 +761,7 @@
 		public string[] GetSystemRaceIDs(GameSystem system)
 		{
 			return GetSystemRaceIDs(system.ID);
-		}
+		}
 
 		/// <summary>
 		/// Gets the IDs of all of the races of a specified game system.
@@ -771,32 +771,32 @@
 		/// </param>
 		/// <returns>
 		/// An array of <see cref="System.String"/>s representing the IDs of the races of the specified game system.
-		/// </returns>
-		public string[] GetSystemRaceIDs(string systemID)
-		{
-			if (racesTable == null)
-			{
-				LoadFiles();
-			}
-
-			Dictionary<string, Dictionary<string, Race>> races = racesTable[systemID.ToLower()];
-
-			if (races==null)
-			{
-				return new string[0];
-			}
-			else
-			{
-				string[] keys = new string[races.Keys.Count];
-				int i = 0;
-
-				foreach (string key in races.Keys)
-				{
-					keys[i++] = key;
-				}
-
-				return keys;
-			}
+		/// </returns>
+		public string[] GetSystemRaceIDs(string systemID)
+		{
+			if (racesTable == null)
+			{
+				LoadFiles();
+			}
+
+			Dictionary<string, Dictionary<string, Race>> races = racesTable[systemID.ToLower()];
+
+			if (races==null)
+			{
+				return new string[0];
+			}
+			else
+			{
+				string[] keys = new string[races.Keys.Count];
+				int i = 0;
+
+				foreach (string key in races.Keys)
+				{
+					keys[i++] = key;
+				}
+
+				return keys;
+			}
 		}
 	}
 }