浏览代码

Far Journey LUA scripts

LethalEncounter 4 年之前
父节点
当前提交
7a03363551

+ 170 - 28
server/Quests/FarJourneyFreeport/TasksaboardtheFarJourney.lua

@@ -26,7 +26,7 @@ function Init(Quest)
 	AddQuestStepCompleteAction(Quest, 1, "Step1Complete")
 end
 
-function Step1Complete(Quest, QuestGiver, Player)
+function Step2Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 1, "I spoke to Waulon.")
 	UpdateQuestTaskGroupDescription(Quest, 1, "I spoke to Waulon as Captain Varlos had asked of me.")
 
@@ -34,7 +34,8 @@ function Step1Complete(Quest, QuestGiver, Player)
 	AddQuestStepCompleteAction(Quest, 2, "Step2Complete")
 end
 
-function Step2Complete(Quest, QuestGiver, Player)
+function Step3Init(Quest, QuestGiver, Player)
+	SetTutorialStep(Player, 17)
 	UpdateQuestStepDescription(Quest, 2, "I found Waulon's hat.")
 	UpdateQuestTaskGroupDescription(Quest, 2, "I found Waulon's hat in one of the boxes.")
 
@@ -42,39 +43,41 @@ function Step2Complete(Quest, QuestGiver, Player)
 	AddQuestStepCompleteAction(Quest, 3, "Step3Complete")
 end
 
-function Step3Complete(Quest, QuestGiver, Player)
+function Step4Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 3, "I returned Waulon's hat to him.")
 	UpdateQuestTaskGroupDescription(Quest, 3, "I returned Waulon's hat.")
-
+	
 	AddQuestStepChat(Quest, 4, "I should speak to Ingrid.", 1, "Waulon has asked me to speak to Ingrid.", 11, Ingrid)
 	AddQuestStepCompleteAction(Quest, 4, "Step4Complete")
 end
 
-function Step4Complete(Quest, QuestGiver, Player)
+function Step5Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 4, "I have spoken to Ingrid as Waulon had asked.")
 	UpdateQuestTaskGroupDescription(Quest, 4, "I have spoken to Ingrid.")
 
 	AddQuestStepObtainItem(Quest, 5, "I should find a way to buy the shard from Merchant Vim.", 1, 100, "Ingrid would like me to buy her a Shard of Luclin.", 11, ShardOfLucin)
 	AddQuestStepCompleteAction(Quest, 5, "Step5Complete")
+	SetTutorialStep(Player, 24)
 end
 
-function Step5Complete(Quest, QuestGiver, Player)
+function Step6Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 5, "I have purchased a Shard of Luclin.")
 	UpdateQuestTaskGroupDescription(Quest, 5, "I purchased a Shard of Luclin.")
 
 	AddQuestStepChat(Quest, 6, "Return to Ingrid.", 1, "Ingrid would like me to give her the Shard of Luclin.", 183, Ingrid)
 	AddQuestStepCompleteAction(Quest, 6, "Step6Complete")
+	SetTutorialStep(Player, 30)
 end
 
-function Step6Complete(Quest, QuestGiver, Player)
+function Step7Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 6, "I gave the Shard of Luclin to Ingrid.")
-	UpdateQuestTaskGroupDescription(Quest, 6, "I gave the Shard of Luclin to Ingrid.")
-
+	UpdateQuestTaskGroupDescription(Quest, 6, "I gave the Shard of Luclin to Ingrid.")	
+	
 	AddQuestStepChat(Quest, 7, "I should speak to Captain Varlos again.", 1, "Captain Varlos is trying to get my attention.", 11, CaptainVarlos)
-	AddQuestStepCompleteAction(Quest, 7, "Step7Complete")
+	AddQuestStepCompleteAction(Quest, 7, "Step7Complete")		
 end
 
-function Step7Complete(Quest, QuestGiver, Player)
+function Step8Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 7, "I spoke with Captain Varlos as Ingrid has asked of me.")
 	UpdateQuestTaskGroupDescription(Quest, 7, "I have spoken to Captain Varlos.")
 
@@ -82,7 +85,7 @@ function Step7Complete(Quest, QuestGiver, Player)
 	AddQuestStepCompleteAction(Quest, 8, "Step8Complete")
 end
 
-function Step8Complete(Quest, QuestGiver, Player)
+function Step9Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 8, "I have killed the rats.")
 	UpdateQuestTaskGroupDescription(Quest, 8, "I killed the rats that Captain Varlos requested.")
 
@@ -90,14 +93,156 @@ function Step8Complete(Quest, QuestGiver, Player)
 	AddQuestStepCompleteAction(Quest, 9, "Step9Complete")
 end
 
-function Step9Complete(Quest, QuestGiver, Player)
+function Step10Init(Quest, QuestGiver, Player)
 	UpdateQuestStepDescription(Quest, 9, "I spoke to Captain Varlos.")
-	UpdateQuestTaskGroupDescription(Quest, 9, "Captain Varlos has ordered you to kill the escaped goblin.")
+	UpdateQuestTaskGroupDescription(Quest, 9, "I spoke to Captain Varlos.") --this this is not 100% like Live but seeing the same entry in your journal for step 9 and 10 like Live is dumb
 
 	AddQuestStepKill(Quest, 10, "I must kill the goblin.", 1, 100, "Captain Varlos has ordered you to kill the escaped goblin.", 11, Goblin)
 	AddQuestStepCompleteAction(Quest, 10, "QuestComplete")
 end
 
+function CurrentStep(Quest, QuestGiver, Player)
+	if GetQuestStep(Player, 524) == 2 then
+		i = 1
+		spawns = GetSpawnListBySpawnID(Player, 270010)
+		repeat
+			spawn = GetSpawnFromList(spawns, i-1)
+			if spawn then
+				ChangeHandIcon(spawn, 1)
+			end
+			i = i + 1
+		until spawn == Nil
+		InstructionWindow(Player, -1.0, "You completed the first part of the quest. As you complete quests and defeat enemies, you earn experience points. This is represented in your experience point display. Filling your experience point display is always a requirement to gain your next level. As you gain levels, you will gain access to more powerful skills and abilities.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_011_f16aa848.mp3", 1702963584, 3318288731, "tutorial_stage_15", "", "continue")
+		FlashWindow(Player, "MainHUD.Experience", 15.0)			
+		SetTutorialStep(Player, 14)
+		AddPrimaryEntityCommandAllSpawns(Player, 270010, "open", 10, "open")
+		chest = GetRandomSpawnByID(Player, 270010)
+		GiveLoot(chest, Player, 0, 185427)
+		GiveLoot(chest, Player, 0, 20902)
+		GiveLoot(chest, Player, 0, 15354)					
+	elseif GetQuestStep(Player, 524) == 3 then			
+		InstructionWindow(Player, -1.0, "The items are now in your inventory.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_014_eaa89ef7.mp3", 361706387, 1106127199, "tutorial_stage_18", "", "continue")		
+		SetTutorialStep(Player, 16)
+	elseif GetQuestStep(Player, 524) == 5 then
+		InstructionWindowClose(Player)
+		InstructionWindow(Player, -1.0, "A merchant is a special type of character who buys and sells things. Find and double left click on Merchant Vim to start a transaction.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_020_6ea052d3.mp3", 4250953579, 3003156164, "tutorial_stage_24", "Double left click on Merchant Vim.", "server")		
+	elseif GetQuestStep(Player, 524) == 6 then
+		InstructionWindowClose(Player)
+		InstructionWindow(Player, -1.0, "You have made the first of many purchases. Now close the merchant window and speak to Ingrid to complete the quest.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_026_d484fa8d.mp3", 4213145594, 1811880905, "tutorial_stage_31", "Return to Ingrid and speak to her.", "server")		
+	elseif GetQuestStep(Player, 524) == 7 then
+		InstructionWindowClose(Player)
+		captain = GetSpawn(Player, 270000)	
+		AddTimer(captain, 2000, "get_attention_init", 1, Player) 
+	elseif GetQuestStep(Player, 524) == 8 then
+		AddPrimaryEntityCommandAllSpawns(Player, 270009, "attack", 10000.0, "attack")
+		i=1
+		spawns = GetSpawnListBySpawnID(Player, 270009)
+		repeat
+			rat = GetSpawnFromList(spawns, i-1)
+			if rat then
+				SetAttackable(rat, 1)
+				if HasLootItem(rat, 11615) == false then
+					AddLootItem(rat, 11615)	
+				end
+			end
+			i = i + 1
+		until rat == Nil
+		if GetQuestStepProgress(Player, 524, 8) == 1 then -- if we already have credit for a kill, remove one rat
+			delrat = GetRandomSpawnByID(Player, 270009)
+			Despawn(delrat)
+		end
+		if HasItem(Player, 88140) == false then
+			GiveImmediateQuestReward(Quest, Player, 0, 0, "88140")
+		end
+		if HasItemEquipped(Player, 88140) == false then
+			ShowWindow(Player, "Inventory.Inventory", 0)
+			InstructionWindow(Player, -1.0, "Open your inventory by clicking the inventory button, then right click on the club the Captain just gave you.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_028_458903e8.mp3", 4151437794, 834827635, "equipping_weapons", "Open your inventory. (click on the inventory button)", "open Inventory")
+			ShowWindow(Player, "MainHUD.StartMenu", 1)
+			FlashWindow(Player, "MainHUD.StartMenu.inventory", 20.0)
+		end
+	elseif GetQuestStep(Player, 524) == 9 then
+		SetTutorialStep(Player, 49)
+		InstructionWindow(Player, -1.0, "You have earned enough experience to gain a level. Congratulations.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_046_7e59cd54.mp3", 3272157184, 1454283978, "tutorial_stage_50", "", "continue")
+		i=1
+		spawns = GetSpawnListBySpawnID(Player, 270009)
+		repeat
+			delrat = GetSpawnFromList(spawns, i-1)
+			if IsAlive(delrat) then
+				Despawn(delrat)
+			end
+			i = i + 1
+		until delrat == Nil
+	elseif GetQuestStep(Player, 524) == 10 then
+		AddPrimaryEntityCommandAllSpawns(Player, 270008, "attack", 10000.0, "attack")
+		i=1
+		spawns = GetSpawnListBySpawnID(Player, 270011)
+		repeat
+			cage = GetSpawnFromList(spawns, i-1)
+			if cage then
+				Despawn(cage)
+			end
+			i = i + 1
+		until cage == Nil
+		i=1
+		spawns = GetSpawnListBySpawnID(Player, 270009)
+		repeat
+			delrat = GetSpawnFromList(spawns, i-1)
+			if delrat then
+				Despawn(delrat)
+			end
+			i = i + 1
+		until delrat == Nil
+	end
+end
+
+function Step1Complete(Quest, QuestGiver, Player)
+	GiveExp(Player, 110)
+	Step2Init(Quest, QuestGiver, Player)
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step2Complete(Quest, QuestGiver, Player)
+	Step3Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step3Complete(Quest, QuestGiver, Player)
+	RemoveItem(Player, WaulonsHat)
+	GiveImmediateQuestReward(Quest, Player, 0, 0, "9357")
+	Step4Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step4Complete(Quest, QuestGiver, Player)	
+	Step5Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step5Complete(Quest, QuestGiver, Player)
+	Step6Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step6Complete(Quest, QuestGiver, Player)
+	Step7Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step7Complete(Quest, QuestGiver, Player)
+	Step8Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step8Complete(Quest, QuestGiver, Player)	
+	Step9Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
+function Step9Complete(Quest, QuestGiver, Player)
+	Step10Init(Quest, QuestGiver, Player)	
+	CurrentStep(Quest, QuestGiver, Player)
+end
+
 function QuestComplete(Quest, QuestGiver, Player)
 	-- The following UpdateQuestStepDescription and UpdateTaskGroupDescription are not needed, parser adds them for completion in case stuff needs to be moved around
 	UpdateQuestStepDescription(Quest, 10, "I have killed the goblin.")
@@ -109,23 +254,23 @@ end
 
 function Reload(Quest, QuestGiver, Player, Step)
 	if Step == 1 then
-		Step1Complete(Quest, QuestGiver, Player)
+		Step2Init(Quest, QuestGiver, Player)
 	elseif Step == 2 then
-		Step2Complete(Quest, QuestGiver, Player)
+		Step3Init(Quest, QuestGiver, Player)
 	elseif Step == 3 then
-		Step3Complete(Quest, QuestGiver, Player)
+		Step4Init(Quest, QuestGiver, Player)
 	elseif Step == 4 then
-		Step4Complete(Quest, QuestGiver, Player)
+		Step5Init(Quest, QuestGiver, Player)
 	elseif Step == 5 then
-		Step5Complete(Quest, QuestGiver, Player)
+		Step6Init(Quest, QuestGiver, Player)
 	elseif Step == 6 then
-		Step6Complete(Quest, QuestGiver, Player)
+		Step7Init(Quest, QuestGiver, Player)
 	elseif Step == 7 then
-		Step7Complete(Quest, QuestGiver, Player)
+		Step8Init(Quest, QuestGiver, Player)
 	elseif Step == 8 then
-		Step8Complete(Quest, QuestGiver, Player)
+		Step9Init(Quest, QuestGiver, Player)
 	elseif Step == 9 then
-		Step9Complete(Quest, QuestGiver, Player)
+		Step10Init(Quest, QuestGiver, Player)
 	elseif Step == 10 then
 		QuestComplete(Quest, QuestGiver, Player)
 	end
@@ -139,11 +284,8 @@ function Accepted(Quest, QuestGiver, Player)
 	AddConversationOption(conversation, "Okay.")
 	StartConversation(conversation, QuestGiver, Player, "Whoa there, the seas are gettin' a bit angry. Go speak ta' me first mate, Waulon. He might have something for ya' ta' do.")
 	
-	local Waulon = GetSpawn(NPC, 270002)
-	FaceTarget(NPC, Waulon)
-end
-
-function Deleted(Quest, QuestGiver, Player)
+	local Waulon = GetSpawn(QuestGiver, 270002)
+	FaceTarget(QuestGiver, Waulon)	
 end
 
 function Declined(Quest, QuestGiver, Player)

+ 12 - 20
server/SpawnScripts/FarJourneyFreeport/Anikra.lua

@@ -13,28 +13,20 @@ function spawn(NPC)
 end
 
 function hailed(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-
-    Dialog.New(NPC, Spawn)
-    Dialog.AddDialog("Do you want to call down the Drake?")
-    Dialog.AddOption("Yes, I want to see him in action!", "callDrake")
-    Dialog.AddOption("Hell No!")
-    Dialog.Start()
+	goblin = GetSpawn(NPC, 270008)
+	if goblin == nil or IsAlive(goblin) == false then
+		FaceTarget(NPC, Spawn)	
+		choice = math.random(1, 2) 	    
+		if choice == 1 then
+			PlayFlavor(NPC, "voiceover/english/anikra/boat_06p_tutorial02_fvo_001.mp3", "Thanks for saving me", "thanks", 3802219844, 3242323771)
+		else
+			PlayFlavor(NPC, "voiceover/english/anikra/boat_06p_tutorial02/anikra_0_003.mp3", "I don't know how I did that. What was that?", "boggle", 927876289, 3048340606)
+		end
+	else
+		PlayFlavor(NPC, "voiceover/english/anikra/boat_06p_tutorial02_fvo_002.mp3", "I really miss my husband. Why did those smugglers have to throw him overboard?", "sigh", 1493499523, 2767493059)
+	end
 end
 
-function callDrake(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-    local drake = GetSpawn(NPC, 270013)
-    if drake ~= nil then
-        AddTimer(drake, 5000, "startanimation")
-	Say(NPC, "Drake should be flying")
-		
-	AddTimer(drake, 31000, "stopanimation")
-	Say(NPC, "Drake should be gone now")
-    end
-end
-
-
 --[[
 function callDrake(NPC, Spawn)
     FaceTarget(NPC, Spawn)

+ 328 - 103
server/SpawnScripts/FarJourneyFreeport/CaptainVarlos.lua

@@ -6,150 +6,375 @@
                    : 
 --]]
 
+get_attention_animation = true
+needs_selection_help = true
+finished_hailed = false
+finished_where_am_I = false
+finished_who_are_you = false
+finished_how_did_I_get_here = false
+finished_where_are_we_headed = false
+finished_high_winds_1 = false
+finished_high_winds_2 = false
+finished_high_winds_3 = false
+seen_quest_praise = false
+
 require "SpawnScripts/Generic/DialogModule"
 
 function spawn(NPC)
 
 end
 
-function hailed(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-	
-	Dialog.New(NPC, Spawn)
-    Dialog.AddDialog("Ahoy! 'Tis good to see you awake. Ya seem a little squiffy, least ya' cheated death!")
-	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_001.mp3", 1930075150, 2666442405)
-	Dialog.AddEmote("salute")
-    Dialog.AddOption("Where am I?", "dlg_1")
-    Dialog.Start()
+function get_attention_init(NPC, player)
+	InstructionWindow(player, -1.0, "Captain Varlos looks like he is trying to get your attention.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_027_30c39009.mp3", 2146230300, 3258594756, "captain_attention", "", "continue")
+	AddTimer(NPC, 100, "get_attention", 1, player)
 end
 
-function dlg_1(NPC, Spawn)
-	FaceTarget(NPC, Spawn)
-	
-	Dialog.New(NPC, Spawn)
-	Dialog.AddDialog("Me apologies.")
-	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_002.mp3", 2054400186, 1976167819)
-	Dialog.AddEmote("bow")
-	Dialog.AddOption("Who are you?", "dlg_2")
-    Dialog.Start()
+function get_attention(NPC, player)	
+	FaceTarget(NPC, player)
+	SendStateCommand(NPC, 883)
+	AddTimer(NPC, math.random(2000, 3000), "stop_get_attention", 1, player)	
 end
 
-function dlg_2(NPC, Spawn)
-	FaceTarget(NPC, Spawn)
-	
-	Dialog.New(NPC, Spawn)
-	Dialog.AddDialog("I am Captain Draik Varlos, and this 'ere fine ship is the Far Journey.")
-	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_003.mp3", 2565389482, 560555759)
-	Dialog.AddOption("How did I get here?", "dlg_3")
-    Dialog.Start()
+function stop_get_attention(NPC, player)
+	SendStateCommand(NPC, 0)
+	if get_attention_animation and HasQuest(player, 524) == true and GetQuestStep(player, 524) == 7 then
+		AddTimer(NPC, 500, "get_attention", 1, player)
+	end
 end
 
-function dlg_3(NPC, Spawn)
-	FaceTarget(NPC, Spawn)
-	
-	Dialog.New(NPC, Spawn)
-	Dialog.AddDialog("Me hearties pulled ya' from the sea, you an those other bilge rats. Do ya' remember?")
-	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_004.mp3", 29296168, 2709023783)
-	Dialog.AddOption("Vaguely. Where are we headed?", "dlg_4")
-    Dialog.Start()
+function hailed(NPC, player)	
+    FaceTarget(NPC, player)
+	SendStateCommand(GetSpawn(NPC, 270000), 318)
+	SendStateCommand(GetSpawn(NPC, 270000), 0)
+	if HasQuest(player, 524) == false and HasCompletedQuest(player, 524) == false then
+		InstructionWindowClose(player)
+		needs_selection_help = true
+		finished_hailed = false
+		finished_where_am_I = false
+		finished_who_are_you = false
+		finished_how_did_I_get_here = false
+		finished_where_are_we_headed = false
+		finished_high_winds_1 = false
+		finished_high_winds_2 = false
+		finished_high_winds_3 = false
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("Ahoy! 'Tis good to see you awake. Ya seem a little squiffy, least ya' cheated death!")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_001.mp3", 1930075150, 2666442405)
+		Dialog.AddEmote("salute")
+		Dialog.AddOption("Where am I?", "where_am_I")
+		Dialog.Start()		
+		AddTimer(NPC, 8000, "hailed_instructions", 1, player)
+	elseif HasQuest(player, 524) == true and GetQuestStep(player, 524) == 7 then
+		SetTutorialStep(player, 32)
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("Avast ye! We need to talk.")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_011.mp3", 570868734, 3287597835)
+		Dialog.AddOption("What is it?", "quest_step_7a")
+		Dialog.Start()
+		get_attention_animation = false
+	elseif HasQuest(player, 524) == true and GetQuestStep(player, 524) == 10 then
+		PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_023.mp3", "You still need to kill that landlubber of a goblin! Get to it mate!", "", 3269557913, 3104212801)
+	elseif HasQuest(player, 524) == true and GetQuestStep(player, 524) == 9 then
+		SetTutorialStep(player, 51)
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("Ya' made quick work of them vermin.")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_016.mp3", 1130776869, 4119313971)
+		Dialog.AddOption("Thanks.", "quest_step_9")
+		Dialog.Start()
+	elseif HasCompletedQuest(player, 524) == true and seen_quest_praise == false then
+		seen_quest_praise = true
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("Arr! Ya saved the Far Journey and me crew! Seems ya' proved ta' be quite a hero.  Well, with the help of that young lass there, ya' do.")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_024.mp3", 998172564, 1159207795)
+		Dialog.AddOption("It was nothing.", "quest_completed")
+		Dialog.Start()
+	elseif HasCompletedQuest(player, 524) == true then
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("So, ya' ready ta go ashore matey?")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_027.mp3", 2285948102, 2994720481)
+		Dialog.AddOption("Yes.", "ready_to_go_ashore")
+		Dialog.AddOption("No. I would like some more time.", "conversation8_2")
+		Dialog.Start()
+	end
 end
 
-function dlg_4(NPC, Spawn)
-	FaceTarget(NPC, Spawn)
-	
-	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_005.mp3", "We are heading to the Island of Refuge.", "", 1602680439, 2810422278, Spawn)
-	
-	AddTimer(NPC, 3000, "ShakeCamera_1", 1, Spawn)
+function quest_completed(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("There be the Island of Refuge, get ready ta' drop anchor. Just let me know when ya' want ta' go ashore.")
+	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_025.mp3", 3643967618, 2645907420)
+	Dialog.AddOption("Ok.", "drop_anchor")
+	Dialog.Start()
 end
 
-function ShakeCamera_1(NPC, Spawn)
-	PerformCameraShake(Spawn, 52429, 15948)
-	AddTimer(NPC, 400, "ShakeCamera_2", 1, Spawn)
+function drop_anchor(NPC, player)
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_026.mp3", "Ingrid! Swing the lead and prepare to drop anchor!", 3011518245, 3851752713)
 end
 
-function ShakeCamera_2(NPC, Spawn)
-	PerformCameraShake(Spawn, 52429, 15948)
-	AddTimer(NPC, 400, "ShakeCamera_3", 1, Spawn)
+function ready_to_go_ashore(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Don't ya' mind, we get paid ta' do that.")
+	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_028.mp3", 1009737776, 2173458794)
+	Dialog.AddOption("Good point.", "zone_to_isle")
+	Dialog.Start()
 end
 
-function ShakeCamera_3(NPC, Spawn)
-	
-	PerformCameraShake(Spawn, 52429, 15948)
-	
-	AddTimer(NPC, 800, "CallIngrid", 1, Spawn)
-	
+function zone_to_isle(NPC, player)
+	Zone(GetZone(325), player)
+end
 
+function quest_step_9(NPC, player)	
+	AddTimer(GetSpawn(NPC, 270013), 100, "attack")
+	AddTimer(NPC, 1000, "quest_step_9b", 1, player)	
 end
 
-function CallIngrid(NPC, Spawn)
-	FaceTarget(NPC, Spawn)
-	
-	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_006.mp3", "Ingird! Quit gawking at the shorty and fix that yard-arm!", "", 2753489262, 3183736171, Spawn)
-	
-	local Geredo = GetSpawn(NPC, 270004)
-	local Ingrid = GetSpawn(NPC, 270001)
-	
-	SetTempVariable(Ingrid, "TempAnimationVar", nil)
-	
-	FaceTarget(NPC, Ingrid)
-	
-	AddTimer(Ingrid, 500, "CaptainCallingIngrid", 1, Spawn)
-	AddTimer(Geredo, 500, "CaptainCallingIngrid", 1, Spawn)
-	
+function quest_step_9b(NPC, player)	
+	FaceTarget(NPC, GetSpawn(NPC, 270013))
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_017.mp3", "Wait. Tis that a... No, it cain' be!", "", 1253231512, 1752159147)
+	AddTimer(NPC, 5000, "quest_step_9c", 1, player)	
+	SendStateCommand(GetSpawn(NPC, 270005), 250)	
 end
 
-function TalkToCaptainVarlos(NPC, Spawn)
-	
-	local Ingrid = GetSpawn(NPC, 270001)
+function quest_step_9c(NPC, player)	
+	Drake = GetSpawn(NPC, 270013)
 	
-	FaceTarget(NPC, Ingrid)
+	Anikra = GetSpawn(NPC, 270006)	
+	Valik = GetSpawn(NPC, 270005)	
+	Geredo = GetSpawn(NPC, 270004)
 	
-	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_007.mp3", "Don't want the ship to come apart in these high winds, do ya'?!", "scold", 517097409, 4194681002, Spawn)
-	
-	AddTimer(Ingrid, 4000, "SaluteCaptainVarlos", 1, Spawn)
+	FaceTarget(Anikra, Drake)
+	FaceTarget(Valik, Drake)	
+	FaceTarget(Geredo, Drake)		
 	
+	SendStateCommand(Anikra, 429)
+	SendStateCommand(Valik, 429)
+	SendStateCommand(Geredo, 429)
 	
+	SendStateCommand(GetSpawn(NPC, 270001), 219)
+	SendStateCommand(GetSpawn(NPC, 270007), 631)
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_018.mp3", "Quick! Ingrid, secure th'loot! Thar be a Drakota off the bow! Quick now! Secure those chests!", "", 3607547478, 39534308)
+	AddTimer(NPC, 9000, "quest_step_9d", 1, player)	
 end
 
-function IngridLeaveCaptain(NPC, Spawn)
-	FaceTarget(NPC, Spawn)
-	
-	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_008.mp3", "Ya think she'd never seen a gnome afore.", "", 2447879193, 4289147535, Spawn)
+function quest_step_9d(NPC, player)	
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_019.mp3", "Everyone down! Watch it!", "", 2065401462, 2542613809)
+	SendStateCommand(GetSpawn(NPC, 270007), 219)
+	SendStateCommand(GetSpawn(NPC, 270001), 220)
+	SendStateCommand(GetSpawn(NPC, 270004), 210)
+	SendStateCommand(GetSpawn(NPC, 270006), 403)
+	SendStateCommand(GetSpawn(NPC, 270005), 218)
+	SendStateCommand(GetSpawn(NPC, 270002), 218)
+	AddTimer(NPC, 3500, "quest_step_9e", 1, player)
+	i=1
+	spawns = GetSpawnListBySpawnID(player, 270011)
+	repeat
+		cage = GetSpawnFromList(spawns, i-1)
+		if cage then
+			Despawn(cage)			
+		end
+		i = i + 1
+	until cage == Nil
+end
 
-	--AddTimer(NPC, 3000, "ShakeCamera_1", 1, Spawn)
-	
-	--AddTimer(NPC, 4000, "TheQuestOffer")
-	
+function quest_step_9e(NPC, player)
+	PerformCameraShake(player, 0.699999988079071)	
+	PerformCameraShake(player, 0.5)	
+	PerformCameraShake(player, 0.30000001192092896)
+	PerformCameraShake(player, 0.10000000149011612)
+	AddTimer(NPC, 3500, "quest_step_9f", 1, player)
 end
 
-function TheQuestOffer(NPC,Spawn)
-	
+function quest_step_9f(NPC, player)		
+	AddTimer(NPC, 3500, "quest_step_9g", 1, player)
 end
 
-function callDrake(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-    local drake = GetSpawn(NPC, 270013)
-    if drake ~= nil then
-        AddTimer(drake, 5000, "startanimation")
-	Say(NPC, "Drake should be flying")
-		
-	AddTimer(drake, 31000, "stopanimation")
-	Say(NPC, "Drake should be gone now")
-    end
+function quest_step_9g(NPC, player)	
+	AddTimer(NPC, 3000, "quest_step_9h", 1, player)	
 end
 
+function quest_step_9h(NPC, player)
+	SendStateCommand(GetSpawn(NPC, 270001), 0)
+	SendStateCommand(GetSpawn(NPC, 270004), 0)
+	SendStateCommand(GetSpawn(NPC, 270006), 0)
+	SendStateCommand(GetSpawn(NPC, 270005), 0)
+	SendStateCommand(GetSpawn(NPC, 270002), 0)	
+	SendStateCommand(GetSpawn(NPC, 270007), 220)
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_020.mp3", "Blimey! That was close! It has been near two months since the last reported sightings of one of them.", "", 814285897, 1688547621)
+	AddTimer(NPC, 6000, "quest_step_9i", 1, player)	
+end
 
---[[
-function callDrake(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-Say(NPC,"I have made it past FaceTarget")
-    local drake = GetSpawn(Spawn, 270013)
-Say(NPC, "I have set the local drake to the spawn id")
-Say(NPC, "Test " .. drake)
-    SpawnSet(drake, "visual_state", 10783)
+function quest_step_9i(NPC, player)	
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_021.mp3", "That damnable goblin has escaped. An' look, me beautiful ship is on fire!", "", 1401094820, 2183903275)
+	AddTimer(NPC, 6000, "quest_step_9j", 1, player)
+end
+
+function quest_step_9j(NPC, player)	
+	SetStepComplete(player, 524, 9)
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_022.mp3", "Ye must put an end to 'is life, afore he tears me ship apart!", "", 2385052787, 1324494518)
+end
+
+function quest_step_7a(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Well, 'tis a bit of a problem. Ya' see, there be rats on board. The vermin keep eating the supplies and I need ya' to go feed them to the deep, afore they eat anything else.")
+	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_012.mp3", 705765462, 3202743441)
+	Dialog.AddOption("So you want me to kill them?", "quest_step_7b")
+	Dialog.Start()
+end
+
+function quest_step_7b(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Yar! That's what we be needin'.")
+	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_013.mp3", 3880459741, 170861362)
+	Dialog.AddOption("How do you expect me to kill them?", "quest_step_7c")
+	Dialog.Start()
+end
+
+function quest_step_7c(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Wit this 'ere club. It is nice and splintered, sure ta' cause them some pain.")
+	Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_014.mp3", 2083163804, 202693960)
+	Dialog.AddOption("Aye, aye, Captain!", "quest_step_7d")
+	Dialog.Start()
+end
+
+function quest_step_7d(NPC, player)	
+	SetStepComplete(player, 524, 7) 
+end
+
+function hailed_instructions(NPC, player)	
+	if needs_selection_help == true then
+		InstructionWindowGoal(player,0)	
+		InstructionWindowClose(player)
+		InstructionWindow(player, -1.0, "To respond to the Captain and other characters you will meet, left click on the response text.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_006_7521b625.mp3", 3936228257, 1877316160, "tutorial_stage_8", "Left click on one of the response options.", "server")
+		needs_selection_help = false
+	end
+end
+function where_am_I(NPC, player)
+	finished_hailed = true
+	--[[Say(NPC, "Testing function call")
+	drake = GetSpawn(player, 270013)
+	SendStateCommand(drake,65")
+	Say(drake, "attacking")
+	AddTimer(drake, 40000, "drake_rain")
+	--]]
+	if needs_selection_help == true then
+		needs_selection_help = false
+	else
+		InstructionWindowGoal(player,0)	
+		InstructionWindowClose(player)	
+	end
+	if finished_where_am_I == false then
+		FaceTarget(NPC, player)
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("Me apologies.")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_002.mp3", 2054400186, 1976167819)
+		Dialog.AddOption("Who are you?", "who_are_you")
+		Dialog.Start()
+	end
+end
+
+function who_are_you(NPC, player)
+	if finished_who_are_you == false then
+		finished_where_am_I = true
+		FaceTarget(NPC, player)
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("I am Captain Draik Varlos, and this 'ere fine ship is the Far Journey.")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_003.mp3", 2565389482, 560555759)
+		Dialog.AddOption("How did I get here?", "how_did_I_get_here")
+		Dialog.Start()
+	end
+end
+
+function how_did_I_get_here(NPC, player)
+	finished_who_are_you = true
+	if finished_how_did_I_get_here == false then
+		FaceTarget(NPC, player)
+		Dialog.New(NPC, player)
+		Dialog.AddDialog("Me hearties pulled ya' from the sea, you an those other bilge rats. Do ya' remember?")
+		Dialog.AddVoiceover("voiceover/english/captain_varlos/boat_06p_tutorial02/varlos_0_004.mp3", 29296168, 2709023783)
+		Dialog.AddOption("Vaguely. Where are we headed?", "where_are_we_headed")
+		Dialog.Start()
+	end
+end
+
+function where_are_we_headed(NPC, player)
+	finished_how_did_I_get_here = true
+	if finished_where_are_we_headed == false then
+		FaceTarget(NPC, player)
+		PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_005.mp3", "We are heading to the Island of Refuge.", "", 1602680439, 2810422278)
+		AddTimer(NPC, 500, "shake_camera_medium", 1, player)
+		AddTimer(NPC, 1500, "shake_camera_low", 1, player)
+		AddTimer(NPC, 2500, "shake_camera_low", 1, player)	
+		AddTimer(NPC, 3000, "high_winds_1", 1, player)
+	end
+end
+
+function shake_camera_low(NPC, player)
+	PerformCameraShake(player, 0.10000000149011612)
+end
+
+function shake_camera_medium(NPC, player)
+	PerformCameraShake(player, 0.20000000298023224)	
+end
+
+function shake_camera_high(NPC, player)
+	PerformCameraShake(player, 0.699999988079071)
+end
+
+function high_winds_1(NPC, player)	
+	finished_where_are_we_headed = true
+	if finished_high_winds_1 == false then
+		FaceTarget(NPC, GetSpawn(NPC, 270001))
+		PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_006.mp3", "Ingrid! Quit gawking at the shorty and fix that yard-arm!", "", 2753489262, 3183736171)
+		SendStateCommand(GetSpawn(NPC, 270001), 0)
+		AddTimer(NPC, 3500, "high_winds_2", 1, player)
+	end
+end
+
+function high_winds_2(NPC, player)
+	finished_high_winds_1 = true
+	if finished_high_winds_2 == false then
+		PlayFlavor(GetSpawn(NPC, 270001), "voiceover/english/ingrid/boat_06p_tutorial02/020_deckhand_ingrid_010_1637e047.mp3", "Aye, aye, Captain!", "", 1250282628, 237171958)
+		SendStateCommand(GetSpawn(NPC, 270001), 520)
+		AddTimer(NPC, 2500, "high_winds_3", 1, player)
+	end
+end
+
+function high_winds_3(NPC, player)
+	finished_high_winds_2 = true
+	if finished_high_winds_3 == false then
+		PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_007.mp3", "Don't want the ship to come apart in these high winds, do ya'?!", "", 517097409, 4194681002)
+		SendStateCommand(GetSpawn(NPC, 270001), 0)
+		AddTimer(NPC, 5000, "high_winds_4", 1, player)
+	end
+end
+
+function high_winds_4(NPC, player)
+	finished_high_winds_3 = true
+	FaceTarget(NPC, player)
+	PlayFlavor(NPC, "voiceover/english/captain_varlos/boat_06p_tutorial02_fvo_008.mp3", "Ya think she'd never seen a gnome afore.", "", 2447879193, 4289147535)
+	SendStateCommand(GetSpawn(NPC, 270001), 630)
+	AddTimer(NPC, 500, "shake_camera_medium", 1, player)
+	AddTimer(NPC, 3500, "shake_camera_high", 1, player)
+	AddTimer(NPC, 5500, "shake_camera_medium", 1, player)
+	AddTimer(NPC, 9500, "shake_camera_low", 1, player)	
+	AddTimer(NPC, 5000, "offer_quest", 1, player)
+end
+
+function offer_quest(NPC, player)
+	if HasQuest(player, 524) == false then
+		OfferQuest(NPC, player, 524, true)
+		AddTimer(NPC, 7000, "Accepted_Tutorial_Instructions", 1, player)	
+	end
+end
 
+function Accepted_Tutorial_Instructions(NPC, player)
+	InstructionWindowClose(player)
+	ShowWindow(player, "Journals.JournalsQuest", 0)
+	InstructionWindow(player, -1.0, "The Captain has given you a quest. Left click on the quest journal button to open your quest journal.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_007_59f6d83b.mp3", 1470829818, 519016852, "tutorial_stage_9", "Open your quest journal. (click on the journal button)", "open JournalsQuest")
+	ShowWindow(player, "MainHUD.StartMenu", 1)
+	FlashWindow(player, "MainHUD.StartMenu.quest_journal", 20.0)
+	SetTutorialStep(player, 8)
 end
-]]--
 
 function respawn(NPC)
 

+ 10 - 91
server/SpawnScripts/FarJourneyFreeport/Geredo.lua

@@ -3,104 +3,23 @@
     Script Author  : Cynnar
     Script Date    : 2019.08.04 12:08:08
     Script Purpose : 
-    Notes          : Geredo is suppose to blow a kiss to Ingrid. PlayFlavor(NPC, "", "", "blowkiss", 0, 0) is not working
-	Notes          : Replaced with PlayFlavor(NPC, "", "", "scheme", 0, 0) for now
+                   : 
 --]]
 
-local TempAnimationPos = nil
-
 function spawn(NPC)
-	
-end
-
--- sent from Ingrid to start the flirting
--- sends back to Ingrid after Geredo starts flirting with a flex
-function GeredoFlirtingWithIngird(NPC, Spawn)
-	
-	local Ingrid = GetSpawn(NPC, 270001)
-	
-	if GetTempVariable(Ingrid, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "flex", 0, 0)
-	end
-
-	if Ingrid ~= nil then
-		AddTimer(Ingrid, 2000, "FlirtWithIngrid")
-	end
-	
-	--Say(NPC, "TempAnimationVar = " .. GetTempVariable(Ingrid, "TempAnimationVar") .. "!")
-	--SetTempVariable(Ingrid, "TempAnimationVar", "SecondRun")
-end
-
-
--- sent from Ingrid's chuckle
--- sends back to Ingrid after Geredo responds with a bow
-function FlirtingWithGeredo(NPC, Spawn)
-	
-	local Ingrid = GetSpawn(NPC, 270001)
-	
-	if GetTempVariable(Ingrid, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "bow", 0, 0)
-	end
-	
-	if Ingrid ~= nil then
-		AddTimer(Ingrid, 3000, "FlirtWithIngrid_2")
-	end
-end
-
--- sent from Ingrid's curtsey
--- sends back to Ingrid afer Geredo responds with a flirt
-function FlirtingWithGeredo_2(NPC, Spawn)
-	
-	local Ingrid = GetSpawn(NPC, 270001)
-	
-	if GetTempVariable(Ingrid, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "flirt", 0, 0)
-	end
-	
-	if Ingrid ~= nil then
-		AddTimer(Ingrid, 2500, "FlirtWithIngrid_3")
-	end
-end
 
--- sent from Ingrid's flustered
--- sends back to Ingrid afer Geredo responds with a blowkiss
-function FlirtingWithGeredo_3(NPC, Spawn)
-	
-	local Ingrid = GetSpawn(NPC, 270001)
-	
-	if GetTempVariable(Ingrid, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "scheme", 0, 0)
-		--PlayAnimation(NPC, 11762)
-	end
-	
-	if Ingrid ~= nil then
-		AddTimer(Ingrid, 2000, "FlirtWithIngrid_4")
-	end
-end
-
--- sent from Ingrid's no
--- sends back to Ingrid afer Geredo responds with beg
-function FlirtingWithGeredo_4(NPC, Spawn)
-	
-	local Ingrid = GetSpawn(NPC, 270001)
-	
-	if GetTempVariable(Ingrid, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "beg", 0, 0)
-	end
-	
-	if Ingrid ~= nil then
-		AddTimer(Ingrid, 1500, "FlirtWithIngrid_5")
-	end
-end
-
-function CaptainCallingIngrid(NPC, Spawn)
-	-- Testing to set animation during the captain calling ingrid
-	--PlayFlavor(NPC, "", "", "blowkiss", 0, 0)
-	PlayAnimation(NPC, 12246)
 end
 
 function hailed(NPC, Spawn)
-
+    choice = math.random(0, 2)	
+    FaceTarget(NPC, Spawn)	
+	if choice == 1 then
+		PlayFlavor(NPC, "voiceover/english/geredo/boat_06p_tutorial02_fvo_001.mp3", "Do you happen to have any mechanical leg extenders? I want to see the water.", "agree", 2902186099, 1357276764)
+	elseif choice == 2 then
+		PlayFlavor(NPC, "voiceover/english/geredo/boat_06p_tutorial02_fvo_002.mp3", "Thinking I should design a new mechanical boat. It would be perfect! Yes, perfect indeed!", "ponder", 2630458163, 1309095480)
+	else
+		PlayFlavor(NPC, "voiceover/english/geredo/boat_06p_tutorial02_fvo_003.mp3", "Owie, my elbow is sore!  It always gets this way when I am near water.  I could have helped rescue Anikra and Valik, but I wasn't able to swim.  Thanks for helping me.", "grumble", 2653823570, 1351171804)
+	end
 end
 
 function respawn(NPC)

+ 62 - 217
server/SpawnScripts/FarJourneyFreeport/Ingrid.lua

@@ -3,248 +3,93 @@
     Script Author  : Cynnar
     Script Date    : 2019.10.18 06:10:27
     Script Purpose : 
-    Notes          : 
-	Notes          : 
+                   : 
 --]]
-
 require "SpawnScripts/Generic/DialogModule"
 
-local TaskAboardTheFarJourney  = 524
-local TempAnimationVar = nil
+local ShardOfLucin = 12565
 
 function spawn(NPC)
-	
-	if not HasCompletedQuest(Player, TaskAboardTheFarJourney) then
-		SetTempVariable(NPC, "TempAnimationVar", "FirstRun")
-		AddTimer(NPC, 1500, "WalkToGeredo")
-	else
-		SetTempVariable(NPC, "TempAnimationVar", nil)
-	end
-	
-end
-
-function hailed(NPC, Spawn)
-	
-    
-	
-	if GetTempVariable(NPC, "TempAnimationVar") == nil then
-		FaceTarget(NPC, Spawn)
-		
-		local rand = math.random(0, 2)
-		
-		if rand == 0 then
-			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_009.mp3", "I hate rats, every time we dock they get on board and eat our supplies.", "grumble", 3636322414, 1973183674, Spawn)
-		elseif rand == 1 then
-			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_008.mp3", "Don't you just love the sea?", "sniff", 541733813, 1294072887, Spawn)
-		else
-			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_007.mp3", "Yo ho ho and a bottle of rum!", "smile", 964088856, 3568852318, Spawn)
-		end
-	end
-	
-end
 
-function WalkToGeredo(NPC, Spawn)
-	
-	MoveToLocation(NPC, 5.85, -2.07, -2.94, 2, nil, true)
-	MoveToLocation(NPC, 5.77, -2.07, -1.56, 2, nil, false)
-	
-	AddTimer(NPC, 1500, "EmoteAnimationStart")
-	
 end
 
---sends to Geredo to start the flirting
---no action on Ingrid's part yet
-function EmoteAnimationStart(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		AnimationChoice = math.random(0, 10)
-		
-		local Geredo = GetSpawn(NPC, 270004)
-		
-		if Geredo ~= nil then
-			if GetTempVariable(NPC, "TempAnimationVar") == "FirstRun" then
-				AddTimer(Geredo, 2000, "GeredoFlirtingWithIngird")
-			else
-				if GetTempVariable(NPC, "TempAnimationVar") == "SecondRun" and AnimationChoice <= 5 then
-					AddTimer(Geredo, 5000, "GeredoFlirtingWithIngird")
-				else
-					AddTimer(Geredo, 5000, "FlirtingWithGeredo")
-				end
-			end
-		end
-	end
-	
-end
-
---sent from Geredo's flex
---sends back to Geredo after Ingrid's response with a chuckle
-function FlirtWithIngrid(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "chuckle", 0, 0)
-		
-		AnimationChoice = math.random(0, 9)
-		
-		local Geredo = GetSpawn(NPC, 270004)
-		
-		if Geredo ~= nil then
-			if GetTempVariable(NPC, "TempAnimationVar") == "FirstRun" then
-				AddTimer(Geredo, 5000, "FlirtingWithGeredo")
-			else
-				if GetTempVariable(NPC, "TempAnimationVar") == "SecondRun" and AnimationChoice >= 7 then
-					AddTimer(Geredo, 5000, "FlirtingWithGeredo")
-				else
-					EmoteAnimationStart(NPC, Spawn)
-				end
-			end
-		end
-	end
-	
-end
-
---sent form Geredo's bow
---sends back to Geredo after Ingrid's curtsey
-function FlirtWithIngrid_2(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "curtsey", 0, 0)
-		
-		AnimationChoice = math.random(0, 9)
-		
-		local Geredo = GetSpawn(NPC, 270004)
-		
-		if Geredo ~= nil then
-			if GetTempVariable(NPC, "TempAnimationVar") == "FirstRun" then
-				AddTimer(Geredo, 5000, "FlirtingWithGeredo_2")
-			elseif GetTempVariable(NPC, "TempAnimationVar") == "SecondRun" and AnimationChoice >= 7 then
-				AddTimer(Geredo, 5000, "FlirtingWithGeredo_2")
-			else
-				EmoteAnimationStart(NPC, Spawn)
-			end
-		end
-	end
-	
-end
-
-
---sent form Geredo's flirt
---sends to flustered animation next
-function FlirtWithIngrid_3(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "giggle", 0, 0)
-		AddTimer(NPC, 2500, "Ingridflustered")
-	end
-	
-end
-
---emotes flustered 
---sends back to Geredo after Ingrid's giggle
-function Ingridflustered(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "flustered", 0, 0)
-		
-		local Geredo = GetSpawn(NPC, 270004)
-		
-		if Geredo ~= nil then
-			AddTimer(Geredo, 3000, "FlirtingWithGeredo_3")
+function hailed(NPC, player)
+    FaceTarget(NPC, player)
+	if HasQuest(player, 524) == false or HasCompletedQuest(player, 524) == true then
+		choice = math.random(1, 3) 
+		if choice == 1 then
+			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_008.mp3", "Don't you just love the sea?", "", 541733813, 1294072887)
+		elseif choice == 2 then
+			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_007.mp3", "Yo ho ho and a bottle of rum!", "", 964088856, 3568852318)
+		else
+			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_009.mp3", "I hate rats, every time we dock they get on board and eat our supplies.", "", 3636322414, 1973183674)
 		end
-	end
-	
-end
-
---sent form Geredo's blowkiss
---sends back to Geredo after Ingrid's no
-function FlirtWithIngrid_4(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "no", 0, 0)
-		
-		local Geredo = GetSpawn(NPC, 270004)
-		
-		if Geredo ~= nil then
-			AddTimer(Geredo, 2000, "FlirtingWithGeredo_4")
+	else
+		step = GetQuestStep(player, 524) 
+		if step == 4 then
+			SendStateCommand(NPC, 0)
+			Dialog.New(NPC, player)
+			Dialog.AddDialog("Hello, how are you?")
+			Dialog.AddVoiceover("voiceover/english/ingrid/boat_06p_tutorial02/ingrid_0_001.mp3", 1960704460, 917558592)
+			Dialog.AddOption("Good, thanks. How about you?", "small_talk")
+			Dialog.Start()
+		elseif step == 5 then
+			PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02_fvo_005.mp3", "Is Vim not going to sell it to you? That is just my luck... well I guess I will have to finish this work then.", "", 4181806501, 3186272404)
+		elseif step == 6 then
+			SetTutorialStep(player, 31)
+			AddCoin(player, 10)
+			DisplayText(player, 34, "You receive 10 Copper.")
+			Dialog.New(NPC, player)
+			Dialog.AddDialog("Ah! You got the shard. Great! Now I can stop doing this work and enjoy the rest of this trip. Here is some coin for your help.")
+			Dialog.AddVoiceover("voiceover/english/ingrid/boat_06p_tutorial02/ingrid_0_006.mp3", 502975024, 483052250)
+			Dialog.AddOption("Thanks.", "thanks_for_getting_shard")
+			Dialog.Start()					
 		end
 	end
-	
 end
 
---sent form Geredo's beg
---sends to foot tap animation
-function FlirtWithIngrid_5(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "tapfoot", 0, 0)
-		
-		AddTimer(NPC, 3000, "IngridTapFoot")
-	end
-	
+function thanks_for_getting_shard(NPC, player)
+	SetStepComplete(player, 524, 6) 
+	RemoveItem(player, ShardOfLucin)
 end
 
---emotes foot tap
---sends back to Geredo after Ingrid's shrug
-function IngridTapFoot(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") ~= nil then
-		PlayFlavor(NPC, "", "", "shrug", 0, 0)
-		
-		if GetTempVariable(NPC, "TempAnimationVar") == "FirstRun" then
-			SetTempVariable(NPC, "TempAnimationVar", "SecondRun")
-		end
-		
-		AddTimer(NPC, 5000, "EmoteAnimationStart")	
-	end
-	
+function small_talk(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("I am fine, just... after the last pickup I have been working extra hard, since Vim said she would give me the piece of Luclin she found.")
+	Dialog.AddVoiceover("voiceover/english/ingrid/boat_06p_tutorial02/ingrid_0_002.mp3", 3891218598, 1657063801)
+	Dialog.AddOption("Vim?", "vim_who")
+	Dialog.Start()
 end
 
-function CaptainCallingIngrid(NPC, Spawn)
-	
-	if GetTempVariable(NPC, "TempAnimationVar") == nil then
-		MoveToLocation(NPC, 2.47, -2.07, -3.26, 5)
-	end
-	
-	MoveToLocation(NPC, -2.72, -2.00, -8.34, 5, nil, true)
-	MoveToLocation(NPC, -2.11, 1.21, -14.69, 5, nil, true)
-	MoveToLocation(NPC, 0.78, 1.21, -14.51, 5, nil, true)
-	MoveToLocation(NPC, 0.54, 1.18, -11.70, 5, nil, true)
-	MoveToLocation(NPC, 1.68, 1.19, -12.13, 5, "FaceCaptainVarlos", false)
-
+function vim_who(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Yes, yes, Vim. The merchant over there. She found a small piece of the moon and is having me work for it. Maybe you can go buy it from her for me?")
+	Dialog.AddVoiceover("voiceover/english/ingrid/boat_06p_tutorial02/ingrid_0_003.mp3", 3050752668, 1437910974)
+	Dialog.AddOption("Sure, but I have no money.", "no_money")
+	Dialog.Start()
+	vim = GetRandomSpawnByID(NPC, 270007)
+	FaceTarget(NPC, vim)
+	AddTimer(NPC, 3000, "turn_towards_player", 1, player)	
 end
 
-function FaceCaptainVarlos(NPC, Spawn)
-	
-	local Varlos = GetSpawn(NPC, 270000)
-	
-	FaceTarget(NPC, Varlos)
-	
-	if GetDistance(NPC, Varlos) >= 1.48 then
-		AddTimer(Varlos, 500, "TalkToCaptainVarlos", 1, Spawn)
-	end
-	
+function turn_towards_player(NPC, player)
+	FaceTarget(NPC, player)
 end
 
-function SaluteCaptainVarlos(NPC, Spawn)
-	
-	local Varlos = GetSpawn(NPC, 270000)
-	
-	PlayFlavor(NPC, "voiceover/english/ingrid/boat_06p_tutorial02/020_deckhand_ingrid_010_1637e047.mp3", "Aye, aye, Captain!", "salute", 1250282628, 237171958, Spawn)
-	
-	AddTimer(Varlos, 3000, "IngridLeaveCaptain", 1, Spawn)
-	AddTimer(NPC, 2000, "ReturnToSpawnPoint", 1, Spawn)
-	
+function no_money(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Maybe you have something she will buy. Why don't you go talk to her.")
+	Dialog.AddVoiceover("voiceover/english/ingrid/boat_06p_tutorial02/ingrid_0_004.mp3", 3978048706, 2537762235)
+	Dialog.AddOption("Sure.", "finished_step_four")
+	Dialog.Start()	
 end
 
-function ReturnToSpawnPoint(NPC, Spawn)
-	
-	MoveToLocation(NPC, 0.78, 1.21, -14.51, 5, nil, true)
-	MoveToLocation(NPC, -2.11, 1.21, -14.69, 5, nil, true)
-	MoveToLocation(NPC, -2.72, -2.00, -8.34, 5, nil, true)
-	MoveToLocation(NPC, 3.34, -2.07, -3.97, 5, nil, true)
-	MoveToLocation(NPC, 2.35, -2.07, -3.34, 5, nil, false)
-	
+function finished_step_four(NPC, player)
+	SetTutorialStep(player, 22)
+	SetStepComplete(player, 524, 4) 
 end
 
 function respawn(NPC)
 
 end
+

+ 2 - 19
server/SpawnScripts/FarJourneyFreeport/Valik.lua

@@ -7,29 +7,12 @@
 --]]
 
 function spawn(NPC)
-	AddTimer(NPC, 5000, "ValikMove")
-end
-
-function ValikMove(NPC, Spawn)
-	MoveToLocation(NPC, -4.17, -2.02, -1.52, 2)
-	MoveToLocation(NPC, -5.37, -1.97, -4.22, 2)
-	MoveToLocation(NPC, -6.39, -1.81, -3.96, 2)
-	
-	AddTimer(NPC, 30000, "ValikMove_2")
-end
 
-function ValikMove_2(NPC, Spawn)
-	MoveToLocation(NPC, -4.17, -2.02, -1.52, 2)
-	MoveToLocation(NPC, -6.62, -1.82, 5.12, 2)
-	
-	AddTimer(NPC, 30000, "ValikMove")
 end
 
 function hailed(NPC, Spawn)
-	choice = math.random(0, 1)
-	
-    FaceTarget(NPC, Spawn)
-	
+	choice = math.random(0, 1)	
+    FaceTarget(NPC, Spawn)	
 	if choice == 1 then
 		PlayFlavor(NPC, "voiceover/english/valik/boat_06p_tutorial02/001_refugee_valik_002_eaf98080.mp3", "I can't wait to reach the island, dry land and dry food. Fish is only good for a while, even for a Kerran.", "", 1919549905, 2798982211)
 	else

+ 21 - 19
server/SpawnScripts/FarJourneyFreeport/Vim.lua

@@ -12,23 +12,27 @@ function spawn(NPC)
 
 end
 
-function hailed(NPC, Spawn)
-    choice = math.random(0, 3) 
-	
-    FaceTarget(NPC, Spawn)
-	
-	if choice == 0 then
-		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_c5d0b965.mp3", "I have some tattered clothes for sale, want to take a look?", "agree", 1974233264, 2156679701)
-
-	elseif choice == 1 then
-		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_6c0c3c22.mp3", "The Far Journey is a beautiful ship, ain't she?", "smirk", 139722646, 2672074756)
-
+function hailed(NPC, player)	
+    choice = math.random(1, 5) 	
+    FaceTarget(NPC, player)	
+	if choice == 1 then
+		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_c5d0b965.mp3", "I have some tattered clothes for sale, want to take a look?", "", 1974233264, 2156679701)
 	elseif choice == 2 then
-		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_d3204929.mp3", "Looking for something sturdy to wear?", "nod", 696787059, 2593820637)
-
+		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_6c0c3c22.mp3", "The Far Journey is a beautiful ship, ain't she?", "", 139722646, 2672074756)
 	elseif choice == 3 then
-		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_187fc6bb.mp3", "I am busy right now...", "no", 1835666244, 487490745)
-
+		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_d3204929.mp3", "Looking for something sturdy to wear?", "", 696787059, 2593820637)
+	elseif choice == 4 then
+		--PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_187fc6bb.mp3", "I am busy right now...", "", 1835666244, 487490745)
+		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02/020_merchant_vim_hail_481beac8.mp3", "I love traveling the seas... Oh! Did you need something?", "", 2187888771, 2112320089)
+	else
+		PlayFlavor(NPC, "voiceover/english/merchant_vim/boat_06p_tutorial02_fvo_005.mp3", "The Far Journey's a beautiful ship, ain't she?", "",3585442471, 604828909)
+	end
+	if GetTutorialStep(player) == 24 then
+		InstructionWindow(player, -1.0, "This is the merchant screen where all buying and selling takes place. Money comes in four denominations: copper, silver, gold, and platinum. Each type of coin is worth 100 times more than the previous one. For example, 100 copper pieces equals 1 silver piece. But right now, as this display shows, you have no money, so left click on the sell tab.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_021_6c80e66e.mp3", 1226703760, 969427050, "tutorial_stage_25", "Click on the 'Sell' tab in the merchant window.", "pane Merchant Sell")
+		FlashWindow(player, "Inventory.Merchant.PlatinumCoinIcon", 8.0)
+		FlashWindow(player, "Inventory.Merchant.GoldCoinIcon", 8.0)
+		FlashWindow(player, "Inventory.Merchant.SilverCoinIcon", 8.0)
+		FlashWindow(player, "Inventory.Merchant.CopperCoinIcon", 8.0)
 	end
 end
 
@@ -36,8 +40,6 @@ function respawn(NPC)
 
 end
 
-function targeted(NPC, Spawn)
-    if GetDistance(Spawn, NPC) < 10 then
-        hailed(NPC, Spawn)
-    end
+function targeted(NPC, Player)	
+    
 end

+ 69 - 3
server/SpawnScripts/FarJourneyFreeport/Waulon.lua

@@ -5,16 +5,82 @@
     Script Purpose : 
                    : 
 --]]
+require "SpawnScripts/Generic/DialogModule"
 
 function spawn(NPC)
 
 end
 
-function hailed(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-	PlayFlavor(NPC, "voiceover/english/waulon/boat_06p_tutorial02/walon_0_008.mp3", "What? Can't ye see? Busy, away with ye!", "", 1608066875, 70639594)
+function hailed(NPC, player)
+    FaceTarget(NPC, player)
+	if HasQuest(player, 524) == false or HasCompletedQuest(player, 524) == true then	
+		PlayFlavor(NPC, "voiceover/english/waulon/boat_06p_tutorial02/walon_0_008.mp3", "What? Can't ye see? Busy, away with ye!", "", 1608066875, 70639594)
+	else
+		step = GetQuestStep(player, 524) 
+		if step == 1 then			
+			InstructionWindowGoal(player,0)	
+			InstructionWindowClose(player)
+			Dialog.New(NPC, player)
+			Dialog.AddDialog("Wot? Oh, hey there, ye' startled me.")
+			Dialog.AddVoiceover("voiceover/english/waulon/boat_06p_tutorial02/walon_0_001.mp3", 814960513, 2301562586)
+			Dialog.AddOption("Sorry about that.", "startled_me")
+			Dialog.Start()	
+		elseif step == 3 then
+			PlayFlavor(NPC, "voiceover/english/waulon/boat_06p_tutorial02/walon_0_004.mp3", "Where's me hat? Needs me lucky hat!", "", 2688932325, 103225044)
+			Dialog.New(NPC, player)
+			Dialog.AddDialog("Ah, me hat! Was worried. See, dis' hat gives me the luck.")
+			Dialog.AddVoiceover("voiceover/english/waulon/boat_06p_tutorial02/walon_0_005.mp3", 4097259098, 893296183)
+			Dialog.AddOption("Glad to help!", "returned_hat")
+			Dialog.Start()
+			InstructionWindowGoal(player, 0)
+		end
+	end	
 end
 
+function returned_hat(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Now me is safe, thanks ta' ye. Here, take this charm. Ya' may find a use for it.")
+	Dialog.AddVoiceover("voiceover/english/waulon/boat_06p_tutorial02/walon_0_006.mp3", 316186630, 2628530085)
+	Dialog.AddOption("Thanks, Waulon.", "received_charm")
+	Dialog.Start()
+end
+
+function returned_hat(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Well now, Ingrid o'er there, can show ya' the rest of the ship. Me needs ta' plot the course ta' the isles now.")
+	Dialog.AddVoiceover("voiceover/english/waulon/boat_06p_tutorial02/walon_0_007.mp3", 1973137904, 2648127610)
+	Dialog.AddOption("Ok.", "finished_step_three")
+	Dialog.Start()
+end
+
+function finished_step_three(NPC, player)
+	SetStepComplete(player, 524, 3) 
+end
+
+function startled_me(NPC, player)
+	Dialog.New(NPC, player)
+	Dialog.AddDialog("Can't seem ta' find me hat.")
+	Dialog.AddVoiceover("voiceover/english/waulon/boat_06p_tutorial02/walon_0_002.mp3", 1759807851, 3940656870)
+	Dialog.AddOption("Do you need some help?", "help_find_hat")
+	Dialog.Start()
+end
+
+function help_find_hat(NPC, player)
+	chest = GetRandomSpawnByID(NPC, 270010)
+	FaceTarget(NPC, chest)
+	Dialog.New(NPC, player)	
+	Dialog.AddDialog("Sure! Me needs ya' ta' go lookie in them there boxes and if ye' find it, lets me know.")
+	Dialog.AddVoiceover("voiceover/english/waulon/boat_06p_tutorial02/walon_0_003.mp3", 2072797774, 185252141)
+	Dialog.AddOption("Ok.", "finished_step_one")
+	Dialog.Start()	
+end
+
+function finished_step_one(NPC, player)
+	InstructionWindowGoal(player, 0)	
+	InstructionWindowClose(player)
+	SetStepComplete(player, 524, 1) 	
+end 
+
 function respawn(NPC)
 
 end

+ 137 - 0
server/SpawnScripts/FarJourneyFreeport/agoblin.lua

@@ -0,0 +1,137 @@
+--[[
+    Script Name    : SpawnScripts/FarJourneyFreeport/a goblin.lua
+    Script Author  : LethalEncounter
+    Script Date    : 2020.07.02
+    Script Purpose : 
+                   : 
+--]]
+
+function spawn(NPC)
+	AddTimer(NPC, 5000, "idle_loop")
+end
+
+function hailed(NPC, player)
+	AddTimer(NPC, 100, "idle_loop")
+end
+
+function idle_loop(NPC)
+    choice = math.random(0, 15) 
+	if choice == 0 then
+		SendStateCommand(NPC, 217)
+	elseif choice == 1 then
+		SendStateCommand(NPC, 218)
+	elseif choice == 2 then
+		SendStateCommand(NPC, 883)
+	elseif choice == 3 then
+		SendStateCommand(NPC, 226)		
+	elseif choice == 4 then
+		SendStateCommand(NPC, 296)
+	elseif choice == 5 then
+		SendStateCommand(NPC, 311)
+	elseif choice == 6 then
+		SendStateCommand(NPC, 315)
+	elseif choice == 7 then
+		SendStateCommand(NPC, 488)
+	elseif choice == 8 then
+		SendStateCommand(NPC, 519)
+	elseif choice == 9 then
+		SendStateCommand(NPC, 521)
+	elseif choice == 10 then
+		SendStateCommand(NPC, 524)
+	elseif choice == 11 then
+		SendStateCommand(NPC, 550)
+	elseif choice == 12 then
+		SendStateCommand(NPC, 632)
+	elseif choice == 13 then
+		SendStateCommand(NPC, 637)
+	elseif choice == 14 then
+		SendStateCommand(NPC, 717)
+	else
+		SendStateCommand(NPC, 82)
+	end
+	AddTimer(NPC, math.random(5000, 7000), "stop_animation")	
+end
+
+function stop_animation(NPC)
+	SendStateCommand(NPC, 0)
+	if GetSpawn(NPC, 270011) == Nil then
+		AddTimer(NPC, 500, "run_around_loop_init")
+	else
+		AddTimer(NPC, math.random(3000, 10000), "idle_loop")
+	end
+end
+
+function run_around_loop_init(NPC)
+	MoveToLocation(NPC, 2.92, 0.57, 15.98, 5, "run_around_loop_init_pause", false)	
+end
+
+function run_around_loop_init_pause(NPC)
+	ClearRunningLocations(NPC)
+	AddTimer(NPC, 700, "run_around_loop_init_continue")
+end
+
+function run_around_loop_init_continue(NPC)
+	MoveToLocation(NPC, 3.23, -2.07, 10.83, 5, "run_around_loop_init_finished", false)
+end
+
+function run_around_loop_init_finished(NPC)
+	ClearRunningLocations(NPC)
+	AddTimer(NPC, 100, "run_around_loop")
+end
+
+function run_around_loop(NPC)
+	MovementLoopAdd(NPC, -4.43, -2.07, 6.17, 5, 3, "run_around_loop_pause1")
+	MovementLoopAdd(NPC, -5.23, -2.01, 0.39, 5, 3, "run_around_loop_pause2")
+	MovementLoopAdd(NPC, -4.88, -2.06, 4.26, 5, 3, "run_around_loop_pause3")
+	MovementLoopAdd(NPC, 3.94, -2.07, 0.66, 5, 3, "run_around_loop_pause4")
+	MovementLoopAdd(NPC, 2.84, -2.07, -2.07, 5, 3, "run_around_loop_pause5")
+	MovementLoopAdd(NPC, 3.41, -1.99, -7.42, 5, 3, "run_around_loop_pause6")
+end
+
+function run_around_loop_pause(NPC)
+	choice = math.random(0, 7) --[ mostly get threaten (125) this way ]--
+	if choice == 0 then
+		SendStateCommand(NPC, 217)
+	elseif choice == 1 then
+		SendStateCommand(NPC, 226)		
+	elseif choice == 2 then
+		SendStateCommand(NPC, 550)
+	elseif choice == 3 then
+		SendStateCommand(NPC, 717)
+	else
+		SendStateCommand(NPC, 125)
+	end
+	AddTimer(NPC, 2800, "run_around_loop_stop_animation")
+end
+
+function run_around_loop_pause1(NPC)
+	SendStateCommand(GetSpawn(NPC, 270005), 218)
+	run_around_loop_pause(NPC)
+end
+
+function run_around_loop_pause2(NPC)
+	SendStateCommand(GetSpawn(NPC, 270006), 525)
+	run_around_loop_pause(NPC)
+end
+
+function run_around_loop_pause3(NPC)
+	run_around_loop_pause(NPC)
+end
+
+function run_around_loop_pause4(NPC)
+	SendStateCommand(GetSpawn(NPC, 270004), 535)
+	run_around_loop_pause(NPC)
+end
+
+function run_around_loop_pause5(NPC)
+	SendStateCommand(GetSpawn(NPC, 270001), 218)
+	run_around_loop_pause(NPC)
+end
+
+function run_around_loop_pause6(NPC)
+	run_around_loop_pause(NPC)
+end
+
+function run_around_loop_stop_animation(NPC)
+	SendStateCommand(NPC, 0)	
+end

+ 28 - 0
server/SpawnScripts/FarJourneyFreeport/atreasurechest.lua

@@ -0,0 +1,28 @@
+--[[
+    Script Name    : SpawnScripts/FarJourneyFreeport/atreasurechest.lua
+    Script Author  : LethalEncounter
+    Script Date    : 2020.07.02
+    Script Purpose : 
+                   : 
+--]]
+
+function spawn(NPC)
+
+end
+
+function open(NPC, Player)
+	SendStateCommand(NPC, 399)
+	AddTimer(NPC, 2000, "finished_open_animation")
+	if HasPendingLoot(NPC, Player) then		
+		ShowLootWindow(Player, NPC)
+		DisplayText(Player, 12, "There appears to be something inside this box.")
+		InstructionWindow(Player, -1.0, "This screen shows the contents of the box you just opened. Left click on the loot all button to take the items from the box.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_013_f0780e49.mp3", 1581263773, 1569244108, "tutorial_stage_17", "Left click on the loot all button.", "server")
+		SetTutorialStep(player, 16)
+	else
+		DisplayText(Player, 12, "This box is empty.")
+	end
+end
+
+function finished_open_animation(NPC)
+	SendStateCommand(NPC, 400)
+end

+ 9 - 13
server/SpawnScripts/FarJourneyFreeport/tutorialdrake.lua

@@ -10,20 +10,16 @@ function spawn(NPC)
 
 end
 
-function hailed(NPC, Spawn)
-    FaceTarget(NPC, Spawn)
-SpawnSet(NPC, visual_state, 10783)
-Say(NPC, "I should have changed my visual state")
+function attack(NPC)
+	SendStateCommand(NPC, 65)
+	AddTimer(NPC, 40000, "drake_rain")
 end
 
-function respawn(NPC)
-
-end
-
-function startanimation(NPC, Spawn)
-	SpawnSet(NPC, "visual_state", "10783")
+function drake_rain(NPC)
+	SendStateCommand(NPC, 910)
+	AddTimer(NPC, 10000, "drake_stop")
 end
 
-function stopanimation(NPC, Spawn)
-	SpawnSet(NPC, "visual_state", "0")
-end
+function drake_stop(NPC)
+	SendStateCommand(NPC, 33678)
+end

+ 247 - 0
server/ZoneScripts/FarJourneyFreeport.lua

@@ -0,0 +1,247 @@
+--[[
+	Script Name		:	FarJourneyFreeport.lua
+	Script Purpose	:	Handles boat scripted events
+	Script Author	:	LethalEncounter
+	Script Date		:	6/28/2020
+	Script Notes	:	
+--]]
+
+seen_step_45 = false
+
+function signal_changed(zone, player, signal)
+	if signal == "sys_client_avatar_ready" and HasQuest(player, 524) == false and HasCompletedQuest(player, 524) == false then
+		i = 1
+		spawns = GetSpawnListBySpawnID(player, 270010)
+		repeat
+			spawn = GetSpawnFromList(spawns, i-1)
+			if spawn then
+				ChangeHandIcon(spawn, 0)
+			end
+			i = i + 1
+		until spawn == Nil
+		InstructionWindow(player, 10.0, "Welcome to Norrath, the world of EverQuest II. Left click on the help button at any time for more detailed help and information.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_001_63779ca0.mp3", 3450229107, 2555116653, "introduction", "", "continue")
+		ShowWindow(player, "MainHUD.StartMenu", 1)
+		FlashWindow(player, "MainHUD.StartMenu.help", 10.0)
+		SetTutorialStep(player, 1)
+	end
+	if signal == "introduction" then
+			ShowWindow(player, "MainHUD.StartMenu", 0)
+			InstructionWindow(player, -1.0, "EverQuest II can be played in either a third person view, which you see now, or from a first person perspective. Scrolling the mouse wheel or pressing the F9 key will change your view. Try changing your view now.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_002_57cbfd77.mp3", 3053902814, 2060319388, "camera_control", "Switch the camera view to first-person. (mouse wheel up)", "camera firstperson", "Switch the camera view to third-person. (mouse wheel down)", "camera thirdperson")
+			SetTutorialStep(player, 2)
+	end
+	if signal == "camera_control" then
+			InstructionWindow(player, -1.0, "The first thing you need to know how to do is look around using the mouse. Hold down the right mouse button and move the mouse right and left. Notice that moving your mouse up and down will make you look in those directions as well.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_003_a3b38888.mp3", 130321605, 3870508467, "tutorial_stage_4", "Look to the left (hold right mouse button and move the mouse left)", "mouselook left", "Look to the right (hold right mouse button and move the mouse right)", "mouselook right", "Look up (hold right mouse button and move the mouse up)", "mouselook up", "Look down (hold right mouse button and move the mouse down)", "mouselook down")
+			SetTutorialStep(player, 3)
+	end
+	if signal == "tutorial_stage_4" and GetTutorialStep(player) == 3 then
+			InstructionWindow(player, -1.0, "Use the A, S, W, and D keys for basic movement. These keys cause you to turn left and right as well as to move forward and back.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_004_ff730a9b.mp3", 825281976, 127545929, "tutorial_stage_5", "Turn left. (press the A key)", "move turnleft", "Turn right. (press the D key)", "move turnright", "Move forward. (press the W key)", "move forward", "Move backward. (press the S key)", "move back")
+			SetTutorialStep(player, 4)
+	end
+	if signal == "tutorial_stage_5" and GetTutorialStep(player) == 4 then
+			InstructionWindow(player, -1.0, "Double left click on Captain Varlos to interact with him.", "", 0, 0, "tutorial_stage_6", "", "server")
+			SetTutorialStep(player, 5)
+	end
+	if signal == "tutorial_stage_9" and GetTutorialStep(player) == 8 then
+			ShowWindow(player, "MainHUD.StartMenu", 0)
+			FlashWindow(player, "MainHUD.StartMenu.quest_journal", 0.0)
+			InstructionWindow(player, -1.0, "The quest journal will keep track of all important quest information for you.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_008_dea98146.mp3", 1585802421, 4158930887, "tutorial_stage_10", "", "continue")
+			SetTutorialStep(player, 9)
+	end
+	if signal == "tutorial_stage_10" and GetTutorialStep(player) == 9 then
+			FlashWindow(player, "Journals.ActiveQuest", 6.5)
+			InstructionWindow(player, -1.0, "This is your quest helper. It displays the current step of your active quest.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_009_7270f5ed.mp3", 1886677883, 3646680727, "tutorial_stage_13", "", "continue")
+			SetTutorialStep(player, 10)
+	end
+	if (signal == "tutorial_stage_13" and GetTutorialStep(player) == 10) or (signal == "sys_client_avatar_ready" and HasQuest(player, 524) == true and GetQuestStep(player, 524) == 1) then
+			InstructionWindow(player, -1.0, "Place your mouse pointer on Waulon. Notice that your mouse pointer changes shape. This indicates what the normal action of a double left click on that object or person will do. In this case you will hail Waulon. Double left click on Waulon now.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_010_73e16723.mp3", 1311374862, 3104741396, "tutorial_stage_14", "Double left click on Waulon to hail him.", "server")
+			ShowWindow(player, "Journals.JournalsQuest", 0)
+			SetTutorialStep(player, 13)
+	end
+	if (signal == "tutorial_stage_15" and GetTutorialStep(player) == 14)  or (signal == "sys_client_avatar_ready" and HasQuest(player, 524) == true and GetQuestStep(player, 524) == 2) then		
+		InstructionWindow(player, -1.0, "Move your mouse pointer over the boxes. Notice that your mouse pointer changes shape again, and the boxes start to glow. Double left click to open each of the boxes.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_012_9ba468fb.mp3", 1009896073, 25784171, "tutorial_stage_16", "Double left click on a box to open it.", "server")
+		SetTutorialStep(player, 15)
+	end
+	if signal == "tutorial_stage_18" and GetTutorialStep(player) == 16 then
+			ShowWindow(player, "Inventory.Inventory", 0)
+			InstructionWindow(player, -1.0, "Managing your inventory and equipment is very important. It is how you use all of the gear that you will find on your adventures. Left click on the inventory button.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_015_46f20016.mp3", 2394903675, 552673556, "tutorial_stage_19", "Open your inventory. (click on the inventory button)", "open Inventory")
+			ShowWindow(player, "MainHUD.StartMenu", 1)
+			FlashWindow(player, "MainHUD.StartMenu.inventory", 16.0)
+			SetTutorialStep(player, 18)
+	end
+	if signal == "tutorial_stage_19" and GetTutorialStep(player) == 18 then
+			ShowWindow(player, "MainHUD.StartMenu", 0)
+			FlashWindow(player, "MainHUD.StartMenu.inventory", 0.0)
+			InstructionWindow(player, -1.0, "This is your inventory. These slots represent available space to carry items.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_016_3f62b542.mp3", 2423921165, 856268766, "tutorial_stage_20", "", "continue")
+			ShowWindow(player, "Inventory.Inventory", 1)
+			FlashWindow(player, "Inventory.Inventory.GeneralPage.InvSlot0", 6.0)
+			FlashWindow(player, "Inventory.Inventory.GeneralPage.InvSlot1", 6.0)
+			FlashWindow(player, "Inventory.Inventory.GeneralPage.InvSlot2", 6.0)
+			FlashWindow(player, "Inventory.Inventory.GeneralPage.InvSlot3", 6.0)
+			FlashWindow(player, "Inventory.Inventory.GeneralPage.InvSlot4", 6.0)
+			FlashWindow(player, "Inventory.Inventory.GeneralPage.InvSlot5", 6.0)
+			SetTutorialStep(player, 19)
+	end
+	if (signal == "tutorial_stage_20" and GetTutorialStep(player) == 19) or (signal == "sys_client_avatar_ready" and HasQuest(player, 524) == true and GetQuestStep(player, 524) == 3)  then
+			InstructionWindow(player, -1.0, "This is your equipment. These slots represent the locations you can equip with armor, weapons, jewelry, and other items. Double left click on the tunic in your inventory.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_017_d8bd9733.mp3", 598366253, 952105390, "tutorial_stage_21", "Double left click on the threadbare tunic to equip it.", "server")
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot0", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot1", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot2", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot3", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot4", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot5", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot6", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot7", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot8", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot9", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot10", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot11", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot12", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot13", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot14", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot15", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot16", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot17", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot18", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot19", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot20", 8.0)
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot21", 8.0)
+			SetTutorialStep(player, 20)
+	end
+	if signal == "tutorial_stage_21" and GetTutorialStep(player) == 20 then
+		InstructionWindow(player, -1.0, "Notice the tunic now occupies the chest equipment slot and you are now wearing it.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_018_8786e939.mp3", 3902294834, 2836623234, "tutorial_stage_22", "", "continue")
+		FlashWindow(player, "Inventory.Inventory.EquipmentPage.EqSlot3", 6.0)
+		SetTutorialStep(player, 21)
+	end
+	if signal == "tutorial_stage_22" and GetTutorialStep(player) == 21 then
+			FlashWindow(player, "Inventory.Inventory.EquipmentPage.Chest3", 0.0)
+			InstructionWindow(player, -1.0, "Waulon is waiting for you to return with his hat. Close your inventory window and go talk to him. Remember, double left clicking on Waulon will start the conversation.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_019_9da1b75d.mp3", 741062937, 535829184, "tutorial_stage_23", "Double left click on Waulon to hail him.", "server")			
+	end
+	if signal == "sys_client_avatar_ready" and HasQuest(player, 524) == true and GetQuestStep(player, 524) == 5 then
+		InstructionWindow(player, -1.0, "A merchant is a special type of character who buys and sells things. Find and double left click on Merchant Vim to start a transaction.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_020_6ea052d3.mp3", 4250953579, 3003156164, "tutorial_stage_24", "Double left click on Merchant Vim.", "server")
+		SetTutorialStep(player, 24)
+	end
+	if signal == "tutorial_stage_25" and GetTutorialStep(player) == 24 then
+		InstructionWindow(player, -1.0, "The sell tab displays the items in your inventory that a merchant is interested in and how much they will pay for each item. Different merchants are interested in different things, and the price they will pay varies.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_022_11c56393.mp3", 3020037974, 1310705478, "tutorial_stage_26", "", "continue")			
+		SetTutorialStep(player, 25)
+	end
+	if signal == "tutorial_stage_26" and GetTutorialStep(player) == 25 then
+		InstructionWindow(player, -1.0, "Congratulations. Now left click on the buy tab", "voiceover/english/narrator/boat_06p_tutorial02/narrator_024_d8a4efd6.mp3", 2701661062, 119120428, "tutorial_stage_28", "Click on the 'Buy' tab in the merchant window.", "pane Merchant Buy")
+		SetTutorialStep(player, 26)
+	end
+	if signal == "tutorial_stage_28" and GetTutorialStep(player) == 26 then
+		InstructionWindow(player, -1.0, "Double left click on the Shard of Luclin.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_025_fae8d9aa.mp3", 2465701012, 531235298, "tutorial_stage_30", "Double left click on the Shard of Luclin.", "server")		
+		SetTutorialStep(player, 28)
+	end
+
+	if signal == "equipping_weapons" then
+		SetTutorialStep(player, 34)
+		ShowWindow(player, "MainHUD.StartMenu", 0)
+		FlashWindow(player, "MainHUD.StartMenu.inventory", 0.0)
+		InstructionWindow(player, -1.0, "This is an action menu. Right clicking on any character, item, or interface element will bring up the action menu for that object.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_029_759b20ee.mp3", 2551751095, 1683887648, "tutorial_stage_35", "Right click on an item in your inventory.", "open RadialMenu")
+		ShowWindow(player, "Inventory.Inventory", 1)
+	end
+	if signal == "tutorial_stage_35" then
+		SetTutorialStep(player, 35)
+		InstructionWindow(player, -1.0, "Left click on the examine action.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_030_ae336060.mp3", 1661740791, 1051227725, "tutorial_stage_36", "Right click on an item, then left click on the examine button.", "open ExamineItem")
+	end
+	if signal == "tutorial_stage_36" then
+		SetTutorialStep(player, 36)
+		InstructionWindow(player, -1.0, "This window shows the detailed specifics about an item.  Notice that the name of the item is white.  This indicates that the item is a good match for you.  If an item's name ever turns grey, you will want to replace it with a better version.  A red name indicates that the item is either unusable by your character class or out of your level range.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_030_ae336060.mp3", 1307292988, 58658687, "tutorial_stage_37", "", "continue")
+	end
+	if signal == "tutorial_stage_37" then
+		SetTutorialStep(player, 37)
+		InstructionWindow(player, -1.0, "Left clicking and dragging on an item will pick that item up and allow you to move it from one slot to another. Pick up the club.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_032_c4d45830.mp3", 1069757593, 1169701151, "tutorial_stage_38", "", "continue")
+	end
+	if signal == "tutorial_stage_38" then
+		SetTutorialStep(player, 38)
+		InstructionWindow(player, -1.0, "Releasing the mouse button over an available slot will drop the item again.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_033_7310c971.mp3", 329734483, 2927325554, "tutorial_stage_39", "", "continue")
+	end
+	if signal == "tutorial_stage_39" then
+		SetTutorialStep(player, 39)
+		InstructionWindow(player, -1.0, "If you drag and drop items onto the paper doll display, your character will attempt to equip that item. If the item cannot be equipped, it will automatically be stored into the first available inventory slot. Try auto-equipping the club.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_034_cb993d34.mp3", 2169570288, 2277767239, "tutorial_stage_40", "Left click and hold down the mouse button on the splintered club, then drag it to your character display.", "server")
+		FlashWindow(player, "Inventory.Inventory.EquipmentPage.PaperDoll", 6.0)
+	end
+	if (signal == "tutorial_stage_40" and GetTutorialStep(player) == 39) or (signal == "sys_client_avatar_ready" and HasQuest(player, 524) == true and GetQuestStep(player, 524) == 8) then
+		SetTutorialStep(player, 40)
+		InstructionWindow(player, -1.0, "Before approaching a potential enemy, you should evaluate a few things. This is your health display. As you are injured, your health  decreases. If it runs out completely you will collapse and could die. It is very important to keep an eye on your health at all times.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_036_ff1a8605.mp3", 4286041154, 293958730, "tutorial_stage_42", "", "continue")
+		FlashWindow(player, "MainHUD.Player.HealthBar", 18.0)
+		FlashWindow(player, "MainHUD.Player.Name", 18.0)
+	end
+	if signal == "tutorial_stage_42" then
+		SetTutorialStep(player, 42)
+		FlashWindow(player, "MainHUD.Player.HealthBar", 0.0)
+		FlashWindow(player, "MainHUD.Player.Name", 0.0)
+		InstructionWindow(player, -1.0, "It is also important to consider how powerful your opponent is. Place your mouse cursor onto the rat.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_037_e7c85534.mp3", 1222496721, 345453852, "tutorial_stage_42.5", "", "continue")
+	end
+	if signal == "tutorial_stage_42.5" then
+		InstructionWindow(player, -1.0, "Notice the mouse pointer changes color. This color indicates how difficult an opponent is. The cursor is white, which means that the rat is an even fight. Easier fights will be green or blue, meaning that these creatures are lower level than you. More difficult, higher level fights will be yellow, orange or red.  Looks however, can be deceiving.  Some creatures are very powerful for their size, and may require a group to conquer.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_038_19982dd.mp3", 1535688531, 2987489092, "tutorial_stage_43", "", "continue")
+	end
+	if signal == "tutorial_stage_43" then
+		SetTutorialStep(player, 43)
+		InstructionWindow(player, -1.0, "Notice his name is now flashing and there is a large targeting ring on the ground below him. This indicates that the rat is now your target.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_040_1e780c5b.mp3", 2045181958, 2230466907, "tutorial_stage_44.5", "", "continue")
+		FlashWindow(player, "MainHUD.Target.HealthBar", 12.0)
+		FlashWindow(player, "MainHUD.Target.Name", 12.0)
+	end
+	if signal == "tutorial_stage_44.5" then
+		SetTutorialStep(player, 44)
+		FlashWindow(player, "MainHUD.Player.HealthBar", 0.0)
+		FlashWindow(player, "MainHUD.Player.Name", 0.0)
+		InstructionWindow(player, -1.0, "You can see both the health and level of your target in the target display. You will also notice a downward pointing arrow above the rat's health bar.  This means that it is a below average difficulty opponent and can be defeated by a single player.  Opponents can range from three downward arrows (a very weak opponent) to three upward arrows (a heroic opponent requiring a group of players to defeat).  An opponent that indicates no arrows at all is considered to be of average difficulty.", "", 0, 0, "tutorial_stage_45", "", "continue")
+		FlashWindow(player, "MainHUD.Target.HealthBar", 12.0)
+		FlashWindow(player, "MainHUD.Target.Name", 12.0)
+	end
+	if signal == "tutorial_stage_45" then
+		SetTutorialStep(player, 45)
+		FlashWindow(player, "MainHUD.Player.HealthBar", 0.0)
+		FlashWindow(player, "MainHUD.Player.Name", 0.0)
+		InstructionWindow(player, -1.0, "Place your mouse pointer over the target box. The tool-tip will show you detailed information about the target and its encounter.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_040_1e780c5b.mp3", 0, 9, "tutorial_stage_45.5", "", "continue")
+		FlashWindow(player, "MainHUD.Target.HealthBar", 12.0)
+		FlashWindow(player, "MainHUD.Target.Name", 12.0)
+	end
+	if signal == "tutorial_stage_45.5" then
+		FlashWindow(player, "MainHUD.Player.HealthBar", 0.0)
+		FlashWindow(player, "MainHUD.Player.Name", 0.0)
+		InstructionWindow(player, -1.0, "It's time for some adventure. Double left click on the rat to attack it.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_042_791576f2.mp3", 1866452922, 760329708, "tutorial_stage_46", "Double left click on the rat.", "server")
+	end
+	if signal == "tutorial_stage_47" then
+		SetTutorialStep(player, 47)
+		InstructionWindow(player, 10.0, "Always be sure to take everything you can from a fallen opponent. Many seemingly worthless items can be valuable to merchants or other players.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_044_dc34536.mp3", 4221017573, 1055524726, "tutorial_stage_48", "", "continue")
+	end
+	if signal == "tutorial_stage_48" then
+		SetTutorialStep(player, 48)
+		InstructionWindow(player, -1.0, "Congratulations! As you see, you also earn experience and rewards for defeating enemies.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_045_db304a48.mp3", 3903602846, 3454863851, "tutorial_stage_49", "", "continue")
+	end	
+	if signal == "tutorial_stage_50" then
+		SetTutorialStep(player, 50)
+		InstructionWindow(player, -1.0, "Notice that your experience point display is now empty, and your maximum health and power have increased.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_047_5c382a71.mp3", 1130515024, 564825664, "tutorial_stage_51", "", "continue")
+		FlashWindow(player, "MainHUD.Player.HealthBarBkg", 6.0)
+		FlashWindow(player, "MainHUD.Player.ManaBarBkg", 6.0)
+		FlashWindow(player, "MainHUD.Player.Name", 6.0)
+		FlashWindow(spawn, "MainHUD.Experience", 3.0)
+	end
+end
+
+function item_equipped(zone, player, item_id, item_name, item_unique_id)
+	if item_name == "threadbare tunic" then
+		InstructionWindowGoal(player, 0)		
+	elseif item_name == "splintered club" then
+		InstructionWindowClose(player)
+		FlashWindow(player, "Inventory.Inventory.EquipmentPage.PaperDoll", 0.0)
+		InstructionWindow(player, -1.0, "Now, go and complete the quest that the Captain gave to you.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_035_acb2990a.mp3", 395837788, 2869210055, "tutorial_stage_40", "", "continue")
+	end
+end
+
+function item_unequipped(zone, player, item_id, item_name, item_unique_id)
+end
+
+function spawn_killed(zone, dead, killer)
+	if seen_step_45 == false and GetName(dead) == "a rat" then	
+		InstructionWindowClose(killer)
+		InstructionWindow(killer, 8.0, "Double click on the dead rat to search its body for valuables.", "voiceover/english/narrator/boat_06p_tutorial02/narrator_043_a33564f1.mp3", 2552146487, 2098243078, "tutorial_stage_47", "Double left click on the corpse of a rat.", "open Loot")
+		seen_step_45 = true
+	end
+	SendStateCommand(GetSpawn(killer, 270001), 0)
+	SendStateCommand(GetSpawn(killer, 270004), 0)
+	SendStateCommand(GetSpawn(killer, 270005), 0)	
+	SendStateCommand(GetSpawn(killer, 270007), 0)
+end

+ 13 - 0
server/ZoneScripts/IsleOfRefuge.lua

@@ -0,0 +1,13 @@
+--[[
+	Script Name		:	IsleOfRefuge.lua
+	Script Purpose	:	Handles Isle of Refuge events
+	Script Author	:	LethalEncounter
+	Script Date		:	9/06/2020
+	Script Notes	:	
+--]]
+
+function signal_changed(zone, player, signal)
+	if signal == "sys_client_avatar_ready" and HasQuest(player, 1) == false and HasCompletedQuest(player, 1) == false then
+		InstructionWindow(player, -1.0, "Garven Tralk can guide you on what to do next.", "voiceover/english/narrator/tutorial_island02/narrator_031_328946a9.mp3", 933085482, 646811402, "tutorial_stage_52", "", "continue")
+	end
+end