# HG changeset patch # User IBBoard # Date 1320610917 0 # Node ID 7179c585d31d9160dafcb011705226cb235c953f # Parent 8f512574031669bd28917a5870e19231a023d6bd 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 diff -r 8f5125740316 -r 7179c585d31d API/Objects/AbstractUnitEquipmentItemSelection.cs --- a/API/Objects/AbstractUnitEquipmentItemSelection.cs Sun Oct 30 20:33:05 2011 +0000 +++ b/API/Objects/AbstractUnitEquipmentItemSelection.cs Sun Nov 06 20:21:57 2011 +0000 @@ -40,7 +40,7 @@ public double AmountTaken { - get + get { return amountTaken; } @@ -83,10 +83,25 @@ return NumberTaken * EquipmentItem.Cost; } } - + + /// + /// Gets the number taken as a whole number of times the item was taken. This number may be altered by the limits + /// placed on the equipment item (e.g. reduced if there is a lower maximum limit) + /// + /// + /// The number of times the item was taken, modified by any limits. + /// public abstract int NumberTaken { get; } + + /// + /// Gets the raw amount taken as a whole number of times the item was taken. + /// + /// + /// The unmodified number of times the item was taken. + /// + public abstract int RawNumberTaken { get; } } } diff -r 8f5125740316 -r 7179c585d31d API/Objects/Unit.cs --- a/API/Objects/Unit.cs Sun Oct 30 20:33:05 2011 +0000 +++ b/API/Objects/Unit.cs Sun Nov 06 20:21:57 2011 +0000 @@ -511,7 +511,7 @@ foreach (AbstractUnitEquipmentItemSelection selection in selections) { - amount += selection.NumberTaken; + amount += selection.RawNumberTaken; } return amount; diff -r 8f5125740316 -r 7179c585d31d API/Objects/UnitEquipmentNumericSelection.cs --- a/API/Objects/UnitEquipmentNumericSelection.cs Sun Oct 30 20:33:05 2011 +0000 +++ b/API/Objects/UnitEquipmentNumericSelection.cs Sun Nov 06 20:21:57 2011 +0000 @@ -23,7 +23,15 @@ { get { - return (int) AmountTaken; + return RawNumberTaken; + } + } + + public override int RawNumberTaken + { + get + { + return (int)AmountTaken; } } diff -r 8f5125740316 -r 7179c585d31d API/Objects/UnitEquipmentRatioSelection.cs --- 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); } } }