--[[
보스 상위버전 - 후마르

9Data/Here/World/FineScript.txt 필요
9Data/Hero/Script/BH_Humar.txt 필요
]]

-- 스크립트의 리턴값
ReturnAI = {}
ReturnAI.END = 1    -- Return_AI_END = 1;//    -- 모든 AI루틴 끝
ReturnAI.CPP = 2    -- Return_AI_CPP = 2;//    -- 루아로 일부 처리한 후 cpp의 AI루틴 돌림


--BossIndex = "BH_Humar"
FellowIndex = {}
FellowIndex[1] = "BH_Looter"
FellowIndex[2] = "BH_Guardian"

HumarBuffSkill = "BH_Humar_Skill_N_APU"
HumarBuffAbState = "StaMobAPU01"
HumarBuffSec = 60

SummonSkillName = "BH_Humar_Skill_S"
SummonSkillCastSecond = 5

--어그로 제거시 부하 없애고 inactiv상태로
SummonRate = {}
SummonRate[1] = 750		-- 75%, 50%, 25%에서 한번씩 부하들 리젠
SummonRate[2] = 500
SummonRate[3] = 250
SummonRate[4] = 0		-- 마지막은 항상 0인것 추가 필요

MemBlock = {}


function Common_RemoveTreasure(MapIndex)
cExecCheck "Common_RemoveTreasure"
	cDebugLog "Common_RemoveTreasure"

	cRegenGroupActiv("BH_Cracker", "BH_HumarBox", 0)	-- 상자가 나오지 않도록(세번째 인수를 생략하거나 1이면 activ)
	cVanishAll(MapIndex, "BH_Humar_O")
	cVanishAll(MapIndex, "BH_Humar_O_02")
	cVanishAll(MapIndex, "BH_Humar_O_03")
	cVanishAll(MapIndex, "BH_Humar_O_04")
	cVanishAll(MapIndex, "BH_Humar_X")
end


-- 부하들은 스크립트처리 안함 - CPP 루틴 사용

------------------------------------------------------------------
-----------------------    Humar Part   --------------------------
------------------------------------------------------------------

function BH_Humar(Handle, MapIndex)
cExecCheck "BH_Humar"
	local Var = MemBlock[Handle]
	if cIsObjectDead(Handle) ~= nil then
		if Var ~= nil then   -- 보스가 죽었음
			cDebugLog("Boss Dead")
			for k = 1, 2 do
				if Var.FellowHandle[k] ~= -1 then
					cNPCVanish(Var.FellowHandle[k])
					Var.FellowHandle[k] = -1
				end
			end

			-- 투명인간 소환 - 보물상자 제어용
			local InvisibleHandle = cMobRegen_Obj("InvisibleMan", Handle)
			cAIScriptSet(InvisibleHandle, Handle) -- 비쥬의 AI스크립트를 Var.Handle(헬가)의 AI스크립트로 세팅
			MemBlock[InvisibleHandle] = {}
			MemBlock[InvisibleHandle].Handle = InvisibleHandle
			MemBlock[InvisibleHandle].MapIndex = MapIndex
			MemBlock[InvisibleHandle].StepFunc = Invisible_Init

			MemBlock[Handle] = nil
		end
		return ReturnAI.END
	end


	if Var == nil then    -- 처음 리젠되었음
		MemBlock[Handle] = {}
		Var = MemBlock[Handle]

		Var.Handle = Handle
		Var.MapIndex = MapIndex
		Var.FellowHandle = {}
		Var.FellowHandle[1] = -1
		Var.FellowHandle[2] = -1

		Var.NextSummonIndex = 1
		Var.BoxVanish = 0		-- 10초에 한번씩 박스를 지우기 위해

		Var.TargetLostSec = 0 	-- 타겟을 잃은 시간
		Var.NextBuff = 0		-- 다음번 버프받을 시간

		Var.Wait = {}
		Var.Wait.Second = 0;
		Var.Wait.NextFunc = nil

		Var.StepFunc = Boss_WaitInvader
	end

	return Var.StepFunc(Var)
end

function Boss_Wait(Var)  -- Var.Wait.Second까지 기다린 후 StepFunc을 WaitFunction으로 세팅
cExecCheck "Boss_Wait"
	if cCurSec() >= Var.Wait.Second then
		Var.StepFunc = Var.Wait.NextFunc
	end
end

function Boss_WaitInvader(Var)
cExecCheck "Boss_WaitInvader"

	local CurSecond = cCurSec()
	if CurSecond > Var.BoxVanish then
		Common_RemoveTreasure(Var.MapIndex)
		Var.BoxVanish = CurSecond + 10
	end


	local hp
	local maxhp
	hp, maxhp = cObjectHP(Var.Handle)
	if hp < maxhp then
		Var.NextBuff = cCurSec() + HumarBuffSec
		Var.StepFunc = Boss_SummonCheck
	end

	if hp == maxhp and Var.NextSummonIndex ~= 1 then
		Var.NextSummonIndex = 1
		cDebugLog "Summon Reset"
	end

	return ReturnAI.END
end

function Boss_BuffCheck(Var)
cExecCheck "Boss_BuffCheck"
	hp, maxhp = cObjectHP(Var.Handle)
	if hp == maxhp then
		Var.StepFunc = Boss_WaitInvader	-- 전투 끝, 피 회복되었음
		return
	end

	if cCurSec() >= Var.NextBuff then
		cDebugLog "Buffing"
		if cNPCSkillUse(Var.Handle, Var.Handle, HumarBuffSkill) ~= nil then
			Var.NextBuff = cCurSec() + HumarBuffSec
		else
			cDebugLog "Fail"
		end
	end

	Var.StepFunc = Boss_SummonCheck
end

function Boss_SummonCheck(Var)
cExecCheck "Boss_SummonCheck"
	local hp
	local maxhp
	hp, maxhp = cObjectHP(Var.Handle)
	if hp * 1000 < maxhp * SummonRate[Var.NextSummonIndex] and cNPCSkillUse(Var.Handle, Var.Handle, SummonSkillName) == 1 then
		cDebugLog("Summon Index " .. Var.NextSummonIndex)
		Var.NextSummonIndex = Var.NextSummonIndex + 1

		Var.Wait.Second = cCurSec() + SummonSkillCastSecond
		Var.Wait.NextFunc = Boss_SummomFellow

		Var.StepFunc = Boss_Wait
		return
	end

	-- 부하들 죽었는지 확인
	for fel = 1, 2 do
		if Var.FellowHandle[fel] ~= -1 and cIsObjectDead(Var.FellowHandle[fel]) ~= nil then
			Var.FellowHandle[fel] = -1
		end
	end


	if cTargetHandle(Var.Handle) ~= nil then  -- 타겟 있음
		Var.TargetLostSec = cCurSec()
	elseif Var.TargetLostSec + 150 < cCurSec() then	-- 타겟 사라짐
		Var.StepFunc = Boss_WaitInvader

		cResetAbstate(Var.Handle, HumarBuffAbState)	-- 버프 해제

		-- Remove fallows
		for k = 1, 2 do
			if Var.FellowHandle[k] ~= -1 then
				cNPCVanish(Var.FellowHandle[k])
				Var.FellowHandle[k] = -1
			end
		end
	end

	Var.StepFunc = Boss_BuffCheck

	return ReturnAI.CPP
end

function Boss_SummomFellow(Var)
cExecCheck "Boss_SummomFellow"
	local summon = false
	for fel = 1, 2 do
		if Var.FellowHandle[fel] == -1 then
			Var.FellowHandle[fel] = cMobRegen_Obj(FellowIndex[fel], Var.Handle)
			summon = true
		end
	end
	if summon then
		cNPCChat(Var.Handle, "BH_Humar_Sum")
	end
	Var.StepFunc = Boss_SummonCheck
end



-------------------------------------------------------------------------
-----------------------    InvisibleMan Part   --------------------------
-------------------------------------------------------------------------
-- 보물상자 제어용 오브젝트

function InvisibleMan(Handle, MapIndex)
cExecCheck "InvisibleMan"
	local Var = MemBlock[Handle]
	if Var == nil then
		----cDebugLog("InvisibleMan Handle Error:" .. Handle)
		return
	end

	if Var.StepFunc ~= nil then
		Var.StepFunc(Var)
	end

	return ReturnAI.END
end

function Invisible_Init(Var)
cExecCheck "Invisible_Init"
	cDebugLog "Invisible_Init"

	cGroupRegen("BH_Cracker", "BH_HumarBox")	-- 상자가 나오도록

	Var.Wait = {}
	Var.Wait.Second = cCurSec() + 60
	Var.StepFunc = Invisible_AllVanish
end

function Invisible_AllVanish(Var)
cExecCheck "Invisible_AllVanish"

	if cCurSec() > Var.Wait.Second then
		cDebugLog "Invisible_AllVanish"
		cRegenGroupActiv("BH_Cracker", "BH_HumarBox", 0)	-- 상자가 나오지 않도록(세번째 인수를 생략하거나 1이면 activ)

		Common_RemoveTreasure(Var.MapIndex)
		cNPCVanish(Var.Handle)

		Var.StepFunc = nil
	end
end
