# HG changeset patch # User IBBoard # Date 1257538290 0 # Node ID 37ad50823531ae3104e9fc86b80d66c6cef0901f # Parent 4d7ff70bb109c44e56ecb53f8d0517f040860885 Re #208: equipmentslot limit issues * Move more code to a common method * Use new IBBMath.Percentage method to ensure consistent calculation of percentages * Move subtraction of amount already taken in slot inside IF and ELSE and tailor to situation Some tests still failing diff -r 4d7ff70bb109 -r 37ad50823531 api/Util/UnitEquipmentUtil.cs --- a/api/Util/UnitEquipmentUtil.cs Thu Nov 05 21:09:03 2009 +0000 +++ b/api/Util/UnitEquipmentUtil.cs Fri Nov 06 20:11:30 2009 +0000 @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Text; +using IBBoard.CustomMath; using IBBoard.Limits; using IBBoard.WarFoundry.API.Objects; @@ -142,31 +143,31 @@ public static double GetMaxEquipmentPercentage(Unit unit, UnitEquipmentItem equip) { + return GetMinOfSlotLimitAndEquipmentLimit(equip, equip.MaxLimit, unit); + } + + private static double GetPercentageOfUnitSize(int number, Unit unit) + { + return IBBMath.Percentage(number, unit.Size); + } + + private static double GetMinOfSlotLimitAndEquipmentLimit(UnitEquipmentItem equip, AbstractLimit equipLimit, Unit unit) + { double limit = 0; AbstractLimit slotLimit = GetSlotLimitForItem(unit, equip); if (slotLimit is IPercentageLimit) { limit = ((IPercentageLimit)slotLimit).Percentage; + limit = limit - GetPercentageOfUnitSize(unit.GetEquipmentAmountInSlotExcludingItem(equip), unit); } else { - limit = GetPercentageOfUnitSize(slotLimit.GetLimit(unit.Size), unit); + int remaining = slotLimit.GetLimit(unit.Size) - unit.GetEquipmentAmountInSlotExcludingItem(equip); + limit = GetPercentageOfUnitSize(remaining, unit); } - limit = limit - GetPercentageOfUnitSize(unit.GetEquipmentAmountInSlotExcludingItem(equip), unit); - - return GetMinOfSlotLimitAndEquipmentLimit(equip.IsRatioLimit, limit, equip.MaxLimit, unit); - } - - private static double GetPercentageOfUnitSize(int number, Unit unit) - { - return (number / (double)unit.Size) * 100; - } - - private static double GetMinOfSlotLimitAndEquipmentLimit(bool equipIsRatio, double limit, AbstractLimit equipLimit, Unit unit) - { - if (equipIsRatio) + if (equip.IsRatioLimit) { limit = Math.Min(limit, ((IPercentageLimit)equipLimit).Percentage); } @@ -179,22 +180,8 @@ } public static double GetMinEquipmentPercentage(Unit unit, UnitEquipmentItem equip) - { - double limit = 0; - AbstractLimit slotLimit = GetSlotLimitForItem(unit, equip); - - if (slotLimit is IPercentageLimit) - { - limit = ((IPercentageLimit)slotLimit).Percentage; - } - else - { - limit = GetPercentageOfUnitSize(slotLimit.GetLimit(unit.Size), unit); - } - - limit = limit - GetPercentageOfUnitSize(unit.GetEquipmentAmountInSlotExcludingItem(equip), unit); - - return GetMinOfSlotLimitAndEquipmentLimit(equip.IsRatioLimit, limit, equip.MinLimit, unit); + { + return GetMinOfSlotLimitAndEquipmentLimit(equip, equip.MinLimit, unit); } } }