diff api/Factories/Xml/WarFoundryXmlRaceFactory.cs @ 252:a54da5a8b5bb

Re #268: Restructure stats for re-use * Add "Member Type" class * Add member type setting and getting to Race * Load member types from XML files * Make unit type pull stat line from stats or first member type, or fall back to a blank stat line * Change Stats object to initialise blank values * Change schema * Make stats optional * Add member type list to race * Add optional member type references to units
author IBBoard <dev@ibboard.co.uk>
date Sun, 25 Apr 2010 15:07:08 +0000
parents 91ee6259677f
children 435eb28b4549
line wrap: on
line diff
--- a/api/Factories/Xml/WarFoundryXmlRaceFactory.cs	Fri Apr 23 20:00:06 2010 +0000
+++ b/api/Factories/Xml/WarFoundryXmlRaceFactory.cs	Sun Apr 25 15:07:08 2010 +0000
@@ -81,6 +81,11 @@
 			{
 				CreateAbilityFromElement(node, race);
 			}
+							
+			foreach (XmlElement node  in WarFoundryXmlFactoryUtils.SelectNodes(extraData, "/race:race/race:memberTypes/race:memberType"))
+			{
+				CreateMemberTypeFromElement(node, race);
+			}
 			
 			foreach (XmlElement node in WarFoundryXmlFactoryUtils.SelectNodes(extraData, "/race:race/race:units/race:unit"))
 			{
@@ -165,8 +170,21 @@
 			
 			type.MainCategory = cat;
 			XmlElement statsElement = WarFoundryXmlFactoryUtils.SelectSingleElement(elem, "race:stats");
-			Stats unitStats = ParseUnitStats(statsElement, type.GameSystem);
-			type.SetUnitStats(unitStats);
+			
+			if (statsElement!=null)
+			{
+				Stats unitStats = ParseUnitStats(statsElement, type.GameSystem);
+				type.SetUnitStats(unitStats);
+			}
+			
+			XmlNodeList unitMemberReferences = WarFoundryXmlFactoryUtils.SelectNodes(elem, "race:unitMembers/race:unitMember");
+			
+			foreach (XmlElement unitMemberRef in unitMemberReferences)
+			{
+				string typeID = unitMemberRef.GetAttribute("typeID");
+				UnitMemberType unitMemberType = type.Race.GetUnitMemberType(typeID);
+				type.AddUnitMemberType(unitMemberType);
+			}
 		}
 
 		private void LoadEquipmentSlotsForUnitType(XmlElement elem, UnitType type)
@@ -388,6 +406,11 @@
 		
 		private Stats ParseUnitStats(XmlElement elem, GameSystem system)
 		{
+			if (elem == null)
+			{
+				return null;
+			}
+			
 			String statsID = elem.GetAttribute("statSet");
 			SystemStats statsSet;
 			
@@ -467,6 +490,13 @@
 			ability.Description = (node == null) ? "" : node.InnerText;
 			race.AddAbility(ability);
 			return ability;
+		}		
+
+		private void CreateMemberTypeFromElement(XmlElement elem, Race race)
+		{
+			Stats stats = ParseUnitStats(WarFoundryXmlFactoryUtils.SelectSingleElement(elem, "race:stats"), race.GameSystem);
+			UnitMemberType unitMemberType = new UnitMemberType(elem.GetAttribute("id"), elem.GetAttribute("name"), stats);
+			race.AddUnitMemberType(unitMemberType);
 		}
 	}
 }