--[[
[author]
class=1
attr=1
descript=ɱĽݲʱĬϲλ,Զ̽ɫɱׯʱѡӲ
chk0str=Ӳׯ
-- 1,С 2,Ľݲλ
]]--

script_name="ɽ"
local nSetNoFight = 0
local l_param_0 = 0
local nFubenMapId = 0x236

local l_boss = {
	["ެɮͷ"] = INVALID_ID ,
	["ެɮ"] = INVALID_ID ,
	["ɮִ"] = INVALID_ID ,
	["ެɮ"] = INVALID_ID ,

	["ͽ"] = INVALID_ID ,
	["Ħ"] = INVALID_ID ,

	["ׯ"] = INVALID_ID ,
	[""] = INVALID_ID ,
	["˿"] = INVALID_ID ,
	
	["޵"] = INVALID_ID ,
	["Ľݸ"] = INVALID_ID ,
	[""] = INVALID_ID ,
	["ʽ"] = INVALID_ID ,

	[""] = INVALID_ID ,
	["Ѫ׹"] = INVALID_ID ,
	["Ա"] = INVALID_ID ,
	[""] = INVALID_ID ,

	["Զɽ"] = INVALID_ID ,
	["Ľݲ"] = INVALID_ID ,
	[""] = INVALID_ID ,
	["ɫħ"] = INVALID_ID ,
	["Ħ_Զɽ"] = INVALID_ID ,
	["Ħ_Ľݲ"] = INVALID_ID ,
	[""] = INVALID_ID ,
	[""] = INVALID_ID ,
	["Ľݲ_ֵ˺"] = INVALID_ID ,
	["ǧ"] = INVALID_ID  ,
	["ħ"] = INVALID_ID ,

	["ĦNPC"] = INVALID_ID ,
	["ׯNPC"] = INVALID_ID ,
	["ĽݸNPC"] = INVALID_ID ,
	["NPC"] = INVALID_ID ,
	["ԶɽNPC"] = INVALID_ID ,
	["ĽݲNPC"] = INVALID_ID ,
	["ɨɮNPC"] = INVALID_ID ,
}


function reset_sss()
	g_step_sss = 0
	g_state_sss = {}
	g_state_sss["Ħ"] = {met=0,die=0}
	g_state_sss["ׯ"] = {met=0,die=0}
	g_state_sss["Ľݸ"] = {met=0,die=0}
	g_state_sss[""] = {met=0,die=0}
	g_state_sss["Ľݲ"] = {met=0,die=0}
end

if g_state_sss == nil then
	reset_sss()
end

if g_step_sss == nil then
	g_step_sss = 1
end

local l_dcq_zb = {
	[0] = {x=118,y=116,count=0} ,
	[1] = {x=142,y=116,count=0} , 
	[2] = {x=118,y=140,count=0} , 
	[3] = {x=142,y=140,count=0} 
}

function ResetBoss()

	l_boss["ެɮͷ"] = INVALID_ID 
	l_boss["ެɮ"] = INVALID_ID 
	l_boss["ɮִ"] = INVALID_ID 
	l_boss["ެɮ"] = INVALID_ID 

	l_boss["ͽ"] = INVALID_ID 
	l_boss["Ħ"] = INVALID_ID 

	l_boss["ׯ"] = INVALID_ID 
	l_boss[""] = INVALID_ID 
	l_boss["˿"] = INVALID_ID
	
	l_boss["޵"] = INVALID_ID 
	l_boss["Ľݸ"] = INVALID_ID 
	l_boss[""] = INVALID_ID
	l_boss["ʽ"] = INVALID_ID

	l_boss[""] = INVALID_ID 
	l_boss["Ѫ׹"] = INVALID_ID 
	l_boss["Ա"] = INVALID_ID
	l_boss[""] = INVALID_ID

	l_boss["Զɽ"] = INVALID_ID 
	l_boss["Ľݲ"] = INVALID_ID 
	l_boss[""] = INVALID_ID 
	l_boss["ɫħ"] = INVALID_ID 
	l_boss["Ħ_Զɽ"] = INVALID_ID 
	l_boss["Ħ_Ľݲ"] = INVALID_ID 
	l_boss[""] = INVALID_ID
	l_boss[""] = INVALID_ID 
	l_boss["ǧ"] = INVALID_ID 
	l_boss["ħ"] = INVALID_ID 

	l_boss["ĦNPC"] = INVALID_ID 
	l_boss["ׯNPC"] = INVALID_ID 
	l_boss["ĽݸNPC"] = INVALID_ID 
	l_boss["NPC"] = INVALID_ID 
	l_boss["ԶɽNPC"] = INVALID_ID 
	l_boss["ĽݲNPC"] = INVALID_ID 
	l_boss["ɨɮNPC"] = INVALID_ID 
end

function DoTeamFollow( act )
	if act == true then
		if GetMount() == INVALID_ID then
			DoMount(true)
			System:Sleep(1000)
		end

		if DataPool:IsTeamLeader() == true then
			Player:EnableTeamFollow( true )
		end
	else
		if DataPool:IsTeamLeader() == true then
			Player:EnableTeamFollow( false )
		end
	end
end

function GetNearestPointFromList( vListPoint )
	local myX,myY = Player:GetPos()
	local tmp_dis = 9999999
	local result
	for i,v in pairs(vListPoint) do 
		local new_dis = GetDistSq(myX,myY , v.x , v.y )
		if new_dis <= tmp_dis then
			result = i
			tmp_dis = new_dis
		end
	end
	return tonumber(result)
end

function GetFarthestPointFromList( vListPoint )
	local myX,myY = Player:GetPos()
	local tmp_dis = 0
	local result
	for i,v in pairs(vListPoint) do 
		local new_dis = GetDistSq(myX,myY , v.x , v.y )
		if new_dis > tmp_dis then
			result = i
			tmp_dis = new_dis
		end
	end
	return tonumber(result)
end

function _callback_kill(fX, fY, nScene)

	--¸npc жԻ
	local result , param = UpdateData()
	if result == nil or result == process_npc_t then
		return true 
	end

	if DataPool:IsTeamLeader() == false and Player:GetData("TEAMFOLLOW") > 0 then
		--Ӹ״̬,,öӳ
		return false 
	end

	return false

end

function _callback(fX, fY, nScene)

	--¸npc жԻ
	local result , param = UpdateData()
	if result == nil or result == process_npc_t then
		return true 
	end

	if DataPool:IsTeamLeader() == false and Player:GetData("TEAMFOLLOW") > 0 then
		--Ӹ״̬
		Player:EnableTeamFollow(false) ;
	end

	return false
end


function do_except( msg )
	ShowMessage("ű %s" , tostring(msg))
end

function UpdateData()

	ResetBoss()
	local bRangeAttack = Player:IsRangeAttack()
	local tmp_mrb_zx = 9999
	local tmp_xys_zx = 9999
	local xNow, yNow = Player:GetPos()

	for i,v in pairs(l_dcq_zb) do
		v.count = 0 
	end

	if IsFuben() == false then
		local isNext,szMsg = GetDebugMessage()
		while isNext == 1 do
		isNext,szMsg = GetDebugMessage()
		end
		return do_except , "뿪"
	end

	local n = EnumObject(true)

	local nBossCount = 0

	for i=0, n - 1 do
		local idObj, classObj, nameObj, xObj, yObj,sTitle,model,angle = EnumObject(false, i)
		if idObj == INVALID_ID then
			continue
		end
		
		if classObj == "MON" then
			if nameObj == "ެɮͷ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "ެɮ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "ɮִ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "ެɮ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "ͽ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "Ħ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				else
					g_state_sss[nameObj].die = 1
				end
			elseif nameObj == "ׯ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				else
					g_state_sss[nameObj].die = 1
				end
			elseif nameObj == "" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "޵" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "Ľݸ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				else
					g_state_sss[nameObj].die = 1
				end
			elseif nameObj == "" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				else
					g_state_sss[nameObj].die = 1
				end
			elseif nameObj == "Ѫ׹" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "Զɽ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "Ľݲ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				else
					g_state_sss[nameObj].die = 1
				end
			elseif nameObj == "ɫħ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "ħ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "Ħ" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end
			elseif nameObj == "" then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				end					
			end
		elseif classObj == "NPC" then
			if nameObj == "Ħ" then
				l_boss["ĦNPC"] = idObj
				g_state_sss[nameObj].met = 1
			elseif nameObj == "ׯ" then
				l_boss["ׯNPC"] = idObj
				g_state_sss[nameObj].met = 1
			elseif nameObj == "Ľݸ" then
				l_boss["ĽݸNPC"] = idObj
				g_state_sss[nameObj].met = 1
			elseif nameObj == "" then
				l_boss["NPC"] = idObj
				g_state_sss[nameObj].met = 1
			elseif nameObj == "Ľݲ" then
				l_boss["ĽݲNPC"] = idObj
				g_state_sss[nameObj].met = 1
			elseif nameObj == "Զɽ" then
				l_boss["ԶɽNPC"] = idObj
				g_state_sss["Ľݲ"].met = 1
			elseif nameObj == "ɨɮ" then
				l_boss["ɨɮNPC"] = idObj
				g_state_sss["Ľݲ"].met = 1
			elseif nameObj == "Ħ" then
				if string.find(sTitle,"Ľݲ") then
					local new_dis = GetDistSq( xNow,yNow ,xObj ,yObj )
					if new_dis < tmp_mrb_zx or l_boss["Ħ_Ľݲ"] == INVALID_ID then
						l_boss["Ħ_Ľݲ"] = idObj 
						tmp_mrb_zx = new_dis
					end						
				elseif string.find(sTitle,"Զɽ") then
					local new_dis = GetDistSq( xNow,yNow ,xObj ,yObj )
					if new_dis < tmp_xys_zx or l_boss["Ħ_Զɽ"] == INVALID_ID then
						l_boss["Ħ_Զɽ"] = idObj 
						tmp_xys_zx = new_dis
					end
				end
			end
		elseif classObj == "SPECIAL" then
			if string.find( nameObj , "˿" ) then
				if bRangeAttack then
					if model >= 0x411 and model <= 0x415 then
						--boss__ը
						l_boss["˿"] = idObj
						AI:SetAdv("в" , idObj , 4 , "˿")
					elseif model >= 0x41b and model <= 0x41f then
						--boss__ը
						l_boss["˿"] = idObj
						AI:SetAdv("в" , idObj , 4 , "˿")
					end
				end
			elseif nameObj == "ʽ" then
				if bRangeAttack then
					AI:SetAdv("в" , idObj , 4 , "ʽ")
				end
			elseif string.find( nameObj , "" ) then
				l_boss[""] = idObj
				AI:SetAdv("в" , idObj , 15 , "")
			elseif string.find( nameObj , "" ) then
				l_boss[""] = idObj
				AI:SetAdv("в" , idObj , 15 , "")
			elseif string.find( nameObj , "˭" ) then
				l_boss[""] = idObj
				AI:SetAdv("в" , idObj , 15 , "")
			elseif nameObj == "ԶɽĽݲЧ" then
				g_state_sss["Ľݲ"].die = 1
			end
		elseif classObj == "PLAYER" then
			if CheckBufferByName( idObj , "") ~= INVALID_ID then
				l_boss[""] = idObj
			elseif CheckBufferByName( idObj , "Ա") ~= INVALID_ID then
				l_boss["Ա"] = idObj
			elseif CheckBufferByName( idObj , "") ~= INVALID_ID then
				l_boss[""] = idObj
			elseif CheckBufferByName( idObj , "ǧ") ~= INVALID_ID then
				l_boss["ǧ"] = idObj
				AI:SetAdv("в" , idObj , 10 , "ǧ")
			end

			for i,v in pairs(l_dcq_zb) do
				if GetDist(xObj,yObj,v.x,v.y) < 10 then
					v.count = v.count + 1
				end
			end
		end
	end

	--״̬
	if Player:GetBuffByName("" , 1) ~= INVALID_ID then
		l_boss[""] = Player:GetData("ID")
	end

	if Player:GetBuffByName("Ա" , 1 ) ~= INVALID_ID then
		l_boss["Ա"] = Player:GetData("ID")
	end

	if Player:GetBuffByName("" , 1 ) ~= INVALID_ID then
		l_boss[""] = Player:GetData("ID")
	end

	local isNext,szMsg = GetDebugMessage()
	while isNext == 1 do
		if szMsg ~= nil then
			if string.find(szMsg ,"ĦѰ") then
				g_step_sss = 1
				g_state_sss["Ħ"].die = 1
			elseif string.find(szMsg , "Զɽͷŷ") then
				UpdateMsg("quest_sss_ftmd")
			elseif string.find(szMsg , "#{SSS_ZJ_120109_60") then
				local _,_,name = string.find( szMsg , "#{SSS_ZJ_120109_60.+\042.(.+)}")
				if name ~= nil then
					local sName = tostring(name)
					if string.len( sName ) > 0 then
						--findobject
						ShowMessage("Ҫֵ˺ %s" , tostring(sName))
						if sName == Player:GetData("NAME") then
							l_boss["Ľݲ_ֵ˺"] = Player:GetData("ID")
						else
							l_boss["Ľݲ_ֵ˺"] = FindObjectByName( sName , "" )
						end
						if l_boss["Ľݲ_ֵ˺"] ~= INVALID_ID then
							UpdateMsg("quest_sss_mrbfdsh")
						end
					end
				end
			elseif string.find(szMsg ,"ׯѰ") then
				g_step_sss = 2
				g_state_sss["ׯ"].die = 1
			elseif string.find(szMsg ,"ĽݸѰ") then
				g_step_sss = 3
				g_state_sss["Ľݸ"].die = 1
			elseif string.find(szMsg ,"Ľݲ") then
				UpdateMsg("quest_sss_step5_wait")
			end
		end
		isNext,szMsg = GetDebugMessage()
	end

-- step: 1,ɱɮ 2,Ħ 3,ׯ 4,ɱޱ 5,Ľݸ 6,ޱ 7, 8,Զɽ
	if l_boss["ެɮͷ"] ~= INVALID_ID or l_boss["ެɮ"] ~= INVALID_ID or l_boss["ɮִ"] ~= INVALID_ID or l_boss["ެɮ"] ~= INVALID_ID then
		return process_jmz_p , 0 
	elseif l_boss["ͽ"] ~= INVALID_ID or l_boss["Ħ"] ~= INVALID_ID then
		return process_boss_kill , 1
	elseif l_boss["ׯ"] ~= INVALID_ID or l_boss[""] ~= INVALID_ID then
		return process_boss_kill , 2
	elseif l_boss["Ľݸ"] ~= INVALID_ID then
		return process_boss_kill , 3
	elseif l_boss[""] ~= INVALID_ID then 
		return process_boss_kill , 4
	elseif l_boss["Զɽ"] ~= INVALID_ID or l_boss["Ľݲ"] ~= INVALID_ID or l_boss["ɫħ"] ~= INVALID_ID or l_boss["Ħ_Զɽ"] ~= INVALID_ID or l_boss["Ħ_Ľݲ"] ~= INVALID_ID or l_boss["ħ"] ~= INVALID_ID then
		return process_boss_kill , 5
	elseif IsMsgCold("quest_sss_step5_wait" , 8000 ) == false then
		return process_boss_kill , 5
	elseif g_state_sss["Ľݲ"].die == 1 and l_boss["ɨɮNPC"] ~= INVALID_ID then
		return process_exit , ""
	elseif l_boss["NPC"] ~= INVALID_ID then
		return process_npc_t , ""
	elseif l_boss["ĽݸNPC"] ~= INVALID_ID then
		return process_npc_t , "Ľݸ"
	elseif l_boss["ׯNPC"] ~= INVALID_ID then
		return process_npc_t , "ׯ"
	elseif l_boss["ĦNPC"] ~= INVALID_ID then
		return process_npc_t , "Ħ"
	elseif l_boss["ɨɮNPC"] ~= INVALID_ID then
		return process_npc_t , "ɨɮ"
	elseif IsMsgCold("quest_sss_step5_wait" , 8000 ) == false then
		return process_boss_kill , 5
	elseif l_boss["ԶɽNPC"] ~= INVALID_ID and l_boss["ĽݲNPC"] ~= INVALID_ID then
		local id1,x1,y1 = FindObjectByID( l_boss["ԶɽNPC"] , "NPC")
		local id2,x2,y2 = FindObjectByID( l_boss["ĽݲNPC"] , "NPC")
		if id1 ~= INVALID_ID and GetDist(119,46,x1,y1) < 3 and id2 ~= INVALID_ID and GetDist(125,46,x2,y2) < 3 then
			PushDebugMessage("ȴɱħ..." , 1)
			return process_boss_kill , 5
		end
	end

	return nil , ""
end

function process_mrf_p()
	--Ľݸ,δĽݸʱ,ׯʹߵĽݸҪָ·,Ҫɱ޵ 57,94 76,88 133,86 167,86
	local v_road = { [0] = {x=57,y=94} , [1] = {x=76,y=88} , [2] = {x=133,y=86} , [3] = {x=167,y=86} }
	local v_begin = GetNearestPointFromList( v_road ) 
	if v_begin == nil then
		v_begin = 0 
	end

	DoTeamFollow(true)

	for i = v_begin , 3 do
		local result , param = UpdateData()
		if result ~= nil and result ~= process_npc_t then
			return
		end

		MoveTo( v_road[i].x , v_road[i].y , nFubenMapId , "" , 2 , true , _callback_kill )
	end

	DoTeamFollow(false)

	--ΧС
	AI:SetAI("ɱ")
	AI:SetParameter("ʼ")
	AI:Start(true)

	while true do

		System:Sleep(500)

		local result , param = UpdateData()
		if result ~= nil and result ~= process_npc_t then
			break
		end

		if FindObjectByName( "޵" , "" ) == INVALID_ID and FindObjectByName( "ͽ" , "" ) == INVALID_ID then 
			break 
		end
	end

	AI:Stop()

	local result , param = UpdateData()
	if result == nil or result == process_npc_t then
		MoveTo( 195 , 87 , nFubenMapId , "" , 2 , true , _callback )
	end
end


function process_dcq_p()
	--,δĽݸʱ,ָ·
	local v_road = { [0] = {x=198,y=91} , [1] = {x=210,y=106} , [2] = {x=211,y=138} , [3] = {x=226,y=162} , [4] = {x=211,y=168} , [5] = {x=162,y=137} , [6] = {x=132,y=129} }
	local v_begin = GetNearestPointFromList( v_road ) 
	if v_begin == nil then
		v_begin = 0 
	end

	DoTeamFollow(true)	

	for i = v_begin , 6 do
		local result , param = UpdateData()
		if result ~= nil and result ~= process_npc_t then
			return
		end

		MoveTo( v_road[i].x , v_road[i].y , nFubenMapId , "" , 2 , true , _callback_kill )
	end

	DoTeamFollow(false)

	--ΧС
	AI:SetAI("ɱ")
	AI:SetParameter("ʼ")
	AI:Start(true)

	while true do

		System:Sleep(500)

		local result , param = UpdateData()
		if result ~= nil and result ~= process_npc_t then
			break
		end

		if FindObjectByName( "޵" , "" ) == INVALID_ID and FindObjectByName( "ͽ" , "" ) == INVALID_ID then 
			break 
		end
	end

	AI:Stop()

	local result , param = UpdateData()
	if result == nil or result == process_npc_t then
		MoveTo( 130 , 122 , nFubenMapId , "" , 2 , true , _callback )
	end
end

function process_jmz_p()

	--õǰ
	local pos , menpai = GetTeamStandPos()

	--ڶλã趨3꣬ѯ1Σɱܱй
	AI:SetAI("ɱ")
	AI:SetParameter("ʼ")
	AI:SetParameter("ʰȡ", 1)
	AI:SetParameter("ͼ", nFubenMapId )
	if 1 == pos then
		AI:SetParameter("", "", 141 , 206 )
		AI:SetParameter("", "", 141 , 191 )  
		AI:SetParameter("", "", 141 , 178 ) 
	elseif 2 == pos then
		AI:SetParameter("", "", 117 , 206 )
		AI:SetParameter("", "", 117 , 191 )  
		AI:SetParameter("", "", 117 , 178 ) 
	else
		AI:SetParameter("", "", 129 , 206 )
		AI:SetParameter("", "", 129 , 191 )  
		AI:SetParameter("", "", 129 , 178 ) 
	end

	AI:StartEx(0)

	AI:SetParameter("в" ,"", 1 )
	AI:SetParameter("в" , "ɱѭ")
	AI:SetParameter("в" , "ֻʰȡBOSS" , 1)


	local result = nil
	local r_param = ""

	AI:StartEx(1)

	while true do 

		System:Sleep(500)

		if AI:IsStop() == true then
			break
		end

		result , r_param = UpdateData()
		if result ~= process_jmz_p then
			--
			break 
		end

		local nRound = AI:GetParameter("ɱѭ")

		if nRound > 0 then
			if l_boss["ĦNPC"] ~= INVALID_ID then
				--
				result = process_npc_t
				r_param = "Ħ"
				break
			else
				ShowMessage("clean ss")
				--Ѿɱ,ȴδboss
				return do_except , "СֵδBOSS"
			end
		end
	end

	AI:Stop()

	return result , r_param
end

function process_exit()
	MoveToNPC(121 , 32 , nFubenMapId ,"ɨɮ" )
	Dismount()

	System:Sleep(500)
	if FindQuestFrameOption( "뿪" , CMP_PART_MATCH) == true then
		QuestFrameOptionClicked( "뿪" , CMP_FULL_MATCH)
		System:Sleep(1000)
		DoLuaString("MessageBox_Self_Env" , "MessageBox_Self_OK_Clicked()")
		DoLuaString("MessageBox_Self_Env" , "MessageBox_Self_Cancel_Clicked(0)")
	end
end

function process_npc_t( p_npc )

	local l_npc = {
		["Ħ"] = {x=130,y=173,qs="ս",next=nil} ,
		["ׯ"] = {x=72,y=120,qs="ս",next=nil} ,
		["Ľݸ"] = {x=195,y=87,qs="ս",next=nil} ,
		[""] = {x=131,y=125,qs="ս",next=nil} ,
		["ɨɮ"] = {x=135,y=38,qs="ʱӦս",next=nil} 	--뿪 x=121,y=32
	}

	if l_npc[p_npc] == nil then
		ShowMessage("process_npc_t  %s !" , tostring(p_npc))
		return do_except , ""
	end

	local s_npc = p_npc.."NPC" 

	while true do 

		System:Sleep(500)

		local result , v_npc = UpdateData()
		if result ~= nil then
			if result ~= process_npc_t then
				--Ҫ
				return result , v_npc
			else
				if v_npc ~= p_npc then
					--Իnpc
					return result , v_npc 
				end
			end
		end

		if l_boss[s_npc] == INVALID_ID then
			if IsDestination( l_npc[p_npc].x , l_npc[p_npc].y , nFubenMapId  , 3 ) == true  then
				if IsMsgCold( "WaitForBoss" , 5000 ) then
					return do_except , "bossδ,Ҫ䴦"
				else
					PushDebugMessage( "ȴBoss..." , 1 )
				end
			else
				--Ľݸ,δĽݸʱ,ׯʹߵĽݸҪָ·,Ҫɱ޵
				if p_npc == "Ľݸ" then
					if g_step_sss < 3 then
						--δĽݸ
						--блȡ
						process_mrf_p()
					else
						DoTeamFollow(true)
						MoveTo( l_npc[p_npc].x , l_npc[p_npc].y , nFubenMapId , "" , 2 , true , _callback )
					end
				elseif p_npc == "" then
					if g_step_sss < 4 then
						--δ
						process_dcq_p()
					end
				elseif p_npc == "ɨɮ" then
					--鿴ΧǷֵ ,Ի
					local v_id,v_x,v_y = FindObjectByName("ֵ" , "NPC")
					if g_step_sss < 5 and v_id ~= INVALID_ID and GetDist( v_x , v_y , 130 , 123 ) < 5 then
						DoTeamFollow(false)
						MoveToNPC( v_x , v_y , nFubenMapId , "ֵ")
						QuestFrameOptionClicked( "Ըһͬǰؾ" , CMP_FULL_MATCH )
					else
						DoTeamFollow(true)

						MoveTo( l_npc[p_npc].x , l_npc[p_npc].y , nFubenMapId , "" , 2 , true , _callback )
					end
				else
					DoTeamFollow(true)

					MoveTo( l_npc[p_npc].x , l_npc[p_npc].y , nFubenMapId , "" , 2 , true , _callback )
				end
				UpdateMsg("WaitForBoss")
			end
		else
			MoveToNPC( l_npc[p_npc].x , l_npc[p_npc].y , nFubenMapId , p_npc )
			DoTeamFollow(false)
			Dismount()
			
			System:Sleep(500)
			if FindQuestFrameOption(l_npc[p_npc].qs , CMP_PART_MATCH) == true then
				QuestFrameOptionClicked( l_npc[p_npc].qs , CMP_FULL_MATCH)
				System:Sleep(1000)
				DoLuaString("MessageBox_Self_Env" , "MessageBox_Self_OK_Clicked()")
				DoLuaString("MessageBox_Self_Env" , "MessageBox_Self_Cancel_Clicked(0)")
			end
			UpdateMsg("WaitForBoss")
		end
	end

	return do_except , "δԤϵķ"
end

function process_boss_kill( p_step )

	g_step_sss = p_step
	SetEvent( "EVENT_PICKUP" , 0 )
	UpdateMsg("Quest_SSS_Begin")

	local bRangeAttack = Player:IsRangeAttack()
	local pos , menpai = GetTeamStandPos()
	if pos < 0 then
		pos = 0
	end

	AI:SetAdv( "" )

	if p_step == 1 then
		AI:SetAdv( "ս" ,  117 , 164 , 146 , 165 )
		AI:SetAdv( "ս" ,  146 , 165, 145  , 180 )
		AI:SetAdv( "ս" ,  145  , 180, 115  ,180 )
		AI:SetAdv( "ս" ,  115  ,180 , 117 , 164 )
		if pos == 1 then
			AI:SetAdv( "Ȧ" , 130 , 166 , 15 )
		elseif pos == 2 then
			AI:SetAdv( "Ȧ" , 123 , 167 , 15 )
		elseif pos == 3 then
			AI:SetAdv( "Ȧ" , 137 , 168 , 15 )
		else
			AI:SetAdv( "Ȧ" , 130 , 170 , 15 )
		end
	elseif p_step == 2 then
		AI:SetAdv( "ս" ,  80 , 108 , 80 , 135 )
		AI:SetAdv( "ս" ,  80 , 135, 57 , 139 )
		AI:SetAdv( "ս" ,  57 , 139 , 51  ,109 )
		AI:SetAdv( "ս" ,  51  ,109 , 80 , 108 )
		AI:SetAdv( "Ȧ" , 72 , 120 , 15 )
	elseif p_step == 3 then
		AI:SetAdv( "ս" , 182 ,  79 , 212 , 79 )
		AI:SetAdv( "ս" , 212 ,  79 , 212 , 103 )
		AI:SetAdv( "ս" , 212 , 103 , 182 , 103 )
		AI:SetAdv( "ս" , 182 , 103 , 182 ,  79 )
		AI:SetAdv( "Ȧ" , 193 , 86 , 15 )
	elseif p_step == 4 then
		AI:SetAdv( "ս" , 107 , 113 , 155 , 113 )
		AI:SetAdv( "ս" , 155 , 113 , 154 , 144 )
		AI:SetAdv( "ս" , 154 , 144 , 107 , 144 )
		AI:SetAdv( "ս" , 107 , 144 , 107 , 113 )
		AI:SetAdv( "Ȧ" , 129 , 129 , 15 )
	elseif p_step == 5 then
		AI:SetAdv( "ս" , 137 ,  36 , 103 , 36 )
		AI:SetAdv( "ս" , 103 ,  36 , 103 , 58 )
		AI:SetAdv( "ս" , 103 ,  58 , 137 , 58 )
		AI:SetAdv( "ս" , 137 ,  58 , 137 ,  36 )
		AI:SetAdv( "Ȧ" , 126 ,  42 , 15 )
	end

	AI:SetAI("߼ս") 
	AI:SetParameter("ͼ" , nFubenMapId ) 
	--AI:Start()
	AI:StartEx(0)

	if nSetNoFight > 0 then
		AI:SetParameter("в" ,"", 0 )
		AI:SetParameter("в" ,"ɱ", 0 )
		AI:SetParameter("в" ,"Ӹ", 1)
		AI:SetParameter("в" ,"", 0)
		AI:SetParameter("в" ,"ֹͣ", 1)
	end

	AI:StartEx(1)

	local result = nil
	local r_param
	--ĦѰ

	local pre_teamfollow = false

	while true do 

		local bPickUp = 1
		local bKillMonster = 1
		local bYinGuai = 0
		local bTeamFollow = 0 
		local bTeamAttack = 0 
		local bStopAssistSelf = 0 
		local bStopAssist = 0
		local bStopSpecialAttack = 0 
		local bCallPet = 1
		local bYinshen = 0 
		local bFixPlace = 0

		local FollowTarget = -1
		local nCalSafeMode = 0

		System:Sleep(500)

		if AI:IsStop() == true then
			break
		end

		result , r_param = UpdateData()

		--ShowMessage("kill  %d", tonumber(r_param))

		if result ~= process_boss_kill or r_param ~= p_step then
			if IsMsgCold("Quest_SSS_Begin" , 5000 ) then
				break
			elseif p_step == 1 and g_state_sss["Ħ"].die == 1 then
				break 
			elseif p_step == 2 and g_state_sss["ׯ"].die == 1 then
				break 
			elseif p_step == 3 and g_state_sss["Ľݸ"].die == 1 then
				break 
			elseif p_step == 4 and g_state_sss[""].die == 1 then
				break 
			end
		else
			UpdateMsg("Quest_SSS_Begin")
		end

		if l_boss["ͽ"] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "ͽ" )
			if bRangeAttack == true then
				bYinGuai = 1
			end
		elseif l_boss[""] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "" )
		elseif l_boss["Ѫ׹"] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "Ѫ׹" )
		elseif l_boss[""] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "" )
		elseif l_boss[""] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "" )
		elseif l_boss["ɫħ"] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "ɫħ" ) 
		elseif l_boss["ħ"] ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "ħ" ) 
		else
			AI:SetAdv("ָɱ" , -1 , "" )
		end

		if l_boss["˿"] == INVALID_ID then
			AI:SetAdv("ɾв" , "˿")
		end

		if l_boss["ʽ"] == INVALID_ID then
			AI:SetAdv("ɾв" , "ʽ")
		end

		if l_boss[""] == INVALID_ID then
			AI:SetAdv("ɾв" , "")
		end

		if l_boss["ǧ"] == INVALID_ID then
			AI:SetAdv("ɾв" , "ǧ")
		end

		if l_boss["ׯ"] == INVALID_ID then
			AI:SetAdv("ɾв" , "ׯ")
		elseif l_param_0 == 0 then
			if bRangeAttack == true and CheckBufferByName( l_boss["ׯ"] , "" )  ~= INVALID_ID then
				AI:SetAdv("в" , l_boss["ׯ"] , 6 , "ׯ")
				--bYinshen = 1
			else
				AI:SetAdv("ɾв" , "ׯ")
			end
		end

		-- ǧ򶾣 ĽݲϢ
		if l_boss["Ա"] ~= INVALID_ID then
			if l_boss["Ա"] == l_boss[""] then
				--޿ɱ
			else
				if l_boss["Ա"] == Player:GetData("ID") then
					if IsMsgCold("quest_sss_zb_setsafe",10000) == true then
						--4Լ
						local safe_pos = 0 
						local safe_count = 9999
						local safe_dis = 999999
						local v_X,v_Y = Player:GetPos()
						for i,v in pairs(l_dcq_zb) do
							if v.count < safe_count then
								safe_pos = i
								safe_count = v.count
								safe_dis = GetDistSq( v_X,v_Y,v.x,v.y)
							else
								local new_dis = GetDistSq( v_X,v_Y,v.x,v.y)
								if v.count == safe_count and new_dis < safe_dis then
									safe_pos = i
									safe_count = v.count
									safe_dis = new_dis
								end
							end
						end

						AI:SetAdv( "Ȧ" , l_dcq_zb[safe_pos].x , l_dcq_zb[safe_pos].y  , 3 )
						UpdateMsg("quest_sss_zb_setsafe")
					end
					bCallPet = 0 
					bFixPlace = 1
				else
					--öΪв
					if IsMsgCold("Quest_SSS_zb", 5000) then
						AI:SetAdv("в" , l_boss["Ա"] , 10 , "Ա")
					else
						--ʱ
						PushDebugMessage("Ա,ȴԷ,5Զ" , 1)
					end
				end
			end
		else
			DelMsg("quest_sss_zb_setsafe")
			UpdateMsg("Quest_SSS_zb")
			AI:SetAdv("ɾв" , "Ա")
			if p_step == 4 then
				AI:SetAdv( "Ȧ" , 129 , 129 , 15 )
			end
		end

		if l_boss[""] ~= INVALID_ID then
			if l_boss[""] == Player:GetData("ID") then
				if l_boss[""] ~= INVALID_ID then
					FollowTarget = l_boss[""]
				end
			else
				FollowTarget = l_boss[""]
			end
		end

		if l_boss["ɫħ"] ~= INVALID_ID or l_boss["Ħ_Զɽ"] ~= INVALID_ID or l_boss["Ħ_Ľݲ"] ~= INVALID_ID or l_boss["ħ"]~= INVALID_ID then
			-- 5 ĵ 3 ׶
			-- AI:SetAdv( "Ȧ" , 126 , 42 , 15 )
		elseif l_boss[""] ~= INVALID_ID or l_boss["Զɽ"] ~= INVALID_ID then
			-- 5 ĵ 1 ׶
			-- 
			if l_boss[""] ~= INVALID_ID then
				PushDebugMessage("bossͷ  " , 1)
				local safe_point = { [0] = {x=109,y=50} , [1] = {x=133,y=50 } }
				local v_id , v_X , v_Y = FindObjectByID( l_boss[""] , "" )
				if v_id ~= INVALID_ID then
					UpdateMsg("quest_sss_ftmd_continue")
					local safe_point = { [0] = {x=109,y=50} , [1] = {x=133,y=50 } }
					local tmp_pos = 0 
					local tmp_dis = 0
					for i,v in pairs(safe_point) do
						local new_dis = GetDistSq( v_X , v_Y , v.x , v.y )
						if new_dis > tmp_dis then
							tmp_pos = i
							tmp_dis = new_dis
						end
					end
					AI:SetAdv( "Ȧ" ,safe_point[tmp_pos].x , safe_point[tmp_pos].y , 4 )
					bFixPlace = 1
					bCallPet = 0
				end
			else
				--npc ׼ͷż,廹δ
				--ֻһθϢ
				if IsMsgCold("quest_sss_ftmd" , 10000 ) == false and l_boss["Զɽ"] ~= INVALID_ID then 
					local v_id , v_X , v_Y = FindObjectByID( l_boss["Զɽ"] , "" )
					local safe_point = { [0] = {x=109,y=50} , [1] = {x=133,y=50 } }
					if v_id ~= INVALID_ID then
						local safe_point = { [0] = {x=109,y=50} , [1] = {x=133,y=50 } }
						local tmp_pos = 0 
						local tmp_dis = 0
						for i,v in pairs(safe_point) do
							local new_dis = GetDistSq( v_X , v_Y , v.x , v.y )
							if new_dis > tmp_dis then
								tmp_pos = i
								tmp_dis = new_dis
							end
						end
						ShowMessage("Զ %d ܷؼ" , tonumber(tmp_pos))
						AI:SetAdv( "Ȧ" , safe_point[tmp_pos].x , safe_point[tmp_pos].y , 4 )
					end
					UpdateMsg("quest_sss_ftmd_fix")
					DelMsg("quest_sss_ftmd")
				end
			end
		elseif l_boss["Ľݲ"] ~= INVALID_ID then
			AI:SetAdv( "Ȧ" , 126 , 42 , 15 )
			-- λٿjV0ֵ˺
			-- 
			if IsMsgCold("quest_sss_mrbfdsh" , 8000 ) == false then
				if l_boss["Ľݲ_ֵ˺"] == Player:GetData("ID") then
					FollowTarget = l_boss["Ľݲ"]
				else
					FollowTarget = l_boss["Ľݲ_ֵ˺"]
				end
			end
		else
			if p_step == 5 then
				AI:SetAdv( "Ȧ" , 126 , 42 , 15 )
				-- һ
			end
		end

		if IsMsgCold("quest_sss_ftmd_fix",10000) == false or l_boss[""] ~= INVALID_ID or IsMsgCold("quest_sss_ftmd_continue" , 4000) == false then
			bFixPlace = 1
			bCallPet = 0 
			bStopAssistSelf = 1
			bStopAssist = 1
			if bRangeAttack == false then
				bKillMonster = 0
			end
			AI:SetAdv( "Ȧ뾶" , 4 )
		end

		local teamfollow = false
		if l_boss[""] ~= INVALID_ID then
			bKillMonster = 0
			bCallPet = 0
			--Ӹ
			teamfollow = true 
		end

		if l_boss["Ľݸ"] ~= INVALID_ID then
			if CheckBufferByName( l_boss["Ľݸ"] , "Ա֮" )  ~= INVALID_ID then
				bKillMonster = 0
				bCallPet=0
				PushDebugMessage("Ľݸʹ˼ Ա֮,ͣ!" , 1 )
				--Ӹ
				teamfollow = true
			elseif CheckBufferByName( l_boss["Ľݸ"] , "ʩ" )  ~= INVALID_ID then
				bStopSpecialAttack = 1
				PushDebugMessage("Ľݸʹ˼ ʩ,ֹͣ⼼ܹ!" , 1 )
			end

		end

		--Ӹ泬3,Զ˳Ӹ
		if teamfollow ~= pre_teamfollow then
			pre_teamfollow = teamfollow
			if teamfollow == true then
				Player:EnableTeamFollow(true)
				UpdateMsg("SSS_TEAMFOLLOW")
			else
				Player:EnableTeamFollow(false)
				DelMsg("SSS_TEAMFOLLOW")
			end
		else
			if IsMsgCold("SSS_TEAMFOLLOW" , 3000) == true then
				Player:EnableTeamFollow(false)
			end
		end

		--ԼԶɽĿ,ԶɽΪв,ôĦ[Զɽ˺]Ϊȫ
		if Player:GetBuffByName("ԶɽĿ") ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "ɫħ" ) 
			nCalSafeMode = 1

			if l_boss["Զɽ"] ~= INVALID_ID then
				AI:SetAdv("в" , l_boss["Զɽ"] , 12 , "Զɽ")
			end

			if l_boss["Ħ_Զɽ"] ~= INVALID_ID then
				local vID, vX , vY = FindObjectByID( l_boss["Ħ_Զɽ"] , "NPC" )
				if vID ~= INVALID_ID then
					AI:SetAdv( "Ȧ" , vX , vY , 5 )
					bFixPlace = 1
				end
			else
				AI:SetAdv( "Ȧ" , 126 , 42 , 15 )
			end
		elseif Player:GetBuffByName("ĽݲĿ") ~= INVALID_ID then
			AI:SetAdv("ָɱ" , 0 , "ɫħ" ) 
			nCalSafeMode = 1

			if l_boss["Ľݲ"] ~= INVALID_ID then
				AI:SetAdv("в" , l_boss["Ľݲ"] , 12 , "Ľݲ")
			end

			if l_boss["Ħ_Ľݲ"] ~= INVALID_ID then
				local vID, vX , vY = FindObjectByID( l_boss["Ħ_Ľݲ"] , "NPC" )
				if vID ~= INVALID_ID then
					AI:SetAdv( "Ȧ" , vX , vY , 5 )
					bFixPlace = 1
				end
			else
				AI:SetAdv( "Ȧ" , 126 , 42 , 15 )
			end
		else
			AI:SetAdv("ɾв" , "Զɽ")
			AI:SetAdv("ɾв" , "Ľݲ")

			if l_boss["ɫħ"] ~= INVALID_ID or l_boss["Ħ_Զɽ"] ~= INVALID_ID or l_boss["Ħ_Ľݲ"] ~= INVALID_ID or l_boss["ħ"]~= INVALID_ID then
				AI:SetAdv( "Ȧ" , 126 , 42 , 15 )
			end
		end

		if nSetNoFight > 0 then
			bKillMonster = 0 
			bYinGuai = 0 
			bTeamAttack = 0 
			bYinshen = 1
			bStopAssist = 1
		end

		AI:SetParameter("в" , "" , 1 )
		AI:SetParameter("ʰȡ" , bPickUp )
		AI:SetParameter("в" , "ɱ" , bKillMonster )
		AI:SetParameter("в" , "" , bYinGuai )
		AI:SetParameter("в" , "Ӹ" , bTeamFollow )
		AI:SetParameter("в" , "" , bTeamAttack )
		AI:SetParameter("в" , "ֹܸͣ" , bStopAssistSelf )
		AI:SetParameter("в" , "ֹͣ" , bStopAssist )
		AI:SetParameter("в" , "ֹͣ⹥" , bStopSpecialAttack )
		AI:SetParameter("в" , "ٻ" , bCallPet )

		AI:SetAdv("" , FollowTarget , 3 )
		AI:SetAdv("" , bYinshen )
		AI:SetAdv("Ȧ" , bFixPlace )
		AI:SetAdv("ȫ㷽ʽ" , nCalSafeMode )
	end

	AI:Stop()

	OnSweepBattleField()

	-- nil,""
	return result , r_param
end


function IsFuben()
	if GetActiveDataSceneID() ~= nFubenMapId then
		return false 
	end
	return true 
end

function FindNextStep()

	if IsFuben() == false then
		return nil,""
	end
	
	local cur_step = g_step_sss
	if cur_step == 0 then
		return process_npc_t, "Ħ"
	elseif cur_step == 1 then
		if g_state_sss["Ħ"].die == 1 then
			return process_npc_t, "ׯ"
		else
			return process_npc_t, "Ħ"
		end
	elseif cur_step == 2 then
		if g_state_sss["ׯ"].die == 1 then
			return process_npc_t, "Ľݸ"
		else
			return process_npc_t, "ׯ"
		end
	elseif cur_step == 3 then
		if g_state_sss["Ľݸ"].die == 1 then
			return process_npc_t, ""
		else
			return process_npc_t, "Ľݸ"
		end
	elseif cur_step == 4 then
		if g_state_sss[""].die == 1 then
			return process_npc_t, "ɨɮ"
		else
			return process_npc_t, ""
		end
	elseif cur_step == 5 then
		if g_state_sss["Ľݲ"].die == 1 then
			return process_exit, ""
		else
			return process_npc_t, "ɨɮ"
		end
	end

	return nil,""
end

--ֵ  Ըһͬǰؾ
function FindProcess()
	local cur_process , cur_param = UpdateData()
	--ɱboss ,᷵һ nil
	if cur_process then
		return cur_process , cur_param
	end
	return FindNextStep()
end

function process_team( process )

	AI:SetAI("ɱ")
	AI:SetParameter("ʼ")
	AI:SetParameter("ͼ", nFubenMapId )
	AI:SetParameter("ʰȡ", 1)

	AI:StartEx(0)
	AI:SetParameter("в" ,"", 0 )
	AI:SetParameter("в" ,"ɱ", 0 )
	AI:SetParameter("в" ,"Ӹ", 1)
	AI:SetParameter("в" ,"", 0)
	AI:SetParameter("в" ,"ֹͣ", 1)
	AI:StartEx(1)
		
	while true do
		if IsFuben() == false then
			break 
		end

		local result , param = UpdateData()
		if process == process_mrf_p or process == process_dcq_p then
			if result ~= nil and result ~= process_npc_t then
				break
			end
		elseif process == process_jmz_p then
			if result ~= process_jmz_p then
				break 
			end
		else
			break 
		end

		System:Sleep(1000)
	end

	AI:Stop()
end

function _SMain()

	l_param_0 = gscript_check( 0 , 0 , 1 )
	nSetNoFight = GetScriptParam( script_name , "attr" , SCRIPT_ATTR_NOFIGHT )
	if nSetNoFight > 0 and DataPool:IsTeamLeader() == true then
		ShowMessage("Ƕӳ,˲ֵĳЩЧ!")
	end

	LogChatMsg(0)

	while true do

		System:Sleep(500) 

		if IsFuben() == true then

			local process , param = FindProcess()
			--ShowMessage("find process %s" , tostring(param))

			if process ~= nil then
				if nSetNoFight > 0 and DataPool:GetTeamMemCount() > 0 and DataPool:IsTeamLeader() == false then
					if process == process_jmz_p or process == process_mrf_p or process == process_dcq_p then
						--Ӹ
						process_team( process )
					else
						process(param)
					end
				else
					process(param)
				end
			else
				--ǰ޲
			end

		else
			--Ұ
			reset_sss()

			if GetQuestTimesInfo("ɽ") == 0 then
				ShowMessage("Ѿɽ")
				break 
			end

			MoveToNPC( 69 , 56 , 2 , "쵤" )
			if DataPool:GetTeamMemCount() < 3 then
				ShowMessage("С 3 ,ִ ɽ")
				return
			end
			QuestFrameOptionClicked("ǰɽ", CMP_FULL_MATCH)
			System:Sleep(1000)

			local strType,_,_,_,szText = DataPool:GetNPCEventList_Item(0)
			if strType == "text" then
				if string.find(szText, "#{CJG_101231_75") then
					ShowMessage("Ѿɽ")
					break	-- ˳ѭű
				end
			end

			System:Sleep(2000)
		end

	end

	LogChatMsg(-1)

end

AI:SetMode("ͣͼ" , nFubenMapId )
_SMain()
AI:SetMode("ͣͼ" , -1 )

