# HG changeset patch # User IBBoard # Date 1256762533 0 # Node ID 0b413f41e6e35c060b6649e4d58a53ec125ef577 # Parent 354d51cc002b7e4d7a4ee1e2f962d2b9037fff89 Re #198: Add equipment slots * Refactor out common function * Add handling of slot limits and existing equipment to GetMaxEquipmentPercentage diff -r 354d51cc002b -r 0b413f41e6e3 api/Util/UnitEquipmentUtil.cs --- a/api/Util/UnitEquipmentUtil.cs Tue Oct 27 20:58:10 2009 +0000 +++ b/api/Util/UnitEquipmentUtil.cs Wed Oct 28 20:42:13 2009 +0000 @@ -110,7 +110,7 @@ private static int GetEquipmentCountLimit (Unit unit, int currLimit, UnitEquipmentItem equip) { int newLimit = currLimit; - AbstractLimit limit = unit.UnitType.GetEquipmentSlotLimit (equip.SlotName); + AbstractLimit limit = GetSlotLimitForItem(unit, equip); if (!(limit is UnlimitedLimit)) { @@ -120,6 +120,12 @@ return newLimit; } + + private static AbstractLimit GetSlotLimitForItem(Unit unit, UnitEquipmentItem equip) + { + return unit.UnitType.GetEquipmentSlotLimit(equip.SlotName); + } + public static int GetMinEquipmentCount (Unit unit, UnitEquipmentItem equip) { @@ -130,23 +136,37 @@ public static bool IsEquipmentRatioLimited(Unit unit, UnitEquipmentItem equip) { - AbstractLimit limit = unit.UnitType.GetEquipmentSlotLimit(equip.SlotName); + AbstractLimit limit = GetSlotLimitForItem(unit, equip); return equip.IsRatioLimit && (limit is IPercentageLimit || limit is UnlimitedLimit); } public static double GetMaxEquipmentPercentage(Unit unit, UnitEquipmentItem equip) { double limit = 0; + AbstractLimit slotLimit = GetSlotLimitForItem(unit, equip); - if (equip.IsRatioLimit) + + if (!(slotLimit is IPercentageLimit || slotLimit is UnlimitedLimit) || unit.GetEquipmentAmountInSlot (equip.SlotName) != 0) { - limit = Math.Max(((IPercentageLimit)equip.MinLimit).Percentage, ((IPercentageLimit)equip.MaxLimit).Percentage); + limit = (GetMaxEquipmentCount(unit, equip) / (double)unit.Size) * 100.0; } else { - int unitSize = unit.Size; - limit = (equip.MaxLimit.GetLimit(unitSize) / (double)unitSize) * 100.0; - } + if (equip.IsRatioLimit) + { + limit = Math.Max(((IPercentageLimit)equip.MinLimit).Percentage, ((IPercentageLimit)equip.MaxLimit).Percentage); + } + else + { + int unitSize = unit.Size; + limit = (equip.MaxLimit.GetLimit(unitSize) / (double)unitSize) * 100.0; + } + + if (slotLimit is IPercentageLimit) + { + limit = Math.Min(((IPercentageLimit)slotLimit).Percentage, limit); + } + } return limit; }