ShowMessage("ʮɱ-̨ű $Rev: 212 $")

--[[
[author]
class=1
attr=1
]]--

script_name="ɱ"
local nSetNoFight = 0

local nFubenMapId = 546
local l_Pre_GSS = INVALID_ID

function GetMissionComplete()

	local vIndex, vIdMission, vIdScript = DataPool:GetPlayerMission(script_name)
	local vParam = {}
	if vIndex ~= -1 then
		-- ȡ
		for i=0,7 do
			vParam[i] = DataPool:GetPlayerMission_Variable(vIndex, i)
			DbgPrintf("[%d]%d", i, vParam[i])
		end
	
		return tonumber(vParam[0])
	end

	return INVALID_ID
end

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

local l_Pre_Yaoxin = "ǷĿ" 
local l_Pre_BossDie = ""
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 ,
	["ѡNPC"] = INVALID_ID ,
	[""] = INVALID_ID 
}

function ResetBoss()
	for i,v in pairs(l_boss) do
		l_boss[i] = INVALID_ID
	end
end

function UpdateData()

	ResetBoss()

	local vPreGssHPPercent = 100

	local n = EnumObject(true)

	for i=0, n - 1 do
		local idObj, classObj, nameObj, xObj, yObj = EnumObject(false, i)
		if idObj == INVALID_ID then
			continue
		end
		if classObj == "MON" then
			if nameObj == "ʥ" then
				if Character:GetData(idObj, "DIE") == false then
					if l_boss["ʥ"] == INVALID_ID then
						l_boss["ʥ"] = idObj
						vPreGssHPPercent = Character:GetData( idObj , "HP_PERCENT" )
					else
						--֮ǰѡǵ1,ô2ʥ hp < 1 10% ʱ,ѡ2ʥ
						--֮ǰѡǵ2,ô1ʥ hp < 2 10% ʱ,ѡ1ʥ
						local v2GssHPPercent = Character:GetData( idObj , "HP_PERCENT" )
						local v1GssHPPercent = Character:GetData( l_boss["ʥ"] , "HP_PERCENT" )
						if l_Pre_GSS == l_boss["ʥ"] then
							if v2GssHPPercent > v1GssHPPercent and math.abs( v2GssHPPercent - v1GssHPPercent ) > 10 then
								l_boss["ʥ"] = idObj
							end
						elseif l_Pre_GSS == idObj then
							if v2GssHPPercent < v1GssHPPercent and math.abs( v1GssHPPercent - v2GssHPPercent ) > 10 then
								--ѡ1
							else
								l_boss["ʥ"] = idObj
							end
						end
					end
				else
					l_Pre_BossDie = "ʥ"
				end
			elseif l_boss[nameObj] ~= nil then
				if Character:GetData(idObj, "DIE") == false then
					l_boss[nameObj] = idObj
				else
					l_Pre_BossDie = nameObj
				end
			end
		elseif classObj == "SPECIAL" then
			if nameObj == "" then
				l_boss[""] = idObj
				AI:SetAdv("в" , idObj , 5 , "")
			elseif nameObj == "" then
				l_boss[""] = idObj
				AI:SetAdv("в" , idObj , 5 , "")
			elseif nameObj == "ɷ" then
				l_boss["ɷ"] = idObj
				AI:SetAdv("в" , idObj , 5 , "ɷ")
			end
		elseif classObj == "NPC" then
			if nameObj == "ʢ" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "ʥ" then 
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "" then 
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "ֳ" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "¬" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "³־" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "ڤ" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "ν" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "" then
				l_boss["ѡNPC"] = idObj
			elseif nameObj == "" then
				l_boss["ѡNPC"] = idObj
			end
		elseif classObj == "PLAYER" or classObj == "PET" then
			local iPos,_,_ = CheckBufferByName( idObj, "ɱ")
			if INVALID_ID ~= iPos then
				l_boss[""] = idObj
			end
		end
	end

	l_Pre_GSS = l_boss["ʥ"]

	while true do 
		local channel, time, name, data = GetChatMsg()

		if channel == INVALID_ID then 
			break 
		end

		local now = System:timeGetTime()
		--channel == 0 and
		if now < time + 10 then
			-- ν ҪԶ빥 Ǽŭ
			if string.find(data, "Ǿ") then
				UpdateMsg("sx_songjiang")
			elseif string.find(data, "") then
				UpdateMsg("sx_lujunyi") 
			elseif string.find(data, "") then
				l_Pre_Yaoxin = "ɫ" 
				ShowMessage(" ɫ")
			elseif string.find(data, "") then
				l_Pre_Yaoxin = "ɫ"
				ShowMessage(" ǻɫ")
			elseif string.find(data, "װع") then
				l_Pre_Yaoxin = "ɫ"
				ShowMessage(" Ǻɫ")
			end
		end
	end

	if l_boss["ʢ"] ~= INVALID_ID then 
		return process_boss_kill,"ʢ"
	elseif l_boss["ʥ"] ~= INVALID_ID then
		return process_boss_kill,"ʥ"
	elseif l_boss[""] ~= INVALID_ID or l_boss[""] ~= INVALID_ID or l_boss[""] ~= INVALID_ID or l_boss["ɷ"] ~= INVALID_ID then
		return process_boss_kill,""
	elseif l_boss[""] ~= INVALID_ID then
		return process_boss_kill,""
	elseif l_boss[""] ~= INVALID_ID or l_boss[""] ~= INVALID_ID then
		return process_boss_kill,""
	elseif l_boss["ֳ"] ~= INVALID_ID then
		return process_boss_kill,"ֳ"
	elseif l_boss["¬"] ~= INVALID_ID then
		return process_boss_kill,"¬"
	elseif l_boss["³־"] ~= INVALID_ID then
		return process_boss_kill,"³־"
	elseif l_boss["ڤ"] ~= INVALID_ID then
		return process_boss_kill,"ڤ"
	elseif l_boss["ν"] ~= INVALID_ID then
		return process_boss_kill,"ν"
	elseif l_boss[""] ~= INVALID_ID then
		return process_boss_kill,""
	elseif l_boss[""] ~= INVALID_ID or l_boss["ɫ"]~= INVALID_ID or l_boss["ɫ"] ~= INVALID_ID or l_boss["ɫ"] ~= INVALID_ID then
		return process_boss_kill,""
	end

	return nil,""	
end

function process_boss_kill( vBoss )

	AI:SetAdv( "Ȧ" , 30 , 33 , 15 )
	AI:SetAI("߼ս") 
	AI:SetParameter("ͼ" , nFubenMapId)

	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 bRangeAttack = Player:IsRangeAttack()
	local pre_teamfollow = false

	Dismount()

	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 FollowTarget = -1
		
		System:Sleep(300)

		if IsFuben() == false then
			break
		end

		local vResult , vParam = UpdateData()
		if vResult == process_boss_kill then
			if vParam ~= vBoss then
				break
			end
			UpdateMsg("FB_DLSX_KILLBOSS")
		else
			local nComplete = GetMissionComplete() 
			if nComplete ~= 0 then
				break
			elseif vBoss == "սǰ׼" then
				--wait
			elseif l_Pre_BossDie == vBoss then
				break
			else
				--ʧĿ,ȴ5˳
				if IsMsgCold("FB_DLSX_KILLBOSS" , 5000) == true then
					break
				end
			end
		end

		-- жϷǷ
		if l_boss["ʥ"] ~= INVALID_ID then	
			local iPos,_,_ = CheckBufferByName( l_boss["ʥ"], "")
			if iPos ~= INVALID_ID then
				bStopSpecialAttack = 1
			end
			
			AI:SetAdv("ָɱ" , -1 , "" )
			AI:SetAdv("ָɱ" , l_boss["ʥ"] , "ʥ" )
		elseif l_boss[l_Pre_Yaoxin] ~= nil and INVALID_ID ~= l_boss[l_Pre_Yaoxin] then
			AI:SetAdv("ָɱ" , -1 , "" )
			AI:SetAdv("ָɱ" , l_boss[l_Pre_Yaoxin] , l_Pre_Yaoxin )
		elseif l_boss["ɫ"] ~= INVALID_ID or l_boss["ɫ"] ~= INVALID_ID or l_boss["ɫ"] ~= INVALID_ID then
			if l_boss[""] ~= INVALID_ID then
				AI:SetAdv("ָɱ" , -1 , "" )
				AI:SetAdv("ָɱ" , l_boss[""] , "" )
			end
		else
			AI:SetAdv("ָɱ" , -1 , "" )
		end

		if INVALID_ID ~= l_boss["ν"] then
--[[
			if bRangeAttack == true then
				AI:SetAdv("в" , l_boss["ν"] , 6 , "ν" )
			else
]]--
				if IsMsgCold("sx_songjiang", 5000) == true then
					AI:SetAdv("ɾв" , l_boss["ν"] )
				else
					AI:SetAdv("в" , l_boss["ν"] , 6 , "ν")
					bKillMonster = 0
				end
--[[
			end
]]--
		else
			AI:SetAdv( "ɾв" , "ν" )
		end

		if INVALID_ID ~= l_boss["ʢ"] then
			AI:SetAdv("" , l_boss["ʢ"] , 3 )
		else
			AI:SetAdv("" , -1 , 3 )
		end

		if INVALID_ID ~= l_boss["³־"] then
			local iPos,_,_ = CheckBufferByName( l_boss["³־"] , "·")

			if INVALID_ID ~= iPos then
				bStopSpecialAttack = 1
			end

			--·,ֹͣ⼼ܹ
			--ձ,ֹbossѪ
			bCallPet = 0
		end

		local teamfollow = false

		if INVALID_ID ~= l_boss["¬"] then
			local iPos,_,_ = CheckBufferByName( l_boss["¬"], "")
			if INVALID_ID ~= iPos then
				bKillMonster = 0
				teamfollow = true
				bCallPet = 0 
				UpdateMsg("sx_lujunyi")
			else 
				if IsMsgCold("sx_lujunyi" , 5000) then
					bKillMonster = 1
				else
					bKillMonster = 0 
					teamfollow = true
				end					
			end

			local iPos,_,_ = CheckBufferByName( l_boss["¬"], "")
			if INVALID_ID ~= iPos then
				bStopSpecialAttack = 1
			end
		end

		--Ӹ泬3,Զ˳Ӹ
		if teamfollow ~= pre_teamfollow then
			pre_teamfollow = teamfollow
			if teamfollow == true then
				Player:EnableTeamFollow(true)
				UpdateMsg("SX_TEAMFOLLOW")
			else
				Player:EnableTeamFollow(false)
				DelMsg("SX_TEAMFOLLOW")
			end
		else
			if IsMsgCold("SX_TEAMFOLLOW" , 3000) == true then
				Player:EnableTeamFollow(false)
			end
		end
		
		if INVALID_ID == l_boss[""] then
			AI:SetAdv("ɾв" , "" )
		end

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

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

		--жԼǷж
		if l_boss[""] ~= INVALID_ID then
			local nPetID = Player:GetFightingPetID()
			if nPetID == l_boss[""] then
				bCallPet = 0
			elseif l_boss[""] == Player:GetData("ID") then
				bCallPet = 0
			else
				--Σն
				AI:SetAdv("в" , l_boss[""] , 6 , "")
			end
		else
			AI:SetAdv("ɾв" , "" )
		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("" , bYinshen )
		AI:SetAdv("Ȧ" , 0 )
	end
	AI:Stop()

	OnSweepBattleField()
end

function _breakmove( fX , fY , nScene )
	if IsFuben() == true then
		return false 
	end
	return true
end

function _breakmove_infuben()
	if IsFuben() == false then
		return false 
	end

	local vResult , vParam = UpdateData()
	if vResult ~= nil then
		return false
	end

	return true
end 

function process_npc_t()

	local vResult , vParam = UpdateData()
	if vResult ~= nil then
		return 
	end

	if INVALID_ID == l_boss["ѡNPC"] then
		MoveInMap( 36 , 34 , nFubenMapId , 2 , _breakmove_infuben )
		if UpdateData() ~= nil then
			return
		end
	end

	if INVALID_ID ~= l_boss["ѡNPC"] then
		local npc_id , npc_x , npc_y , _ , _ , _ , _ , npc_name = FindObjectByID( l_boss["ѡNPC"] , "NPC" )
		if INVLIAD_ID ~= npc_id then
			MoveToNPC( npc_x , npc_y , nFubenMapId , npc_name , false , false , _breakmove_infuben )
			if UpdateData() == nil then
				QuestFrameOptionClicked("ս", CMP_PART_MATCH)
				System:Sleep(2000)
			end
		end
	end
end

local function OnCommonMission()

	while true do

		System:Sleep(500)
		
		local nComplete = GetMissionComplete() 

		if IsFuben() == true then
			local vResult , vParam = UpdateData()
			if vResult == process_boss_kill then
				process_boss_kill( vParam )
			elseif nComplete ~= 0 then
				--˳
				MoveToNPC(12, 34, nFubenMapId , "ٴʦ" , false )
				QuestFrameOptionClicked("ȷ", CMP_FULL_MATCH)
			else
				--
				if DataPool:GetTeamMemCount() == 0 or DataPool:IsTeamLeader() == true then
					process_npc_t()
				else
					process_boss_kill( "սǰ׼" )
				end
			end
		else
			if nComplete == INVALID_ID then
				if GetQuestTimesInfo("ɱ") == 0 then
					ShowMessage("մɱ!")
					return
				end

				MoveToNPC(131, 79, 2, "ٴʦ")
				-- ж϶
				if DataPool:GetTeamMemCount() < 3 then 
					ShowMessage(" 3 ˣ")
					return
				end

				QuestFrameOptionClicked("ɱ", CMP_FULL_MATCH)

				local strType,_,_,_,szText = DataPool:GetNPCEventList_Item(0)

				if strType == "text" then
					if string.find(szText, "Ѿ") then
						ShowMessage("Ѿɱǣ")
						break	-- ˳ѭű
					end
				end

				QuestFrameAcceptClicked()
				System:Sleep(1000)

			elseif nComplete == 1 then
				MoveToNPC(131, 79, 2, "ٴʦ")
				QuestFrameOptionClicked("ɱ", CMP_FULL_MATCH)
				QuestFrameMissionComplete()	-- 
			elseif nComplete == 0 then
				MoveToNPC(131, 79, 2, "ٴʦ" , true , true , _breakmove )
				QuestFrameOptionClicked("ɱ", CMP_FULL_MATCH)
				QuestFrameOptionClicked("ǰ̨", CMP_FULL_MATCH)
			else
				QuestFrameMissionAbnegate(g_idScript)
			end
		end		
	end
end

local function OnXuKongMission()

	script_name = "սɱ"

	while true do

		System:Sleep(500)

		-- жǷȡ
		if IsFuben() == true then
			local nComplete = GetMissionComplete() 

			local vResult , vParam = UpdateData()
			if vResult == process_boss_kill then
				process_boss_kill( vParam )
			elseif nComplete ~= 0 then
				--˳
				MoveToNPC(12, 34, nFubenMapId , "ٴʦ" , false )
				QuestFrameOptionClicked("ȷ", CMP_FULL_MATCH)
			else
				--
				if DataPool:GetTeamMemCount() == 0 or DataPool:IsTeamLeader() == true then
					process_npc_t()
				else
					process_boss_kill( "սǰ׼" )
				end
			end
		else
			local nComplete = GetMissionComplete() 
			if nComplete == 0 then
				MoveToNPC(131, 79, 2, "ٴʦ" , true , true , _breakmove )
				if DataPool:GetTeamMemCount() < 3 and IsFuben() == false then 
					g_XukongRet = 1
					ShowMessage(" 3 ˣ")
					return
				end

				QuestFrameOptionClicked("սɱ", CMP_FULL_MATCH)
				QuestFrameOptionClicked("ǰ̨", CMP_FULL_MATCH)
			else
				break
			end
		end
	end
end

function _SMain(...)

	nSetNoFight = GetScriptParam( script_name , "attr" , SCRIPT_ATTR_NOFIGHT )

	LogChatMsg(0)

	--սʼ
	AI:SetAdv( "" )
	AI:SetAdv( "ս" ,  14 , 17 , 46 , 17 )
	AI:SetAdv( "ս" ,  46 , 17 , 46 , 47 )
	AI:SetAdv( "ս" ,  14 , 17 , 14 , 47 )
	AI:SetAdv( "ս" ,  14 , 47 , 46 , 47 )

	local isXK = false
	if _CommandLoad ~= nil then
		local vCmd = tostring(_CommandLoad)
		if vCmd == "" then
			isXK = true
		end
	end

	if isXK == true then
		OnXuKongMission()
	else
		OnCommonMission()
	end

	LogChatMsg(-1)
end

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


--[[
"" ǳʱ,ȷɫ,Զºֹͣ˹,ʱֱӲ
ʥ ѪлĿ
]]--