Mercurial > repos > IBBoard.WarFoundry.API
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 |