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 }