diff API/Util/UnitEquipmentUtil.cs @ 337:3c4a6403a88c

* Fix capitalisation so that new files are in the namespace no-open-ticket
author IBBoard <dev@ibboard.co.uk>
date Sun, 03 Apr 2011 18:50:32 +0000
parents
children c8002429ab45
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/API/Util/UnitEquipmentUtil.cs	Sun Apr 03 18:50:32 2011 +0000
@@ -0,0 +1,211 @@
+// This file (UnitEquipmentUtil.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 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 System.Text;
+using IBBoard.CustomMath;
+using IBBoard.Limits;
+using IBBoard.WarFoundry.API.Objects;
+
+namespace IBBoard.WarFoundry.API.Util
+{
+	public class UnitEquipmentUtil
+	{
+		/// <summary>
+		/// Gets an array of allowed <see cref="UnitEquipmentItem"/>s based on the current selections of the unit, taking in to account Mutex groups and other limits.
+		/// </summary>
+		/// <param name="unit">The <see cref="Unit"/> to get equipment items for</param>
+		/// <returns>The array of allowed <see cref="UnitEquipmentItem"/>s</returns>
+		public static UnitEquipmentItem[] GetAllowedEquipmentItems(Unit unit)
+		{
+			List<UnitEquipmentItem> list = new List<UnitEquipmentItem>();
+			UnitEquipmentItem[] currItems = unit.GetEquipment();
+
+			foreach (UnitEquipmentItem item in GetAllEquipmentItems(unit))
+			{
+				bool allowed = IsAllowedByMutex(item, currItems);
+
+				if (allowed)
+				{
+					list.Add(item);
+				}
+			}
+
+			return list.ToArray();
+		}
+
+		private static bool IsAllowedByMutex(UnitEquipmentItem item, UnitEquipmentItem[] currItems)
+		{
+			bool allowed = true;
+
+			foreach (UnitEquipmentItem currItem in currItems)
+			{
+				if (ItemsAreMutuallyExclusive(currItem, item))
+				{
+					allowed = false;
+					break;
+				}
+			}
+
+			return allowed;
+		}
+
+		/// <summary>
+		/// Gets a list of all <see cref="UnitEquipmentItem"/>s that would stop the unit taking <code>item</code> because of mutex groups.
+		/// </summary>
+		/// <param name="unit">The unit that wants to take the equipment item</param>
+		/// <param name="item">The item to check blocking items for</param>
+		/// <returns>a list of all <see cref="UnitEquipmentItem"/>s that would stop the unit taking <code>item</code></returns>
+		public static List<UnitEquipmentItem> GetBlockingEquipmentItems(Unit unit, UnitEquipmentItem item)
+		{
+			List<UnitEquipmentItem> items = new List<UnitEquipmentItem>();
+			UnitEquipmentItem[] currItems = unit.GetEquipment();
+
+			foreach (UnitEquipmentItem unitItem in currItems)
+			{
+				if (ItemsAreMutuallyExclusive(unitItem, item))
+				{
+					items.Add(unitItem);
+				}
+			}
+
+			return items;
+		}
+
+		public static UnitEquipmentItem[] GetAllEquipmentItems(Unit unit)
+		{
+			return unit.UnitType.GetEquipmentItems();
+		}
+
+		public static bool ItemsAreMutuallyExclusive(UnitEquipmentItem item1, UnitEquipmentItem item2)
+		{
+			bool areMutex = false;
+			string[] item1mutex = item1.MutexGroups;
+			string[] item2mutex = item2.MutexGroups;
+
+			foreach (string mutex in item1mutex)
+			{
+				foreach (string otherMutex in item2mutex)
+				{
+					if (mutex.Equals(otherMutex))
+					{
+						areMutex = true;
+						goto postLoop;
+					}
+				}
+			}
+			postLoop:
+
+			return areMutex;
+		}
+
+		public static int GetMaxEquipmentCount (Unit unit, UnitEquipmentItem equip)
+		{
+			return GetEquipmentCountLimit (unit, equip.MaxLimit.GetLimit(unit.Size), equip);
+		}
+
+		private static int GetEquipmentCountLimit (Unit unit, int currLimit, UnitEquipmentItem equip)
+		{
+			int newLimit = currLimit;
+			ILimit limit = GetSlotLimitForItem(unit, equip);
+			
+			if (!(limit is UnlimitedLimit))
+			{
+				int slotMax = limit.GetLimit (unit.Size) - unit.GetEquipmentAmountInSlotExcludingItem(equip);
+				newLimit = Math.Min (slotMax, newLimit);
+			}
+			
+			return newLimit;
+		}
+
+		private static ILimit GetSlotLimitForItem(Unit unit, UnitEquipmentItem equip)
+		{
+			return unit.UnitType.GetEquipmentSlotLimit(equip.SlotName);
+		}
+
+		
+		public static int GetMinEquipmentCount (Unit unit, UnitEquipmentItem equip)
+		{
+			return GetEquipmentCountLimit (unit, equip.MinLimit.GetLimit(unit.Size), equip);
+		}
+		
+		public static bool IsEquipmentRatioLimited(Unit unit, UnitEquipmentItem equip)
+		{
+			ILimit limit = GetSlotLimitForItem(unit, equip);
+			return equip.IsRatioLimit && (limit is IPercentageLimit || limit is UnlimitedLimit);
+		}
+		
+		public static double GetMaxEquipmentPercentage(Unit unit, UnitEquipmentItem equip)
+		{
+			return GetMinOfSlotLimitAndEquipmentLimit(equip, equip.MaxLimit, unit);
+		}
+		
+		private static double GetPercentageOfUnitSize(int number, Unit unit)
+		{
+			return IBBMath.Percentage(number, unit.Size);
+		}
+		
+		private static double GetMinOfSlotLimitAndEquipmentLimit(UnitEquipmentItem equip, ILimit equipLimit, Unit unit)
+		{			
+			double limit = 0;
+			ILimit slotLimit = GetSlotLimitForItem(unit, equip);
+			
+			if (slotLimit is IPercentageLimit)
+			{
+				limit = ((IPercentageLimit)slotLimit).Percentage - GetPercentageOfUnitSize(unit.GetEquipmentAmountInSlotExcludingItem(equip), unit);
+			}
+			else
+			{
+				int remaining = slotLimit.GetLimit(unit.Size) - unit.GetEquipmentAmountInSlotExcludingItem(equip);
+				limit = GetPercentageOfUnitSize(remaining, unit);
+			}
+			
+			if (equip.IsRatioLimit)
+			{
+				limit = Math.Min(limit, ((IPercentageLimit)equipLimit).Percentage);
+			}
+			else
+			{
+				limit = Math.Min(limit, GetPercentageOfUnitSize(equipLimit.GetLimit(unit.Size), unit));
+			}
+			
+			return limit;
+		}
+		
+		public static double GetMinEquipmentPercentage(Unit unit, UnitEquipmentItem equip)
+		{
+			return GetMinOfSlotLimitAndEquipmentLimit(equip, equip.MinLimit, unit);
+		}
+
+		public static double GetEquipmentAmount(Unit unit, UnitEquipmentItem item)
+		{
+			double amount = 0;
+			AbstractUnitEquipmentItemSelection selection = unit.GetEquipmentSelection(item);
+
+			if (selection != null)
+			{
+				amount = selection.AmountTaken;
+			}
+
+			return amount;
+		}
+
+		public static bool GetEquipmentAmountIsRatio(Unit unit, UnitEquipmentItem item)
+		{
+			return (unit.GetEquipmentSelection(item) is UnitEquipmentRatioSelection);
+		}
+
+		public static int GetEquipmentAmountTaken(Unit unit, UnitEquipmentItem item)
+		{
+			AbstractUnitEquipmentItemSelection selection = unit.GetEquipmentSelection(item);
+			return (selection == null ? 0 : selection.NumberTaken);
+		}
+		
+		public static bool CanEditEquipmentAmount(Unit unit, UnitEquipmentItem item)
+		{
+			return item !=null && (item.MaxLimit.GetLimit(unit.Size) != item.MinLimit.GetLimit(unit.Size));
+		}
+	}
+}