Mercurial > repos > IBBoard.WarFoundry.API
view API/Objects/UnitEquipmentItem.cs @ 450:8811737baebf
Fixes #352: Test/fix cyclic references in unit types
* Tell the Race it has a new UnitType earlier to resolve load loops
* Update example data file to one that uses all requirements, but caused cyclic issues
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sun, 22 Jan 2012 19:17:06 +0000 |
parents | 7e95b880f9cc |
children |
line wrap: on
line source
// This file (UnitEquipmentItem.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 IBBoard.CustomMath; using IBBoard.Limits; using IBBoard.WarFoundry.API.Util; using IBBoard.Lang; //using IBBoard.WarFoundry.API.Objects; namespace IBBoard.WarFoundry.API.Objects { /// <summary> /// Summary description for UnitEquipmentItem. /// </summary> public class UnitEquipmentItem : WarFoundryObject { private EquipmentItem item; private bool required; private bool roundUp; private double costMultiplier = 1; private RoundType roundType; private string[] mutexGroups; private UnitType unitType; private string slotName = ""; private ILimit minLimit; private ILimit maxLimit; public UnitEquipmentItem(EquipmentItem equipmentItem, UnitType equipmentFor) : this(equipmentItem, equipmentFor, new string[0]) { //Do nothing extra } public UnitEquipmentItem(EquipmentItem equipmentItem, UnitType equipmentFor, params string[] mutexGroups) { item = equipmentItem; unitType = equipmentFor; this.mutexGroups = mutexGroups; unitType.AddEquipmentItem(this); } public override string Name { get { return item.Name; } set { base.Name = value; } } public override string ID { get { return (EquipmentForUnit == null ? base.ID : EquipmentForUnit.ID) + EquipmentItemID; } set { base.ID = value; } } public string EquipmentItemID { get { return item.ID; } } public double Cost { get { return IBBMath.Round(EquipmentItem.Cost * CostMultiplier, CostRoundType); } } public double CostMultiplier { get { return costMultiplier; } set { costMultiplier = value; } } public RoundType CostRoundType { get { return roundType; } set { roundType = value; } } public bool IsRequired { get { return required; } set { required = value; } } public bool RoundNumberUp { get { return roundUp; } set { roundUp = value; } } public GameSystem GameSystem { get { return EquipmentItem.GameSystem; } } public String[] MutexGroups { get { return (string[]) mutexGroups.Clone(); } } public UnitType EquipmentForUnit { get { return unitType; } } public bool IsRatioLimit { get { return MinLimit is IPercentageLimit && MaxLimit is IPercentageLimit; } } /// <summary> /// Gets the Limit object for the minimum number of items that can be taken /// </summary> public ILimit MinLimit { get { ILimit limit = minLimit; if (limit == null) { if (maxLimit != null) { limit = maxLimit; } else { limit = new SimpleRoundedPercentageLimit(100, false); } } return limit; } set { if (value != null) { minLimit = value; } } } /// <summary> /// Gets the Limit object for the maximum number of items that can be taken /// </summary> public ILimit MaxLimit { get { ILimit limit = maxLimit; if (limit == null) { if (minLimit != null) { limit = minLimit; } else { limit = new SimpleRoundedPercentageLimit(100, false); } } return limit; } set { if (value != null) { maxLimit = value; } } } public EquipmentItem EquipmentItem { get { return item; } } public override string ToString() { return Translation.GetTranslation("UnitEquipmentItemName", "{0} ({1}{2} each)", Name, Cost, GameSystem.GetPointsAbbrev(Cost)); } public bool HasAlternatives() { if (MutexGroups.Length == 0) { return false; } else if (EquipmentForUnit == null) { return false; } else { //If the number of items in the MutEx group is greater than one then it must be this item plus another return EquipmentForUnit.GetEquipmentItemsByExclusionGroups(MutexGroups).Length > 1; } } public string Description { get { return EquipmentItem.Description; } } public Race EquipmentForRace { get { return EquipmentItem.EquipmentForRace; } } public bool CanBeUsedWithItem(EquipmentItem item) { return EquipmentItem.CanBeUsedWithItem(item); } public string SlotName { get { return slotName; } set { if (value != null && value != "") { slotName = value; } } } } }