Mercurial > repos > IBBoard.WarFoundry.API
view api/Objects/ArmyCategory.cs @ 257:435eb28b4549
Re #270: Add multiple categories to API
* Add section for multiple categories to schema
* Add category loading to factory
Also:
* Do more sensible check on whether we need to set MainCategory when adding category to unit type
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Tue, 18 May 2010 19:59:17 +0000 |
parents | 938409fc24cc |
children | 92d10b06ab0f |
line wrap: on
line source
// This file (ArmyCategory.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2007, 2008, 2009 IBBoard. // // 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 System.Collections.Generic; using IBBoard.WarFoundry.API.Requirements; namespace IBBoard.WarFoundry.API.Objects { /// <summary> /// Summary description for ArmyCategory. /// </summary> public class ArmyCategory : WarFoundryObject, ICostedWarFoundryObject { private Category category; private Army parentArmy; private double pointsTotal; private List<Unit> units; private Dictionary<string, int> unitTypes; private DoubleValChangedDelegate PointsValueChangedMethod; public event ObjectAddDelegate UnitAdded; public event ObjectRemoveDelegate UnitRemoved; public event FailedUnitRequirementDelegate FailedRequirement; public event DoubleValChangedDelegate PointsValueChanged; public ArmyCategory(Army army, Category cat) : base() { parentArmy = army; category = cat; cat.NameChanged+=new StringValChangedDelegate(cat_NameChanged); PointsValueChangedMethod = new DoubleValChangedDelegate(PointsValueChangedHandler); units = new List<Unit>(); unitTypes = new Dictionary<string,int>(); } public Category Category { get { return category; } } public Army ParentArmy { get { return parentArmy; } } public override string ID { get { return Category.ID; } set { Category.ID = value; } } public override string Name { get { return category.Name; } set { category.Name = value; } } internal void AddUnit(Unit unit) { List<FailedUnitRequirement> failedReqs = ParentArmy.CanAddUnit(unit); units.Add(unit); unit.Category = this; unit.PointsValueChanged+= PointsValueChangedMethod; int unitTypeCount; unitTypes.TryGetValue(unit.UnitType.ID, out unitTypeCount); unitTypes[unit.UnitType.ID] = (int)unitTypeCount + 1; TotalPoints+= unit.Points; OnUnitAdded(unit, failedReqs); } internal void RemoveUnit(Unit unit) { List<FailedUnitRequirement> failedReqs = ParentArmy.CanRemoveUnit(unit); units.Remove(unit); unitTypes[unit.UnitType.ID] = ((int)unitTypes[unit.UnitType.ID])-1; TotalPoints-= unit.Points; unit.PointsValueChanged-= PointsValueChangedMethod; OnUnitRemoved(unit, failedReqs); } public int GetUnitTypeCount(UnitType unitType) { return unitTypes.ContainsKey(unitType.ID) ? (int)unitTypes[unitType.ID] : 0; } public Unit[] GetUnits() { return units.ToArray(); } private double TotalPoints { get { return pointsTotal; } set { double oldVal = pointsTotal; pointsTotal = value; if (oldVal!=pointsTotal) { OnPointsValueChanged(oldVal, pointsTotal); } } } [Obsolete("Use Points instead")] public double PointsTotal { get { return TotalPoints; } } public double Points { get { return TotalPoints; } } private void PointsValueChangedHandler(WarFoundryObject obj, double oldVal, double newVal) { if (obj is Unit) { double diff = newVal - oldVal; TotalPoints+= diff; } } protected void OnUnitAdded(Unit unit) { OnUnitAdded(unit, null); } protected void OnUnitAdded(Unit unit, List<FailedUnitRequirement> 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<FailedUnitRequirement> failedReqs) { if (UnitRemoved != null) { UnitRemoved(unit); } if (FailedRequirement != null && failedReqs != null && failedReqs.Count > 0) { FailedRequirement(failedReqs); } } protected virtual void OnPointsValueChanged(double oldValue, double newValue) { if (PointsValueChanged!=null) { PointsValueChanged(this, oldValue, newValue); } } protected void cat_NameChanged(WarFoundryObject obj, string oldValue, string newValue) { OnNameChanged(oldValue, newValue); } public int GetPointsPercentage() { return (int)Math.Round((Points / ParentArmy.MaxPoints) * 100, 0); } } }