diff api/Objects/ArmyCategory.cs @ 0:520818033bb6

Initial commit of WarFoundry code
author IBBoard <dev@ibboard.co.uk>
date Fri, 19 Dec 2008 15:57:51 +0000
parents
children 306558904c2a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/api/Objects/ArmyCategory.cs	Fri Dec 19 15:57:51 2008 +0000
@@ -0,0 +1,173 @@
+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
+	{
+		private Category category;
+		private Army parentArmy;
+		private double pointsTotal;
+		private List<Unit> units;
+		private Dictionary<string, int> unitTypes;
+		private DoubleValChangedDelegate PointsValueChangedMethod;
+		public event DoubleValChangedDelegate PointsValueChanged;
+		public event ObjectAddDelegate UnitAdded;
+		public event ObjectRemoveDelegate UnitRemoved;
+		public event FailedUnitRequirementDelegate RequirementsFailed;
+
+		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;
+			}
+		}
+
+		public void AddUnit(Unit unit)
+		{
+			List<FailedUnitRequirement> failedReqs = ParentArmy.CanAddUnit(unit);
+
+			units.Add(unit);
+			unit.Army = ParentArmy;
+			unit.Category = this;
+			unit.PointsValueChanged+= PointsValueChangedMethod;
+			int unitTypeCount;
+			unitTypes.TryGetValue(unit.UnitType.ID, out unitTypeCount);
+			unitTypes[unit.UnitType.ID] = (int)unitTypeCount + 1;
+			TotalPoints+= unit.PointsValue;
+			OnUnitAdded(unit, failedReqs);
+		}
+
+		public void RemoveUnit(Unit unit)
+		{
+			List<FailedUnitRequirement> failedReqs = ParentArmy.CanRemoveUnit(unit);
+			units.Remove(unit);
+			unit.Army = null;
+			unitTypes[unit.UnitType.ID] = ((int)unitTypes[unit.UnitType.ID])-1;
+			TotalPoints-= unit.PointsValue;
+			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);
+				}
+			}
+		}
+
+		public double PointsTotal
+		{
+			get { return TotalPoints; }
+		}
+
+		private void PointsValueChangedHandler(WarFoundryObject obj, double oldVal, double newVal)
+		{
+			if (obj is Unit)
+			{
+				double diff = newVal - oldVal;
+				TotalPoints+= diff;
+			}
+		}
+
+		private void OnUnitAdded(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitAdded!=null)
+			{
+				UnitAdded(unit);
+			}
+
+			if (RequirementsFailed!=null && failedReqs!=null && failedReqs.Count > 0)
+			{
+				RequirementsFailed(failedReqs);
+			}
+		}
+
+		private void OnUnitRemoved(Unit unit, List<FailedUnitRequirement> failedReqs)
+		{
+			if (UnitRemoved!=null)
+			{
+				UnitRemoved(unit);
+			}
+
+			if (RequirementsFailed!=null && failedReqs!=null && failedReqs.Count>0)
+			{
+				RequirementsFailed(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((PointsTotal / ParentArmy.MaxPoints) * 100, 0);
+		}
+	}
+}