comparison API/Factories/Xml/WarFoundryXmlRaceFactory.cs @ 377:c3b0b28bad48

Re #353: Handle unloaded units being referenced outside factory * Create interface for race factories * Start to pull out common methods and add "try unit and fall back to factory" method for getting unit types * Make XML Race Factory implement interface * Use new factory
author IBBoard <dev@ibboard.co.uk>
date Mon, 04 Jul 2011 20:02:26 +0000
parents e50682387d63
children ff7f1b319b4e
comparison
equal deleted inserted replaced
376:e50682387d63 377:c3b0b28bad48
18 namespace IBBoard.WarFoundry.API.Factories.Xml 18 namespace IBBoard.WarFoundry.API.Factories.Xml
19 { 19 {
20 /// <summary> 20 /// <summary>
21 /// A sub-factory for loading WarFoundry Race XML files 21 /// A sub-factory for loading WarFoundry Race XML files
22 /// </summary> 22 /// </summary>
23 public class WarFoundryXmlRaceFactory 23 public class WarFoundryXmlRaceFactory : IRaceFactory<XmlDocument, XmlElement>
24 { 24 {
25 private Dictionary<Race, XmlDocument> extraData = new Dictionary<Race, XmlDocument>(); 25 private Dictionary<Race, XmlDocument> extraData = new Dictionary<Race, XmlDocument>();
26 private WarFoundryXmlLimitParser limitParser = new WarFoundryXmlLimitParser(); 26 private WarFoundryXmlLimitParser limitParser = new WarFoundryXmlLimitParser();
27 private WarFoundryXmlFactory mainFactory; 27 private WarFoundryXmlFactory mainFactory;
28 28
40 { 40 {
41 XmlDocument extra = null; 41 XmlDocument extra = null;
42 extraData.TryGetValue(obj, out extra); 42 extraData.TryGetValue(obj, out extra);
43 return extra; 43 return extra;
44 } 44 }
45 45
46 public Race CreateRaceFromElement(ZipFile file, XmlElement elem) 46 public Race CreateRace(XmlElement elem)
47 {
48 return CreateRaceFromElement(elem);
49 }
50
51 public Race CreateRaceFromElement(XmlElement elem)
47 { 52 {
48 string id = elem.GetAttribute("id"); 53 string id = elem.GetAttribute("id");
49 string subid = elem.GetAttribute("subid"); 54 string subid = elem.GetAttribute("subid");
50 string systemID = elem.GetAttribute("system"); 55 string systemID = elem.GetAttribute("system");
51 string name = elem.GetAttribute("name"); 56 string name = elem.GetAttribute("name");
104 private Category CreateCategoryFromElement(XmlElement elem, Race parentRace) 109 private Category CreateCategoryFromElement(XmlElement elem, Race parentRace)
105 { 110 {
106 Category cat = CategoryLoader.CreateFromElement(elem); 111 Category cat = CategoryLoader.CreateFromElement(elem);
107 parentRace.AddCategory(cat); 112 parentRace.AddCategory(cat);
108 return cat; 113 return cat;
114 }
115
116
117 public UnitType GetUnitType(string id, Race parentRace)
118 {
119 return GetUnitType(id, parentRace, GetExtraData(parentRace));
120 }
121
122 public UnitType GetUnitType(string id, Race parentRace, XmlDocument doc)
123 {
124 UnitType type = parentRace.GetUnitType(id);
125
126 if (type==null)
127 {
128 type = GetUnitTypeFromDocument(doc, id, parentRace);
129 }
130
131 return type;
109 } 132 }
110 133
111 private UnitType GetUnitTypeFromDocument(XmlDocument doc, string id, Race parentRace) 134 private UnitType GetUnitTypeFromDocument(XmlDocument doc, string id, Race parentRace)
112 { 135 {
113 XmlElement unitWithId = WarFoundryXmlFactoryUtils.SelectSingleElement (doc, "/race:race/race:units/race:unit[@id='" + id + "']"); 136 XmlElement unitWithId = WarFoundryXmlFactoryUtils.SelectSingleElement (doc, "/race:race/race:units/race:unit[@id='" + id + "']");
381 string name = extraData.GetAttribute("requirementName"); 404 string name = extraData.GetAttribute("requirementName");
382 UnitRequiresAtLeastNUnitsRequirementFactory reqFactory = GetRequirementFactory(name); 405 UnitRequiresAtLeastNUnitsRequirementFactory reqFactory = GetRequirementFactory(name);
383 406
384 if (reqFactory != null) { 407 if (reqFactory != null) {
385 string data = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "race:data").InnerText; 408 string data = WarFoundryXmlFactoryUtils.SelectSingleElement(extraData, "race:data").InnerText;
386 UnitRequiresAtLeastNUnitsRequirement req = reqFactory.CreateRequirement(type, data); 409 UnitRequiresAtLeastNUnitsRequirement req = reqFactory.CreateRequirement(type, data, this);
387 type.AddRequirement(req); 410 type.AddRequirement(req);
388 } 411 }
389 } 412 }
390 } 413 }
391 414