Mercurial > repos > IBBoard.WarFoundry.API
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 } |