diff API/Factories/Xml/WarFoundryXmlArmyParser.cs @ 337:3c4a6403a88c

* Fix capitalisation so that new files are in the namespace no-open-ticket
author IBBoard <dev@ibboard.co.uk>
date Sun, 03 Apr 2011 18:50:32 +0000
parents
children 00d6cf940c3c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/API/Factories/Xml/WarFoundryXmlArmyParser.cs	Sun Apr 03 18:50:32 2011 +0000
@@ -0,0 +1,131 @@
+//  This file (WarFoundryXmlArmyParser.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 and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using IBBoard.IO;
+using IBBoard.Xml;
+using ICSharpCode.SharpZipLib.Zip;
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Factories.Xml
+{
+	public class WarFoundryXmlArmyParser
+	{
+		private ZipFile file;
+		private XmlElement elem;
+		private Army army;
+		private Dictionary<String, Unit> units;
+		
+		public WarFoundryXmlArmyParser(ZipFile file, XmlElement elem)
+		{
+			this.file = file;
+			this.elem = elem;
+		}
+
+		public Army GetArmy()
+		{
+			if (army == null)
+			{
+				ParseArmy();
+			}
+
+			return army;
+		}
+
+		private void ParseArmy()
+		{
+			string name = elem.GetAttribute("name");
+			string systemID = elem.GetAttribute("system");
+			GameSystem system = WarFoundryLoader.GetDefault().GetGameSystem(systemID);
+			
+			if (system == null)
+			{
+				throw new RequiredDataMissingException(file.Name, "Game System", systemID);
+			}
+			
+			string raceID = elem.GetAttribute("race");
+			Race race = WarFoundryLoader.GetDefault().GetRace(system, raceID);
+			
+			if (race == null)
+			{
+				throw new RequiredDataMissingException(file.Name, "Race", raceID);
+			}
+			
+			int points = XmlTools.GetIntValueFromAttribute(elem, "maxPoints");			
+			army = new Army(race, name, points, file);
+			LoadUnits();
+		}
+
+		private void LoadUnits()
+		{
+			units = new Dictionary<string, Unit>();
+
+			foreach (XmlElement unitElem in WarFoundryXmlFactoryUtils.SelectNodes(elem, "/army:army/army:units/army:unit"))
+			{
+				string id = unitElem.GetAttribute("id");
+
+				if (!units.ContainsKey(id))
+				{
+					string unitTypeId = unitElem.GetAttribute("unitType");
+					UnitType unitType = army.Race.GetUnitType(unitTypeId);
+
+					if (unitType == null)
+					{
+						throw new RequiredDataMissingException(file.Name, "Unit Type", unitTypeId);
+					}
+					
+					string name = unitElem.GetAttribute("unitName");
+					int size = XmlTools.GetIntValueFromAttribute(unitElem, "size");
+					
+					string catID = unitElem.GetAttribute("category");
+					Category cat = army.Race.GetCategory(catID);
+					
+					if (cat == null)
+					{
+						cat = unitType.MainCategory;
+					}
+
+					Unit unit = new Unit(id, name, size, unitType, army.GetCategory(cat));
+					army.AddUnit(unit, cat);
+					units.Add(id, unit);
+
+					LoadUnitEquipment(unitElem, unit);
+				}
+				else
+				{
+					throw new InvalidFileException("Duplicate unit ID found in army file: "+id);
+				}
+			}
+		}
+
+		private void LoadUnitEquipment(XmlElement unitElem, Unit unit)
+		{
+			foreach (XmlElement elem in WarFoundryXmlFactoryUtils.SelectNodes(unitElem, "army:equipment/army:equipItem"))
+			{
+				string equipID = elem.GetAttribute("id");
+				UnitEquipmentItem item = unit.UnitType.GetEquipmentItem(equipID);
+	
+				if (item == null)
+				{
+					throw new RequiredDataMissingException(file.Name, "Equipment Item", equipID);
+				}
+
+				double amount = XmlTools.GetDoubleValueFromAttribute(elem, "amount");
+				string equipTypeString = elem.GetAttribute("amountType");
+
+				if (equipTypeString == "ratio")
+				{
+					unit.SetEquipmentRatio(item, amount);
+				}
+				else
+				{
+					//amount should be a whole number, so do type-cast rounding
+					unit.SetEquipmentAmount(item, (int) amount);
+				}
+			}
+		}
+	}
+}