-------------------------------------------------------------------------------- -- Arena Progress Func -- -------------------------------------------------------------------------------- -- 아레나 초기화 function InitArena( Var ) cExecCheck "InitArena" if Var == nil then return end local Regen_ArenaGate = RegenInfo[ "NPC" ][ "ArenaGate" ] local Regen_ArenaStone = RegenInfo[ "NPC" ][ "ArenaStone" ] local Regen_ArenaCrystal = RegenInfo[ "Monster" ][ "ArenaCrystal" ] local Regen_ArenaWarrior = RegenInfo[ "Monster" ][ "AncientArenaWarrior" ] local Regen_Handle = nil -- 순간 이동 게이트 생성 Var[ "ArenaGate" ][ "Count" ] = #Regen_ArenaGate for i = 1, Var[ "ArenaGate" ][ "Count" ] do Regen_Handle = cMobRegen_XY( Var[ "MapIndex" ], Regen_ArenaGate[ i ][ "Index" ], Regen_ArenaGate[ i ][ "X" ], Regen_ArenaGate[ i ][ "Y" ], Regen_ArenaGate[ i ][ "Dir" ] ) if Regen_Handle ~= nil then cSetAIScript ( MainLuaScriptPath, Regen_Handle ) cAIScriptFunc( Regen_Handle, "Entrance", "DummyRoutineFunc" ) cAIScriptFunc( Regen_Handle, "NPCClick", "ArenaGate_Click" ) Var[ "ArenaGate" ][ i ] = Regen_Handle end end -- 크리스탈 수호석 생성 Var[ "ArenaStone" ][ "Count" ] = #Regen_ArenaStone for i = 1, Var[ "ArenaStone" ][ "Count" ] do Regen_Handle = cMobRegen_XY( Var[ "MapIndex" ], Regen_ArenaStone[ i ][ "Index" ], Regen_ArenaStone[ i ][ "X" ], Regen_ArenaStone[ i ][ "Y" ], Regen_ArenaStone[ i ][ "Dir" ] ) if Regen_Handle ~= nil then cSetAIScript ( MainLuaScriptPath, Regen_Handle ) cAIScriptFunc( Regen_Handle, "Entrance", "ArenaStone_Entrance" ) Var[ "ArenaStone" ][ i ] = Regen_Handle Var[ "ArenaStone" ][ "SkillUseTime" ][ Regen_Handle ] = Var[ "CurSec" ] + ArenaStone[ "IntervalTime" ] end end -- 크리스탈 생성 Regen_Handle = cMobRegen_XY( Var[ "MapIndex" ], Regen_ArenaCrystal[ "Index" ], Regen_ArenaCrystal[ "X" ], Regen_ArenaCrystal[ "Y" ], Regen_ArenaCrystal[ "Dir" ] ) if Regen_Handle ~= nil then cSetAbstate( Regen_Handle, ArenaCrystal[ "RegenAbsatate" ][ "Index" ], ArenaCrystal[ "RegenAbsatate" ][ "Str" ], ArenaCrystal[ "RegenAbsatate" ][ "KeepTime" ] ) cSetAIScript ( MainLuaScriptPath, Regen_Handle ) cAIScriptFunc( Regen_Handle, "Entrance", "ArenaCrystal_Entrance" ) Var[ "ArenaCrystal" ][ "Handle" ] = Regen_Handle Var[ "ArenaCrystal" ][ "VanishTime" ] = nil Var[ "ArenaCrystal" ][ "SkillUseTime" ] = Var[ "CurSec" ] + ArenaCrystal[ "Routine" ][ "BlastTime" ] end -- 고대 아레나 용사 생성 Var[ "AncientArenaWarrior" ][ "Count" ] = #Regen_ArenaWarrior for i = 1, Var[ "AncientArenaWarrior" ][ "Count" ] do Var[ "AncientArenaWarrior" ][ i ] = {} Var[ "AncientArenaWarrior" ][ i ][ "Handle" ] = cMobRegen_XY( Var[ "MapIndex" ], Regen_ArenaWarrior[ i ][ "Index" ], Regen_ArenaWarrior[ i ][ "X" ], Regen_ArenaWarrior[ i ][ "Y" ], Regen_ArenaWarrior[ i ][ "Dir" ] ) Var[ "AncientArenaWarrior" ][ i ][ "RegenTime" ] = nil end -- 다음 단계 설정 Var["StepFunc"] = StartWait DebugLog( "End InitArena" ) end -- 아레나 시작 대기 function StartWait( Var ) cExecCheck "StartWait" if Var == nil then return end -- 킹덤 퀘스트 시작 전에 플레이어의 첫 로그인을 기다린다. if #Var[ "Player" ] < 1 then if Var["InitialSec"] + WAIT_PLAYER_MAP_LOGIN_SEC_MAX <= cCurrentSecond() then cEndOfKingdomQuest( Var[ "MapIndex" ] ) return end return end -- 스텝 초기화 if Var[ "StartWait" ] == nil then DebugLog( "Start StartWait" ) -- 대기 시간, 다이얼로그 정보 설정 Var[ "StartWait" ] = {} Var[ "StartWait" ][ "WaitTime" ] = Var[ "CurSec" ] + DelayTime[ "StartWait" ] Var[ "StartWait" ][ "EffectTime" ] = Var[ "CurSec" ] + DelayTime[ "BeforeStartEffect" ] Var[ "StartWait" ][ "DialogTime" ] = Var[ "CurSec" ] + DelayTime[ "BeforeStartDialog" ] Var[ "StartWait" ][ "DialogStep" ] = 1 end -- 시작 이펙트 메시지 출력 if Var[ "StartWait" ][ "EffectTime" ] ~= nil then if Var[ "StartWait" ][ "EffectTime" ] <= Var[ "CurSec" ] then cStartMsg_AllInMap( Var[ "MapIndex" ] ) Var[ "StartWait" ][ "EffectTime" ] = nil end end -- 다이얼로그 출력 if Var[ "StartWait" ][ "DialogTime" ] ~= nil then if Var[ "StartWait" ][ "DialogTime" ] <= Var[ "CurSec" ] then local DialogStep = Var[ "StartWait" ][ "DialogStep" ] local MaxDialogStep = #NPCDialogInfo[ "StartWait" ] if DialogStep <= MaxDialogStep then cMobDialog( Var[ "MapIndex" ], NPCDialogInfo[ "StartWait" ][ DialogStep ][ "FaceCut" ], NPCDialogInfo[ "ScriptFileName" ], NPCDialogInfo[ "StartWait" ][ DialogStep ][ "Index" ] ) Var[ "StartWait" ][ "DialogTime" ] = Var[ "CurSec" ] + DelayTime[ "BetweenStartDialog" ] Var[ "StartWait" ][ "DialogStep" ] = DialogStep + 1 end if Var[ "StartWait" ][ "DialogStep" ] > MaxDialogStep then Var[ "StartWait" ][ "DialogTime" ] = nil Var[ "StartWait" ][ "DialogStep" ] = nil end end end -- 다음 단계 진행 if Var[ "StartWait" ][ "WaitTime" ] <= Var[ "CurSec" ] then Var["StepFunc"] = ArenaProcess Var[ "StartWait" ] = nil DebugLog( "End StartWait" ) end end -- 아레나 진행 function ArenaProcess( Var ) cExecCheck "ArenaProcess" if Var == nil then return end -- 스텝 초기화 if Var[ "ArenaProcess" ] == nil then -- 아레나 진행 설정 Var[ "KQLimitTime" ] = Var[ "CurSec" ] + DelayTime[ "ArenaKeepTime" ] cTimer( Var[ "MapIndex" ], DelayTime[ "ArenaKeepTime" ] ) cScoreInfo_AllInMap( Var[ "MapIndex" ], #TeamNumberList, Var["Team"][ RED_TEAM ][ "Score" ], Var["Team"][ BLUE_TEAM ][ "Score" ] ) Var[ "ArenaProcess" ] = {} Var[ "ArenaProcess" ][ "ProcessTime" ] = Var[ "CurSec" ] + DelayTime[ "ArenaProcessIntervalTime" ] -- 깃발 소환 for i = 1, #TeamNumberList do local TeamNumber = TeamNumberList[ i ] local Regen_Flag = RegenInfo[ "NPC" ][ "ArenaFlag" ][ TeamNumber ] Var[ "ArenaFlag" ][ TeamNumber ][ "PlayerHandle" ] = nil Var[ "ArenaFlag" ][ TeamNumber ][ "Handle" ] = nil Regen_Handle = cMobRegen_XY( Var[ "MapIndex" ], Regen_Flag[ "Index" ], Regen_Flag[ "X" ], Regen_Flag[ "Y" ], Regen_Flag[ "Dir" ] ) if Regen_Handle ~= nil then cSetAIScript ( MainLuaScriptPath, Regen_Handle ) cAIScriptFunc( Regen_Handle, "Entrance", "ArenaFlag_Entrance" ) Var[ "ArenaFlag" ][ TeamNumber ][ "Handle" ] = Regen_Handle Var[ "ArenaFlag" ][ TeamNumber ][ "PlayerHandle" ] = nil Var[ "ArenaFlag" ][ TeamNumber ][ "PlayerTeam" ] = nil Var[ "ArenaFlag" ][ TeamNumber ][ "Drop_LifeTime" ] = nil Var[ "ArenaFlag" ][ TeamNumber ][ "X" ] = Regen_Flag[ "X" ] Var[ "ArenaFlag" ][ TeamNumber ][ "Y" ] = Regen_Flag[ "Y" ] Var[ "ArenaFlag" ][ TeamNumber ][ "GoalConditionNoticeTime" ] = nil Var[ "ArenaFlag" ][ TeamNumber ][ "Penalty"] = nil end end end ArenaFlag_Manager( Var ) if Var[ "ArenaProcess" ][ "ProcessTime" ] <= Var[ "CurSec" ] then ArenaFlagMarking_Manager( Var ) ArenaMonster_Manager( Var ) Player_Manager( Var ) end if Var[ "KQLimitTime" ] <= Var[ "CurSec" ] then ------------------------------------------------------------ -- 모든 오브젝트 삭제 ------------------------------------------------------------ -- 깃발 삭제 for i = 1, #TeamNumberList do cNPCVanish( Var[ "ArenaFlag" ][ TeamNumberList[ i ] ][ "Handle" ] ) end -- 순간 이동 게이트 삭제 for i = 1, Var[ "ArenaGate" ][ "Count" ] do cNPCVanish( Var[ "ArenaGate" ][ i ] ) end -- 크리스탈 수호석 삭제 for i = 1, Var[ "ArenaStone" ][ "Count" ] do cNPCVanish( Var[ "ArenaStone" ][ i ] ) end -- 크리스탈 삭제 cNPCVanish( Var[ "ArenaCrystal" ][ "Handle" ] ) -- 고대 아레나 용사 삭제 for i = 1, Var[ "AncientArenaWarrior" ][ "Count" ] do cNPCVanish( Var[ "AncientArenaWarrior" ][ i ] ) end ------------------------------------------------------------ -- 결과 처리 ------------------------------------------------------------ cTimer( Var[ "MapIndex" ], 0 ) local Result = {} if Var[ "Team" ][ RED_TEAM ][ "Score" ] == Var[ "Team" ][ BLUE_TEAM ][ "Score" ] then Result[ RED_TEAM ] = ArenaResult[ "DRAW" ] Result[ BLUE_TEAM ] = ArenaResult[ "DRAW" ] elseif Var[ "Team" ][ RED_TEAM ][ "Score" ] < Var[ "Team" ][ BLUE_TEAM ][ "Score" ] then Result[ RED_TEAM ] = ArenaResult[ "LOSE" ] Result[ BLUE_TEAM ] = ArenaResult[ "WIN" ] else Result[ RED_TEAM ] = ArenaResult[ "WIN" ] Result[ BLUE_TEAM ] = ArenaResult[ "LOSE" ] end for i = 1, #Var[ "Player" ] do local TeamNo = Var[ "Player" ][ i ][ "TeamNumber" ] if Result[ TeamNo ] ~= nil then if Result[ TeamNo ][ "EffectMsg" ] ~= nil then cEffectMsg( Var[ "Player" ][ i ][ "Handle" ], Result[ TeamNo ][ "EffectMsg" ] ) end if Result[ TeamNo ][ "RewardIndex" ] ~= nil then cKQRewardIndex( Var[ "Player" ][ i ][ "Handle" ], Result[ TeamNo ][ "RewardIndex" ] ) end if Result[ TeamNo ][ "RewardAbs" ] ~= nil then cSetAbstate( Var[ "Player" ][ i ][ "Handle" ], Result[ TeamNo ][ "RewardAbs" ][ "Index" ], Result[ TeamNo ][ "RewardAbs" ][ "Str" ], Result[ TeamNo ][ "RewardAbs" ][ "KeepTime" ] ) end cViewSlotUnEquipAll( Var[ "Player" ][ i ][ "Handle" ] ) end end -- 팀 별 처리 for i = 1, #TeamNumberList do -- 팀 관련 데이터 local TeamNumber = TeamNumberList[i] local FlagData = ArenaFlag[ TeamNumber ] local PenaltyData = ArenaFlag["Penalty"] local PlayerHandle = Var["ArenaFlag"][TeamNumber]["PlayerHandle"] -- 주자 확인, 처리 if PlayerHandle ~= nil then -- 화살표 삭제 cDelDirectionalArrow( PlayerHandle ) -- 깃발 상태이상 제거 cResetAbstate( PlayerHandle, FlagData["Abstate"]["Index"] ) -- 패널티 제거 for PenaltyIndex = 1, #PenaltyData["Abstate"] do cResetAbstate( PlayerHandle, PenaltyData["Abstate"][PenaltyIndex][ "Index" ] ) end end end cSetTeamBattle( Var[ "MapIndex" ], false ) Var["StepFunc"] = ReturnToHome Var[ "ArenaProcess" ] = nil Var[ "KQLimitTime" ] = 0 DebugLog( "End ArenaProcess" ) end end -- 귀환 function ReturnToHome( Var ) cExecCheck "ReturnToHome" if Var == nil then return end if Var["ReturnToHome"] == nil then DebugLog( "Start ReturnToHome" ) Var["ReturnToHome"] = {} Var["ReturnToHome"]["ReturnStepSec"] = Var["CurSec"] Var["ReturnToHome"]["ReturnStepNo"] = 1 end -- Return : return notice substep if Var["ReturnToHome"]["ReturnStepNo"] <= #NoticeInfo["KQReturn"] then if Var["ReturnToHome"]["ReturnStepSec"] <= Var["CurSec"] then -- Notice of Escape if NoticeInfo["KQReturn"][ Var["ReturnToHome"]["ReturnStepNo"] ]["Index"] ~= nil then cNotice( Var["MapIndex"], NoticeInfo["ScriptFileName"], NoticeInfo["KQReturn"][ Var["ReturnToHome"]["ReturnStepNo"] ]["Index"] ) end -- Go To Next Notice Var["ReturnToHome"]["ReturnStepNo"] = Var["ReturnToHome"]["ReturnStepNo"] + 1 Var["ReturnToHome"]["ReturnStepSec"] = Var["CurSec"] + DelayTime["GapKQReturnNotice"] end return end -- Return : linkto substep if Var["ReturnToHome"]["ReturnStepNo"] > #NoticeInfo["KQReturn"] then if Var["ReturnToHome"]["ReturnStepSec"] <= Var["CurSec"] then --Finish_KQ cLinkToAll( Var["MapIndex"], LinkInfo["ReturnMap"]["MapIndex"], LinkInfo["ReturnMap"]["x"], LinkInfo["ReturnMap"]["y"] ) Var["ReturnToHome"] = nil if cEndOfKingdomQuest( Var["MapIndex"] ) == nil then ErrorLog( "ReturnToHome::Function cEndOfKingdomQuest failed" ) end DebugLog( "End ReturnToHome" ) end return end end