--------------------------------------------------------------------------------
--                            Kingkong Routine                              --
--------------------------------------------------------------------------------

function PlayerMapLogin( MapIndex, Handle )
cExecCheck "PlayerMapLogin"

	if MapIndex == nil
	then
		DebugLog( "PlayerMapLogin::MapIndex == nil")
		return
	end

	if Handle == nil
	then
		DebugLog( "PlayerMapLogin::Handle == nil")
		return
	end

	local Var = InstanceField[ MapIndex ]

	if Var == nil
	then
		DebugLog( "PlayerMapLogin::Var == nil")
		return
	end

	-- 첫 플레이어의 맵 로그인 체크
	Var["bPlayerMapLogin"] = true

	-- 시간 설정이 아직 되지 않은 경우에는 아무것도 실행하지 않는다.
	if Var["KQLimitTime"] == nil
	then
		return
	end

	if Var["CurSec"] == nil
	then
		return
	end

	-- 현재 시간 기준으로 제한시간을 받아서 요청한다.
	local nLimitSec = Var["KQLimitTime"] - Var["CurSec"]

	cShowKQTimerWithLife_Obj( Handle, nLimitSec )

end



MemBlock = {}
function BossRoutine( Handle, MapIndex )
cExecCheck "BossRoutine"

	if InstanceField[MapIndex] == nil
	then
		MemBlock[Handle] = nil
		cAIScriptSet( Handle )
		return ReturnAI["END"]
	end

	if cIsObjectDead( Handle ) == 1
	then
		MemBlock[Handle] = nil
		cAIScriptSet( Handle )
		return ReturnAI["END"]
	end


	local CurSec = cCurrentSecond()


	local Var = MemBlock[Handle]

	if Var == nil
	then
		MemBlock[Handle]			= {}

		Var							= MemBlock[Handle]
		Var["Handle"]				= Handle
		Var["MapIndex"]				= MapIndex

		-- 리젠 다이얼로그 처리 관련 정보 초기화
		Var["RegenDialog"]			= {}
		Var["RegenDialog"]["Data"]	= BossDialog["BossFloorStart"]
		Var["RegenDialog"]["Step"]	= 1
		Var["RegenDialog"]["Wait"]	= CurSec


		-- 보스 페이즈 처리 관련 정보 초기화
		Var["HPChkTime"]			= 0

		Var["SkillRate"]			= {}
		Var["Summon"]				= {}
		Var["Heal"]					= {}


		Var["SkillRate"]["Step"]	= 1
		Var["Summon"]["Step"]		= 1
		Var["Heal"]["Step"]			= 1


		Var["SkillRate"]["Flag"]	= false
		Var["Summon"]["Flag"]		= false
		Var["Heal"]["Flag"]			= false


		if Var["SkillRate"]["Step"] <= #BossSkillRateNameTable
		then
			Var["SkillRate"]["CurData"]	= BossSkillRate[ BossSkillRateNameTable[ Var["SkillRate"]["Step"] ] ]
		end

		if Var["Summon"]["Step"] <= #BossSummonNameTable
		then
			Var["Summon"]["CurData"]	= BossSummon[ BossSummonNameTable[ Var["Summon"]["Step"] ] ]
		end

		if Var["Heal"]["Step"] <= #BossHealNameTable
		then
			Var["Heal"]["CurData"]		= BossHeal[ BossHealNameTable[ Var["Heal"]["Step"] ] ]
		end


		cMobDetectRange( Var["Handle"], BossDetectRange["Regen"] )

		cAIScriptFunc( Var["Handle"], "MobDamaged", "BossDamaged" )

		local Curhp, Maxhp = cObjectHP( Var["Handle"] )
		BossDamaged( Var["MapIndex"], 0, Maxhp, Curhp, Var["Handle"] )

	end


	-- 최초 타겟 설정시 DetectRange 늘려줌
	if Var["TargetHandle"] == nil
	then
		Var["TargetHandle"] = cTargetHandle( Var["Handle"] )
		if Var["TargetHandle"] ~= nil
		then
			cMobDetectRange( Var["Handle"], BossDetectRange["View"] )
		end
	end


	-- 한번에 많은 데미지를 입어서 제대로 처리 안될 가능성 때문에 1초마다 hp 체크.
	if Var["HPChkTime"] + 1 <= CurSec
	then
		Var["HPChkTime"] = CurSec

		local Curhp, Maxhp = cObjectHP( Var["Handle"] )
		BossDamaged( Var["MapIndex"], 0, Maxhp, Curhp, Var["Handle"] )
	end


	RegenDialogProc( Var )

	SkillRateChange( Var )
	SummonMob( Var )
	Recovery( Var )


	return ReturnAI["CPP"]

end



function RegenDialogProc( Var )
cExecCheck "RegenDialogProc"

	if Var == nil
	then
		return
	end

	if Var["RegenDialog"] == nil
	then
		return
	end

	if Var["RegenDialog"]["Step"] > #Var["RegenDialog"]["Data"]
	then
		Var["RegenDialog"] = nil
		return
	end

	local CurSec	= cCurrentSecond()
	local CurData	= Var["RegenDialog"]["Data"][ Var["RegenDialog"]["Step"] ]

	if Var["RegenDialog"]["Wait"] + CurData["Delay"] > CurSec
	then
		return
	end

	cMobDialog( Var["MapIndex"], CurData["MobIndex"], BossDialog["ScriptFileName"], CurData["Index"] )


	Var["RegenDialog"]["Wait"] = CurSec
	Var["RegenDialog"]["Step"] = Var["RegenDialog"]["Step"] + 1

end



function BossDamaged( MapIndex, Attacker, MaxHP, CurHP, Defender )
cExecCheck "BossDamaged"

	local Var = MemBlock[Defender]

	if Var == nil
	then
		return
	end

	local HPRate = (CurHP * 1000) / MaxHP

	SkillRateCheck( Var, HPRate )
	SummonCheck( Var, HPRate )
	HealCheck( Var, HPRate )

end




function SkillRateCheck( Var, HPRate )
cExecCheck "SkillRateCheck"

	if Var == nil
	then
		return
	end


	if Var["SkillRate"] == nil
	then
		return
	end

	if Var["SkillRate"]["Flag"] == true
	then
		return
	end

	if HPRate > Var["SkillRate"]["CurData"]["HPRate"]
	then
		return
	end


	Var["SkillRate"]["Flag"] = true

end

function SkillRateChange( Var )
cExecCheck "SkillRateChange"

	if Var == nil
	then
		return
	end


	if Var["SkillRate"] == nil
	then
		return
	end

	if Var["SkillRate"]["Flag"] == false
	then
		return
	end


	-- 무기 확률 변경
	local Values = Var["SkillRate"]["CurData"]["Value"]

	cMobWeaponRate( Var["Handle"], Values[1], Values[2], Values[3], Values[4] )



	Var["SkillRate"]["Step"] = Var["SkillRate"]["Step"] + 1

	if Var["SkillRate"]["Step"] > #BossSkillRateNameTable
	then
		Var["SkillRate"] = nil
	else
		Var["SkillRate"]["CurData"]	= BossSkillRate[ BossSkillRateNameTable[ Var["SkillRate"]["Step"] ] ]

		Var["SkillRate"]["Flag"]	= false
	end

end



function SummonCheck( Var, HPRate )
cExecCheck "SummonCheck"

	if Var == nil
	then
		return
	end


	if Var["Summon"] == nil
	then
		return
	end

	if Var["Summon"]["Flag"] == true
	then
		return
	end

	if HPRate > Var["Summon"]["CurData"]["HPRate"]
	then
		return
	end


	Var["Summon"]["Flag"] = true

end

function SummonMob( Var )
cExecCheck "SummonMob"

	if Var == nil
	then
		return
	end


	if Var["Summon"] == nil
	then
		return
	end

	if Var["Summon"]["Flag"] == false
	then
		return
	end


	-- 다이얼로그 띄우고 2초 딜레이
	if Var["Summon"]["OnTime"] == nil
	then
		local LastFloorName = FloorNameTable[#FloorNameTable]
		local LastBossIndex = RegenInfo["BossMob"][LastFloorName]["Success"]["Index"]
		cMobDialog( Var["MapIndex"], LastBossIndex, BossDialog["ScriptFileName"], BossDialog["SummonMob"]["Index"] )

		Var["Summon"]["OnTime"] = cCurrentSecond()
	end


	if Var["Summon"]["OnTime"] + BossSummon["BossSummonDelay"] > cCurrentSecond()
	then
		return
	end

	Var["Summon"]["OnTime"] = nil


	-- 소환
	local Values = Var["Summon"]["CurData"]["Value"]

	for i = 1, #Values
	do
		cMobRegen_Obj( Values[i], Var["Handle"] )
	end



	Var["Summon"]["Step"] = Var["Summon"]["Step"] + 1

	if Var["Summon"]["Step"] > #BossSummonNameTable
	then
		Var["Summon"] = nil
	else
		Var["Summon"]["CurData"]	= BossSummon[ BossSummonNameTable[ Var["Summon"]["Step"] ] ]

		Var["Summon"]["Flag"]		= false
	end

end


function HealCheck( Var, HPRate )
cExecCheck "HealCheck"

	if Var == nil
	then
		return
	end


	if Var["Heal"] == nil
	then
		return
	end

	if Var["Heal"]["Flag"] == true
	then
		return
	end

	if HPRate > Var["Heal"]["CurData"]["HPRate"]
	then
		return
	end


	Var["Heal"]["Flag"] = true

end

function Recovery( Var )
cExecCheck "Recovery"

	if Var == nil
	then
		return
	end


	if Var["Heal"] == nil
	then
		return
	end

	if Var["Heal"]["Flag"] == false
	then
		return
	end


	local CurSec = cCurrentSecond()


	if Var["Heal"]["HealTickCount"] == nil
	then
		-- 다이얼로그 띄우고 2초 딜레이
		if Var["Heal"]["OnTime"] == nil
		then
			local LastFloorName = FloorNameTable[#FloorNameTable]
			local LastBossIndex = RegenInfo["BossMob"][LastFloorName]["Success"]["Index"]
			cMobDialog( Var["MapIndex"], LastBossIndex, BossDialog["ScriptFileName"], BossDialog["Heal"]["Index"] )

			Var["Heal"]["OnTime"] = CurSec
		end

		if Var["Heal"]["OnTime"] + BossHeal["BossHealDelay"] > CurSec
		then
			return
		end


		-- 아이들 대기
		if cWaitIdle( Var["Handle"] ) == nil
		then
			return
		end


		-- 상태이상 걸어주고, 애니매이션 걸어줌
		cSetAbstate( Var["Handle"], BossHeal["Abstate"]["Index"], BossHeal["Abstate"]["Strength"], BossHeal["Abstate"]["KeepTime"] )
		cAnimate( Var["Handle"], "start", BossHeal["AniIndex"] )

		Var["Heal"]["HealTickCount"]	= BossHeal["Tick"]
		Var["Heal"]["OnTime"]			= nil
		Var["Heal"]["ChkTime"]			= CurSec
	end


	if Var["Heal"]["ChkTime"] + BossHeal["TickTime"] > CurSec
	then
		return
	end

	Var["Heal"]["ChkTime"] = CurSec


	-- 힐
	cHeal( Var["Handle"], Var["Heal"]["CurData"]["Value"] )



	Var["Heal"]["HealTickCount"] = Var["Heal"]["HealTickCount"] - 1


	if Var["Heal"]["HealTickCount"] <= 0
	then
		cAnimate( Var["Handle"], "stop" )

		Var["Heal"]["Step"] = Var["Heal"]["Step"] + 1

		Var["Heal"]["HealTickCount"]	= nil
		Var["Heal"]["OnTime"]			= nil
		Var["Heal"]["ChkTime"]			= nil

		if Var["Heal"]["Step"] > #BossHealNameTable
		then
			Var["Heal"] = nil
		else
			Var["Heal"]["CurData"]	= BossHeal[ BossHealNameTable[ Var["Heal"]["Step"] ] ]

			Var["Heal"]["Flag"]		= false
		end

	end

end