Mercurial > repos > snowblizz-super-API-ideas
diff api/Objects/Unit.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/Unit.cs Fri Dec 19 15:57:51 2008 +0000 @@ -0,0 +1,405 @@ +using System; +using System.Collections; +using System.Text; +using System.Xml; +using IBBoard.Lang; + +namespace IBBoard.WarFoundry.API.Objects +{ + /// <summary> + /// Summary description for UnitInstance. + /// </summary> + public class Unit : WarFoundryObject + { + private UnitType type; + private int size; + private Army army; + private Race race; + private double points; + private ArmyCategory cat; + private Hashtable equipment = new Hashtable(); + public event DoubleValChangedDelegate PointsValueChanged; + public event IntValChangedDelegate UnitSizeChanged; + public event FloatValChangedDelegate UnitEquipmentAmountChanged; + + public Unit(UnitType unitType, Army parentArmy) : this(unitType, unitType.MinSize, parentArmy){} + + public Unit(UnitType unitType, int startSize, Army parentArmy) + { + Army = parentArmy; + type = unitType; + Size = startSize; + setInitialEquipment(); + CalcCost(); + } + + protected override string DefaultName() + { + if (type != null) + { + if (size == 1) + { + return type.Name; + } + else + { + return String.Format(Translation.GetTranslation("defaultUnitName"), size, type.Name); + } + } + else + { + return "Unknown Unit"; + } + } + + private void setInitialEquipment() + { + foreach (UnitEquipmentItem unitEquip in UnitType.GetEquipmentItems()) + { + if (unitEquip.IsRequired) + { + if (CanEquipWithItem(unitEquip.ID)) + { + EquipmentItem equipItem = unitEquip.EquipmentItem; + equipment[unitEquip.ID] = equipItem.MinNumber; + } + } + } + } + + private void CalcCost() + { + String oldName = HasDefaultName() ? Name : null; + double oldpoints = points; + points = type.CostPerTrooper * AdditionalTroopers + type.BaseUnitCost; + UnitEquipmentItem unitEquipItem; + EquipmentItem equipItem; + float count; + + foreach (string key in equipment.Keys) + { + unitEquipItem = UnitType.GetEquipmentItem(key); + equipItem = unitEquipItem.EquipmentItem; + count = (float)equipment[key]; + + if (equipItem.IsRatioLimit) + { + if (unitEquipItem.RoundNumberUp) + { + points+= Math.Ceiling(size * count) * equipItem.Cost; + } + else + { + points+= Math.Floor(size * count) * equipItem.Cost; + } + } + else + { + if (count == -1) + { + points+= size * equipItem.Cost; + } + else + { + points+= count * equipItem.Cost; + } + } + } + + if (oldpoints!=points) + { + OnPointsValueChanged(oldpoints, points); + } + + if (oldName!=null) + { + OnNameChanged(oldName, Name); + } + } + + public int AdditionalTroopers + { + get { return Math.Max(Size - type.BaseSize, 0); } + } + + public int Size + { + get { return size; } + set + { + if (value!=size) + { + int oldValue = size; + size = (value>0 ? value : 1); + CalcCost(); + OnUnitSizeChanged(oldValue, size); + } + } + } + + public UnitType UnitType + { + get { return type; } + } + + public Army Army + { + get { return army; } + set + { + army = value; + + if (army == null) + { + Category = null; + } + } + } + + public Race Race + { + get { return race; } + set { race = value; } + } + + public ArmyCategory Category + { + get + { + if (cat==null) + { + if (Army!=null) + { + return Army.GetCategory(UnitType.MainCategory); + } + else + { + return null; + } + } + else + { + return cat; + } + } + set { cat = value; } + } + + public double PointsValue + { + get + { + if (points == 0) + { + CalcCost(); + } + + return points; + } + } + + public UnitEquipmentItem[] GetAllowedOptionalEquipment() + { + ArrayList list = new ArrayList(); + + foreach (UnitEquipmentItem item in UnitType.GetEquipmentItems()) + { + if (!item.IsRequired) + { + list.Add(item); + } + } + + return (UnitEquipmentItem[])list.ToArray(typeof(UnitEquipmentItem)); + } + + public UnitEquipmentItem[] GetEquipment() + { + UnitEquipmentItem[] items = new UnitEquipmentItem[equipment.Count]; + int i = 0; + + foreach (String itemID in equipment.Keys) + { + items[i++] = UnitType.GetEquipmentItem(itemID); + } + + return items; + } + + public UnitEquipmentItem[] GetRequiredEquipment() + { + ArrayList list = new ArrayList(); + UnitEquipmentItem item; + + foreach(String itemID in equipment.Keys) + { + item = UnitType.GetEquipmentItem(itemID); + + if (item.IsRequired) + { + list.Add(item); + } + } + + return (UnitEquipmentItem[])list.ToArray(typeof(UnitEquipmentItem)); + } + + public float GetEquipmentAmount(UnitEquipmentItem item) + { + return GetEquipmentAmount(item.EquipmentItem.ID); + } + + public float GetEquipmentAmount(string equipID) + { + if (equipment.ContainsKey(equipID)) + { + return (float)equipment[equipID]; + } + else + { + return 0; + } + } + + public void SetEquipmentAmount(string equipID, float amount) + { + UnitEquipmentItem equip = UnitType.GetEquipmentItem(equipID); + + if (equip == null) + { + throw new InvalidOperationException("No such equipment ID "+equipID+" for unit "+ID); + } + + if (equip.EquipmentItem.IsRatioLimit) + { + if (amount > 1) + { + amount = 1; + } + else if (amount < 0) + { + amount = 0; + } + //else what was passed in was okay + } + else + { + if (amount >=1 || amount == -1) + { + amount = (float)Math.Round(amount); + } + else + { + amount = 0; + } + } + + float oldAmount = 0; + + if (equipment.ContainsKey(equipID)) + { + oldAmount = (float)equipment[equipID]; + } + + if (amount!=oldAmount) + { + if (amount > 0 || amount == -1) + { + equipment[equipID] = amount; + } + else + { + equipment.Remove(equipID); + } + + OnUnitEquipmentAmountChanged(equip, oldAmount, amount); + CalcCost(); + } + } + + public bool CanEquipWithItem(string equipID) + { + string mutex = UnitType.GetEquipmentItem(equipID).MutexGroup; + + if (mutex == "") + { + return true; + } + + foreach (string itemID in equipment.Keys) + { + if (UnitType.GetEquipmentItem(itemID).MutexGroup == mutex) + { + return false; + } + } + + return true; + } + + private void OnPointsValueChanged(double oldValue, double newValue) + { + if (PointsValueChanged!=null) + { + PointsValueChanged(this, oldValue, newValue); + } + } + + private void OnUnitSizeChanged(int oldValue, int newValue) + { + if (UnitSizeChanged!=null) + { + UnitSizeChanged(this, oldValue, newValue); + } + } + + private void OnUnitEquipmentAmountChanged(UnitEquipmentItem equip, float oldValue, float newValue) + { + if (UnitEquipmentAmountChanged!=null) + { + UnitEquipmentAmountChanged(equip, oldValue, newValue); + } + } + + public Stats UnitStats + { + get { return UnitType.UnitStats; } + } + + /*public override string ToXmlString() + { + StringBuilder sb = new StringBuilder(); + float amount; + + foreach(string key in equipment.Keys) + { + amount = (float)equipment[key]; + + if (amount > 0 || amount == -1) + { + sb.Append("<equipItem id=\""+key+"\" amount=\""+amount+"\" />"); + } + } + + string equipmentString; + + if (sb.Length > 0) + { + equipmentString = "<equipment>"+sb.ToString()+"</equipment>"; + } + else + { + equipmentString = ""; + } + + if (equipmentString == "") + { + return "<unit id=\""+ID+"\" unitType=\""+UnitType.ID+"\" unitName=\""+name+"\" size=\""+Size+"\" />"; + } + else + { + return "<unit id=\""+ID+"\" unitType=\""+UnitType.ID+"\" unitName=\""+name+"\" size=\""+Size+"\">"+equipmentString+"</unit>"; + } + }*/ + } +}