# HG changeset patch # User IBBoard # Date 1239291382 0 # Node ID 2094bd0ba6520795619d1708d920302ec339b8bb # Parent a920b1bcb40877aa242b00f37c18da0f1f5784fe Re #61 - Complete structure of WarFoundry API objects * Make Unit work with EquipmentItem objects as it doesn't need to know about the limits * Add methods to UnitType to check limits on an EquipmentItem Also: * Remove some unnecessary casting now that we're using genericed lists diff -r a920b1bcb408 -r 2094bd0ba652 api/Objects/CompositeEquipmentItem.cs --- a/api/Objects/CompositeEquipmentItem.cs Thu Apr 09 15:05:38 2009 +0000 +++ b/api/Objects/CompositeEquipmentItem.cs Thu Apr 09 15:36:22 2009 +0000 @@ -29,7 +29,7 @@ public void RemoveItem(EquipmentItem item) { compositeItems.Remove(item); - cost-= item.Cost; + Cost-= item.Cost; } public EquipmentItem[] Items diff -r a920b1bcb408 -r 2094bd0ba652 api/Objects/Unit.cs --- a/api/Objects/Unit.cs Thu Apr 09 15:05:38 2009 +0000 +++ b/api/Objects/Unit.cs Thu Apr 09 15:36:22 2009 +0000 @@ -21,7 +21,7 @@ private Race race; 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; @@ -34,7 +34,7 @@ Army = parentArmy; type = unitType; Size = startSize; - setInitialEquipment(); + SetInitialEquipment(); CalcCost(); } @@ -57,15 +57,15 @@ } } - private void setInitialEquipment() + private void SetInitialEquipment() { foreach (UnitEquipmentItem unitEquip in UnitType.GetEquipmentItems()) { if (unitEquip.IsRequired) { - if (CanEquipWithItem(unitEquip.ID)) + if (CanEquipWithItem(unitEquip)) { - equipment[unitEquip] = unitEquip.MinNumber; + equipment[unitEquip.EquipmentItem] = unitEquip.MinNumber; } } } @@ -77,10 +77,10 @@ double oldpoints = points; points = type.CostPerTrooper * AdditionalTroopers + type.BaseUnitCost; - foreach (UnitEquipmentItem unitEquipItem in equipment.Keys) + foreach (EquipmentItem equipItem in equipment.Keys) { - EquipmentItem equipItem = unitEquipItem.EquipmentItem; - double count = (double)equipment[unitEquipItem]; + double count = equipment[equipItem]; + UnitEquipmentItem unitEquipItem = UnitType.GetEquipmentItem(equipItem); if (unitEquipItem.IsRatioLimit) { @@ -235,42 +235,53 @@ } } - return (UnitEquipmentItem[])list.ToArray(); + return list.ToArray(); } - public UnitEquipmentItem[] GetEquipment() + public EquipmentItem[] GetEquipment() { - UnitEquipmentItem[] items = new UnitEquipmentItem[equipment.Count]; - int i = 0; - - foreach (UnitEquipmentItem item in equipment.Keys) - { - items[i++] = item; - } - - return items; + return DictionaryUtils.ToKeyArray(equipment); + } + + private UnitEquipmentItem[] GetUnitEquipmentItemsForEquipment() + { + EquipmentItem[] items = GetEquipment(); + int arrLength = items.Length; + UnitEquipmentItem[] unitItems = new UnitEquipmentItem[arrLength]; + + for (int i = 0; i < arrLength; i++) + { + UnitType.GetEquipmentItem(items[i]); + } + + return unitItems; } - public UnitEquipmentItem[] GetRequiredEquipment() + public EquipmentItem[] GetRequiredEquipment() { - List list = new List(); + List list = new List(); - foreach(UnitEquipmentItem item in equipment.Keys) + foreach(UnitEquipmentItem item in GetUnitEquipmentItemsForEquipment()) { if (item.IsRequired) { - list.Add(item); + list.Add(item.EquipmentItem); } } - return (UnitEquipmentItem[])list.ToArray(); + return list.ToArray(); } - - public double GetEquipmentAmount(UnitEquipmentItem item) + + public double GetEquipmentAmount(UnitEquipmentItem item) + { + return GetEquipmentAmount(item.EquipmentItem); + } + + public double GetEquipmentAmount(EquipmentItem item) { if (equipment.ContainsKey(item)) { - return (double)equipment[item]; + return equipment[item]; } else { @@ -281,13 +292,18 @@ public double GetEquipmentAmount(string equipID) { return GetEquipmentAmount(UnitType.GetEquipmentItem(equipID)); + } + + public void SetEquipmentAmount(UnitEquipmentItem equip, int amount) + { + SetEquipmentAmount(equip.EquipmentItem, amount); } - public void SetEquipmentAmount(UnitEquipmentItem equip, int amount) + public void SetEquipmentAmount(EquipmentItem equip, int amount) { - if (equip.IsRatioLimit) + if (UnitType.IsRatioLimitedEquipmentItem(equip)) { - throw new InvalidOperationException("Equipment with ID "+equip.EquipmentItemID+" for unit "+ID+" has a ratio limit, not an absolute limit"); + 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) @@ -300,9 +316,14 @@ public void SetEquipmentRatio(UnitEquipmentItem equip, double ratio) { - if (!equip.IsRatioLimit) + SetEquipmentRatio(equip.EquipmentItem, ratio); + } + + public void SetEquipmentRatio(EquipmentItem equip, double ratio) + { + if (UnitType.IsAbsoluteLimitedEquipmentItem(equip)) { - throw new InvalidOperationException("Equipment with ID "+equip.EquipmentItemID+" for unit "+ID+" has an absolute limit, not a ratio limit"); + throw new InvalidOperationException("Equipment with ID "+equip.ID+" for unit of type "+UnitType.ID+" has an absolute limit, not a ratio limit"); } if (ratio > 1) @@ -317,7 +338,7 @@ SetEquipmentAmount(equip, ratio); } - private void SetEquipmentAmount(UnitEquipmentItem equip, double amount) + private void SetEquipmentAmount(EquipmentItem equip, double amount) { double oldAmount = 0; @@ -340,26 +361,31 @@ OnUnitEquipmentAmountChanged(equip, oldAmount, amount); CalcCost(); } + } + + public bool CanEquipWithItem(UnitEquipmentItem item) + { + string mutex = item.MutexGroup; + + if (mutex == "") + { + return true; + } + + foreach (UnitEquipmentItem unitItem in GetUnitEquipmentItemsForEquipment()) + { + if (unitItem.MutexGroup == mutex) + { + return false; + } + } + + return true; } public bool CanEquipWithItem(string equipID) { - string mutex = UnitType.GetEquipmentItem(equipID).MutexGroup; - - if (mutex == "") - { - return true; - } - - foreach (UnitEquipmentItem item in equipment.Keys) - { - if (item.MutexGroup == mutex) - { - return false; - } - } - - return true; + return CanEquipWithItem(UnitType.GetEquipmentItem(equipID)); } private void OnPointsValueChanged(double oldValue, double newValue) @@ -378,7 +404,7 @@ } } - private void OnUnitEquipmentAmountChanged(UnitEquipmentItem equip, double oldValue, double newValue) + private void OnUnitEquipmentAmountChanged(EquipmentItem equip, double oldValue, double newValue) { if (UnitEquipmentAmountChanged!=null) { diff -r a920b1bcb408 -r 2094bd0ba652 api/Objects/UnitType.cs --- a/api/Objects/UnitType.cs Thu Apr 09 15:05:38 2009 +0000 +++ b/api/Objects/UnitType.cs Thu Apr 09 15:36:22 2009 +0000 @@ -244,6 +244,20 @@ UnitEquipmentItem equipItem = null; equipment.TryGetValue(id, out equipItem); return equipItem; + } + + /// + /// Gets a for the given , or null if the unit can't take that EquipmentItem + /// + /// + /// The to get the + /// + /// + /// The that definies the UnitType's restrictions for taking the + /// + public UnitEquipmentItem GetEquipmentItem(EquipmentItem item) + { + return GetEquipmentItem(item.ID); } /// @@ -272,6 +286,18 @@ } } + public bool IsRatioLimitedEquipmentItem(EquipmentItem item) + { + UnitEquipmentItem equip = GetEquipmentItem(item); + return equip != null && equip.IsRatioLimit; + } + + public bool IsAbsoluteLimitedEquipmentItem(EquipmentItem item) + { + UnitEquipmentItem equip = GetEquipmentItem(item); + return equip != null && !equip.IsRatioLimit; + } + public ICollection GetRequiredAbilities() { return requiredAbilities.Values;