view api/Objects/Stats.cs @ 10:607c3232d689

Re #11 - Documentation * Document Stats and SystemStats at class level to explain the difference * Document WarFoundryXmlFactory at class level Re #13 - XPath for XML loading * Load categories using XPath - needs fixing so we can do a proper "categories/cat" query Re #10 - Refactoring for readability * Fix method signature for getting number from attribute added in r19 * Refactor more code in to GetExtraData method * Separate out loading of categories for GameSystem
author IBBoard <dev@ibboard.co.uk>
date Sun, 04 Jan 2009 20:43:36 +0000
parents 520818033bb6
children 306558904c2a
line wrap: on
line source

// Stats.cs
//
//  Copyright (C) 2008 IBBoard
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License version 2.1 of the License as published by the Free
// Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
//
//

using System;
using System.Collections.Generic;
using IBBoard.Lang;

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 Stat[] stats;
		private List<string> statOrder;
		private SystemStats sysStats;
		
		public Stats(SystemStats systemStats)
		{
			sysStats = systemStats;
		}
		
		public Stat[] StatsArray
		{
			get { return (Stat[])stats.Clone(); }
		}
		
		protected internal void SetStats(List<Stat> statList)
		{
			stats = statList.ToArray();
			statOrder = new List<string>();
			
			foreach (Stat stat in statList)
			{
				statOrder.Add(stat.ParentSlot.Name);
			}
		}
		
		public Stat this[string id]
		{
			get
			{
				Stat stat = null;
				int pos = statOrder.IndexOf(id);
				
				try
				{
					stat = this[pos];
				}
				catch (ArgumentException ex)
				{
					throw new ArgumentException(Translation.GetTranslation("InvalidStatPos", "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.Length && pos >= 0)
				{
					return stats[pos];
				}
				else
				{
					throw new ArgumentException(Translation.GetTranslation("InvalidStatPos", "Invalid statistic position {0} for stats based on system stats set {1}", new object[]{pos, sysStats.ID})); 
				}
			}
		}
		
		public int StatCount
		{
			get { return stats.Length; }
		}
	}
}