comparison api/Objects/Unit.cs @ 0:520818033bb6

Initial commit of WarFoundry code
author IBBoard <dev@ibboard.co.uk>
date Fri, 19 Dec 2008 15:57:51 +0000
parents
children 306558904c2a
comparison
equal deleted inserted replaced
-1:000000000000 0:520818033bb6
1 using System;
2 using System.Collections;
3 using System.Text;
4 using System.Xml;
5 using IBBoard.Lang;
6
7 namespace IBBoard.WarFoundry.API.Objects
8 {
9 /// <summary>
10 /// Summary description for UnitInstance.
11 /// </summary>
12 public class Unit : WarFoundryObject
13 {
14 private UnitType type;
15 private int size;
16 private Army army;
17 private Race race;
18 private double points;
19 private ArmyCategory cat;
20 private Hashtable equipment = new Hashtable();
21 public event DoubleValChangedDelegate PointsValueChanged;
22 public event IntValChangedDelegate UnitSizeChanged;
23 public event FloatValChangedDelegate UnitEquipmentAmountChanged;
24
25 public Unit(UnitType unitType, Army parentArmy) : this(unitType, unitType.MinSize, parentArmy){}
26
27 public Unit(UnitType unitType, int startSize, Army parentArmy)
28 {
29 Army = parentArmy;
30 type = unitType;
31 Size = startSize;
32 setInitialEquipment();
33 CalcCost();
34 }
35
36 protected override string DefaultName()
37 {
38 if (type != null)
39 {
40 if (size == 1)
41 {
42 return type.Name;
43 }
44 else
45 {
46 return String.Format(Translation.GetTranslation("defaultUnitName"), size, type.Name);
47 }
48 }
49 else
50 {
51 return "Unknown Unit";
52 }
53 }
54
55 private void setInitialEquipment()
56 {
57 foreach (UnitEquipmentItem unitEquip in UnitType.GetEquipmentItems())
58 {
59 if (unitEquip.IsRequired)
60 {
61 if (CanEquipWithItem(unitEquip.ID))
62 {
63 EquipmentItem equipItem = unitEquip.EquipmentItem;
64 equipment[unitEquip.ID] = equipItem.MinNumber;
65 }
66 }
67 }
68 }
69
70 private void CalcCost()
71 {
72 String oldName = HasDefaultName() ? Name : null;
73 double oldpoints = points;
74 points = type.CostPerTrooper * AdditionalTroopers + type.BaseUnitCost;
75 UnitEquipmentItem unitEquipItem;
76 EquipmentItem equipItem;
77 float count;
78
79 foreach (string key in equipment.Keys)
80 {
81 unitEquipItem = UnitType.GetEquipmentItem(key);
82 equipItem = unitEquipItem.EquipmentItem;
83 count = (float)equipment[key];
84
85 if (equipItem.IsRatioLimit)
86 {
87 if (unitEquipItem.RoundNumberUp)
88 {
89 points+= Math.Ceiling(size * count) * equipItem.Cost;
90 }
91 else
92 {
93 points+= Math.Floor(size * count) * equipItem.Cost;
94 }
95 }
96 else
97 {
98 if (count == -1)
99 {
100 points+= size * equipItem.Cost;
101 }
102 else
103 {
104 points+= count * equipItem.Cost;
105 }
106 }
107 }
108
109 if (oldpoints!=points)
110 {
111 OnPointsValueChanged(oldpoints, points);
112 }
113
114 if (oldName!=null)
115 {
116 OnNameChanged(oldName, Name);
117 }
118 }
119
120 public int AdditionalTroopers
121 {
122 get { return Math.Max(Size - type.BaseSize, 0); }
123 }
124
125 public int Size
126 {
127 get { return size; }
128 set
129 {
130 if (value!=size)
131 {
132 int oldValue = size;
133 size = (value>0 ? value : 1);
134 CalcCost();
135 OnUnitSizeChanged(oldValue, size);
136 }
137 }
138 }
139
140 public UnitType UnitType
141 {
142 get { return type; }
143 }
144
145 public Army Army
146 {
147 get { return army; }
148 set
149 {
150 army = value;
151
152 if (army == null)
153 {
154 Category = null;
155 }
156 }
157 }
158
159 public Race Race
160 {
161 get { return race; }
162 set { race = value; }
163 }
164
165 public ArmyCategory Category
166 {
167 get
168 {
169 if (cat==null)
170 {
171 if (Army!=null)
172 {
173 return Army.GetCategory(UnitType.MainCategory);
174 }
175 else
176 {
177 return null;
178 }
179 }
180 else
181 {
182 return cat;
183 }
184 }
185 set { cat = value; }
186 }
187
188 public double PointsValue
189 {
190 get
191 {
192 if (points == 0)
193 {
194 CalcCost();
195 }
196
197 return points;
198 }
199 }
200
201 public UnitEquipmentItem[] GetAllowedOptionalEquipment()
202 {
203 ArrayList list = new ArrayList();
204
205 foreach (UnitEquipmentItem item in UnitType.GetEquipmentItems())
206 {
207 if (!item.IsRequired)
208 {
209 list.Add(item);
210 }
211 }
212
213 return (UnitEquipmentItem[])list.ToArray(typeof(UnitEquipmentItem));
214 }
215
216 public UnitEquipmentItem[] GetEquipment()
217 {
218 UnitEquipmentItem[] items = new UnitEquipmentItem[equipment.Count];
219 int i = 0;
220
221 foreach (String itemID in equipment.Keys)
222 {
223 items[i++] = UnitType.GetEquipmentItem(itemID);
224 }
225
226 return items;
227 }
228
229 public UnitEquipmentItem[] GetRequiredEquipment()
230 {
231 ArrayList list = new ArrayList();
232 UnitEquipmentItem item;
233
234 foreach(String itemID in equipment.Keys)
235 {
236 item = UnitType.GetEquipmentItem(itemID);
237
238 if (item.IsRequired)
239 {
240 list.Add(item);
241 }
242 }
243
244 return (UnitEquipmentItem[])list.ToArray(typeof(UnitEquipmentItem));
245 }
246
247 public float GetEquipmentAmount(UnitEquipmentItem item)
248 {
249 return GetEquipmentAmount(item.EquipmentItem.ID);
250 }
251
252 public float GetEquipmentAmount(string equipID)
253 {
254 if (equipment.ContainsKey(equipID))
255 {
256 return (float)equipment[equipID];
257 }
258 else
259 {
260 return 0;
261 }
262 }
263
264 public void SetEquipmentAmount(string equipID, float amount)
265 {
266 UnitEquipmentItem equip = UnitType.GetEquipmentItem(equipID);
267
268 if (equip == null)
269 {
270 throw new InvalidOperationException("No such equipment ID "+equipID+" for unit "+ID);
271 }
272
273 if (equip.EquipmentItem.IsRatioLimit)
274 {
275 if (amount > 1)
276 {
277 amount = 1;
278 }
279 else if (amount < 0)
280 {
281 amount = 0;
282 }
283 //else what was passed in was okay
284 }
285 else
286 {
287 if (amount >=1 || amount == -1)
288 {
289 amount = (float)Math.Round(amount);
290 }
291 else
292 {
293 amount = 0;
294 }
295 }
296
297 float oldAmount = 0;
298
299 if (equipment.ContainsKey(equipID))
300 {
301 oldAmount = (float)equipment[equipID];
302 }
303
304 if (amount!=oldAmount)
305 {
306 if (amount > 0 || amount == -1)
307 {
308 equipment[equipID] = amount;
309 }
310 else
311 {
312 equipment.Remove(equipID);
313 }
314
315 OnUnitEquipmentAmountChanged(equip, oldAmount, amount);
316 CalcCost();
317 }
318 }
319
320 public bool CanEquipWithItem(string equipID)
321 {
322 string mutex = UnitType.GetEquipmentItem(equipID).MutexGroup;
323
324 if (mutex == "")
325 {
326 return true;
327 }
328
329 foreach (string itemID in equipment.Keys)
330 {
331 if (UnitType.GetEquipmentItem(itemID).MutexGroup == mutex)
332 {
333 return false;
334 }
335 }
336
337 return true;
338 }
339
340 private void OnPointsValueChanged(double oldValue, double newValue)
341 {
342 if (PointsValueChanged!=null)
343 {
344 PointsValueChanged(this, oldValue, newValue);
345 }
346 }
347
348 private void OnUnitSizeChanged(int oldValue, int newValue)
349 {
350 if (UnitSizeChanged!=null)
351 {
352 UnitSizeChanged(this, oldValue, newValue);
353 }
354 }
355
356 private void OnUnitEquipmentAmountChanged(UnitEquipmentItem equip, float oldValue, float newValue)
357 {
358 if (UnitEquipmentAmountChanged!=null)
359 {
360 UnitEquipmentAmountChanged(equip, oldValue, newValue);
361 }
362 }
363
364 public Stats UnitStats
365 {
366 get { return UnitType.UnitStats; }
367 }
368
369 /*public override string ToXmlString()
370 {
371 StringBuilder sb = new StringBuilder();
372 float amount;
373
374 foreach(string key in equipment.Keys)
375 {
376 amount = (float)equipment[key];
377
378 if (amount > 0 || amount == -1)
379 {
380 sb.Append("<equipItem id=\""+key+"\" amount=\""+amount+"\" />");
381 }
382 }
383
384 string equipmentString;
385
386 if (sb.Length > 0)
387 {
388 equipmentString = "<equipment>"+sb.ToString()+"</equipment>";
389 }
390 else
391 {
392 equipmentString = "";
393 }
394
395 if (equipmentString == "")
396 {
397 return "<unit id=\""+ID+"\" unitType=\""+UnitType.ID+"\" unitName=\""+name+"\" size=\""+Size+"\" />";
398 }
399 else
400 {
401 return "<unit id=\""+ID+"\" unitType=\""+UnitType.ID+"\" unitName=\""+name+"\" size=\""+Size+"\">"+equipmentString+"</unit>";
402 }
403 }*/
404 }
405 }