Mercurial > repos > IBBoard.WarFoundry.API
comparison api/Objects/UnitType.cs @ 56:9561ef46c6fb
Re #61 - Complete structure of WarFoundry API objects
* Add adding of abilities and equipment to UnitType
* Add getting of all, required and optional abilities
* Add UnitAbility class to store UnitType's reference to Ability object
Also:
* Convert UnitType to using Genericed collections
* Reduce visibility of properties to private
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 05 Apr 2009 19:57:32 +0000 |
parents | a5855fcd75ab |
children | e0ce5578e7c2 |
comparison
equal
deleted
inserted
replaced
55:9080366031c0 | 56:9561ef46c6fb |
---|---|
1 // This file (UnitType.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard. | 1 // This file (UnitType.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2009 IBBoard. |
2 // | 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. | 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 | 4 |
5 using System; | 5 using System; |
6 using System.Collections; | |
7 using System.Collections.Generic; | 6 using System.Collections.Generic; |
8 using System.Xml; | 7 using System.Xml; |
9 using IBBoard.Logging; | 8 using IBBoard.Logging; |
10 using IBBoard.WarFoundry.API.Requirements; | 9 using IBBoard.WarFoundry.API.Requirements; |
11 | 10 |
14 /// <summary> | 13 /// <summary> |
15 /// A UnitType is a type for a <see cref=" Unit"/>, normally relating to an entry in an army list. The UnitType defines the name, cost, minimum and maximum limits of a unit, and the equipment units of the type can take. | 14 /// A UnitType is a type for a <see cref=" Unit"/>, normally relating to an entry in an army list. The UnitType defines the name, cost, minimum and maximum limits of a unit, and the equipment units of the type can take. |
16 /// </summary> | 15 /// </summary> |
17 public class UnitType : WarFoundryObject | 16 public class UnitType : WarFoundryObject |
18 { | 17 { |
19 protected Category mainCat; | 18 private Category mainCat; |
20 protected Race race; | 19 private Race race; |
21 protected int min, max, baseSize = 0; | 20 private int min, max, baseSize = 0; |
22 protected int minSize, maxSize; | 21 private int minSize, maxSize; |
23 protected double baseUnitCost; | 22 private double baseUnitCost; |
24 protected double costPerTrooper; | 23 private double costPerTrooper; |
25 protected Stats stats; | 24 private Stats stats; |
26 protected List<UnitRequirement> requirements = new List<UnitRequirement>(); | 25 private List<UnitRequirement> requirements = new List<UnitRequirement>(); |
27 protected Hashtable equipment = new Hashtable(); | 26 private Dictionary<string, UnitEquipmentItem> equipment = new Dictionary<string, UnitEquipmentItem>(); |
28 protected Hashtable equipmentExclusionGroups = new Hashtable(); | 27 private Dictionary<string, List<UnitEquipmentItem>> equipmentExclusionGroups = new Dictionary<string, List<UnitEquipmentItem>>(); |
29 protected ArrayList equipmentKeyOrder = new ArrayList(); | 28 private List<string> equipmentKeyOrder = new List<string>(); |
29 private Dictionary<string, UnitAbility> abilities = new Dictionary<string, UnitAbility>(); | |
30 | 30 |
31 | 31 |
32 public UnitType(string id, string typeName, Race parentRace) : base(id, typeName) | 32 public UnitType(string id, string typeName, Race parentRace) : base(id, typeName) |
33 { | 33 { |
34 race = parentRace; | 34 race = parentRace; |
35 } | 35 } |
36 | 36 |
37 [Obsolete("Use three parameter constructor and setters")] | 37 [Obsolete("Use three parameter constructor and setters")] |
38 public UnitType(string id, string typeName, string mainCategoryID, string[] allCategoryIDs, int minNum, int maxNum, int minimumSize, int maximumSize, double unitCost, double trooperCost, Stats unitStats, UnitRequirement[] unitRequirements, Race parentRace) : base(id, typeName) | 38 public UnitType(string id, string typeName, string mainCategoryID, string[] allCategoryIDs, int minNum, int maxNum, int minimumSize, int maximumSize, double unitCost, double trooperCost, Stats unitStats, UnitRequirement[] unitRequirements, Race parentRace) : this (id, typeName, parentRace) |
39 { | 39 { |
40 race = parentRace; | |
41 mainCat = race.GetCategory(mainCategoryID); | 40 mainCat = race.GetCategory(mainCategoryID); |
42 MinNumber = minNum; | 41 MinNumber = minNum; |
43 MaxNumber = maxNum; | 42 MaxNumber = maxNum; |
44 MinSize = minimumSize; | 43 MinSize = minimumSize; |
45 MaxSize = maximumSize; | 44 MaxSize = maximumSize; |
197 { | 196 { |
198 if (value!=null) | 197 if (value!=null) |
199 { | 198 { |
200 stats = value; | 199 stats = value; |
201 } | 200 } |
201 } | |
202 } | |
203 | |
204 public void AddEquipmentItem(UnitEquipmentItem item) | |
205 { | |
206 equipment.Add(item.ID, item); | |
207 equipmentKeyOrder.Add(item.ID); | |
208 AddToMutexGroup(item); | |
209 } | |
210 | |
211 private void AddToMutexGroup(UnitEquipmentItem item) | |
212 { | |
213 string mutexGroup = item.MutexGroup; | |
214 | |
215 if (mutexGroup!="" && mutexGroup!=null) | |
216 { | |
217 List<UnitEquipmentItem> items = null; | |
218 equipmentExclusionGroups.TryGetValue(mutexGroup, out items); | |
219 | |
220 if (items == null) | |
221 { | |
222 items = new List<UnitEquipmentItem>(); | |
223 equipmentExclusionGroups.Add(mutexGroup, items); | |
224 } | |
225 | |
226 items.Add(item); | |
202 } | 227 } |
203 } | 228 } |
204 | 229 |
205 /// <summary> | 230 /// <summary> |
206 /// Gets a <see cref="UnitEquipmentItem"/> for the given ID string, or <code>null</code> if nothing exists for that ID | 231 /// Gets a <see cref="UnitEquipmentItem"/> for the given ID string, or <code>null</code> if nothing exists for that ID |
211 /// <returns> | 236 /// <returns> |
212 /// The <see cref="UnitEquipmentItem"/> for the given ID string, or <code>null</code> if nothing exists for that ID | 237 /// The <see cref="UnitEquipmentItem"/> for the given ID string, or <code>null</code> if nothing exists for that ID |
213 /// </returns> | 238 /// </returns> |
214 public UnitEquipmentItem GetEquipmentItem(string id) | 239 public UnitEquipmentItem GetEquipmentItem(string id) |
215 { | 240 { |
216 return (UnitEquipmentItem)equipment[id]; | 241 UnitEquipmentItem equipItem = null; |
242 equipment.TryGetValue(id, out equipItem); | |
243 return equipItem; | |
217 } | 244 } |
218 | 245 |
219 /// <summary> | 246 /// <summary> |
220 /// Gets an array of all available <see cref="UnitEquipmentItem"/>s for this UnitType | 247 /// Gets an array of all available <see cref="UnitEquipmentItem"/>s for this UnitType |
221 /// </summary> | 248 /// </summary> |
227 UnitEquipmentItem[] items = new UnitEquipmentItem[equipment.Count]; | 254 UnitEquipmentItem[] items = new UnitEquipmentItem[equipment.Count]; |
228 int i = 0; | 255 int i = 0; |
229 | 256 |
230 foreach (string itemID in equipmentKeyOrder) | 257 foreach (string itemID in equipmentKeyOrder) |
231 { | 258 { |
232 items[i++] = (UnitEquipmentItem)equipment[itemID]; | 259 items[i++] = equipment[itemID]; |
233 } | 260 } |
234 | 261 |
235 return items; | 262 return items; |
263 } | |
264 | |
265 public ICollection<Ability> GetAbilities() | |
266 { | |
267 ICollection<Ability> abilitiesList = new List<Ability>(); | |
268 | |
269 foreach (UnitAbility ability in abilities.Values) | |
270 { | |
271 abilitiesList.Add(ability.Ability); | |
272 } | |
273 | |
274 return abilitiesList; | |
275 } | |
276 | |
277 public ICollection<Ability> GetRequiredAbilities() | |
278 { | |
279 ICollection<Ability> requiredAbilities = new List<Ability>(); | |
280 | |
281 foreach (UnitAbility ability in abilities.Values) | |
282 { | |
283 if (ability.IsRequired) | |
284 { | |
285 requiredAbilities.Add(ability.Ability); | |
286 } | |
287 } | |
288 | |
289 return requiredAbilities; | |
290 } | |
291 | |
292 public ICollection<Ability> GetOptionalAbilities() | |
293 { | |
294 ICollection<Ability> optionalAbilities = new List<Ability>(); | |
295 | |
296 foreach (UnitAbility ability in abilities.Values) | |
297 { | |
298 if (!ability.IsRequired) | |
299 { | |
300 optionalAbilities.Add(ability.Ability); | |
301 } | |
302 } | |
303 | |
304 return optionalAbilities; | |
305 } | |
306 | |
307 public void AddAbility(Ability ability) | |
308 { | |
309 if (!abilities.ContainsKey(ability.ID)) | |
310 { | |
311 UnitAbility unitAbility = new UnitAbility(ability); | |
312 abilities[ability.ID] = unitAbility; | |
313 } | |
236 } | 314 } |
237 | 315 |
238 public void AddRequirement(UnitRequirement requirement) | 316 public void AddRequirement(UnitRequirement requirement) |
239 { | 317 { |
240 requirements.Add(requirement); | 318 requirements.Add(requirement); |
280 return failures; | 358 return failures; |
281 } | 359 } |
282 | 360 |
283 public UnitEquipmentItem[] GetEquipmentItemsByExclusionGroup(string group) | 361 public UnitEquipmentItem[] GetEquipmentItemsByExclusionGroup(string group) |
284 { | 362 { |
285 ArrayList list = (ArrayList)equipmentExclusionGroups[group]; | 363 List<UnitEquipmentItem> list = null; |
364 equipmentExclusionGroups.TryGetValue(group, out list); | |
286 | 365 |
287 if (list == null) | 366 if (list == null) |
288 { | 367 { |
289 return new UnitEquipmentItem[0]; | 368 return new UnitEquipmentItem[0]; |
290 } | 369 } |
291 else | 370 else |
292 { | 371 { |
293 return (UnitEquipmentItem[])list.ToArray(typeof(UnitEquipmentItem)); | 372 return list.ToArray(); |
294 } | 373 } |
295 } | 374 } |
296 } | 375 } |
297 } | 376 } |