quest new_quest_lv52 begin   
    state start begin
		when login or levelup with pc.get_level() >= 52 begin -- Quest for level 52 and higher
			set_state(letterfromboss)
			pc.setqf("ghostsleft", 4)
		end
	end
	
	-- starts with a quest-letter send to the player
	state letterfromboss begin
		when letter begin
			-- this is the letter
			send_letter(gameforge.new_quest_lv52._010_send_letter)
		end
		when button or info begin
			-- finding out which map (map1) the player has to go to meet his or her first contact
			local map_lookup = { "Yongan", "Joan", "Pyongmoo" }
			local mapname = map_lookup[pc.get_empire()]
			say_title(gameforge.new_quest_lv52._020_say_title)
			say_reward(gameforge.new_quest_lv52._021_say_reward)
			say(string.format(gameforge.new_quest_lv52._022_say, mapname)) -- where Baek-Go can be found. See if-then-else argument above.
			set_state(askbeakgo)			
		end
		
		when enter begin
			if pc.getqf("ghostsleft") == 0 then
				pc.setqf("ghostsleft", 4)
			end
		end
	end
	
	-- This state if for the conversation with Baek-Go which the player is told to go in the letter above. 
	state askbeakgo begin
		-- This Function is for finding out if the player is in the right map so we can place the questarrow right.
		when login or enter begin
			send_letter(gameforge.new_quest_lv52._030_set_title)
			q.start() -- creating a journal entery int the quest-journal
			q.set_title(gameforge.new_quest_lv52._030_set_title) -- setting the title of the new quest-journal
			if is_destination_village(1) then -- 
				local position = find_npc_by_vnum(20018) -- Locate Baek-Go
				if position != 0 then
					target.vid("__TARGET__", position, gameforge.new_quest_lv52._035_target) -- place questarrow on Baek-Go
				end
			end
		end
		when button or info begin -- this event is triggered when the quest-journal is clicked. A conversation window will open.
			say_title(gameforge.new_quest_lv52._030_set_title)
			say(gameforge.new_quest_lv52._040_say)
			say("")
			say(string.format(gameforge.new_quest_lv52._043_say, get_map_name_by_number(1)))
		end
				
		when 20018.chat.gameforge.new_quest_lv52._030_set_title begin -- when Baek-Go is clicked this event is triggered
			target.delete("__TARGET__")
			say_title(gameforge.new_quest_lv52._044_say_title)
			say(gameforge.new_quest_lv52._041_say)
			q.done()
			local doquest = select(gameforge.new_quest_lv52._042_select, gameforge.subquest_12._50_select)
			if doquest ==1 then 
				set_state(askyuhwan)
			else
				say_title(gameforge.new_quest_lv52._044_say_title)
				say(gameforge.new_quest_lv52._046_say)
				return
			end
		end
		when 20355.chat.gameforge.new_quest_lv52._030_set_title begin -- If the player should click the Boss he or she will get a reaction from him even though it is not needed for the quest.
			say_title(gameforge.new_quest_lv52._054_say_title)
			say(gameforge.new_quest_lv52._042_say)
			local doquest = select(gameforge.new_quest_lv52._055_select, gameforge.subquest_12._50_select, gameforge.new_quest_lv75._290_2_select)
			if doquest ==1 then 
				say_title(gameforge.new_quest_lv52._054_say_title)
				say(gameforge.new_quest_lv52._056_say)
			elseif doquest == 3 then
				say(gameforge.subquest_06._60_say)
				local abortquest = select(gameforge.subquest_06._70_select, gameforge.subquest_06._80_select)
				if abortquest == 1 then
					pc.setqf("ghostsleft", 0)
					target.delete("__TARGET__")
					set_state(__GIVEUP__)
				else
					say_title(gameforge.new_quest_lv52._054_say_title)
					say(gameforge.subquest_11._80_say)
				end
				return
			else
				say_title(gameforge.new_quest_lv52._054_say_title)
				say(gameforge.new_quest_lv52._85_say)
			end
		end
	end
	
	-- This state is for the second npc to talk to - Yu-Hwan. The player is send to him by Baek-Go in the state above.
	state askyuhwan begin
		
        when login or enter begin
			send_letter(gameforge.new_quest_lv52._030_set_title)
			q.start() -- starting a new quest-journal since the player may logout or changing maps during this quest
			q.set_title(gameforge.new_quest_lv52._030_set_title) -- this is the tilte of the quest-journal
			if is_destination_village(2) then 
				local position = find_npc_by_vnum(20017) -- locating Yu-Hwan in map2...
				if position != 0 then
					target.vid("__TARGET2__", position, gameforge.new_quest_lv52._050_target) -- ...and placing a questarrow on him
				end
			end
		end
		when button or info begin -- this event is triggered when the player looks into the quest-journal to find out what to do
			local mapname

			-- the following text will appear in the conversation window when clicking the quest-journal of this quest
			say_title(gameforge.new_quest_lv52._030_set_title)
			say(gameforge.new_quest_lv52._051_say)
			say("")
			say(string.format(gameforge.new_quest_lv52._045_say, get_map_name_by_number(3)))
		end
		when 20017.chat.gameforge.new_quest_lv52._030_set_title begin -- event triggered when Yu-Hwan is clicked. A conversation window will appear.
			target.delete("__TARGET2__")
			say_title(gameforge.new_quest_lv52._049_say_title)
			say(gameforge.new_quest_lv52._052_say)
			say(gameforge.new_quest_lv52._053_say)
			q.done()
			set_state(gotoboss)
		end
		when 20355.chat.gameforge.new_quest_lv52._030_set_title begin -- It is not neccessary for the quest but the player may get the idea to talk to the Boss who is the quest-giver and will get a reaction from him.
			say_title(gameforge.new_quest_lv52._054_say_title)
			say_reward(gameforge.new_quest_lv52._055_say_reward)
			wait()
			say_pc_name()
			say_reward(gameforge.new_quest_lv52._056_say_reward)
		end
	end
	
	-- After talking to Yu-Hwan the player is send to the Boss and to this state. 
	state gotoboss begin
		-- again the player has to switch maps. To figure out if it is the right one we use this function again.
		when login or enter begin
			send_letter(gameforge.new_quest_lv52._030_set_title)
			q.start() -- we need a new quest-journal entery since the player may logout or change maps
			q.set_title(gameforge.new_quest_lv52._030_set_title)
			if is_destination_village(1) then -- 
				local position = find_npc_by_vnum(20355) -- locate the Boss in map1
				if position != 0 then
					target.vid("__TARGET3__", position, gameforge.new_quest_lv52._060_target) -- place questarrow on Boss
				end
			end
		end
		when button or info begin -- this event is triggered when the quest-journal is clicked - it will open a conversation window
            local map_lookup = { "Yongan", "Joan", "Pyongmoo" }
			local mapname = map_lookup[pc.get_empire()]
			say_title(gameforge.new_quest_lv52._030_set_title)
			say(string.format(gameforge.new_quest_lv52._061_say, mapname))
		end
		when 20355.chat.gameforge.new_quest_lv52._030_set_title begin -- when the boss is clicked a conversation starts
			target.delete("__TARGET3__")
			local MorF = pc.get_sex() -- here we find out the characters sex
			say_pc_name()
			say(gameforge.new_quest_lv52._062_say_reward )
			wait()
			say_title(gameforge.new_quest_lv52._054_say_title)
			if MorF == 0 then 
				say(gameforge.new_quest_lv52._063_say_reward) -- say this if character is male
			else
				say(gameforge.new_quest_lv52._064_say_reward) -- say this if character is female
			end
			say(gameforge.new_quest_lv52._065_say_reward)
			say(gameforge.new_quest_lv52._066_say_reward)
			wait()
			say_pc_name()
			say(gameforge.new_quest_lv52._067_say_reward)
			wait()
			say_title(gameforge.new_quest_lv52._054_say_title)
			say(gameforge.new_quest_lv52._068_say_reward)
			say(gameforge.new_quest_lv52._069_say_reward)
			wait()
			say_title(gameforge.new_quest_lv52._054_say_title)
			say(gameforge.new_quest_lv52._070_say_reward)
			wait()
			say_pc_name()
			say(gameforge.new_quest_lv52._071_say_reward)
			local answer = select(gameforge.new_quest_lv52._080_1_select, gameforge.new_quest_lv52._080_2_select, gameforge.new_quest_lv52._080_3_select) -- multiple choice answer
			if answer == 1 then -- positive answer: Doing it for the village
				say_pc_name()
				say(gameforge.new_quest_lv52._081_say_reward)
			elseif answer == 2 then -- positive answer: proving oneself
				say_pc_name()
				say(gameforge.new_quest_lv52._082_say_reward)
			elseif answer == 3 then -- negative answer
				say_pc_name()
				say(gameforge.new_quest_lv52._083_say_reward)
				wait()
				say_title(gameforge.new_quest_lv52._054_say_title)
				say(gameforge.new_quest_lv52._084_say_reward)
				wait()
				say_pc_name()
				local answertwo = select(gameforge.new_quest_lv52._090_1_select, gameforge.new_quest_lv52._090_2_select)
				if answertwo == 1 then -- think twice positive answer
					say_pc_name()
					say(gameforge.new_quest_lv52._091_say_reward)
				elseif answertwo == 2 then -- don't wanne do this quest answer 
					say_pc_name()
					say(gameforge.new_quest_lv52._092_say_reward )
					wait()
					say_title(gameforge.new_quest_lv52._054_say_title)
					say(gameforge.new_quest_lv52._093_say_reward) -- finishing quest
					say(string.format(gameforge.new_quest_lv52._093_say_reward_exp, 20000))
					say(string.format(gameforge.new_quest_lv52._093_say_reward_gold, 25000))
					pc.change_money(25000)
					pc.give_exp2(20000)
					q.done()
					pc.setqf("ghostsleft", 0)
					clear_letter()
					set_state(__GIVEUP__)
					return
				else
					notice_multiline(gameforge.new_quest_lv52._100_notice, notice)
				end
			end
			wait() -- continue positive conversation
			say_title(gameforge.new_quest_lv52._054_say_title)
			say(gameforge.new_quest_lv52._110_say_reward)
			say(gameforge.new_quest_lv52._111_say_reward)
			q.done()
			set_state(revenge)
		end
	end
	
	-- in this stae the fighting is done
	state revenge begin
	
		when enter begin
			if pc.getqf("ghostsleft") == 0 then
				pc.setqf("ghostsleft", 4)
			end
		end
	
		when login or enter begin
			new_quest_lv52_mob1 = 706
			new_quest_lv52_mob2 = 707
			new_quest_lv52_mob3 = 756
			new_quest_lv52_mob4 = 757
			new_quest_lv52_successMulti = 2
			new_quest_lv52_neededAmount = 4
			
			letterindex = new_quest_lv52_neededAmount - pc.getqf("ghostsleft")
			if letterindex == 0 then
				send_letter(gameforge.new_quest_lv52._030_set_title)
			elseif letterindex == 1 then 
				send_letter(gameforge.new_quest_lv52._170_send_letter)
			elseif letterindex == 2 then
				send_letter(gameforge.new_quest_lv52._171_send_letter)
			elseif letterindex == 3 then
				send_letter(gameforge.new_quest_lv52._172_send_letter)
			else
				send_letter(gameforge.new_quest_lv52._173_send_letter)
			end
			q.start()
			q.set_title(gameforge.new_quest_lv52._030_set_title)
		end
		when button or info begin
			local sayMob1Name = mob_name(706)
			local sayMob2Name = mob_name(707)
			local sayMob3Name = mob_name(756)
			local sayMob4Name = mob_name(757)
			say_title(gameforge.new_quest_lv52._120_set_title)
			
			letterindex = new_quest_lv52_neededAmount - pc.getqf("ghostsleft")
			-- these ate the answers which will appear in the quest-journal after every successful kill
			if letterindex == 1 then 
				say_reward(gameforge.new_quest_lv52._130_say_reward)
				say(gameforge.new_quest_lv52._131_say)
				say(gameforge.new_quest_lv52._132_say)
			elseif letterindex == 2 then
				say_reward(gameforge.new_quest_lv52._140_say_reward)
				say(gameforge.new_quest_lv52._141_say)
				say(gameforge.new_quest_lv52._132_say)
			elseif letterindex == 3 then
				say_reward(gameforge.new_quest_lv52._150_say_reward)
				say(gameforge.new_quest_lv52._151_say)
				say(gameforge.new_quest_lv52._132_say)
			elseif letterindex == 4 then

			else
				-- this quest-journal entery is shown befor the first mob is killed
				say(gameforge.new_quest_lv52._160_say)
				say(gameforge.new_quest_lv52._161_say)
				say("")
				say(string.format(gameforge.new_quest_lv52._162_say,get_map_name_by_number(64)))
			end
		end	
		when 706.kill or 707.kill or 756.kill or 757.kill begin -- Mob1 - Mob4
			local minimum_y = 671 -- this is the minumum Y value
			local value_y = pc.get_local_y() - minimum_y
			-- this if-then-else construct controls if the the killed mob can be counted as a valid kill
			if pc.get_local_y() >= 671 and pc.get_local_y() <= 906 then 
				if pc.get_local_x() >= 603 and pc.get_local_x() < 778 then -- handles west side of the tower
					local minimum_x = 603
					local value_x = value_y*35/47 -- calculation of slope triangle
					if pc.get_local_x() >= value_x + minimum_x then 
						if pc.getqf("ghostsleft") > 0 then
							local successProb = pc.getqf("ghostsleft")*new_quest_lv52_successMulti
							if math.random(1,100) < successProb then 
								local index = pc.getqf("ghostsleft") -1
								pc.setqf("ghostsleft", index) -- one ghost less to be freed
								if index == 3 then 
									letterindex = 1
									send_letter(gameforge.new_quest_lv52._170_send_letter)
									q.set_title(gameforge.new_quest_lv52._030_set_title)
								elseif index == 2 then
									letterindex = 2
									send_letter(gameforge.new_quest_lv52._171_send_letter)
									q.set_title(gameforge.new_quest_lv52._030_set_title)
								elseif index == 1 then
									letterindex = 3
									send_letter(gameforge.new_quest_lv52._172_send_letter)
									q.set_title(gameforge.new_quest_lv52._030_set_title)
								elseif index == 0 then
									if pc.get_job() == 0 then -- class sensitive reward
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", 50403)
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", number(50416, 50420))
										else 
											pc.setqf("lv52reward", 50300)
										end
									elseif pc.get_job() == 1 then
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", number(50431, 50435))
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", 50449)
										else 
											pc.setqf("lv52reward", 50301)
										end
									elseif pc.get_job() == 2 then
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", 50464)
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", number(50476, 50481))
										else 
											pc.setqf("lv52reward", 50302)
										end
									elseif pc.get_job() == 3 then
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", number(50491, 50496))
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", 50509)
										else 
											pc.setqf("lv52reward", 50303)
										end
									else
										pc.setqf("lv52reward", 1)
									end
									q.done()
									set_state(backhome)
								else
									notice("There is something wrong with the questflag!") -- to be deleted after testing
								end
							else
		--						notice("Pech gehabt, nix passiert!") -- to be deleted after testing
							end
						else
--							notice("You already freed all the ghosts!") -- to be deleted after testing
						end
					else 
--						notice("This one does not count!") -- to be deleted after testing
					end
				elseif pc.get_local_x() >= 778 and pc.get_local_x() <= 906 then -- handles east side of the tower
					local maximum_x = 906
					local value_x = value_y*128/235 -- calculation of slope triangle
					if pc.get_local_x() <= maximum_x - value_x then
--						notice("This one may count!") -- to be deleted after testing
						if pc.getqf("ghostsleft") > 0 then
							local successProb = pc.getqf("ghostsleft")*new_quest_lv52_successMulti
							if math.random(1,100) < successProb then 
								local index = pc.getqf("ghostsleft") -1
								pc.setqf("ghostsleft", index) -- one ghost less to be freed
								if index == 3 then 
									letterindex = 1
									send_letter(gameforge.new_quest_lv52._170_send_letter)
									q.set_title(gameforge.new_quest_lv52._030_set_title)
								elseif index == 2 then
									letterindex = 2
									send_letter(gameforge.new_quest_lv52._171_send_letter)
									q.set_title(gameforge.new_quest_lv52._030_set_title)
								elseif index == 1 then
									letterindex = 3
									send_letter(gameforge.new_quest_lv52._172_send_letter)
									q.set_title(gameforge.new_quest_lv52._030_set_title)
								elseif index == 0 then
									if pc.get_job() == 0 then -- class sensitive reward
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", number(50401, 50405))
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", 50418)
										else 
											pc.setqf("lv52reward", 70037)
										end
									elseif pc.get_job() == 1 then
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", 50434)
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", number(50446, 50450))
										else 
											pc.setqf("lv52reward", 70037)
										end
									elseif pc.get_job() == 2 then
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", number(50461, 50466))
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", 50479)
										else 
											pc.setqf("lv52reward", 70037)
										end
									elseif pc.get_job() == 3 then
										if pc.get_skill_group() == 1 then
											pc.setqf("lv52reward", 50495)
										elseif pc.get_skill_group() == 2 then
											pc.setqf("lv52reward", number(50506, 50511))
										else 
											pc.setqf("lv52reward", 70037)
										end
									else
										pc.setqf("lv52reward", 1)
									end
									q.done()
									set_state(backhome)
								else
	--								notice("There is something wrong with the questflag!") -- to be deleted after testing
								end
							else
--								notice("Pech gehabt, nix passiert!") -- to be deleted after testing
							end
						else
--							notice("You already freed all the ghosts!") -- to be deleted after testing
						end
					else 
--						notice("This one does not count!") -- to be deleted after testing
					end
				end
			end
		end
	end
	
	-- when the killing is done we go back to the boss
	state backhome begin
		when login or enter begin 
			send_letter(gameforge.new_quest_lv52._030_set_title)
			q.start()
			q.set_title(gameforge.new_quest_lv52._030_set_title)
			if is_destination_village(1) then -- 
				local position = find_npc_by_vnum(20355) -- Boss
				if position != 0 then
					target.vid("__TARGET4__", position, gameforge.new_quest_lv52._060_target) -- place questarrow on Boss
				end
			end
		end
		when button or info begin -- here the last letter from the boss is handled
			say_title(gameforge.new_quest_lv52._010_send_letter)
			say_reward(gameforge.new_quest_lv52._180_say_reward)
			local reward = pc.getqf("lv52reward")
			say(string.format(gameforge.new_quest_lv52._181_say, item_name(reward)))
			 --EDIT Arne 24Sept09, Reason: Did not fit in UI
			say(string.format(gameforge.new_quest_lv52._182_say, get_map_name_by_number(1)))
		end
		when 20355.chat.gameforge.new_quest_lv52._030_set_title begin -- when the boss is clicked
			target.delete("__TARGET4__")
			say_title(gameforge.new_quest_lv52._054_say_title)
			local MorF = pc.get_sex() -- is the character male of female
			local isvalid = pc.getqf("ghostsleft")
			if isvalid == 0 then 
				local reward = pc.getqf("lv52reward")
				say(string.format(gameforge.new_quest_lv52._183_say_reward, item_name(reward)))
				say(gameforge.new_quest_lv52._184_say_reward)
				if MorF == 0 then
					say(gameforge.new_quest_lv52._185_say_reward) -- if character is male
				else
					say(gameforge.new_quest_lv52._186_say_reward) -- if character is female
				end
				pc.change_money(270000)
				pc.give_exp2(3300000)
				pc.give_item2(reward)
				pc.setqf("lv52reward", 0)
			else
				notice("Questflag got manipulated! You shouldn't be here!!!") -- if the player cheated
			end
			q.done()
			clear_letter()
			set_state(__COMPLETE__)
		end
	end
	
	------  give up ------------------------------------------------------------------------------------------------------
	state __GIVEUP__ begin
	end
	------  complete ------------------------------------------------------------------------------------------------------
	state __COMPLETE__ begin
	end
end