You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
SigFiesta/LuaScript/AIScript/Psy_Psyken.lua

196 lines
5.2 KiB

-- 프시켄을 위한 스크립트
-- 스킬 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