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);
 		}
 	}
 }