-- 프시켄을 위한 스크립트
-- 스킬 1 : 일정시간 데미지를 일정량 이상 받았을 때 발동
-- 스킬 2 : HP에 따라 발동

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


-- 상수 정의
C = {}
C.Immune = {}		-- 데미지 면역 스킬
C.Immune.SkillIndex = "Psy_Psyken_Skill_N_MRS"	-- 스킬 이름 -- MobAttackSequence에서는 제거
C.Immune.Interval = 20	-- 20초 내 20000 이상의 데미지를 받았을 때
C.Immune.Damage = 50000	--

C.SummonTable = {}	-- 필살기 테이블
C.SummonTable[1] = {}
C.SummonTable[1].HPRate = 950	-- 95% 이하일 때 한번 사용
C.SummonTable[1].Summon = {}
C.SummonTable[1].Summon[1] = "Psy_PsykenDog"
--C.SummonTable[1].Summon[2] = "Psy_PsykenDog"
-- PsykenDog 2마리 소환(더 있으면 C.SummonTable[1].Summon[3] 이후에 추가

C.SummonTable[2] = {}
C.SummonTable[2].HPRate = 700	-- 70% 이하일 때 한번 사용
C.SummonTable[2].Summon = {}
C.SummonTable[2].Summon[1] = "Psy_PsykenDog"
C.SummonTable[2].Summon[2] = "Psy_PsykenDog"
--C.SummonTable[2].Summon[3] = "Psy_PsykenDog"
-- PsykenDog 3마리 소환(더 있으면 C.SummonTable[2].Summon[3] 이후에 추가

C.SummonTable[3] = {}
C.SummonTable[3].HPRate = 300	-- 30% 이하일 때 한번 사용
C.SummonTable[3].Summon = {}
C.SummonTable[3].Summon[1] = "Psy_PsykenDog"
C.SummonTable[3].Summon[2] = "Psy_PsykenDog"
C.SummonTable[3].Summon[3] = "Psy_PsykenDog"
-- PsykenDog 3마리 소환(더 있으면 C.SummonTable[2].Summon[3] 이후에 추가

MemBlock = {}

function Psy_Psyken(Handle, MapIndex)
cExecCheck "Psy_Psyken"

	if cIsObjectDead(Handle) then	-- 죽었음
		cAIScriptSet(Handle)	-- 스크립트 없앰
		MemBlock[Handle] = nil	-- 메모리해제
		cDebugLog "Psy_Psyken Dead"
		return
	end

	local Var = MemBlock[Handle]
	if Var == nil then
		MemBlock[Handle] = {}
		Var = MemBlock[Handle]
		Var.Handle = Handle
		Var.MapIndex = MapIndex

		Var.LastCheck = cCurSec()	-- 1초에 한번씩 체크하기 위해


		Var.ImmunManage = {}		-- HP 감소를 감시하는 테이블(면역스킬을 위한)
		Var.ImmunManage.QueueHead = 1
		for k = 1, C.Immune.Interval do
			Var.ImmunManage[k] = cObjectHP(Var.Handle)
		end

		Var.NextSummonIndex = 1	-- 필살기를 사용하기 위한 테이블 C.SummonTable[1].HPRate까지 기다림

		Var.StepFunc = Psyken_Default
	end
	Var.StepFunc(Var)
	return ReturnAI.CPP
end

function Psyken_Default(Var)
cExecCheck "Psyken_Default"

	local CurSec = cCurSec()
	if Var.LastCheck == CurSec then
		return
	end

	Var.LastCheck = CurSec

	-- 1초에 한번씩 체크 시작

	local CurHP, MaxHP = cObjectHP(Var.Handle)


	-- HP 감소율 감시
	Var.ImmunManage.QueueHead = Var.ImmunManage.QueueHead + 1
	if Var.ImmunManage.QueueHead > C.Immune.Interval then
		Var.ImmunManage.QueueHead = 1
	end

	local LastHP = Var.ImmunManage[Var.ImmunManage.QueueHead]
	Var.ImmunManage[Var.ImmunManage.QueueHead] = CurHP

	if LastHP - CurHP > C.Immune.Damage then
		Var.StepFunc = Psyken_ImmunSkill	-- 면역스킬 발동
		return
	end


	-- HP 감시
	if CurHP == MaxHP then
		Var.NextSummonIndex = 1
	else
		local HPRate = CurHP * 1000 / MaxHP
		if C.SummonTable[Var.NextSummonIndex] ~= nil and HPRate < C.SummonTable[Var.NextSummonIndex].HPRate then
			Var.StepFunc = Psyken_Summon		-- 소환스킬
			return
		end
	end
end

function Psyken_ImmunSkill(Var)	-- 면역스킬 발동
cExecCheck "Psyken_ImmunSkill"

	if cSkillBlast(Var.Handle, Var.Handle, C.Immune.SkillIndex) == nil then  -- 실패
		cDebugLog "Psyken_ImmunSkill : Other Skill using"
		return	-- 다른 스킬 사용중이므로 실패 - 다음 루틴에서 다시 시도
	end

	cDebugLog "Psyken_ImmunSkill : Blast"

	for k = 1, C.Immune.Interval do
		Var.ImmunManage[k] = cObjectHP(Var.Handle)
	end

	Var.StepFunc = Psyken_Default
end

function Psyken_Summon(Var)		-- 소환스킬
cExecCheck "Psyken_Summon"

	-- 적당한 스킬 넣을것
	--if cSkillBlast(Var.Handle, var.Handle, C.SummonTable.SkillIndexA) == nil then  -- 실패
	--	cDebugLog "Psyken_SummonA : Other Skill using"
	--	return	-- 다른 스킬 사용중이므로 실패 - 다음 루틴에서 다시 시도
	--end
	-- 소환물 리젠
	for k = 1, #C.SummonTable[Var.NextSummonIndex].Summon do
		local Handle = cMobRegen_Obj(C.SummonTable[Var.NextSummonIndex].Summon[k], Var.Handle)
		MemBlock[Handle] = {}
		MemBlock[Handle].Handle = Handle
		MemBlock[Handle].Master = Var.Handle
		cAIScriptSet(Handle, Var.Handle)
		cAIScriptFunc(Handle, "Entrance", "PsykenPet") --입구함수는 PsykenPet
	end

	Var.NextSummonIndex = Var.NextSummonIndex + 1
	Var.StepFunc = Psyken_Default
end

---------------------------------------------------------------

function PsykenPet(Handle, MapIndex)
cExecCheck "Psyken_Summon"


	if cIsObjectDead(Handle) then	-- 죽었음
		cAIScriptSet(Handle)	-- 스크립트 없앰
		MemBlock[Handle] = nil	-- 메모리해제
		cDebugLog "Pen Dead"
		return ReturnAI.END
	end

	local Var = MemBlock[Handle]
	if Var == nil then
		MemBlock[Handle] = nil
		cNPCVanish(Handle)
		cAIScriptSet(Handle)	-- 스크립트 없앰
		return ReturnAI.END
	end

	if cIsObjectDead(Var.Master) then -- 프시켄이 죽었음
		MemBlock[Handle] = nil
		cNPCVanish(Handle)
		cAIScriptSet(Handle)	-- 스크립트 없앰
		return ReturnAI.END
	end

	local HP, MaxHP = cObjectHP(Var.Master)
	if HP == MaxHP then	-- 평화모드로 피가 가득 찼음
		MemBlock[Handle] = nil
		cNPCVanish(Handle)
		cAIScriptSet(Handle)	-- 스크립트 없앰
		return ReturnAI.END
	end

	return ReturnAI.CPP
end