# HG changeset patch # User IBBoard # Date 1249816152 0 # Node ID ced5a18d9f52d4d4b620d84d6a1312f148f71cf1 # Parent 6c6cfe5594fc03f3e11e884dab57de516eac09e2 Re #118: Allow equipment amounts of "ratio" equipment to be define as absolute or ratio amounts * Rework Unit's internals on how it stores equipment selection amounts * Fix logic error in "IsValidValue()" for absolute equipment selections * Fix calculation error when using "equip all" for absolute equipment selections * Make abstract equipment selection object set amount taken using property to trigger value checking Also: * Line ending cleanup in UnitEquipmentItem diff -r 6c6cfe5594fc -r ced5a18d9f52 api/Objects/AbstractUnitEquipmentItemSelection.cs --- a/api/Objects/AbstractUnitEquipmentItemSelection.cs Sun Aug 09 10:34:09 2009 +0000 +++ b/api/Objects/AbstractUnitEquipmentItemSelection.cs Sun Aug 09 11:09:12 2009 +0000 @@ -19,7 +19,7 @@ { selectionForUnit = unit; selectedItem = item; - amountTaken = amount; + AmountTaken = amount; } public Unit EquipmentForUnit diff -r 6c6cfe5594fc -r ced5a18d9f52 api/Objects/Unit.cs --- a/api/Objects/Unit.cs Sun Aug 09 10:34:09 2009 +0000 +++ b/api/Objects/Unit.cs Sun Aug 09 11:09:12 2009 +0000 @@ -20,7 +20,7 @@ private Unit parentUnit; private double points; private ArmyCategory cat; - private Dictionary equipment = new Dictionary(); + private Dictionary equipment = new Dictionary(); private List containedUnits = new List(); public event DoubleValChangedDelegate PointsValueChanged; public event IntValChangedDelegate UnitSizeChanged; @@ -35,6 +35,23 @@ Size = startSize; SetInitialEquipment(); CalcCost(); + UnitEquipmentAmountChanged+= new DoubleValChangedDelegate(UnitEquipmentAmountChangedHandler); + UnitSizeChanged+= new IntValChangedDelegate(UnitSizeChangedHandler); + } + + private void UnitEquipmentAmountChangedHandler(WarFoundryObject obj, double oldVal, double newVal) + { + CalcCost(); + } + + private void UnitSizeChangedHandler(WarFoundryObject obj, int oldVal, int newVal) + { + CalcCost(); + + if (HasDefaultName()) + { + OnNameChanged("", Name); + } } protected override string DefaultName() @@ -64,7 +81,14 @@ { if (CanEquipWithItem(unitEquip)) { - equipment[unitEquip] = unitEquip.MinNumber; + if (unitEquip.IsRatioLimit) + { + equipment[unitEquip] = new UnitEquipmentRatioSelection(this, unitEquip); + } + else + { + equipment[unitEquip] = new UnitEquipmentNumericSelection(this, unitEquip); + } } } } @@ -76,32 +100,9 @@ double oldpoints = points; points = type.CostPerTrooper * AdditionalTroopers + type.BaseUnitCost; - foreach (UnitEquipmentItem unitEquipItem in equipment.Keys) + foreach (AbstractUnitEquipmentItemSelection equipSelection in equipment.Values) { - double count = equipment[unitEquipItem]; - - if (unitEquipItem.IsRatioLimit) - { - if (unitEquipItem.RoundNumberUp) - { - points += Math.Ceiling(size * count) * unitEquipItem.Cost; - } - else - { - points += Math.Floor(size * count) * unitEquipItem.Cost; - } - } - else - { - if (count == WarFoundryCore.INFINITY) - { - points += size * unitEquipItem.Cost; - } - else - { - points += count * unitEquipItem.Cost; - } - } + points += equipSelection.TotalCost; } if (oldpoints!=points) @@ -129,7 +130,6 @@ { int oldValue = size; size = (value>0 ? value : 1); - CalcCost(); OnUnitSizeChanged(oldValue, size); } } @@ -253,7 +253,15 @@ public double GetEquipmentAmount(UnitEquipmentItem item) { - return DictionaryUtils.GetValue(equipment, item); + double amount = 0; + AbstractUnitEquipmentItemSelection selection = DictionaryUtils.GetValue(equipment, item); + + if (selection != null) + { + amount = selection.AmountTaken; + } + + return amount; } public double GetEquipmentAmount(string equipID) @@ -263,17 +271,34 @@ public void SetEquipmentAmount(UnitEquipmentItem equip, int amount) { - if (equip.IsRatioLimit) - { - throw new InvalidOperationException("Equipment with ID "+equip.ID+" for unit of type "+UnitType.ID+" has a ratio limit, not an absolute limit"); - } - if (amount <1 && amount != WarFoundryCore.INFINITY) { amount = 0; } - SetEquipmentAmount(equip, (double)amount); + if (amount == 0) + { + RemoveEquipmentItem(equip); + } + else + { + double oldAmount = GetEquipmentAmount(equip); + + if (amount!=oldAmount) + { + if (oldAmount == 0) + { + equipment[equip] = new UnitEquipmentNumericSelection(this, equip, amount); + } + else + { + AbstractUnitEquipmentItemSelection currSelection = DictionaryUtils.GetValue(equipment, equip); + currSelection.AmountTaken = amount; + } + + OnUnitEquipmentAmountChanged(equip, oldAmount, amount); + } + } } public void SetEquipmentRatio(UnitEquipmentItem equip, double ratio) @@ -292,31 +317,39 @@ ratio = 0; } - SetEquipmentAmount(equip, ratio); + if (ratio == 0) + { + RemoveEquipmentItem(equip); + } + else + { + double oldRatio = GetEquipmentAmount(equip); + + if (ratio != oldRatio) + { + if (oldRatio == 0) + { + equipment[equip] = new UnitEquipmentRatioSelection(this, equip, ratio); + } + else + { + AbstractUnitEquipmentItemSelection currSelection = DictionaryUtils.GetValue(equipment, equip); + currSelection.AmountTaken = ratio; + } + + OnUnitEquipmentAmountChanged(equip, oldRatio, ratio); + } + } } - private void SetEquipmentAmount(UnitEquipmentItem equip, double amount) + private void RemoveEquipmentItem(UnitEquipmentItem equip) { - double oldAmount = 0; - - if (equipment.ContainsKey(equip)) - { - oldAmount = equipment[equip]; - } - - if (amount!=oldAmount) + double oldAmount = GetEquipmentAmount(equip); + + if (oldAmount != 0) { - if (amount != 0) - { - equipment[equip] = amount; - } - else - { - equipment.Remove(equip); - } - - OnUnitEquipmentAmountChanged(equip, oldAmount, amount); - CalcCost(); + equipment.Remove(equip); + OnUnitEquipmentAmountChanged(equip, oldAmount, 0); } } diff -r 6c6cfe5594fc -r ced5a18d9f52 api/Objects/UnitEquipmentItem.cs --- a/api/Objects/UnitEquipmentItem.cs Sun Aug 09 10:34:09 2009 +0000 +++ b/api/Objects/UnitEquipmentItem.cs Sun Aug 09 11:09:12 2009 +0000 @@ -220,10 +220,10 @@ } public static string FormatEquipmentAmount(UnitEquipmentItem item, double amount) - { - if (amount == WarFoundryCore.INFINITY) - { - return "all"; //TODO: Translate + { + if (amount == WarFoundryCore.INFINITY) + { + return "all"; //TODO: Translate } else if (item.IsRatioLimit) { diff -r 6c6cfe5594fc -r ced5a18d9f52 api/Objects/UnitEquipmentNumericSelection.cs --- a/api/Objects/UnitEquipmentNumericSelection.cs Sun Aug 09 10:34:09 2009 +0000 +++ b/api/Objects/UnitEquipmentNumericSelection.cs Sun Aug 09 11:09:12 2009 +0000 @@ -20,13 +20,18 @@ { get { - return AmountTaken * EquipmentItem.Cost; + return CalculateAmount() * EquipmentItem.Cost; } } + + private double CalculateAmount() + { + return (AmountTaken == WarFoundryCore.INFINITY ? EquipmentForUnit.Size : AmountTaken); + } protected override bool IsValidValue (double newValue) { - return newValue = Math.Round(newValue); + return newValue == Math.Round(newValue); } } }