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.
196 lines
5.2 KiB
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
|
|
|