# HG changeset patch # User IBBoard # Date 1246131544 0 # Node ID 89cc29b4c0125a326a387895a15b3b2187ff4c03 # Parent 3ea0ab04352bc1192c1e07fa14812ff7e173028f Re #90: Stop new units showing up twice * Hand all of unit adding/removing down to category * Refactor out OnFailedRequirement method in Army * Make Army listen to and propogate FailedRequirement events from Units * Add OnUnitAdded/Removed method to ArmyCategory that takes list of failures * Remove direct reference to Army from Unit and go via ArmyCategory instead diff -r 3ea0ab04352b -r 89cc29b4c012 api/Commands/CreateAndAddUnitCommand.cs --- a/api/Commands/CreateAndAddUnitCommand.cs Sat Jun 27 18:59:49 2009 +0000 +++ b/api/Commands/CreateAndAddUnitCommand.cs Sat Jun 27 19:39:04 2009 +0000 @@ -12,17 +12,17 @@ public class CreateAndAddUnitCommand : Command { private UnitType addedUnitType; - private Army army; + private ArmyCategory armyCat; private Unit addedUnit; - public CreateAndAddUnitCommand(UnitType toAdd, Army armyTo) + public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory armyCatTo) { addedUnitType = toAdd; - army = armyTo; + armyCat = armyCatTo; } [Obsolete("Use two parameter constructor instead")] - public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory catTo, Army armyTo) : this(toAdd, armyTo) + public CreateAndAddUnitCommand(UnitType toAdd, ArmyCategory catTo, Army armyTo) : this(toAdd, catTo) { } @@ -33,7 +33,7 @@ public override bool CanExecute() { - return (addedUnitType!=null && army!=null); + return (addedUnitType!=null && armyCat!=null); } public override string Description @@ -48,19 +48,19 @@ public override bool Execute() { - addedUnit = new Unit(addedUnitType, army); + addedUnit = new Unit(addedUnitType, armyCat); this.Redo(); return true; } public override void Redo() { - army.AddUnit(addedUnit); + armyCat.AddUnit(addedUnit); } public override void Undo() - { - army.RemoveUnit(addedUnit); + { + armyCat.RemoveUnit(addedUnit); } diff -r 3ea0ab04352b -r 89cc29b4c012 api/Objects/Army.cs --- a/api/Objects/Army.cs Sat Jun 27 18:59:49 2009 +0000 +++ b/api/Objects/Army.cs Sat Jun 27 19:39:04 2009 +0000 @@ -69,6 +69,7 @@ cat.PointsValueChanged+= PointsValueChangedMethod; cat.UnitAdded+=new ObjectAddDelegate(Army_UnitAdded); cat.UnitRemoved+=new ObjectRemoveDelegate(Army_UnitRemoved); + cat.FailedRequirement+=new FailedUnitRequirementDelegate(Army_FailedRequirement); } } @@ -97,19 +98,16 @@ protected void OnUnitAdded(Unit unit) { OnUnitAdded(unit, null); - } - - protected void OnUnitAdded(Unit unit, List failedReqs) - { - if (UnitAdded!=null) - { - UnitAdded(unit); - } - - if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0) - { - FailedRequirement(failedReqs); - } + } + + protected void OnUnitAdded(Unit unit, List failedReqs) + { + if (UnitAdded != null) + { + UnitAdded(unit); + } + + OnFailedRequirement(failedReqs); } protected void OnUnitRemoved(Unit unit) @@ -122,12 +120,17 @@ if (UnitRemoved!=null) { UnitRemoved(unit); - } - - if (FailedRequirement!=null && failedReqs!=null && failedReqs.Count > 0) - { - FailedRequirement(failedReqs); - } + } + + OnFailedRequirement(failedReqs); + } + + protected void OnFailedRequirement(List failedReqs) + { + if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0) + { + FailedRequirement(failedReqs); + } } private void OnPointsValueChanged(double oldValue, double newValue) @@ -160,17 +163,13 @@ public void AddUnit(Unit unit) { - unit.Army = this; ArmyCategory armyCat = GetCategory(unit.UnitType.MainCategory); armyCat.AddUnit(unit); } public void RemoveUnit(Unit unit) { - List failedReqs = CanRemoveUnit(unit); - unit.Army = null; unit.Category.RemoveUnit(unit); - OnUnitRemoved(unit, failedReqs); } public Unit[] GetUnits(Category cat) @@ -254,14 +253,19 @@ return count; } - private void Army_UnitAdded(object val) + private void Army_UnitAdded(WarFoundryObject val) { OnUnitAdded((Unit)val); - } - - private void Army_UnitRemoved(object val) + } + + private void Army_UnitRemoved(WarFoundryObject val) { OnUnitRemoved((Unit)val); + } + + private void Army_FailedRequirement(List val) + { + OnFailedRequirement(val); } } } diff -r 3ea0ab04352b -r 89cc29b4c012 api/Objects/ArmyCategory.cs --- a/api/Objects/ArmyCategory.cs Sat Jun 27 18:59:49 2009 +0000 +++ b/api/Objects/ArmyCategory.cs Sat Jun 27 19:39:04 2009 +0000 @@ -21,7 +21,8 @@ private DoubleValChangedDelegate PointsValueChangedMethod; public event DoubleValChangedDelegate PointsValueChanged; public event ObjectAddDelegate UnitAdded; - public event ObjectRemoveDelegate UnitRemoved; + public event ObjectRemoveDelegate UnitRemoved; + public event FailedUnitRequirementDelegate FailedRequirement; public ArmyCategory(Army army, Category cat) : base() { @@ -74,16 +75,17 @@ unitTypes.TryGetValue(unit.UnitType.ID, out unitTypeCount); unitTypes[unit.UnitType.ID] = (int)unitTypeCount + 1; TotalPoints+= unit.PointsValue; - OnUnitAdded(unit); + OnUnitAdded(unit, failedReqs); } internal void RemoveUnit(Unit unit) { + List failedReqs = ParentArmy.CanRemoveUnit(unit); units.Remove(unit); unitTypes[unit.UnitType.ID] = ((int)unitTypes[unit.UnitType.ID])-1; TotalPoints-= unit.PointsValue; unit.PointsValueChanged-= PointsValueChangedMethod; - OnUnitRemoved(unit); + OnUnitRemoved(unit, failedReqs); } public int GetUnitTypeCount(UnitType unitType) @@ -122,23 +124,43 @@ { double diff = newVal - oldVal; TotalPoints+= diff; - } - } - - private void OnUnitAdded(Unit unit) - { - if (UnitAdded!=null) - { - UnitAdded(unit); - } - } - - private void OnUnitRemoved(Unit unit) - { - if (UnitRemoved!=null) - { - UnitRemoved(unit); - } + } + } + + protected void OnUnitAdded(Unit unit) + { + OnUnitAdded(unit, null); + } + + protected void OnUnitAdded(Unit unit, List failedReqs) + { + if (UnitAdded != null) + { + UnitAdded(unit); + } + + if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0) + { + FailedRequirement(failedReqs); + } + } + + protected void OnUnitRemoved(Unit unit) + { + OnUnitRemoved(unit, null); + } + + protected void OnUnitRemoved(Unit unit, List failedReqs) + { + if (UnitRemoved != null) + { + UnitRemoved(unit); + } + + if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0) + { + FailedRequirement(failedReqs); + } } protected virtual void OnPointsValueChanged(double oldValue, double newValue) diff -r 3ea0ab04352b -r 89cc29b4c012 api/Objects/Unit.cs --- a/api/Objects/Unit.cs Sat Jun 27 18:59:49 2009 +0000 +++ b/api/Objects/Unit.cs Sat Jun 27 19:39:04 2009 +0000 @@ -17,7 +17,6 @@ { private UnitType type; private int size; - private Army army; private Unit parentUnit; private double points; private ArmyCategory cat; @@ -25,13 +24,13 @@ private List containedUnits = new List(); public event DoubleValChangedDelegate PointsValueChanged; public event IntValChangedDelegate UnitSizeChanged; - public event DoubleValChangedDelegate UnitEquipmentAmountChanged; - - public Unit(UnitType unitType, Army parentArmy) : this(unitType, unitType.MinSize, parentArmy){} - - public Unit(UnitType unitType, int startSize, Army parentArmy) - { - Army = parentArmy; + public event DoubleValChangedDelegate UnitEquipmentAmountChanged; + + public Unit(UnitType unitType, ArmyCategory parentArmyCat) : this(unitType, unitType.MinSize, parentArmyCat) { } + + public Unit(UnitType unitType, int startSize, ArmyCategory parentArmyCat) + { + Category = parentArmyCat; type = unitType; Size = startSize; SetInitialEquipment(); @@ -143,16 +142,7 @@ public Army Army { - get { return army; } - set - { - army = value; - - if (army == null) - { - Category = null; - } - } + get { return (Category == null ? null : Category.ParentArmy); } } public Race Race @@ -161,24 +151,10 @@ } public ArmyCategory Category - { - get - { - if (cat==null) - { - if (Army!=null) - { - return Army.GetCategory(UnitType.MainCategory); - } - else - { - return null; - } - } - else - { - return cat; - } + { + get + { + return cat; } set { cat = value; } }