Mercurial > repos > IBBoard.WarFoundry.API
diff 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 |
line wrap: on
line diff
--- a/API/Objects/UnitEquipmentRatioSelection.cs Sun Oct 30 20:33:05 2011 +0000 +++ b/API/Objects/UnitEquipmentRatioSelection.cs Sun Nov 06 20:21:57 2011 +0000 @@ -27,17 +27,37 @@ { get { - return CalculateNumberTaken (EquipmentForUnit, EquipmentItem, AmountTaken); + return CalculateNumberTaken(EquipmentForUnit, EquipmentItem, AmountTaken); + } + } + + public override int RawNumberTaken + { + get + { + return CalculateRawNumberTaken(EquipmentForUnit, EquipmentItem, AmountTaken); } } - internal static int CalculateNumberTaken (Unit unit, UnitEquipmentItem item, double ratioTaken) + internal static int CalculateNumberTaken(Unit unit, UnitEquipmentItem item, double ratioTaken) + { + int wholeNumberTaken = CalculateRawNumberTaken(unit, item, ratioTaken); + int maxTaken = Int32.MaxValue; + int minTaken = 0; + + if (wholeNumberTaken > 0) + { + maxTaken = UnitEquipmentUtil.GetMaxEquipmentCount(unit, item); + } + + minTaken = UnitEquipmentUtil.GetMinEquipmentCount(unit, item); + return Math.Min(Math.Max(wholeNumberTaken, minTaken), maxTaken); + } + + private static int CalculateRawNumberTaken (Unit unit, UnitEquipmentItem item, double ratioTaken) { double exactNumberTaken = (ratioTaken / 100) * unit.Size; - int wholeNumberTaken = (int)IBBMath.Round (exactNumberTaken, item.RoundNumberUp); - int maxTaken = UnitEquipmentUtil.GetMaxEquipmentCount (unit, item); - int minTaken = UnitEquipmentUtil.GetMinEquipmentCount (unit, item); - return Math.Min (Math.Max (wholeNumberTaken, minTaken), maxTaken); + return (int)IBBMath.Round(exactNumberTaken, item.RoundNumberUp); } } }