Mercurial > repos > IBBoard.WarFoundry.API
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); + } + } + } + } +}