comparison API/Objects/UnitEquipmentRatioSelection.cs @ 429:7179c585d31d

Re #356: Stack overflow with some equipment limits * Add RawNumberTaken to be used in some locations to avoid indirect recursion * Use new RawNumberTaken within Unit equipment counting method Overflow fixed, but results not correct
author IBBoard <dev@ibboard.co.uk>
date Sun, 06 Nov 2011 20:21:57 +0000
parents 3c4a6403a88c
children c8002429ab45
comparison
equal deleted inserted replaced
428:8f5125740316 429:7179c585d31d
25 25
26 public override int NumberTaken 26 public override int NumberTaken
27 { 27 {
28 get 28 get
29 { 29 {
30 return CalculateNumberTaken (EquipmentForUnit, EquipmentItem, AmountTaken); 30 return CalculateNumberTaken(EquipmentForUnit, EquipmentItem, AmountTaken);
31 } 31 }
32 } 32 }
33 33
34 internal static int CalculateNumberTaken (Unit unit, UnitEquipmentItem item, double ratioTaken) 34 public override int RawNumberTaken
35 {
36 get
37 {
38 return CalculateRawNumberTaken(EquipmentForUnit, EquipmentItem, AmountTaken);
39 }
40 }
41
42 internal static int CalculateNumberTaken(Unit unit, UnitEquipmentItem item, double ratioTaken)
43 {
44 int wholeNumberTaken = CalculateRawNumberTaken(unit, item, ratioTaken);
45 int maxTaken = Int32.MaxValue;
46 int minTaken = 0;
47
48 if (wholeNumberTaken > 0)
49 {
50 maxTaken = UnitEquipmentUtil.GetMaxEquipmentCount(unit, item);
51 }
52
53 minTaken = UnitEquipmentUtil.GetMinEquipmentCount(unit, item);
54 return Math.Min(Math.Max(wholeNumberTaken, minTaken), maxTaken);
55 }
56
57 private static int CalculateRawNumberTaken (Unit unit, UnitEquipmentItem item, double ratioTaken)
35 { 58 {
36 double exactNumberTaken = (ratioTaken / 100) * unit.Size; 59 double exactNumberTaken = (ratioTaken / 100) * unit.Size;
37 int wholeNumberTaken = (int)IBBMath.Round (exactNumberTaken, item.RoundNumberUp); 60 return (int)IBBMath.Round(exactNumberTaken, item.RoundNumberUp);
38 int maxTaken = UnitEquipmentUtil.GetMaxEquipmentCount (unit, item);
39 int minTaken = UnitEquipmentUtil.GetMinEquipmentCount (unit, item);
40 return Math.Min (Math.Max (wholeNumberTaken, minTaken), maxTaken);
41 } 61 }
42 } 62 }
43 } 63 }