# HG changeset patch # User IBBoard # Date 1258821654 0 # Node ID dce340f9cedc20ebb22f08cd47b90721bb346c06 # Parent 1f39e325deee2a39c610d4ee7ff9603ea4a06b1e Re #217: Rounding problem with equipment cost calculations * Temporary solution (which I thought I'd already committed yesterday) to make sure that rounding of amount doesn't round outside limit if limit and item rounding directions are different Re #220: Make percentage and numeric amounts more obvious * Deprecate some calculation and presentation methods and move them to UnitEquipmentUtils * Add method to return the number of equipment items taken rather than the amount taken diff -r 1f39e325deee -r dce340f9cedc api/Objects/AbstractUnitEquipmentItemSelection.cs --- a/api/Objects/AbstractUnitEquipmentItemSelection.cs Sat Nov 21 11:50:48 2009 +0000 +++ b/api/Objects/AbstractUnitEquipmentItemSelection.cs Sat Nov 21 16:40:54 2009 +0000 @@ -87,8 +87,9 @@ public abstract int NumberTaken { get; - } - + } + + [Obsolete("Implementation is down to the UI")] public abstract string GetEquipmentAmountString(); } } diff -r 1f39e325deee -r dce340f9cedc api/Objects/Unit.cs --- a/api/Objects/Unit.cs Sat Nov 21 11:50:48 2009 +0000 +++ b/api/Objects/Unit.cs Sat Nov 21 16:40:54 2009 +0000 @@ -248,67 +248,48 @@ } } - return list.ToArray(); + return list.ToArray(); + } + + internal AbstractUnitEquipmentItemSelection GetEquipmentSelection(UnitEquipmentItem item) + { + return DictionaryUtils.GetValue(equipment, item); } + [Obsolete("Use UnitEquipmentUtil method instead")] public double GetEquipmentAmount(UnitEquipmentItem item) - { - double amount = 0; - AbstractUnitEquipmentItemSelection selection = DictionaryUtils.GetValue(equipment, item); - - if (selection != null) - { - amount = selection.AmountTaken; - } - - return amount; - } - + { + return UnitEquipmentUtil.GetEquipmentAmount(this, item); + } + + [Obsolete("Use UnitEquipmentUtil method instead")] public double GetEquipmentAmount(string equipID) { return GetEquipmentAmount(UnitType.GetEquipmentItem(equipID)); - } - + } + + [Obsolete("Use UnitEquipmentUtil method instead")] public bool GetEquipmentAmountIsRatio(UnitEquipmentItem item) - { - return IsEquipmentAmountRatio(GetEquipmentSelection(item)); - } - - private AbstractUnitEquipmentItemSelection GetEquipmentSelection(UnitEquipmentItem item) - { - return DictionaryUtils.GetValue(equipment, item); - } - - private bool IsEquipmentAmountRatio(AbstractUnitEquipmentItemSelection selection) - { - return (selection is UnitEquipmentRatioSelection); - } - + { + return UnitEquipmentUtil.GetEquipmentAmountIsRatio(this, item); + } + + [Obsolete("Use UnitEquipmentUtil method instead")] public bool GetEquipmentAmountIsRatio(string itemID) { return GetEquipmentAmountIsRatio(UnitType.GetEquipmentItem(itemID)); } + [Obsolete("Implementation is down to the UI")] public string GetEquipmentAmountString(string equipID) { - return GetEquipmentAmountString(UnitType.GetEquipmentItem(equipID)); - } - + return ""; + } + + [Obsolete("Implementation is down to the UI")] public string GetEquipmentAmountString(UnitEquipmentItem item) - { - String amountString = ""; - AbstractUnitEquipmentItemSelection selection = GetEquipmentSelection(item); - - if (IsEquipmentAmountRatio(selection)) - { - amountString = UnitEquipmentRatioSelection.GetEquipmentAmountString(GetEquipmentAmount(item)); - } - else - { - amountString = UnitEquipmentNumericSelection.GetEquipmentAmountString(GetEquipmentAmount(item)); - } - - return amountString; + { + return ""; } public void SetEquipmentAmount(UnitEquipmentItem equip, int amount) @@ -508,9 +489,9 @@ public int GetEquipmentAmountInSlot (string slotName) { - int amount = 0; - - List selections = DictionaryUtils.GetValue(equipmentSlots, slotName); + int amount = 0; + + List selections = GetEquipmentSlotSelections(slotName); if (selections != null) { @@ -518,6 +499,11 @@ } return amount; + } + + internal List GetEquipmentSlotSelections(string slotName) + { + return DictionaryUtils.GetValue(equipmentSlots, slotName); } /// diff -r 1f39e325deee -r dce340f9cedc api/Objects/UnitEquipmentNumericSelection.cs --- a/api/Objects/UnitEquipmentNumericSelection.cs Sat Nov 21 11:50:48 2009 +0000 +++ b/api/Objects/UnitEquipmentNumericSelection.cs Sat Nov 21 16:40:54 2009 +0000 @@ -35,22 +35,15 @@ protected override bool IsValidValue (double newValue) { return base.IsValidValue(newValue) && IsWholeNumber(newValue); - } - + } + + [Obsolete("Implementation is down to the UI")] public override string GetEquipmentAmountString () { return GetEquipmentAmountString(AmountTaken); - } - - /// - /// Gets a string representing the amount of equipment taken when the amount is a numeric selection - /// - /// - /// A - /// - /// - /// A - /// + } + + [Obsolete("Implementation is down to the UI")] public static string GetEquipmentAmountString(double amount) { return amount.ToString(); diff -r 1f39e325deee -r dce340f9cedc api/Objects/UnitEquipmentRatioSelection.cs --- a/api/Objects/UnitEquipmentRatioSelection.cs Sat Nov 21 11:50:48 2009 +0000 +++ b/api/Objects/UnitEquipmentRatioSelection.cs Sat Nov 21 16:40:54 2009 +0000 @@ -3,7 +3,9 @@ // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. using System; +using IBBoard.CustomMath; using IBBoard.Limits; +using IBBoard.WarFoundry.API.Util; namespace IBBoard.WarFoundry.API.Objects { @@ -25,16 +27,21 @@ { get { - double numberTaken = (AmountTaken / 100) * EquipmentForUnit.Size; - return (int) (EquipmentItem.RoundNumberUp ? Math.Ceiling(numberTaken) : Math.Floor(numberTaken)); + double exactNumberTaken = (AmountTaken / 100) * EquipmentForUnit.Size; + int wholeNumberTaken = (int) IBBMath.Round(exactNumberTaken, EquipmentItem.RoundNumberUp); + int maxTaken = UnitEquipmentUtil.GetMaxEquipmentCount(EquipmentForUnit, EquipmentItem); + int minTaken = UnitEquipmentUtil.GetMinEquipmentCount(EquipmentForUnit, EquipmentItem); + return Math.Min(Math.Max(wholeNumberTaken, minTaken), maxTaken); } - } - + } + + [Obsolete("Implementation is down to the UI")] public override string GetEquipmentAmountString () { return GetEquipmentAmountString(AmountTaken); - } - + } + + [Obsolete("Implementation is down to the UI")] public static string GetEquipmentAmountString(double amount) { string amountString; diff -r 1f39e325deee -r dce340f9cedc api/Util/UnitEquipmentUtil.cs --- a/api/Util/UnitEquipmentUtil.cs Sat Nov 21 11:50:48 2009 +0000 +++ b/api/Util/UnitEquipmentUtil.cs Sat Nov 21 16:40:54 2009 +0000 @@ -178,5 +178,29 @@ { return GetMinOfSlotLimitAndEquipmentLimit(equip, equip.MinLimit, unit); } + + public static double GetEquipmentAmount(Unit unit, UnitEquipmentItem item) + { + double amount = 0; + AbstractUnitEquipmentItemSelection selection = unit.GetEquipmentSelection(item); + + if (selection != null) + { + amount = selection.AmountTaken; + } + + return amount; + } + + public static bool GetEquipmentAmountIsRatio(Unit unit, UnitEquipmentItem item) + { + return (unit.GetEquipmentSelection(item) is UnitEquipmentRatioSelection); + } + + public static int GetEquipmentAmountTaken(Unit unit, UnitEquipmentItem item) + { + AbstractUnitEquipmentItemSelection selection = unit.GetEquipmentSelection(item); + return (selection == null ? 0 : selection.NumberTaken); + } } }