/**********************************************************
RunUO AoV C# script file
Official Age of Valor Script :: www.uovalor.com
Last modified by Red Squirrel on Jan-01-2012 10:08:52pm
Filepath: scripts\Engines\AI\Creature\Paragon.cs
Lines of code: 170

Description: 

***********************************************************/


using System;
using Server;
using Server.Items;

namespace Server.Mobiles
{
	public class Paragon
	{
		public static double ChestChance = .10;         // Chance that a paragon will carry a paragon chest
		public static Map[] Maps         = new Map[]    // Maps that paragons will spawn on
		{
			Map.Ilshenar
		};

		public static Type[] Artifacts = new Type[]
		{
			typeof(GoldBricks),
			typeof(PhillipsWoodenSteed),		
			typeof(AlchemistsBauble),
			typeof(ArcticDeathDealer),
			typeof(BlazeOfDeath),
			typeof(BowOfTheJukaKing),
			typeof(BurglarsBandana),
			typeof(CavortingClub),
			typeof(EnchantedTitanLegBone),
			typeof(GwennosHarp),
			typeof(IolosLute),
			typeof(LunaLance),
			typeof(NightsKiss),
			typeof(NoxRangersHeavyCrossbow),
			typeof(OrcishVisage),
			typeof(PolarBearMask),
			typeof(ShieldOfInvulnerability),
			typeof(StaffOfPower),
			typeof(VioletCourage),
			typeof(HeartOfTheLion), 
			typeof(WrathOfTheDryad),
			typeof(PixieSwatter), 
			typeof(GlovesOfThePugilist),
			typeof(HorsemansHelm), 
			typeof(SerpentineAvenger),
			typeof(TritonsTrident),
			typeof(BanditsBolt)
		};

		public static int    Hue   = 0x501;        // Paragon hue
		
		// Buffs
		public static double HitsBuff   = 5.0;
		public static double StrBuff    = 1.05;
		public static double IntBuff    = 1.20;
		public static double DexBuff    = 1.20;
		public static double SkillsBuff = 1.20;
		public static double SpeedBuff  = 1.20;
		public static double FameBuff   = 1.40;
		public static double KarmaBuff  = 1.40;
		public static int    DamageBuff = 5;

		public static void Convert( BaseCreature bc )
		{
			if ( bc.IsParagon )
				return;

			bc.Hue = Hue;

			if ( bc.HitsMaxSeed >= 0 )
				bc.HitsMaxSeed = (int)( bc.HitsMaxSeed * HitsBuff );
			
			bc.RawStr = (int)( bc.RawStr * StrBuff );
			bc.RawInt = (int)( bc.RawInt * IntBuff );
			bc.RawDex = (int)( bc.RawDex * DexBuff );

			bc.Hits = bc.HitsMax;
			bc.Mana = bc.ManaMax;
			bc.Stam = bc.StamMax;

			for( int i = 0; i < bc.Skills.Length; i++ )
			{
				Skill skill = (Skill)bc.Skills[i];

				if ( skill.Base > 0.0 )
					skill.Base *= SkillsBuff;
			}

			bc.PassiveSpeed /= SpeedBuff;
			bc.ActiveSpeed /= SpeedBuff;

			bc.DamageMin += DamageBuff;
			bc.DamageMax += DamageBuff;

			if ( bc.Fame > 0 )
				bc.Fame = (int)( bc.Fame * FameBuff );

			if ( bc.Fame > 32000 )
				bc.Fame = 32000;

			// TODO: Mana regeneration rate = Sqrt( buffedFame ) / 4

			if ( bc.Karma != 0 )
			{
				bc.Karma = (int)( bc.Karma * KarmaBuff );

				if( Math.Abs( bc.Karma ) > 32000 )
					bc.Karma = 32000 * Math.Sign( bc.Karma );
			}
		}

		public static void UnConvert( BaseCreature bc )
		{
			if ( !bc.IsParagon )
				return;

			bc.Hue = 0;

			if ( bc.HitsMaxSeed >= 0 )
				bc.HitsMaxSeed = (int)( bc.HitsMaxSeed / HitsBuff );
			
			bc.RawStr = (int)( bc.RawStr / StrBuff );
			bc.RawInt = (int)( bc.RawInt / IntBuff );
			bc.RawDex = (int)( bc.RawDex / DexBuff );

			bc.Hits = bc.HitsMax;
			bc.Mana = bc.ManaMax;
			bc.Stam = bc.StamMax;

			for( int i = 0; i < bc.Skills.Length; i++ )
			{
				Skill skill = (Skill)bc.Skills[i];

				if ( skill.Base > 0.0 )
					skill.Base /= SkillsBuff;
			}
			
			bc.PassiveSpeed *= SpeedBuff;
			bc.ActiveSpeed *= SpeedBuff;

			bc.DamageMin -= DamageBuff;
			bc.DamageMax -= DamageBuff;

			if ( bc.Fame > 0 )
				bc.Fame = (int)( bc.Fame / FameBuff );
			if ( bc.Karma != 0 )
				bc.Karma = (int)( bc.Karma / KarmaBuff );
		}

		public static bool CheckConvert( BaseCreature bc )
		{
			return CheckConvert( bc, bc.Location, bc.Map );
		}

		public static bool CheckConvert( BaseCreature bc, Point3D location, Map m )
		{
			if ( !Core.AOS )
				return false;
				
			if( bc.CantbeParagon)
				return false;
				

			if ( Array.IndexOf( Maps, m ) == -1)
				return false;

			if ( bc is BaseChampion || bc is Harrower || bc is BaseVendor || bc is BaseHealer || bc is BaseEscortable || bc is Clone || bc.IsMLBoss )
				return false;
				
			if(bc.Region!=null && !bc.Region.CanSpawnParagon(bc))return false;

			int fame = bc.Fame;

			if ( fame > 32000 )
				fame = 32000;

			double chance = 1 / Math.Round( 20.0 - ( fame / 3200 ));

			return ( chance > Utility.RandomDouble() );
		}

		public static bool CheckArtifactChance( Mobile m, BaseCreature bc )
		{
			if ( !Core.AOS )
				return false;
				
			PlayerMobile pm = m as PlayerMobile;
			if(pm==null || pm.Hidden)return false;
				
			//check if they are close to the location of last arty, if yes, no arty for them
			int xoffset = pm.X-pm.AoA_lastspot.X;
			int yoffset =pm.Y-pm.AoA_lastspot.Y;
			if(xoffset<0)xoffset*=-1;
			if(yoffset<0)yoffset*=-1;
			
			if(xoffset<5 && yoffset<5 && pm.Map==pm.AoA_lastmap)return false;				

			double fame = (double)bc.Fame;

			if ( fame > 32000 )
				fame = 32000;

			double chance = 1 / ( Math.Max( 10, 100 * ( 0.83 - Math.Round( Math.Log( Math.Round( fame / 6000, 3 ) + 0.001, 10 ), 3 ) ) ) * ( 100 - Math.Sqrt( m.Luck ) ) / 100.0 );

			if(m is PlayerMobile && ((PlayerMobile)m).showartychance)m.SendMessage(52,"Minor artifact chance: {0}%",Math.Round(chance*100,3));
			
			if(bc.IsSupreme)return true;
			
			return chance > Utility.RandomDouble();
		}

		public static void GiveArtifactTo( Mobile m )
		{
			Item item = (Item)Activator.CreateInstance( Artifacts[Utility.Random(Artifacts.Length)] );
			
			if(m is PlayerMobile)
			{
			PlayerMobile pm = m as PlayerMobile;
			pm.AoA_lastspot=pm.Location;
			pm.AoA_lastmap=pm.Map;
			}

			if ( m.AddToBackpack( item ) )
				m.SendMessage(200, "As a reward for slaying the mighty paragon, an artifact has been placed in your backpack." );
			else
				m.SendMessage(200, "As your backpack is full, your reward for destroying the legendary paragon has been placed at your feet." );
		}
	}
}