Mercurial > repos > IBDev-IBBoard.WarFoundry.API
annotate api/Factories/Xml/WarFoundryXmlRaceFactory.cs @ 67:e6200220ece3
Re #50 - Complete core loading of WarFoundry XML files
* Clean up stat loading for game systems and unit types
* Delete rogue character that stopped code compiling
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 25 Apr 2009 14:59:23 +0000 |
parents | 9080366031c0 |
children | 10d14a7051d5 |
rev | line source |
---|---|
52 | 1 // This file (WarFoundryXmlRaceFactory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard |
2 // | |
3 // The file and the library/program it is in are licensed under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING.LGPL for more information and the full license. | |
4 // | |
5 | |
6 using System; | |
7 using System.Collections.Generic; | |
8 using System.IO; | |
9 using System.Xml; | |
10 using IBBoard.Xml; | |
11 using IBBoard.IO; | |
12 using IBBoard.Logging; | |
13 using ICSharpCode.SharpZipLib.Zip; | |
14 using IBBoard.WarFoundry.API.Objects; | |
15 | |
16 namespace IBBoard.WarFoundry.API.Factories.Xml | |
17 { | |
18 /// <summary> | |
19 /// A sub-factory for loading WarFoundry Race XML files | |
20 /// </summary> | |
21 public class WarFoundryXmlRaceFactory : AbstractStagedLoadedSubFactory | |
22 { | |
23 private Dictionary<Race, XmlDocument> extraData = new Dictionary<Race, XmlDocument>(); | |
24 | |
25 public WarFoundryXmlRaceFactory(WarFoundryXmlFactory factory) : base (factory) | |
26 { | |
27 } | |
28 | |
29 private void StoreExtraData(Race wfObject, XmlElement elem) | |
30 { | |
31 extraData[wfObject] = elem.OwnerDocument; | |
32 } | |
33 | |
34 private XmlDocument GetExtraData(Race obj) | |
35 { | |
36 XmlDocument extra = null; | |
37 extraData.TryGetValue(obj, out extra); | |
38 return extra; | |
39 } | |
40 | |
41 public Race CreateRaceFromElement(ZipFile file, XmlElement elem) | |
42 { | |
43 string id = elem.GetAttribute("id"); | |
44 string subid = elem.GetAttribute("subid"); | |
45 string systemID = elem.GetAttribute("system"); | |
46 string name = elem.GetAttribute("name"); | |
55
9080366031c0
Re #9 - Refactor for small methods
IBBoard <dev@ibboard.co.uk>
parents:
53
diff
changeset
|
47 Race race = new Race(id, subid, name, WarFoundryLoader.GetDefault().GetGameSystem(systemID), mainFactory); |
52 | 48 StoreExtraData(race, elem); |
49 return race; | |
50 } | |
51 | |
52 public void CompleteLoading(Race race) | |
53 { | |
54 if (!WarFoundryXmlFactoryUtils.CanCompleteLoading(race)) | |
55 { | |
56 return; | |
57 } | |
58 | |
59 race.SetAsLoading(); | |
60 XmlDocument extraData = GetExtraData(race); | |
61 | |
62 foreach (XmlElement node in WarFoundryXmlFactoryUtils.SelectNodes(extraData, "/race:race/race:units/race:unit")) | |
63 { | |
64 UnitType type = CreateUnitTypeFromElement(node, race, race.GameSystem); | |
65 race.AddUnitType(type); | |
66 } | |
67 | |
68 foreach (XmlElement node in WarFoundryXmlFactoryUtils.SelectNodes(extraData, "/race:race/race:categories/cat:cat")) | |
69 { | |
70 race.AddCategory(CreateCategoryFromElement(node)); | |
71 } | |
72 | |
73 foreach (XmlElement node in WarFoundryXmlFactoryUtils.SelectNodes(extraData, "/race:race/race:equipment/cat:equipmentItem")) | |
74 { | |
75 EquipmentItem item = CreateEquipmentItemFromElement(node, race); | |
76 race.AddEquipmentItem(item); | |
77 } | |
78 | |
79 foreach (XmlElement node in WarFoundryXmlFactoryUtils.SelectNodes(extraData, "/race:race/race:abilities/cat:ability")) | |
80 { | |
81 Ability ability = CreateAbilityFromElement(node, race); | |
82 race.AddAbility(ability); | |
83 } | |
84 | |
85 race.SetAsFullyLoaded(); | |
86 LogNotifier.DebugFormat(GetType(), "Completed loading of Race with ID {0}", race.ID); | |
87 } | |
88 | |
89 private UnitType CreateUnitTypeFromElement(XmlElement elem, Race parentRace, GameSystem system) | |
90 { | |
91 string id = elem.GetAttribute("id"); | |
92 string name = elem.GetAttribute("typeName"); | |
93 UnitType type = new UnitType(id, name, parentRace); | |
94 type.MaxNumber = XmlTools.GetIntValueFromAttribute(elem, "maxNum"); | |
95 type.MinNumber = XmlTools.GetIntValueFromAttribute(elem, "minNum"); | |
96 type.MaxSize = XmlTools.GetIntValueFromAttribute(elem, "maxSize"); | |
97 type.MinSize = XmlTools.GetIntValueFromAttribute(elem, "minSize"); | |
98 type.BaseSize = XmlTools.GetIntValueFromAttribute(elem, "baseSize"); | |
99 type.CostPerTrooper = XmlTools.GetIntValueFromAttribute(elem, "points"); | |
100 type.BaseUnitCost = XmlTools.GetIntValueFromAttribute(elem, "unitPoints"); | |
101 string mainCatID = elem.GetAttribute("cat"); | |
102 Category cat = parentRace.GetCategory(mainCatID); | |
103 | |
104 if (cat == null) | |
105 { | |
106 throw new InvalidDataException(String.Format("Attribute 'cat' of UnitType {0} (value: {1}) did not reference a valid category", id, mainCatID)); | |
107 } | |
108 | |
109 type.MainCategory = cat; | |
110 XmlElement statsElement = WarFoundryXmlFactoryUtils.SelectSingleElement(elem, "/race:race/race:units/race:unit/race:stats"); | |
111 type.UnitStats = ParseUnitStats(statsElement, system); | |
112 //TODO: Add unit requirements | |
113 LogNotifier.Debug(GetType(), "Loaded "+type.Name); | |
114 return type; | |
115 } | |
116 | |
117 private Stats ParseUnitStats(XmlElement elem, GameSystem system) | |
118 { | |
119 String statsID = elem.GetAttribute("statSet"); | |
120 SystemStats statsSet; | |
121 | |
122 if (statsID == "") | |
123 { | |
124 statsSet = system.StandardSystemStats; | |
125 } | |
126 else | |
127 { | |
128 statsSet = system.GetSystemStatsForID(statsID); | |
129 } | |
130 | |
131 Stats stats = new Stats(statsSet); | |
132 | |
53 | 133 foreach (XmlElement stat in WarFoundryXmlFactoryUtils.SelectNodes(elem, "race:stat")) |
52 | 134 { |
67
e6200220ece3
Re #50 - Complete core loading of WarFoundry XML files
IBBoard <dev@ibboard.co.uk>
parents:
55
diff
changeset
|
135 String statName = stat.GetAttribute("name"); |
e6200220ece3
Re #50 - Complete core loading of WarFoundry XML files
IBBoard <dev@ibboard.co.uk>
parents:
55
diff
changeset
|
136 stats.SetStatValue(statName, stat.InnerText); |
52 | 137 } |
138 | |
139 return stats; | |
140 } | |
141 | |
142 private EquipmentItem CreateEquipmentItemFromElement(XmlElement elem, Race race) | |
143 { | |
144 string id = elem.GetAttribute("id"); | |
145 string name = elem.GetAttribute("name"); | |
55
9080366031c0
Re #9 - Refactor for small methods
IBBoard <dev@ibboard.co.uk>
parents:
53
diff
changeset
|
146 double cost = 0; |
52 | 147 ArmourType armourType; |
148 | |
149 try | |
150 { | |
151 cost = XmlTools.GetDoubleValueFromAttribute(elem, "cost"); | |
152 } | |
153 catch(FormatException ex) | |
154 { | |
155 throw new InvalidFileException("Attribute 'cost' of equipment item "+id+" was not a valid number", ex); | |
156 } | |
157 | |
158 try | |
159 { | |
160 armourType = (ArmourType)Enum.Parse(typeof(ArmourType), elem.GetAttribute("armourType")); | |
161 } | |
162 catch(ArgumentException ex) | |
163 { | |
164 throw new InvalidFileException("Attribute 'armourType' of equipment "+id+" was not a valid value from the enumeration", ex); | |
165 } | |
166 | |
167 //TODO: Parse equipment stats if there are any | |
55
9080366031c0
Re #9 - Refactor for small methods
IBBoard <dev@ibboard.co.uk>
parents:
53
diff
changeset
|
168 EquipmentItem item = new EquipmentItem(id, name, race); |
9080366031c0
Re #9 - Refactor for small methods
IBBoard <dev@ibboard.co.uk>
parents:
53
diff
changeset
|
169 item.Cost = cost; |
9080366031c0
Re #9 - Refactor for small methods
IBBoard <dev@ibboard.co.uk>
parents:
53
diff
changeset
|
170 item.ItemArmourType = armourType; |
52 | 171 |
55
9080366031c0
Re #9 - Refactor for small methods
IBBoard <dev@ibboard.co.uk>
parents:
53
diff
changeset
|
172 return item; |
52 | 173 } |
174 | |
175 private Ability CreateAbilityFromElement(XmlElement elem, Race race) | |
176 { | |
177 string id = elem.GetAttribute("id"); | |
178 string name = elem.GetAttribute("name"); | |
179 Ability ability = new Ability(id, name); | |
180 XmlNode node = elem.SelectSingleNode("description", WarFoundryXmlFactoryUtils.GetNamespaceManager()); | |
181 ability.Description = (node == null) ? "" : node.InnerText; | |
182 return ability; | |
183 } | |
184 } | |
185 } |