using System;
using System.Collections.Generic;
using System.Text;
using Server.Engines.MLQuests.Objectives;
using Server.Items;
using Server.Engines.MLQuests.Rewards;
using Server.Mobiles;

namespace Server.Engines.MLQuests.Definitions
{
	public static class Spellweaving
	{
		public static void AwardTo( PlayerMobile pm )
		{
			if ( pm == null )
				return;

			MLQuestContext context = MLQuestSystem.GetOrCreateContext( pm );

			if ( !context.Spellweaving )
			{
				context.Spellweaving = true;

				Effects.SendLocationParticles( EffectItem.Create( pm.Location, pm.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 );
				Effects.PlaySound( pm.Location, pm.Map, 0x243 );

				Effects.SendMovingParticles( new Entity( Server.Serial.Zero, new Point3D( pm.X - 6, pm.Y - 6, pm.Z + 15 ), pm.Map ), pm, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
				Effects.SendMovingParticles( new Entity( Server.Serial.Zero, new Point3D( pm.X - 4, pm.Y - 6, pm.Z + 15 ), pm.Map ), pm, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );
				Effects.SendMovingParticles( new Entity( Server.Serial.Zero, new Point3D( pm.X - 6, pm.Y - 4, pm.Z + 15 ), pm.Map ), pm, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 );

				Effects.SendTargetParticles( pm, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 );
			}
		}
	}

	#region Patience

	public class Patience : MLQuest
	{
		public override Type NextQuest { get { return typeof( NeedsOfTheManyHeartwood1 ); } }

		public Patience()
		{
			Activated = true;
			Title = 1072753; // Patience
			Description = 1072762; // Learning to weave spells and control the forces of nature requires sacrifice, discipline, focus, and an unwavering dedication to Sosaria herself.  We do not teach the unworthy.  They do not comprehend the lessons nor the dedication required.  If you would walk the path of the Arcanist, then you must do as I require without hesitation or question.  Your first task is to gather miniature mushrooms ... 20 of them from the branches of our mighty home.  I give you one hour to complete the task.
			RefusalMessage = 1072767; // *nods* Not everyone has the temperment to undertake the way of the Arcanist.
			InProgressMessage = 1072774; // The mushrooms I seek can be found growing here in The Heartwood. Seek them out and gather them.  You are running out of time.
			CompletionMessage = 1074166; // Have you gathered the mushrooms?

			Objectives.Add( new TimedCollectObjective( TimeSpan.FromHours( 1 ), 20, typeof( MiniatureMushroom ), "miniature mushrooms" ) );

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}

		public override void Generate()
		{
			base.Generate();

			PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Aeluva" ), new Point3D( 7064, 349, 0 ), Map.Felucca );
			PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Aeluva" ), new Point3D( 7064, 349, 0 ), Map.Trammel );

			// Split up to prevent stacking on the spawner
			PutSpawner( new Spawner( 20, TimeSpan.FromSeconds( 15 ), TimeSpan.FromSeconds( 30 ), 0, 30, "MiniatureMushroom" ), new Point3D( 7015, 366, 0 ), Map.Felucca );
			PutSpawner( new Spawner( 20, TimeSpan.FromSeconds( 15 ), TimeSpan.FromSeconds( 30 ), 0, 30, "MiniatureMushroom" ), new Point3D( 7015, 366, 0 ), Map.Trammel );

			PutSpawner( new Spawner( 5, TimeSpan.FromSeconds( 15 ), TimeSpan.FromSeconds( 30 ), 0, 20, "MiniatureMushroom" ), new Point3D( 7081, 373, 0 ), Map.Felucca );
			PutSpawner( new Spawner( 5, TimeSpan.FromSeconds( 15 ), TimeSpan.FromSeconds( 30 ), 0, 20, "MiniatureMushroom" ), new Point3D( 7081, 373, 0 ), Map.Trammel );

			PutSpawner( new Spawner( 15, TimeSpan.FromSeconds( 15 ), TimeSpan.FromSeconds( 30 ), 0, 20, "MiniatureMushroom" ), new Point3D( 7052, 414, 0 ), Map.Felucca );
			PutSpawner( new Spawner( 15, TimeSpan.FromSeconds( 15 ), TimeSpan.FromSeconds( 30 ), 0, 20, "MiniatureMushroom" ), new Point3D( 7052, 414, 0 ), Map.Trammel );
		}
	}

	public class NeedsOfTheManyHeartwood1 : MLQuest
	{
		public override Type NextQuest { get { return typeof( NeedsOfTheManyHeartwood2 ); } }
		public override bool IsChainTriggered { get { return true; } }

		public NeedsOfTheManyHeartwood1()
		{
			Activated = true;
			Title = 1072797; // Needs of the Many - The Heartwood
			Description = 1072763; // The way of the Arcanist involves cooperation with others and a strong committment to the community of your people.  We have run low on the cotton we use to pack wounds and our people have need.  Bring 10 bales of cotton to me.
			RefusalMessage = 1072768; // You endanger your progress along the path with your unwillingness.
			InProgressMessage = 1072775; // I care not where you acquire the cotton, merely that you provide it.
			CompletionMessage = 1074110; // Well, where are the cotton bales?

			Objectives.Add( new CollectObjective( 10, typeof( Cotton ), 1023577 ) ); // bale of cotton

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}
	}

	public class NeedsOfTheManyHeartwood2 : MLQuest
	{
		public override Type NextQuest { get { return typeof( MakingAContributionHeartwood ); } }
		public override bool IsChainTriggered { get { return true; } }

		public NeedsOfTheManyHeartwood2()
		{
			Activated = true;
			Title = 1072797; // Needs of the Many - The Heartwood
			Description = 1072764; // We must look to the defense of our people!  Bring boards for new arrows.
			RefusalMessage = 1072769; // The people have need of these items.  You are proving yourself inadequate to the demands of a member of this community.
			InProgressMessage = 1072776; // The requirements are simple -- 250 boards.
			CompletionMessage = 1074152; // Well, where are the boards?

			Objectives.Add( new CollectObjective( 250, typeof( Board ), 1027127 ) ); // board

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}
	}

	public class MakingAContributionHeartwood : MLQuest
	{
		public override Type NextQuest { get { return typeof( UnnaturalCreations ); } }
		public override bool IsChainTriggered { get { return true; } }

		public MakingAContributionHeartwood()
		{
			Activated = true;
			Title = 1072798; // Making a Contribution - The Heartwood
			Description = 1072765; // With health and defense assured, we need look to the need of the community for food and drink.  We will feast on fish steaks, sweets, and wine.  You will supply the ingredients, the cooks will prepare the meal.  As a Arcanist relies upon others to build focus and lend their power to her workings, the community needs the effort of all to survive.
			RefusalMessage = 1072770; // Do not falter now.  You have begun to show promise.
			InProgressMessage = 1072777; // Where are the items you've been tasked to supply for the feast?
			CompletionMessage = 1074158; // Ah good, you're back.  We're eager for the feast.

			Objectives.Add( new CollectObjective( 1, typeof( SackFlour ), 1024153 ) ); // sack of flour
			Objectives.Add( new CollectObjective( 10, typeof( JarHoney ), 1022540 ) ); // jar of honey
			Objectives.Add( new CollectObjective( 20, typeof( FishSteak ), 1022427 ) ); // fish steak

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}
	}

	public class UnnaturalCreations : MLQuest
	{
		public override bool IsChainTriggered { get { return true; } }

		public UnnaturalCreations()
		{
			Activated = true;
			Title = 1072758; // Unnatural Creations
			Description = 1072780; // You have proven your desire to contribute to the community and serve the people.  Now you must demonstrate your willingness to defend Sosaria from the greatest blight that plagues her.  Unnatural creatures, brought to a sort of perverted life, despoil our fair world.  Destroy them -- 5 Exodus Overseers and 2 Exodus Minions.
			RefusalMessage = 1072771; // You must serve Sosaria with all your heart and strength.  Your unwillingness does not reflect favorably upon you.
			InProgressMessage = 1072779; // Every moment you procrastinate, these unnatural creatures damage Sosaria.
			CompletionMessage = 1074167; // Well done!  Well done, indeed.  You are worthy to become an arcanist!

			Objectives.Add( new KillObjective( 5, new Type[] { typeof( ExodusOverseer ) }, "Exodus Overseers" ) );
			Objectives.Add( new KillObjective( 2, new Type[] { typeof( ExodusMinion ) }, "Exodus Minions" ) );

			Rewards.Add( new ItemReward( 1031601, typeof( ArcaneCircleScroll ) ) ); // Arcane Circle
			Rewards.Add( new ItemReward( 1031600, typeof( SpellweavingBook ) ) ); // Spellweaving Spellbook
			Rewards.Add( new ItemReward( 1031602, typeof( GiftOfRenewalScroll ) ) ); // Gift of Renewal
		}

		public override void GetRewards( MLQuestInstance instance )
		{
			Spellweaving.AwardTo( instance.Player );
			base.GetRewards( instance );
		}
	}

	#endregion

	#region Discipline

	public class Discipline : MLQuest
	{
		public override Type NextQuest { get { return typeof( NeedsOfTheManySanctuary ); } }

		public Discipline()
		{
			Activated = true;
			Title = 1072752; // Discipline
			Description = 1072761; // Learning to weave spells and control the forces of nature requires sacrifice, discipline, focus, and an unwavering dedication to Sosaria herself.  We do not teach the unworthy.  They do not comprehend the lessons nor the dedication required.  If you would walk the path of the Arcanist, then you must do as I require without hesitation or question.  Your first task is to rid our home of rats ... 50 of them in the next hour.
			RefusalMessage = 1072767; // *nods* Not everyone has the temperment to undertake the way of the Arcanist.
			InProgressMessage = 1072773; // You waste my time.  The task is simple. Kill 50 rats in an hour.
			// No completion message

			Objectives.Add( new TimedKillObjective( TimeSpan.FromHours( 1 ), 50, new Type[] { typeof( Rat ) }, "rats", new QuestArea( 1074807, "Sanctuary" ) ) ); // Sanctuary

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}

		public override void Generate()
		{
			base.Generate();

			PutSpawner( new Spawner( 1, 5, 10, 0, 0, "Koole" ), new Point3D( 6257, 110, -10 ), Map.Felucca );
			PutSpawner( new Spawner( 1, 5, 10, 0, 0, "Koole" ), new Point3D( 6257, 110, -10 ), Map.Trammel );
		}
	}

	public class NeedsOfTheManySanctuary : MLQuest
	{
		public override Type NextQuest { get { return typeof( MakingAContributionSanctuary ); } }
		public override bool IsChainTriggered { get { return true; } }

		public NeedsOfTheManySanctuary()
		{
			Activated = true;
			Title = 1072754; // Needs of the Many - Sanctuary
			Description = 1072763; // The way of the Arcanist involves cooperation with others and a strong committment to the community of your people.  We have run low on the cotton we use to pack wounds and our people have need.  Bring 10 bales of cotton to me.
			RefusalMessage = 1072768; // You endanger your progress along the path with your unwillingness.
			InProgressMessage = 1072775; // I care not where you acquire the cotton, merely that you provide it.
			CompletionMessage = 1074110; // Well, where are the cotton bales?

			Objectives.Add( new CollectObjective( 10, typeof( Cotton ), 1023577 ) ); // bale of cotton

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}
	}

	public class MakingAContributionSanctuary : MLQuest
	{
		public override Type NextQuest { get { return typeof( SuppliesForSanctuary ); } }
		public override bool IsChainTriggered { get { return true; } }

		public MakingAContributionSanctuary()
		{
			Activated = true;
			Title = 1072755; // Making a Contribution - Sanctuary
			Description = 1072764; // We must look to the defense of our people!  Bring boards for new arrows.
			RefusalMessage = 1072769; // The people have need of these items.  You are proving yourself inadequate to the demands of a member of this community.
			InProgressMessage = 1072776; // The requirements are simple -- 250 boards.
			CompletionMessage = 1074152; // Well, where are the boards?

			Objectives.Add( new CollectObjective( 250, typeof( Board ), 1027127 ) ); // board

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}
	}

	public class SuppliesForSanctuary : MLQuest
	{
		public override Type NextQuest { get { return typeof( TheHumanBlight ); } }
		public override bool IsChainTriggered { get { return true; } }

		public SuppliesForSanctuary()
		{
			Activated = true;
			Title = 1072756; // Supplies for Sanctuary
			Description = 1072765; // With health and defense assured, we need look to the need of the community for food and drink.  We will feast on fish steaks, sweets, and wine.  You will supply the ingredients, the cooks will prepare the meal.  As a Arcanist relies upon others to build focus and lend their power to her workings, the community needs the effort of all to survive.
			RefusalMessage = 1072770; // Do not falter now.  You have begun to show promise.
			InProgressMessage = 1072777; // Where are the items you've been tasked to supply for the feast?
			CompletionMessage = 1074158; // Ah good, you're back.  We're eager for the feast.

			Objectives.Add( new CollectObjective( 1, typeof( SackFlour ), 1024153 ) ); // sack of flour
			Objectives.Add( new CollectObjective( 10, typeof( JarHoney ), 1022540 ) ); // jar of honey
			Objectives.Add( new CollectObjective( 20, typeof( FishSteak ), 1022427 ) ); // fish steak

			Rewards.Add( new DummyReward( 1074872 ) ); // The opportunity to learn the ways of the Arcanist.
		}
	}

	public class TheHumanBlight : MLQuest
	{
		public override bool IsChainTriggered { get { return true; } }

		public TheHumanBlight()
		{
			Activated = true;
			Title = 1072757; // The Human Blight
			Description = 1072766; // You have proven your desire to contribute to the community and serve the people.  Now you must demonstrate your willingness to defend Sosaria from the greatest blight that plagues her.  The human vermin that have spread as a disease, despoiling the land are the greatest blight we face.  Kill humans and return to me the proof of your actions. Bring me 30 human ears.
			RefusalMessage = 1072771; // You must serve Sosaria with all your heart and strength.  Your unwillingness does not reflect favorably upon you.
			InProgressMessage = 1072778; // Why do you delay?  The human blight must be averted.
			CompletionMessage = 1074160; // I will take the ears you have collected now.  Hand them here.

			Objectives.Add( new CollectObjective( 30, typeof( SeveredHumanEars ), 1032591 ) ); // severed human ears

			Rewards.Add( new ItemReward( 1031601, typeof( ArcaneCircleScroll ) ) ); // Arcane Circle
			Rewards.Add( new ItemReward( 1031600, typeof( SpellweavingBook ) ) ); // Spellweaving Spellbook
			Rewards.Add( new ItemReward( 1031602, typeof( GiftOfRenewalScroll ) ) ); // Gift of Renewal
		}

		public override void GetRewards( MLQuestInstance instance )
		{
			Spellweaving.AwardTo( instance.Player );
			base.GetRewards( instance );
		}
	}

	#endregion

	#region Friend of the Fey

	public class FriendOfTheFey : MLQuest
	{
		public override Type NextQuest { get { return typeof( TokenOfFriendship ); } }

		public FriendOfTheFey()
		{
			Activated = true;
			Title = 1074284; // Friend of the Fey
			Description = 1074286; // The children of Sosaria understand the dedication and committment of an arcanist -- and will, from time to time offer their friendship.  If you would forge such a bond, first seek out a goodwill offering to present.  Pixies enjoy sweets and pretty things.
			RefusalMessage = 1074288; // There's always time to make new friends.
			InProgressMessage = 1074290; // I think honey and some sparkly beads would please a pixie.
			CompletionMessage = 1074292; // What have we here? Oh yes, gifts for a pixie.

			Objectives.Add( new CollectObjective( 1, typeof( Beads ), 1024235 ) ); // beads
			Objectives.Add( new CollectObjective( 1, typeof( JarHoney ), 1022540 ) ); // jar of honey

			Rewards.Add( new DummyReward( 1074874 ) ); // The opportunity to prove yourself worthy of learning to Summon Fey. (Sufficient spellweaving skill is required to cast the spell)
		}

		public override void Generate()
		{
			base.Generate();

			PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Synaeva" ), new Point3D( 7064, 350, 0 ), Map.Felucca );
			PutSpawner( new Spawner( 1, 5, 10, 0, 3, "Synaeva" ), new Point3D( 7064, 350, 0 ), Map.Trammel );
		}
	}

	public class TokenOfFriendship : MLQuest
	{
		public override Type NextQuest { get { return typeof( Alliance ); } }
		public override bool IsChainTriggered { get { return true; } }

		public TokenOfFriendship()
		{
			Activated = true;
			Title = 1074293; // Token of Friendship
			Description = 1074297; // I've wrapped your gift suitably to present to a pixie of discriminating taste.  Seek out Arielle and give her your offering.
			RefusalMessage = 1074310; // I'll hold onto this gift in case you change your mind.
			InProgressMessage = 1074315; // Arielle wanders quite a bit, so I'm not sure exactly where to find her.  I'm sure she's going to love your gift.
			CompletionMessage = 1074319; // *giggle*  Oooh!  For me?

			Objectives.Add( new DeliverObjective( typeof( GiftForArielle ), 1, "gift for Arielle", typeof( Arielle ) ) );

			Rewards.Add( new DummyReward( 1074874 ) ); // The opportunity to prove yourself worthy of learning to Summon Fey. (Sufficient spellweaving skill is required to cast the spell)
		}
	}

	public class Alliance : MLQuest
	{
		public override bool IsChainTriggered { get { return true; } }

		public Alliance()
		{
			Activated = true;
			Title = 1074294; // Alliance
			Description = 1074298; // *giggle* Mean reapers make pixies unhappy.  *light-hearted giggle*  You could fix them!
			RefusalMessage = 1074311; // *giggle* Okies!
			InProgressMessage = 1074316; // Mean reapers are all around trees!  *giggle*  You fix them up, please.
			CompletionNotice = CompletionNoticeShortReturn;

			Objectives.Add( new KillObjective( 20, new Type[] { typeof( Reaper ) }, "reapers" ) );

			Rewards.Add( new ItemReward( 1031607, typeof( SummonFeyScroll ) ) ); // Summon Fey
		}

		public override void GetRewards( MLQuestInstance instance )
		{
			instance.PlayerContext.SummonFey = true;
			instance.Player.SendLocalizedMessage( 1074320, "", 0x2A ); // *giggle* Mean reapers got fixed!  Pixie friend now! *giggle* When mean thingies bother you, a brave pixie will help.

			base.GetRewards( instance );
		}
	}

	#endregion

	#region Fiendish Friends

	public class FiendishFriends : MLQuest
	{
		public override Type NextQuest { get { return typeof( CrackingTheWhipI ); } }

		public FiendishFriends()
		{
			Activated = true;
			Title = 1074283; // Fiendish Friends
			Description = 1074285; // It is true that a skilled arcanist can summon and dominate an imp to serve at their pleasure.  To do such at thing though, you must master the miserable little fiends utterly by demonstrating your superiority.  Rough them up some -- kill a few.  That will do the trick.
			RefusalMessage = 1074287; // You're probably right.  They're not worth the effort.
			InProgressMessage = 1074289; // Surely you're not having difficulties swatting down those annoying pests?
			// TODO: Verify
			CompletionMessage = 1074291; // Hah!  You showed them!

			Objectives.Add( new KillObjective( 50, new Type[] { typeof( Imp ) }, "imps" ) );

			Rewards.Add( new DummyReward( 1074873 ) ); // The opportunity to prove yourself worthy of learning to Summon Fiends. (Sufficient spellweaving skill is required to cast the spell)
		}

		public override void Generate()
		{
			base.Generate();

			PutSpawner( new Spawner( 1, 5, 10, 0, 0, "ElderBrae" ), new Point3D( 6266, 124, 0 ), Map.Felucca );
			PutSpawner( new Spawner( 1, 5, 10, 0, 0, "ElderBrae" ), new Point3D( 6266, 124, 0 ), Map.Trammel );
		}
	}

	// TODO: Verify
	public class CrackingTheWhipI : MLQuest
	{
		public override Type NextQuest { get { return typeof( CrackingTheWhipII ); } }
		public override bool IsChainTriggered { get { return true; } }

		public CrackingTheWhipI()
		{
			Activated = true;
			Title = 1074295; // Cracking the Whip
			Description = 1074300; // Now that you've shown those mini pests your might, you should collect suitable implements to use to train your summoned pet.  I suggest a stout whip.
			RefusalMessage = 1074313; // Heh. Changed your mind, eh?
			InProgressMessage = 1074317; // Well, hurry up.  If you don't get a whip how do you expect to control the little devil?
			CompletionMessage = 1074321; // That's a well-made whip.  No imp will ignore the sting of that lash.

			Objectives.Add( new CollectObjective( 1, typeof( StoutWhip ), "Stout Whip" ) );

			Rewards.Add( new DummyReward( 1074873 ) ); // The opportunity to prove yourself worthy of learning to Summon Fiends. (Sufficient spellweaving skill is required to cast the spell)
		}
	}

	// TODO: Verify
	public class CrackingTheWhipII : MLQuest
	{
		public override bool IsChainTriggered { get { return true; } }

		public CrackingTheWhipII()
		{
			Activated = true;
			Title = 1074295; // Cracking the Whip
			Description = 1074302; // Now you just need to make the little buggers fear you -- if you can slay an arcane daemon, you'll earn their subservience.
			RefusalMessage = 1074314; // If you're not up for it, so be it.
			InProgressMessage = 1074318; // You need to vanquish an arcane daemon before the imps will fear you properly.

			Objectives.Add( new KillObjective( 1, new Type[] { typeof( ArcaneDaemon ) }, 1029733 ) ); // arcane demon

			Rewards.Add( new ItemReward( 1031608, typeof( SummonFiendScroll ) ) ); // Summon Fiend
		}

		public override void GetRewards( MLQuestInstance instance )
		{
			instance.PlayerContext.SummonFiend = true;
			instance.Player.SendLocalizedMessage( 1074322, "", 0x2A ); // You've demonstrated your strength, got a means of control, and taught the imps to fear you.  You're ready now to summon them.

			base.GetRewards( instance );
		}
	}

	#endregion

	#region Mobiles

	[QuesterName( "Aeluva (The Heartwood)" )]
	public class Aeluva : BaseCreature
	{
		public override bool IsInvulnerable { get { return true; } }
		public override bool CanTeach { get { return true; } }

		public override bool CanShout { get { return true; } }
		public override void Shout( PlayerMobile pm )
		{
			/*
			 * 1074206 - Excuse me please traveler, might I have a little of your time?
			 * 1074207 - Good day to you friend! Allow me to offer you a fabulous opportunity!  Thrills and adventure await!
			 */
			MLQuestSystem.Tell( this, pm, Utility.Random( 1074206, 2 ) );
		}

		[Constructable]
		public Aeluva()
			: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0 )
		{
			Name = "Aeluva";
			Title = "the arcanist";
			Race = Race.Elf;
			Female = true;
			Body = 606;
			Hue = Race.RandomSkinHue();
			InitStats( 100, 100, 25 );

			Utility.AssignRandomHair( this, true );

			SetSkill( SkillName.Meditation, 60.0, 80.0 );
			SetSkill( SkillName.Focus, 60.0, 80.0 );

			AddItem( new ElvenShirt() );
			AddItem( new Kilt( Utility.RandomNondyedHue() ) ); // Note: OSI hue = 0x1516, typo?
			AddItem( new ElvenBoots() );
			AddItem( new Circlet() );
		}

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

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}
	}

	[QuesterName( "Koole (Sanctuary)" )]
	public class Koole : BaseCreature
	{
		public override bool IsInvulnerable { get { return true; } }
		public override bool CanTeach { get { return true; } }

		public override bool CanShout { get { return true; } }
		public override void Shout( PlayerMobile pm )
		{
			MLQuestSystem.Tell( this, pm, Utility.RandomList(
				1074186, // Come here, I have a task.
				1074218  // Hey!  I want to talk to you, now.
			) );
		}

		[Constructable]
		public Koole()
			: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0 )
		{
			Name = "Koole";
			Title = "the arcanist";
			Race = Race.Elf;
			Body = 605;
			Hue = Race.RandomSkinHue();
			InitStats( 100, 100, 25 );

			Utility.AssignRandomHair( this, true );

			SetSkill( SkillName.Meditation, 60.0, 80.0 );
			SetSkill( SkillName.Focus, 60.0, 80.0 );

			Item item;

			item = new LeafChest();
			item.Hue = 443;
			AddItem( item );

			item = new LeafArms();
			item.Hue = 443;
			AddItem( item );

			AddItem( new LeafTonlet() );
			AddItem( new ThighBoots( Utility.RandomAnimalHue() ) );
			AddItem( new RoyalCirclet() );
		}

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

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}
	}

	[QuesterName( "Synaeva (The Heartwood)" )]
	public class Synaeva : BaseCreature
	{
		public override bool IsInvulnerable { get { return true; } }
		public override bool CanTeach { get { return true; } }

		public override bool CanShout { get { return true; } }
		public override void Shout( PlayerMobile pm )
		{
			MLQuestSystem.Tell( this, pm, 1074223 ); // Have you done it yet?  Oh, I haven’t told you, have I?
		}

		[Constructable]
		public Synaeva()
			: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0 )
		{
			Name = "Synaeva";
			Title = "the arcanist";
			Race = Race.Elf;
			Female = true;
			Body = 606;
			Hue = Race.RandomSkinHue();
			InitStats( 100, 100, 25 );

			Utility.AssignRandomHair( this, true );

			SetSkill( SkillName.Meditation, 60.0, 80.0 );
			SetSkill( SkillName.Focus, 60.0, 80.0 );

			Item item = new RavenHelm();
			item.Hue = Utility.RandomGreenHue();
			AddItem( item );

			AddItem( new FemaleLeafChest() );
			AddItem( new LeafArms() );
			AddItem( new LeafTonlet() );
			AddItem( new ElvenBoots() );
			AddItem( new WildStaff() );
		}

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

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}
	}

	[QuesterName( "Elder Brae (Sanctuary)" )]
	public class ElderBrae : BaseCreature
	{
		public override bool IsInvulnerable { get { return true; } }
		public override bool CanTeach { get { return true; } }

		public override bool CanShout { get { return true; } }
		public override void Shout( PlayerMobile pm )
		{
			MLQuestSystem.Tell( this, pm, Utility.RandomList(
				1074215, // Don’t test my patience you sniveling worm!
				1074218  // Hey!  I want to talk to you, now.
			) );
		}

		[Constructable]
		public ElderBrae()
			: base( AIType.AI_Vendor, FightMode.None, 2, 1, 0.5, 2.0 )
		{
			Name = "Elder Brae";
			Title = "the wise";
			Race = Race.Elf;
			Female = true;
			Body = 606;
			Hue = Race.RandomSkinHue();
			InitStats( 100, 100, 25 );

			Utility.AssignRandomHair( this, true );

			SetSkill( SkillName.Meditation, 60.0, 80.0 );
			SetSkill( SkillName.Focus, 60.0, 80.0 );

			AddItem( new GemmedCirclet() );
			AddItem( new FemaleElvenRobe( Utility.RandomBrightHue() ) );
			AddItem( new ElvenBoots( Utility.RandomAnimalHue() ) );
		}

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

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}
	}

	#endregion
}
