/***************************************************************************
 *                               VirtueInfo.cs
 *                            -------------------
 *   begin                : May 1, 2002
 *   copyright            : (C) The RunUO Software Team
 *   email                : info@runuo.com
 *
 *   $Id$
 *
 ***************************************************************************/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

using System;

namespace Server
{
	[PropertyObject]
	public class VirtueInfo
	{
		private int[] m_Values;

		public int[] Values
		{
			get
			{
				return m_Values;
			}
		}

		public int GetValue( int index )
		{
			if ( m_Values == null )
				return 0;
			else
				return m_Values[index];
		}

		public void SetValue( int index, int value )
		{
			if ( m_Values == null )
				m_Values = new int[8];

			m_Values[index] = value;
		}

		public override string ToString()
		{
			return "...";
		}

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Humility{ get{ return GetValue( 0 ); } set{ SetValue( 0, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Sacrifice{ get{ return GetValue( 1 ); } set{ SetValue( 1, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Compassion{ get{ return GetValue( 2 ); } set{ SetValue( 2, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Spirituality{ get{ return GetValue( 3 ); } set{ SetValue( 3, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Valor{ get{ return GetValue( 4 ); } set{ SetValue( 4, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Honor{ get{ return GetValue( 5 ); } set{ SetValue( 5, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Justice{ get{ return GetValue( 6 ); } set{ SetValue( 6, value ); } }

		[CommandProperty( AccessLevel.Counselor, AccessLevel.GameMaster )]
		public int Honesty{ get{ return GetValue( 7 ); } set{ SetValue( 7, value ); } }

		public VirtueInfo()
		{
		}

		public VirtueInfo( GenericReader reader )
		{
			int version = reader.ReadByte();

			switch ( version )
			{
				case 1:	//Changed the values throughout the virtue system
				case 0:
				{
					int mask = reader.ReadByte();

					if ( mask != 0 )
					{
						m_Values = new int[8];

						for ( int i = 0; i < 8; ++i )
							if ( (mask & (1 << i)) != 0 )
								m_Values[i] = reader.ReadInt();
					}

					break;
				}
			}

			if( version == 0 )
			{
				Compassion *= 200;
				Sacrifice *= 250;	//Even though 40 (the max) only gives 10k, It's because it was formerly too easy

				//No direct conversion factor for Justice, this is just an approximation
				Justice *= 500;

				//All the other virtues haven't been defined at 'version 0' point in time in the scripts.
			}
		}

		public static void Serialize( GenericWriter writer, VirtueInfo info )
		{
			writer.Write( (byte) 1 ); // version

			if ( info.m_Values == null )
			{
				writer.Write( (byte) 0 );
			}
			else
			{
				int mask = 0;

				for ( int i = 0; i < 8; ++i )
					if ( info.m_Values[i] != 0 )
						mask |= 1 << i;

				writer.Write( (byte) mask );

				for ( int i = 0; i < 8; ++i )
					if ( info.m_Values[i] != 0 )
						writer.Write( (int) info.m_Values[i] );
			}
		}
	}
}