using System;
using Server;
using Server.Network;

namespace Server.Mobiles
{
	[CorpseName( "a hare corpse" )]
	public class EnragedRabbit : BaseEnraged
	{
		public EnragedRabbit( Mobile summoner ) : base( summoner )
		{
			Name = "a rabbit";
			Body = 0xcd;
		}

		public override int GetAttackSound() 
		{ 
			return 0xC9; 
		} 

		public override int GetHurtSound() 
		{ 
			return 0xCA; 
		} 

		public override int GetDeathSound() 
		{ 
			return 0xCB; 
		} 

		public EnragedRabbit( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}

	[CorpseName( "a deer corpse" )]
	public class EnragedHart : BaseEnraged
	{
		public EnragedHart( Mobile summoner ) : base( summoner )
		{
			Name = "a great hart";
			Body = 0xea;
		}

		public override int GetAttackSound() 
		{ 
			return 0x82; 
		} 

		public override int GetHurtSound() 
		{ 
			return 0x83; 
		} 

		public override int GetDeathSound() 
		{ 
			return 0x84; 
		} 

		public EnragedHart( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}

	[CorpseName( "a deer corpse" )]
	public class EnragedHind : BaseEnraged
	{
		public EnragedHind( Mobile summoner ) : base( summoner )
		{
			Name = "a hind";
			Body = 0xed;
		}
		public override int GetAttackSound() 
		{ 
			return 0x82; 
		} 

		public override int GetHurtSound() 
		{ 
			return 0x83; 
		} 

		public override int GetDeathSound() 
		{ 
			return 0x84; 
		} 

		public EnragedHind( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}

	[CorpseName( "a bear corpse" )]
	public class EnragedBlackBear : BaseEnraged
	{
		public EnragedBlackBear( Mobile summoner ) : base( summoner )
		{
			Name = "a black bear";
			Body = 0xd3;
			BaseSoundID = 0xa3;
		}
		public EnragedBlackBear( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}

	[CorpseName( "an eagle corpse" )]
	public class EnragedEagle : BaseEnraged
	{
		public EnragedEagle( Mobile summoner ) : base( summoner )
		{
			Name = "an eagle";
			Body = 0x5;
			BaseSoundID = 0x2ee;
		}
		public EnragedEagle( Serial serial ) : base( serial )
		{
		}
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}

	public class BaseEnraged : BaseCreature
	{
		public BaseEnraged( Mobile summoner ) 
			: base( AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4 )
		{
			SetStr( 50, 200 );
			SetDex( 50, 200 );
			SetHits( 50, 200 );
			SetStam( 50, 200 );

			/* 
				On OSI, all stats are random 50-200, but
				str is never less than hits, and dex is never
				less than stam.
			*/

			if( Str < Hits )
				Str = Hits;
			if( Dex < Stam )
				Dex = Stam;

			Karma = -1000;
			Tamable = false;

			SummonMaster = summoner;
		}

		public override void OnThink()
		{

			if( SummonMaster == null || SummonMaster.Deleted )
			{
				Delete();
			}

			/*
				On OSI, without combatant, they behave as if they have been
				given "come" command, ie they wander towards their summoner,
				but never actually "follow".
			*/

			else if( !Combat( this ))
			{
				if( AIObject != null )
				{
					AIObject.MoveTo( SummonMaster, false , 5 );
				}
			}

			/*
				On OSI, if the summon attacks a mobile, the summoner meer also
				attacks them, regardless of karma, etc. as long as the combatant
				is a player or controlled/summoned, and the summoner is not already
				engaged in combat.
			*/

			else if( !Combat( SummonMaster ))
			{
				BaseCreature bc = null;
				if( Combatant is BaseCreature )
				{
					bc = (BaseCreature)Combatant;
				}
				if( Combatant.Player || ( bc != null && ( bc.Controlled || bc.SummonMaster != null )))
				{
					SummonMaster.Combatant = Combatant;
				}
			}
			else
			{
				base.OnThink();
			}
		}

		private bool Combat( Mobile mobile )
		{
			Mobile combatant = mobile.Combatant;
			if( combatant == null || combatant.Deleted )
			{	
				return false;
			}
			else if ( combatant.IsDeadBondedPet || !combatant.Alive )
			{
				return false;
			}
			return true;
		}

		public override void OnSingleClick( Mobile from )
		{
			base.OnSingleClick( from );
			PrivateOverheadMessage( MessageType.Regular, 0x3B2, 1060768, from.NetState ); // enraged
		}

		public override void AddNameProperties( ObjectPropertyList list )
		{
			base.AddNameProperties( list );
			list.Add( 1060768 ); // enraged
		}

		public BaseEnraged( Serial serial ) : base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );
			writer.Write( (int) 0 );
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );
			int version = reader.ReadInt();
		}
	}
}

