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.
469 lines
11 KiB
469 lines
11 KiB
--------------------------------------------------------------------------------
|
|
-- 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
|
|
|
|
|