-------------------------------------------------------------------------------- -- King Slime Routine -- -------------------------------------------------------------------------------- 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 -- 시간 설정이 아직 되지 않은 경우에는 아무것도 실행하지 않는다. if Var["KQLimitTime"] == nil then return end if Var["CurSec"] == nil then return end -- 현재 시간 기준으로 제한시간을 받아서 요청한다. local nLimitSec = Var["KQLimitTime"] - Var["CurSec"] cShowKQTimerWithLife_Obj( Handle, nLimitSec ) end function KingSlimeRoutine( Handle, MapIndex ) cExecCheck "KingSlimeRoutine" local Var = InstanceField[ MapIndex ] if Var == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) return ReturnAI["END"] end local RoutineTimeIndex = ""..Handle -- // 0.1초마다 체크하는 루틴 if Var["RoutineTime"][ RoutineTimeIndex ] == nil then Var["RoutineTime"][ RoutineTimeIndex ] = cCurrentSecond() end if Var["RoutineTime"][ RoutineTimeIndex ] + 0.1 > cCurrentSecond() then return ReturnAI["CPP"] else Var["RoutineTime"][ RoutineTimeIndex ] = cCurrentSecond() end -- 0.1초마다 체크하는 루틴 // if Var["Enemy"] == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) return ReturnAI["END"] end if Var["Enemy"][ Handle ] == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) return ReturnAI["END"] end -- King Slime 사망 if cIsObjectDead( Handle ) == 1 then cMobShout( Handle, KingSlimeChat["ScriptFileName"], KingSlimeChat["DeathShout"]["Index"] ) cAIScriptSet( Handle ) Var["Enemy"][ Handle ]["PhaseNumber"] = nil Var["Enemy"][ Handle ] = nil return ReturnAI["END"] end -- 페이즈 조건 체크 후 행동 if Var["Enemy"][ Handle ]["PhaseNumber"] == nil then Var["Enemy"][ Handle ]["PhaseNumber"] = 1 end local CurHP, MaxHP = cObjectHP( Handle ) local RoutineStepFunc = nil if CurHP == MaxHP then RoutineStepFunc = DummyPhaseFunc elseif Var["Enemy"][ Handle ]["PhaseNumber"] < #BossPhaseNameTable then local NextBossPhase = BossPhaseNameTable[ Var["Enemy"][ Handle ]["PhaseNumber"] + 1 ] local HP_RealRate = ( CurHP * 1000 ) / MaxHP -- 1000분율 if HP_RealRate < KingSlimeSummon[ NextBossPhase ]["HP_Rate"] then -- 다음 페이즈로 바꾼 후의 페이즈의 보스 액션 실행 Var["Enemy"][ Handle ]["PhaseNumber"] = Var["Enemy"][ Handle ]["PhaseNumber"] + 1 RoutineStepFunc = PhaseActionFunc else RoutineStepFunc = DummyPhaseFunc end else RoutineStepFunc = DummyPhaseFunc end RoutineStepFunc( Handle, MapIndex ) return ReturnAI["CPP"] end function DummyPhaseFunc( ) cExecCheck "DummyPhaseFunc" end function PhaseActionFunc( BossHandle, MapIndex ) cExecCheck "PhaseActionFunc" if BossHandle == nil then return end if MapIndex == nil then return end local Var = InstanceField[ MapIndex ] if Var == nil then return end local PhaseNumber = Var["Enemy"][ BossHandle ]["PhaseNumber"] local BossPhase = BossPhaseNameTable[ PhaseNumber ] DebugLog( "Start PhaseActionFunc::"..BossPhase ) cMobShout( BossHandle, KingSlimeChat["ScriptFileName"], KingSlimeChat["SummonMobShout"]["Index"] ) for i = 1, #KingSlimeSummon[ BossPhase ]["SummonMobs"] do local SummonMobInfo = {} local SummonMobHandle = nil SummonMobHandle = cMobRegen_Obj( KingSlimeSummon[ BossPhase ]["SummonMobs"][i], BossHandle ) if SummonMobHandle ~= nil then cSetAIScript ( MainLuaScriptPath, SummonMobHandle ) cAIScriptFunc( SummonMobHandle, "Entrance", "SummonMobRoutine" ) Var["Enemy"][ SummonMobHandle ] = SummonMobInfo Var["Enemy"][ SummonMobHandle ]["Handle"] = SummonMobHandle end end DebugLog( "End PhaseActionFunc::"..BossPhase ) end function SummonMobRoutine( Handle, MapIndex ) cExecCheck "SummonMobRoutine" local Var = InstanceField[ MapIndex ] if Var == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) return ReturnAI["END"] end -- // 0.1초마다 체크하는 루틴 local RoutineTimeIndex = ""..Handle if Var["RoutineTime"][ RoutineTimeIndex ] == nil then Var["RoutineTime"][ RoutineTimeIndex ] = cCurrentSecond() end if Var["RoutineTime"][ RoutineTimeIndex ] + 0.1 > cCurrentSecond() then return ReturnAI["CPP"] else Var["RoutineTime"][ RoutineTimeIndex ] = cCurrentSecond() end -- 0.1초마다 체크하는 루틴 // if Var["Enemy"] == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) Var["RoutineTime"][ RoutineTimeIndex ] = nil return ReturnAI["END"] end if Var["Enemy"][ Handle ] == nil then cAIScriptSet( Handle ) cNPCVanish( Handle ) Var["RoutineTime"][ RoutineTimeIndex ] = nil return ReturnAI["END"] end if cIsObjectDead( Handle ) == 1 then cAIScriptSet( Handle ) Var["Enemy"][ Handle ] = nil Var["RoutineTime"][ RoutineTimeIndex ] = nil return ReturnAI["END"] end return ReturnAI["CPP"] end