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.
1205 lines
24 KiB
1205 lines
24 KiB
--------------------------------------------------------------------------------
|
|
-- Seiren Castle Routine --
|
|
--------------------------------------------------------------------------------
|
|
|
|
function DummyRoutineFunc( )
|
|
cExecCheck "DummyRoutineFunc"
|
|
end
|
|
|
|
|
|
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
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Routine Function
|
|
--------------------------------------------------------------------------------
|
|
function Routine_Normal( Handle, MapIndex )
|
|
cExecCheck "Routine_Normal"
|
|
|
|
|
|
-- 함수 인자 확인
|
|
if Handle == nil
|
|
then
|
|
ErrorLog( "Routine_Normal::Handle == nil" )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Routine_Normal::MapIndex == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 필드 버퍼 확인
|
|
local Var = InstanceField[ MapIndex ]
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Routine_Normal::Var == nil"..MapIndex )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 0.2초마다 확인하는 루틴
|
|
if Var["RoutineTime"][ Handle ] <= cCurrentSecond()
|
|
then
|
|
Var["RoutineTime"][ Handle ] = cCurrentSecond() + 0.2
|
|
else
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터가 죽었는지 확인
|
|
if cIsObjectDead( Handle ) == nil
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터가 할 일이 끝났으면, 보스 몬스터의 버퍼를 nil 로 초기화 해준다
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
|
|
return ReturnAI["CPP"]
|
|
|
|
end
|
|
|
|
|
|
function Routine_DropItem( Handle, MapIndex )
|
|
cExecCheck "Routine_DropItem"
|
|
|
|
|
|
-- 함수 인자 확인
|
|
if Handle == nil
|
|
then
|
|
ErrorLog( "Routine_DropItem::Handle == nil" )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Routine_DropItem::MapIndex == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 필드 버퍼 확인
|
|
local Var = InstanceField[ MapIndex ]
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Routine_DropItem::Var == nil"..MapIndex )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 0.2초마다 확인하는 루틴
|
|
if Var["RoutineTime"][ Handle ] <= cCurrentSecond()
|
|
then
|
|
Var["RoutineTime"][ Handle ] = cCurrentSecond() + 0.2
|
|
else
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터가 죽었는지 확인
|
|
if cIsObjectDead( Handle ) == nil
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터의 버퍼가 있는지 확인
|
|
if Var["Enemy"][ Handle ] == nil
|
|
then
|
|
ErrorLog( "Routine_DropItem::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터의 정보가 있는지 확인
|
|
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
|
|
if CurBossInfo == nil
|
|
then
|
|
ErrorLog( "Routine_DropItem::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 아이템 드랍 정보가 있는지 확인
|
|
local CurItemDeopList = CurBossInfo[ "ItemDropList" ]
|
|
if CurItemDeopList == nil
|
|
then
|
|
ErrorLog( "Routine_DropItem::CurItemDeopList == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 드랍 확률 합
|
|
local nMaxDropRate = 0
|
|
for i = 1, #CurItemDeopList
|
|
do
|
|
nMaxDropRate = nMaxDropRate + CurItemDeopList[ i ]["DropRate"]
|
|
end
|
|
|
|
|
|
-- 드랍 확률
|
|
local nCurDropRate = cRandomInt( 1, nMaxDropRate )
|
|
for i = 1, #CurItemDeopList
|
|
do
|
|
nCurDropRate = nCurDropRate - CurItemDeopList[ i ]["DropRate"]
|
|
|
|
|
|
-- 아이템 드랍
|
|
if nCurDropRate <= 0
|
|
then
|
|
cDropItem( CurItemDeopList[ i ]["Index"], Handle, Handle, 1000000, true )
|
|
break
|
|
end
|
|
end
|
|
|
|
|
|
-- 보스 몬스터가 할 일이 끝났으면, 보스 몬스터의 버퍼를 nil 로 초기화 해준다
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
|
|
return ReturnAI["CPP"]
|
|
|
|
end
|
|
|
|
|
|
function Routine_PortalRegen( Handle, MapIndex )
|
|
cExecCheck "Routine_PortalRegen"
|
|
|
|
-- 함수 인자 확인
|
|
if Handle == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::Handle == nil" )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::MapIndex == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 필드 버퍼 확인
|
|
local Var = InstanceField[ MapIndex ]
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::Var == nil"..MapIndex )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 0.2초마다 확인하는 루틴
|
|
if Var["RoutineTime"][ Handle ] <= cCurrentSecond()
|
|
then
|
|
Var["RoutineTime"][ Handle ] = cCurrentSecond() + 0.2
|
|
else
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터가 죽었는지 확인
|
|
if cIsObjectDead( Handle ) == nil
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터의 버퍼가 있는지 확인
|
|
if Var["Enemy"][ Handle ] == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 보스 몬스터의 정보가 있는지 확인
|
|
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
|
|
if CurBossInfo == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 확인 대상이 있을때, 대상도 죽었는지 확인
|
|
if CurBossInfo["BossDeadCheck"] ~= nil
|
|
then
|
|
local DeadBossHandle = Var["Enemy"][ CurBossInfo["BossDeadCheck"] ]
|
|
if DeadBossHandle ~= nil
|
|
then
|
|
if cIsObjectDead( DeadBossHandle ) == nil
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- 생성할 포탈 정보가 있는지 확인
|
|
local CurRegenPortalName = CurBossInfo["PortalName"]
|
|
local CurRegenPortal = RegenInfo["Stuff"][ CurRegenPortalName ]
|
|
if CurRegenPortal == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 포탈이 생성되어 있는지 확인
|
|
if Var["Portal"][ CurRegenPortalName ] == nil
|
|
then
|
|
-- 포탈 생성 / 포탈 정보 설정
|
|
local nPortalHandle = cDoorBuild( Var["MapIndex"], CurRegenPortal["Index"], CurRegenPortal["x"], CurRegenPortal["y"], CurRegenPortal["dir"], CurRegenPortal["scale"] )
|
|
if nPortalHandle == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::Portal was not created. : "..CurRegenPortalName )
|
|
else
|
|
if cSetAIScript ( MainLuaScriptPath, nPortalHandle ) == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::cSetAIScript ( MainLuaScriptPath, nPortalHandle ) == nil" )
|
|
end
|
|
|
|
if cAIScriptFunc( nPortalHandle, "NPCClick", "Click_Portal" ) == nil
|
|
then
|
|
ErrorLog( "Routine_PortalRegen::cAIScriptFunc( nPortalHandle, \"NPCClick\", \"Click_Portal\" )" )
|
|
end
|
|
|
|
|
|
Var["Portal"][ nPortalHandle ] = {}
|
|
Var["Portal"][ nPortalHandle ]["Info"] = PortalInfo[ CurRegenPortalName ]
|
|
Var["Portal"][ nPortalHandle ]["Use"] = false
|
|
Var["Portal"][ CurRegenPortalName ] = nPortalHandle
|
|
end
|
|
end
|
|
|
|
|
|
-- 보스 몬스터가 할 일이 끝났으면, 보스 몬스터의 버퍼를 nil 로 초기화 해준다
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
function Routine_Hayreddin( Handle, MapIndex )
|
|
cExecCheck "Routine_Hayreddin"
|
|
|
|
-- 함수 인자 확인
|
|
if Handle == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::Handle == nil" )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::MapIndex == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 필드 버퍼 확인
|
|
local Var = InstanceField[ MapIndex ]
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::Var == nil" )
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 하이레딘 죽었는지 확인
|
|
if cIsObjectDead( Handle ) ~= nil
|
|
then
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 하이레딘 버퍼가 있는지 확인
|
|
if Var["Enemy"][ Handle ] == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 하이레딘 정보가 있는지 확인
|
|
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
|
|
if CurBossInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 하이레딘 페이즈 번호 확인
|
|
local PhaseNumber = Var["Enemy"][ Handle ]["Phase"]
|
|
if PhaseNumber == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::PhaseNumber == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 하이레딘 페이즈 정보 확인
|
|
local PhaseInfo = CurBossInfo["Phase"]
|
|
if PhaseInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::PhaseInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 하이레딘 진행된 페이즈 번호 확인
|
|
if PhaseNumber < 0 or PhaseNumber > #PhaseInfo
|
|
then
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 현재 페이즈 정보 확인
|
|
local CurPhaseInfo = PhaseInfo[ PhaseNumber ]
|
|
if CurPhaseInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::CurPhaseInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- HP 조건 확인
|
|
if CurPhaseInfo["Condition_HPRate"] ~= nil
|
|
then
|
|
-- 하이레딘 HP 정보
|
|
local nCurHP, nMaxHP = cObjectHP( Handle )
|
|
if nCurHP == nil or nMaxHP == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::nCurHP == nil or nMaxHP == nil" )
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
local nCurHPRate = nCurHP / nMaxHP * 100
|
|
|
|
if nCurHPRate > CurPhaseInfo["Condition_HPRate"]
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
end
|
|
|
|
|
|
-- 위치 조건 확인
|
|
if CurPhaseInfo["Condition_Locate"] ~= nil
|
|
then
|
|
-- 하이레딘 위치 정보
|
|
local Loc_x, Loc_y = cObjectLocate( Handle )
|
|
if Loc_x == nil or Loc_y == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::Loc_x == nil or Loc_y == nil" )
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
local DistSquar = cDistanceSquar( Loc_x, Loc_y, CurPhaseInfo["Condition_Locate"]["x"], CurPhaseInfo["Condition_Locate"]["y"] )
|
|
if DistSquar > 10 * 10
|
|
then
|
|
return ReturnAI["END"]
|
|
end
|
|
end
|
|
|
|
|
|
-- 하이레딘 도주
|
|
if CurPhaseInfo["RunTo"] ~= nil
|
|
then
|
|
cRunTo( Handle, CurPhaseInfo["RunTo"]["x"], CurPhaseInfo["RunTo"]["y"], 1000 )
|
|
end
|
|
|
|
-- 다이얼 로그 출력
|
|
if CurPhaseInfo["DialogInfo"] ~= nil
|
|
then
|
|
cMobDialog( Var["MapIndex"], CurPhaseInfo["DialogInfo"]["SpeakerIndex"], ChatInfo["ScriptFileName"], CurPhaseInfo["DialogInfo"]["Index"] )
|
|
end
|
|
|
|
-- 문 열기
|
|
if CurPhaseInfo["DoorOpen"] ~= nil
|
|
then
|
|
local nCurDoorHandle = Var["Door"][ CurPhaseInfo["DoorOpen"] ]
|
|
if nCurDoorHandle ~= nil
|
|
then
|
|
if Var["Door"][ nCurDoorHandle ] ~= nil
|
|
then
|
|
cDoorAction( nCurDoorHandle, Var["Door"][ nCurDoorHandle ]["Info"]["Block"], "open" )
|
|
Var["Door"][ nCurDoorHandle ]["IsOpen"] = true
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 하이레딘 삭제
|
|
if CurPhaseInfo["BossVanish"] == true
|
|
then
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 다음 페이즈 설정
|
|
Var["Enemy"][ Handle ]["Phase"] = PhaseNumber + 1
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
function Routine_Freloan( Handle, MapIndex )
|
|
cExecCheck "Routine_Freloan"
|
|
|
|
-- 함수 인자 확인
|
|
if Handle == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::Handle == nil" )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::MapIndex == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 현재 시간
|
|
local CurSec = cCurrentSecond()
|
|
if CurSec == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::Var == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 필드 버퍼 확인
|
|
local Var = InstanceField[ MapIndex ]
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::Var == nil" )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 죽었는지 확인
|
|
if cIsObjectDead( Handle ) ~= nil
|
|
then
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 버퍼가 있는지 확인
|
|
if Var["Enemy"][ Handle ] == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 정보가 있는지 확인
|
|
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
|
|
if CurBossInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Hayreddin::CurBossInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 페이즈 번호 확인
|
|
local PhaseNumber = Var["Enemy"][ Handle ]["Phase"]
|
|
if PhaseNumber == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::PhaseNumber == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 페이즈 정보 확인
|
|
local PhaseInfo = CurBossInfo["Phase"]
|
|
if PhaseInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::PhaseInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 진행된 페이즈 번호 확인
|
|
if PhaseNumber < 0 or PhaseNumber > #PhaseInfo
|
|
then
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
-- 0.2초마다 체크하는 루틴
|
|
if Var["RoutineTime"][ Handle ] <= CurSec
|
|
then
|
|
Var["RoutineTime"][ Handle ] = CurSec + 0.2
|
|
else
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 현재 페이즈 정보 확인
|
|
local CurPhaseInfo = PhaseInfo[ PhaseNumber ]
|
|
if CurPhaseInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::CurPhaseInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 프렐로안 HP 정보
|
|
local nCurHP, nMaxHP = cObjectHP( Handle )
|
|
if nCurHP == nil or nMaxHP == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::nCurHP == nil or nMaxHP == nil" )
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
local nCurHPRate = nCurHP / nMaxHP * 100
|
|
|
|
|
|
-- 어그로가 풀렸을 경우
|
|
if cAggroListSize( Handle ) == 0
|
|
then
|
|
if PhaseNumber == 1
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
-- HP 조건 확인
|
|
if nCurHPRate > CurPhaseInfo["Condition_HPRate"]
|
|
then
|
|
Var["Enemy"][ Handle ]["Phase"] = PhaseNumber - 1
|
|
|
|
-- 어그로 풀리면 페이즈 스킬 사용 정보 초기화
|
|
Var["Enemy"][ Handle ]["UseSkillSec"] = nil
|
|
Var["Enemy"][ Handle ]["SummonChief"] = nil
|
|
Var["Enemy"][ Handle ]["SummonSec"] = nil
|
|
end
|
|
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 스킬 사용
|
|
if CurPhaseInfo["UseSkill"] ~= nil
|
|
then
|
|
if Var["Enemy"][ Handle ]["UseSkillSec"] == nil
|
|
then
|
|
Var["Enemy"][ Handle ]["UseSkillSec"] = CurSec
|
|
end
|
|
|
|
-- 스킬 사용 시간 확인
|
|
if Var["Enemy"][ Handle ]["UseSkillSec"] <= CurSec
|
|
then
|
|
if cSkillBlast( Handle, Handle, CurPhaseInfo["UseSkill"]["Index"] ) == 1
|
|
then
|
|
Var["Enemy"][ Handle ]["UseSkillSec"] = CurSec + CurPhaseInfo["UseSkill"]["Interval"]
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- 치프 소환
|
|
if CurPhaseInfo["Summon_Chief"] ~= nil
|
|
then
|
|
local SummonChiefInfo = Var["Enemy"][ Handle ]["SummonChief"]
|
|
if SummonChiefInfo == nil
|
|
then
|
|
Var["Enemy"][ Handle ]["SummonChief"] = {}
|
|
|
|
SummonChiefInfo = Var["Enemy"][ Handle ]["SummonChief"]
|
|
SummonChiefInfo["SummonStep"] = 1
|
|
SummonChiefInfo["SummonList"] = {}
|
|
|
|
|
|
-- 소환 순서 만들기
|
|
local TmpList = {}
|
|
local SummonMax = #CurPhaseInfo["Summon_Chief"]
|
|
|
|
for i = 1, SummonMax
|
|
do
|
|
TmpList[ i ] = i
|
|
end
|
|
|
|
for i = SummonMax, 1, -1
|
|
do
|
|
local Index = cRandomInt( 1, i )
|
|
SummonChiefInfo["SummonList"][ i ] = TmpList[ Index ]
|
|
|
|
for j = Index, (SummonMax - 1)
|
|
do
|
|
TmpList[ j ] = TmpList[ j + 1 ]
|
|
TmpList[ j + 1 ] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 치프 소환할지 확인
|
|
local NextBossSummon = false
|
|
if SummonChiefInfo["Handle"] == nil
|
|
then
|
|
NextBossSummon = true
|
|
else
|
|
-- 소환된 치프가 죽으면 다음 치프 소환
|
|
if cIsObjectDead( SummonChiefInfo["Handle"] ) == 1
|
|
then
|
|
SummonChiefInfo["Handle"] = nil
|
|
NextBossSummon = true
|
|
end
|
|
end
|
|
|
|
-- 치프를 모두 소환 했는지 확인
|
|
if SummonChiefInfo["SummonStep"] > #SummonChiefInfo["SummonList"]
|
|
then
|
|
NextBossSummon = false
|
|
end
|
|
|
|
|
|
-- 치프 소환
|
|
if NextBossSummon == true
|
|
then
|
|
if cSkillBlast( Handle, Handle, CurPhaseInfo["Summon_Chief"]["SkillIndex"] ) == 1
|
|
then
|
|
local SummonIndex = SummonChiefInfo["SummonList"][ SummonChiefInfo["SummonStep"] ]
|
|
if SummonIndex <= #CurPhaseInfo["Summon_Chief"]
|
|
then
|
|
local CurRegenChief = CurPhaseInfo["Summon_Chief"][ SummonIndex ]
|
|
|
|
SummonChiefInfo["Handle"] = cMobRegen_XY( Var["MapIndex"], CurRegenChief["Index"], CurRegenChief["x"], CurRegenChief["y"], CurRegenChief["dir"] )
|
|
SummonChiefInfo["SummonStep"] = SummonChiefInfo["SummonStep"] + 1
|
|
|
|
cRunTo( SummonChiefInfo["Handle"], CurRegenChief["RunTo"]["x"], CurRegenChief["RunTo"]["y"], 1000 )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- 다리 소환
|
|
if CurPhaseInfo["Summon_Leg"] ~= nil
|
|
then
|
|
if Var["Enemy"][ Handle ]["SummonSec"] == nil
|
|
then
|
|
Var["Enemy"][ Handle ]["SummonSec"] = CurSec
|
|
end
|
|
|
|
|
|
-- 소환 시간 확인
|
|
if Var["Enemy"][ Handle ]["SummonSec"] <= CurSec
|
|
then
|
|
local TargetHandle = cTargetHandle( Handle )
|
|
if TargetHandle ~= nil
|
|
then
|
|
if cSkillBlast( Handle, TargetHandle, CurPhaseInfo["Summon_Leg"]["SkillIndex"] ) == 1
|
|
then
|
|
for i = 1, #CurPhaseInfo["Summon_Leg"]
|
|
do
|
|
local CurRegenLeg = CurPhaseInfo["Summon_Leg"][ i ]
|
|
cMobRegen_XY( Var["MapIndex"], CurRegenLeg["Index"], CurRegenLeg["x"], CurRegenLeg["y"], CurRegenLeg["dir"] )
|
|
end
|
|
|
|
Var["Enemy"][ Handle ]["SummonSec"] = CurSec + CurPhaseInfo["Summon_Leg"]["Interval"]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- 다음 단계 번호 설정
|
|
local NextPhaseNumber = PhaseNumber + 1
|
|
if NextPhaseNumber < 0 or NextPhaseNumber > #PhaseInfo
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 다음 단계 정보 확인
|
|
local NextPhaseInfo = PhaseInfo[ NextPhaseNumber ]
|
|
if NextPhaseInfo == nil
|
|
then
|
|
ErrorLog( "Routine_Freloan::NextPhaseInfo == nil" )
|
|
EnemyBufferClear( Var, Handle )
|
|
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- HP 조건 확인
|
|
if nCurHPRate > NextPhaseInfo["Condition_HPRate"]
|
|
then
|
|
return ReturnAI["CPP"]
|
|
end
|
|
|
|
|
|
-- 다음 페이즈 설정
|
|
Var["Enemy"][ Handle ]["Phase"] = NextPhaseNumber
|
|
Var["Enemy"][ Handle ]["UseSkillSec"] = nil
|
|
Var["Enemy"][ Handle ]["SummonChief"] = nil
|
|
Var["Enemy"][ Handle ]["SummonSec"] = nil
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Click Function
|
|
--------------------------------------------------------------------------------
|
|
function Click_Door( NPCHandle, PlyHandle, RegistNumber )
|
|
cExecCheck "Click_Door"
|
|
|
|
DebugLog( "Click_Door::Start" )
|
|
|
|
if NPCHandle == nil
|
|
then
|
|
ErrorLog( "Click_Door::NPCHandle == nil" )
|
|
return
|
|
end
|
|
|
|
if PlyHandle == nil
|
|
then
|
|
ErrorLog( "Click_Door::PlyHandle == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local MapIndex = cGetCurMapIndex( NPCHandle )
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Click_Door::MapIndex == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local Var = InstanceField[ MapIndex ]
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Click_Door::Var == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Door"] == nil
|
|
then
|
|
ErrorLog( "Click_Door::Var[\"Door\"] == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Door"][ NPCHandle ] == nil
|
|
then
|
|
ErrorLog( "Click_Door::Var[\"Door\"][NPCHandle] == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Door"][ NPCHandle ]["IsOpen"] == true
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
-- 플레이어가 열쇠를 가지고 있는지 확인
|
|
local ItemLot, bLocked = cGetItemLot( PlyHandle, Var["Door"][ NPCHandle ]["Info"]["NeedItem"] )
|
|
|
|
if bLocked == nil
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
if bLocked == 1
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
if ItemLot == nil
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
if ItemLot < 1
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
|
|
-- 캐스팅 시작
|
|
cCastingBar( PlyHandle, NPCHandle, (Var["Door"][ NPCHandle ]["Info"]["CastingTime"] * 1000), Var["Door"][ NPCHandle ]["Info"]["CastingAni"] )
|
|
|
|
|
|
DebugLog( "Click_Door::End" )
|
|
end
|
|
|
|
|
|
function Click_Portal( NPCHandle, PlyHandle, RegistNumber )
|
|
cExecCheck "Click_Portal"
|
|
|
|
DebugLog( "Click_Portal::Start" )
|
|
|
|
if NPCHandle == nil
|
|
then
|
|
ErrorLog( "Click_Portal::NPCHandle == nil" )
|
|
return
|
|
end
|
|
|
|
if PlyHandle == nil
|
|
then
|
|
ErrorLog( "Click_Portal::PlyHandle == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local MapIndex = cGetCurMapIndex( NPCHandle )
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Click_Portal::MapIndex == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local Var = InstanceField[ MapIndex ]
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Click_Portal::Var == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Portal"] == nil
|
|
then
|
|
ErrorLog( "Click_Portal::Var[\"Portal\"] == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Portal"][ NPCHandle ] == nil
|
|
then
|
|
ErrorLog( "Click_Portal::Var[\"Portal\"][NPCHandle] == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local CurPortalInfo = Var["Portal"][ NPCHandle ]["Info"]
|
|
if CurPortalInfo == nil
|
|
then
|
|
ErrorLog( "Click_Portal::Var[\"Portal\"][NPCHandle] == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
|
|
-- 설정된 위치로 이동
|
|
cCastTeleport( PlyHandle, "SpecificCoord", CurPortalInfo["x"], CurPortalInfo["y"] );
|
|
|
|
|
|
Var["Portal"][ NPCHandle ]["Use"] = true
|
|
|
|
|
|
DebugLog( "Click_Portal::End" )
|
|
end
|
|
|
|
|
|
function Click_ExitGate( NPCHandle, PlyHandle, RegistNumber )
|
|
cExecCheck "ExitGateClick"
|
|
|
|
DebugLog( "ExitGateClick::Start" )
|
|
|
|
if NPCHandle == nil
|
|
then
|
|
ErrorLog( "ExitGateClick::NPCHandle == nil" )
|
|
return
|
|
end
|
|
|
|
if PlyHandle == nil
|
|
then
|
|
ErrorLog( "ExitGateClick::PlyHandle == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
cLinkTo( PlyHandle, LinkInfo["ReturnMap"]["MapIndex"], LinkInfo["ReturnMap"]["x"], LinkInfo["ReturnMap"]["y"] )
|
|
|
|
DebugLog( "ExitGateClick::End" )
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Menu Function
|
|
--------------------------------------------------------------------------------
|
|
function Menu_Door( NPCHandle, PlyHandle, RegistNumber, Menu )
|
|
cExecCheck "Menu_Door"
|
|
|
|
DebugLog( "Menu_Door::Start" )
|
|
|
|
if NPCHandle == nil
|
|
then
|
|
ErrorLog( "Menu_Door::NPCHandle == nil" )
|
|
return
|
|
end
|
|
|
|
if PlyHandle == nil
|
|
then
|
|
ErrorLog( "Menu_Door::PlyHandle == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local MapIndex = cGetCurMapIndex( NPCHandle )
|
|
|
|
if MapIndex == nil
|
|
then
|
|
ErrorLog( "Menu_Door::MapIndex == nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local Var = InstanceField[ MapIndex ]
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "Menu_Door::Var == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Door"] == nil
|
|
then
|
|
ErrorLog( "Menu_Door::Var[\"Door\"] == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Door"][ NPCHandle ] == nil
|
|
then
|
|
ErrorLog( "Menu_Door::Var[\"Door\"][NPCHandle] == nil" )
|
|
return
|
|
end
|
|
|
|
if Var["Door"][ NPCHandle ]["IsOpen"] == true
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
-- 플레이어가 열쇠를 가지고 있는지 확인
|
|
local ItemLot, bLocked = cGetItemLot( PlyHandle, Var["Door"][ NPCHandle ]["Info"]["NeedItem"] )
|
|
|
|
if bLocked == nil
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
if bLocked == 1
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
if ItemLot == nil
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
if ItemLot < 1
|
|
then
|
|
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
|
|
return
|
|
end
|
|
|
|
|
|
-- 열쇠 파괴, 문 열기
|
|
if cInvenItemDestroy( PlyHandle, Var["Door"][ NPCHandle ]["Info"]["NeedItem"], -1 ) ~= 1
|
|
then
|
|
return
|
|
end
|
|
|
|
cDoorAction( NPCHandle, Var["Door"][ NPCHandle ]["Info"]["Block"], "open" )
|
|
|
|
Var["Door"][ NPCHandle ]["IsOpen"] = true
|
|
|
|
DebugLog( "Menu_Door::End" )
|
|
end
|
|
|