view api/Objects/Stats.cs @ 267:3f14a792fd41

Re #274: Crash when missing unit member ID * Add key and keyref for member type Re #290: Migrate to using key/keyref definitions instead of ID/IDREF type * Move keyref and key for equipment slot to correct place to be valid * Add aliased xmlns for schema to allow for use in XPath, which doesn't use default namespace * Disable warning reporting until Mono Bug 613684 is fixed (https://bugzilla.novell.com/show_bug.cgi?id=613684)
author IBBoard <dev@ibboard.co.uk>
date Sat, 12 Jun 2010 19:49:32 +0000
parents cdda78975be1
children
line wrap: on
line source

// This file (Stats.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;

namespace IBBoard.WarFoundry.API.Objects
{
	/// <summary>
	/// Stats defines the statistic/attribute values for an entity (for example a unit or any of their equipment that has a stat line) paired against a <see cref=" SystemStats"/> stat line definition.
	/// </summary>
	public class Stats
	{
		private List<Stat> stats;
		private SystemStats sysStats;
		
		public Stats(SystemStats systemStats)
		{
			sysStats = systemStats;
			int statCount = sysStats.SlotCount;
			stats = new List<Stat>(statCount);

			foreach (StatSlot slot in sysStats.StatSlots)
			{
				stats.Add(new Stat(slot, ""));
			}
		}
		
		public Stat[] StatsArray
		{
			get { return stats.ToArray(); }
		}

		public void SetStatValue(string statName, string statValue)
		{
			StatSlot slot = sysStats[statName.ToLower()];

			if (slot!=null)
			{
				int pos = sysStats.GetStatSlotPosition(slot);

				if (pos > -1)
				{
					stats[pos] = new Stat(slot, statValue);
				}
			}				
		}
		
		public Stat this[string id]
		{
			get
			{
				StatSlot slot = sysStats[id.ToLower()];
				int pos = sysStats.GetStatSlotPosition(slot);
				Stat stat = null;
				
				try
				{
					stat = this[pos];
				}
				catch (ArgumentException ex)
				{
					throw new ArgumentException(String.Format("Invalid statistic ID {0} for stats based on system stats set {1}", new object[]{id, sysStats.ID}), ex);
				}
				
				return stat;
			}
		}
		
		public Stat this[int pos]
		{
			get
			{
				if (pos < stats.Count && pos >= 0)
				{
					return stats[pos];
				}
				else
				{
					throw new ArgumentException(String.Format("Invalid statistic position {0} for stats based on system stats set {1}", new object[]{pos, sysStats.ID})); 
				}
			}
		}

		public string GetStatValue(string id)
		{
			return this[id.ToLower()].SlotValueString;
		}
		
		public int StatCount
		{
			get { return stats.Count; }
		}
		
		public string StatsID
		{
			get
			{
				return sysStats.ID;
			}
		}
	}
}