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.
610 lines
13 KiB
610 lines
13 KiB
--------------------------------------------------------------------------------
|
|
-- Cake Progress Func --
|
|
--------------------------------------------------------------------------------
|
|
|
|
function KQInit( Var )
|
|
cExecCheck "KQInit"
|
|
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "InitCake : Var nil" )
|
|
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
|
|
|
|
--[[
|
|
-- 도어블럭 관리를 위해 투명한 도어 소환
|
|
local RegenDoor = RegenInfo["Door"]
|
|
Var["Door"] = cDoorBuild( Var["MapIndex"], RegenDoor["Index"], RegenDoor["X"], RegenDoor["Y"], 0, 1000 )
|
|
if Var["Door"] == nil
|
|
then
|
|
GoToFail( Var, "Invisible door regen fail" )
|
|
return
|
|
end
|
|
|
|
cDoorAction( Var["Door"], RegenDoor["Block"], "close" )
|
|
--]]
|
|
|
|
-- 도어블럭 관리를 위해 투명한 도어 소환
|
|
local RegenDoor = RegenInfo["Door"]
|
|
Var["Door"] = {}
|
|
for k = 1, #RegenDoor
|
|
do
|
|
local DoorInfo = RegenDoor[ k ]
|
|
Var["Door"][ k ] = cDoorBuild( Var["MapIndex"], DoorInfo["Index"], DoorInfo["X"], DoorInfo["Y"], DoorInfo["DIR"], DoorInfo["SCALE"] )
|
|
if Var["Door"][ k ] == nil
|
|
then
|
|
GoToFail( Var, "Door Npc regen fail" )
|
|
return
|
|
end
|
|
|
|
cDoorAction( Var["Door"][ k ], DoorInfo["Block"], "close" )
|
|
end
|
|
|
|
|
|
-- 케이크, 음료대포 판매 NPC 소환
|
|
local RegenNPC = RegenInfo["NPC"]
|
|
for i = 1, #RegenNPC
|
|
do
|
|
cNPCRegen( Var["MapIndex"], RegenNPC[ i ] )
|
|
end
|
|
|
|
|
|
-- 다음 단계 설정
|
|
Var["StepFunc"] = StartWait
|
|
end
|
|
|
|
|
|
function StartWait( Var )
|
|
cExecCheck "StartWait"
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "StartWait : Var nil" )
|
|
return
|
|
end
|
|
|
|
|
|
-- 스텝 초기화
|
|
local StartWaitInfo = Var["StartWait"]
|
|
if StartWaitInfo == nil
|
|
then
|
|
Var["StartWait"] = {}
|
|
StartWaitInfo = Var["StartWait"]
|
|
|
|
StartWaitInfo["NextSetpWaitTime"] = Var["CurSec"] + DelayTime["StartWait"]
|
|
|
|
StartWaitInfo["DialogTime"] = Var["CurSec"]
|
|
StartWaitInfo["DialogStep"] = 1
|
|
end
|
|
|
|
|
|
-- 시작을 기다리면서 다이얼로그 출력
|
|
if StartWaitInfo["DialogTime"] ~= nil
|
|
then
|
|
|
|
if StartWaitInfo["DialogTime"] <= Var["CurSec"]
|
|
then
|
|
|
|
local DialogStep = StartWaitInfo["DialogStep"]
|
|
local MaxDialogStep = #NoticeInfo["KDCake_Role"]
|
|
|
|
if DialogStep <= MaxDialogStep
|
|
then
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["KDCake_Role"][ DialogStep ] )
|
|
|
|
StartWaitInfo["DialogTime"] = Var["CurSec"] + DelayTime["StartDialogInterval"]
|
|
StartWaitInfo["DialogStep"] = DialogStep + 1
|
|
end
|
|
|
|
|
|
if DialogStep > MaxDialogStep
|
|
then
|
|
StartWaitInfo["DialogTime"] = nil
|
|
StartWaitInfo["DialogStep"] = nil
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 다음 단계 진행
|
|
if StartWaitInfo["NextSetpWaitTime"] <= Var["CurSec"]
|
|
then
|
|
Var["StepFunc"] = RoundWait
|
|
Var["StartWait"] = nil
|
|
StartWaitInfo = nil
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function RoundWait( Var )
|
|
cExecCheck "RoundWait"
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "RoundWait : Var nil" )
|
|
return
|
|
end
|
|
|
|
|
|
-- 스텝 초기화
|
|
local RoundWaitInfo = Var["RoundWait"]
|
|
if RoundWaitInfo == nil
|
|
then
|
|
Var["RoundWait"] = {}
|
|
RoundWaitInfo = Var["RoundWait"]
|
|
|
|
RoundWaitInfo["NextSetpWaitTime"] = Var["CurSec"] + DelayTime["RoundWait"]
|
|
RoundWaitInfo["DialogTime"] = Var["CurSec"] + DelayTime["RoundStartMessage"]
|
|
|
|
cTimer( Var["MapIndex"], 0 )
|
|
|
|
Var["RoundTimeOver"] = false
|
|
end
|
|
|
|
|
|
|
|
if RoundWaitInfo["DialogTime"] ~= nil
|
|
then
|
|
|
|
if RoundWaitInfo["DialogTime"] <= Var["CurSec"]
|
|
then
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["RoundStart_10SecondAgo"], tostring( Var["Round"] ) )
|
|
|
|
RoundWaitInfo["DialogTime"] = nil
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 다음 단계 진행
|
|
if RoundWaitInfo["NextSetpWaitTime"] <= Var["CurSec"]
|
|
then
|
|
Var["StepFunc"] = RoundProcess
|
|
Var["RoundWait"] = nil
|
|
RoundWaitInfo = nil
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 라운드 진행
|
|
function RoundProcess( Var )
|
|
cExecCheck "RoundProcess"
|
|
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "RoundProcess : Var nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local RedTeamInfo = Var["Team"][ KQ_TEAM["RED"] ]
|
|
local BlueTeamInfo = Var["Team"][ KQ_TEAM["BLUE"] ]
|
|
|
|
if RedTeamInfo == nil
|
|
then
|
|
ErrorLog( "RoundProcess : RedTeamInfo nil" )
|
|
return
|
|
end
|
|
|
|
if BlueTeamInfo == nil
|
|
then
|
|
ErrorLog( "RoundProcess : BlueTeamInfo nil" )
|
|
return
|
|
end
|
|
|
|
|
|
-- 스텝 초기화
|
|
if Var["RoundEndTime"] == 0
|
|
then
|
|
|
|
-- 라운드 시작 알림
|
|
cEffectMsg_AllInMap( Var["MapIndex"], EFFECT_MSG_TYPE["EMT_WATER_START"] )
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["RoundStart"], tostring( Var["Round"] ) )
|
|
|
|
|
|
-- 도어 블럭 해제
|
|
--cDoorAction( Var["Door"], RegenInfo["Door"]["Block"], "open" )
|
|
for k = 1, #Var["Door"]
|
|
do
|
|
cDoorAction( Var["Door"][ k ], RegenInfo["Door"][ k ]["Block"], "open" )
|
|
end
|
|
|
|
|
|
-- 라운드 종료 시간 설정
|
|
Var["RoundEndTime"] = Var["CurSec"] + DelayTime["RoundLimit"]
|
|
|
|
cTimer( Var["MapIndex"], DelayTime["RoundLimit"] )
|
|
|
|
|
|
-- 초기 점수 설정
|
|
RedTeamInfo["Score"] = Player_TeamMemberCount( Var, KQ_TEAM["RED"] )
|
|
BlueTeamInfo["Score"] = Player_TeamMemberCount( Var, KQ_TEAM["BLUE"] )
|
|
|
|
cScoreBoard_AllInMap( Var["MapIndex"], true, Var["Round"], RedTeamInfo["Win"], RedTeamInfo["Score"],
|
|
BlueTeamInfo["Win"], BlueTeamInfo["Score"] )
|
|
|
|
|
|
-- 플레이어에게 킹퀘 결과 적용
|
|
for i = 1, #Var["Player"]
|
|
do
|
|
Var["Player"][ i ]["IsOut"] = false
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 플레이어 매니져
|
|
if Player_Manager( Var ) == false
|
|
then
|
|
Var["StepFunc"] = KQReward
|
|
Var["RoundEndTime"] = 0
|
|
return
|
|
end
|
|
|
|
|
|
-- 점수 확인, 다음 단계 진행
|
|
-- 한쪽이 0이되면 다음 단계로 진행해야한다.
|
|
if RedTeamInfo["Score"] == 0 or BlueTeamInfo["Score"] == 0
|
|
then
|
|
Var["StepFunc"] = RoundEnd
|
|
Var["RoundEndTime"] = 0
|
|
|
|
Var["RoundTimeOver"]= false
|
|
return
|
|
end
|
|
|
|
|
|
-- 시간 확인, 다음 단계 진행
|
|
if Var["RoundEndTime"] <= Var["CurSec"]
|
|
then
|
|
Var["StepFunc"] = RoundEnd
|
|
Var["RoundEndTime"] = 0
|
|
|
|
Var["RoundTimeOver"]= true
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 라운드 종료
|
|
function RoundEnd( Var )
|
|
cExecCheck "RoundEnd"
|
|
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "RoundProcess : Var nil" )
|
|
return
|
|
end
|
|
|
|
|
|
local RedTeamInfo = Var["Team"][ KQ_TEAM["RED"] ]
|
|
local BlueTeamInfo = Var["Team"][ KQ_TEAM["BLUE"] ]
|
|
|
|
if RedTeamInfo == nil
|
|
then
|
|
ErrorLog( "RoundProcess : RedTeamInfo nil" )
|
|
return
|
|
end
|
|
|
|
if BlueTeamInfo == nil
|
|
then
|
|
ErrorLog( "RoundProcess : BlueTeamInfo nil" )
|
|
return
|
|
end
|
|
|
|
|
|
|
|
-- 스텝 초기화
|
|
local RoundEndInfo = Var["RoundEnd"]
|
|
if RoundEndInfo == nil
|
|
then
|
|
Var["RoundEnd"] = {}
|
|
RoundEndInfo = Var["RoundEnd"]
|
|
|
|
|
|
RoundEndInfo["NextSetpWaitTime"] = Var["CurSec"] + DelayTime["RoundEndWait"]
|
|
|
|
|
|
-- 타이머 삭제
|
|
cTimer( Var["MapIndex"], 0 )
|
|
|
|
|
|
-- 라운드 승패 처리
|
|
local Emotion = {}
|
|
|
|
if RedTeamInfo["Score"] > BlueTeamInfo["Score"] and Var["RoundTimeOver"] == false
|
|
then
|
|
|
|
-- 라운드 결과 설정 : 레드팀 승리
|
|
RedTeamInfo["Win"] = RedTeamInfo["Win"] + 1
|
|
BlueTeamInfo["Lose"] = BlueTeamInfo["Lose"] + 1
|
|
|
|
Emotion[ KQ_TEAM["RED"] ] = RoundInfo["Emotion"]["WIN"]
|
|
Emotion[ KQ_TEAM["BLUE"] ] = RoundInfo["Emotion"]["LOSE"]
|
|
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["RoundEnd"][ KQ_TEAM["RED"] ], tostring( Var["Round"] ) )
|
|
|
|
elseif RedTeamInfo["Score"] < BlueTeamInfo["Score"] and Var["RoundTimeOver"] == false
|
|
then
|
|
|
|
-- 라운드 결과 설정 : 블루팀 승리
|
|
RedTeamInfo["Lose"] = RedTeamInfo["Lose"] + 1
|
|
BlueTeamInfo["Win"] = BlueTeamInfo["Win"] + 1
|
|
|
|
Emotion[ KQ_TEAM["RED"] ] = RoundInfo["Emotion"]["LOSE"]
|
|
Emotion[ KQ_TEAM["BLUE"] ] = RoundInfo["Emotion"]["WIN"]
|
|
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["RoundEnd"][ KQ_TEAM["BLUE"] ], tostring( Var["Round"] ) )
|
|
|
|
else
|
|
|
|
-- 라운드 결과 설정 : 무승부
|
|
RedTeamInfo["Draw"] = RedTeamInfo["Draw"] + 1
|
|
BlueTeamInfo["Draw"] = BlueTeamInfo["Draw"] + 1
|
|
|
|
Emotion[ KQ_TEAM["RED"] ] = RoundInfo["Emotion"]["DRAW"]
|
|
Emotion[ KQ_TEAM["BLUE"] ] = RoundInfo["Emotion"]["DRAW"]
|
|
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["RoundEnd"]["DRAW"], tostring( Var["Round"] ) )
|
|
|
|
end
|
|
|
|
|
|
RedTeamInfo["Score"] = 0
|
|
BlueTeamInfo["Score"] = 0
|
|
|
|
|
|
-- 변경된 라운드 승패 정보 알림
|
|
cScoreBoard_AllInMap( Var["MapIndex"], true, Var["Round"], RedTeamInfo["Win"], RedTeamInfo["Score"],
|
|
BlueTeamInfo["Win"], BlueTeamInfo["Score"] )
|
|
|
|
-- 이모션
|
|
for i = 1, #Var["Player"]
|
|
do
|
|
local PlayerInfo = Var["Player"][ i ]
|
|
|
|
if PlayerInfo["IsInMap"] == true
|
|
then
|
|
|
|
cSetAbstate( PlayerInfo["Handle"], "StaAdlFStun", 1, (DelayTime["RoundEndWait"] * 1000) )
|
|
cEmotion( PlayerInfo["Handle"], Emotion[ PlayerInfo["TeamType"] ] )
|
|
|
|
end
|
|
|
|
PlayerInfo["CakeHandle"] = nil
|
|
PlayerInfo["CakeAbstateTime"] = 0
|
|
PlayerInfo["PrisonLinkToWaitTime"] = 0
|
|
PlayerInfo["IsOut"] = false
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 대기 시간 확인
|
|
if RoundEndInfo["NextSetpWaitTime"] > Var["CurSec"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
-- 킹퀘 종료 조건 확인
|
|
if Var["Round"] >= RoundInfo["LastRound"] or
|
|
RedTeamInfo["Win"] >= RoundInfo["WinRound"] or
|
|
BlueTeamInfo["Win"] >= RoundInfo["WinRound"]
|
|
then
|
|
|
|
Var["StepFunc"] = KQReward
|
|
|
|
else
|
|
|
|
Var["Round"] = Var["Round"] + 1
|
|
Var["StepFunc"] = RoundWait
|
|
|
|
|
|
-- 도어 블럭 설정
|
|
-- cDoorAction( Var["Door"], RegenInfo["Door"]["Block"], "close" )
|
|
for k = 1, #Var["Door"]
|
|
do
|
|
cDoorAction( Var["Door"][ k ], RegenInfo["Door"][ k ]["Block"], "close" )
|
|
end
|
|
|
|
-- 플레이어 각팀 위치로 옮겨주기
|
|
for i = 1, #Var["Player"]
|
|
do
|
|
local PlayerInfo = Var["Player"][ i ]
|
|
local RegenLocInfo = TeamRegenLocation[ PlayerInfo["TeamType"] ]
|
|
|
|
if PlayerInfo["IsInMap"] == true and RegenLocInfo ~= nil
|
|
then
|
|
|
|
cCastTeleport( PlayerInfo["Handle"], "SpecificCoord", RegenLocInfo["X"], RegenLocInfo["Y"] )
|
|
--cLinkTo( PlayerInfo["Handle"], Var["MapIndex"], RegenLocInfo["X"], RegenLocInfo["Y"] )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
Var["RoundEnd"] = nil
|
|
RoundEndInfo = nil
|
|
|
|
end
|
|
|
|
|
|
function KQReward( Var )
|
|
cExecCheck "KQReward"
|
|
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "KQReward : Var nil" )
|
|
return
|
|
end
|
|
|
|
|
|
-- 타이머 삭제
|
|
cTimer( Var["MapIndex"], 0 )
|
|
|
|
|
|
local RedTeamInfo = Var["Team"][ KQ_TEAM["RED"] ]
|
|
local BlueTeamInfo = Var["Team"][ KQ_TEAM["BLUE"] ]
|
|
|
|
if RedTeamInfo == nil
|
|
then
|
|
ErrorLog( "KQReward : RedTeamInfo nil" )
|
|
return
|
|
end
|
|
|
|
if BlueTeamInfo == nil
|
|
then
|
|
ErrorLog( "KQReward : BlueTeamInfo nil" )
|
|
return
|
|
end
|
|
|
|
|
|
-- 킹덤 퀘스트 결과
|
|
local KQResult = {}
|
|
|
|
-- 킹덤 퀘스트 결과
|
|
if RedTeamInfo["Win"] > BlueTeamInfo["Win"]
|
|
then
|
|
-- 레드팀 승리
|
|
KQResult[ KQ_TEAM["RED"] ] = "WIN"
|
|
KQResult[ KQ_TEAM["BLUE"] ] = "LOSE"
|
|
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["KQEnd"][ KQ_TEAM["RED"] ] )
|
|
|
|
elseif RedTeamInfo["Win"] < BlueTeamInfo["Win"]
|
|
then
|
|
-- 블루팀 승리
|
|
KQResult[ KQ_TEAM["RED"] ] = "LOSE"
|
|
KQResult[ KQ_TEAM["BLUE"] ] = "WIN"
|
|
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["KQEnd"][ KQ_TEAM["BLUE"] ] )
|
|
|
|
else
|
|
-- 무승부
|
|
KQResult[ KQ_TEAM["RED"] ] = "DRAW"
|
|
KQResult[ KQ_TEAM["BLUE"] ] = "DRAW"
|
|
|
|
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["KQEnd"]["DRAW"] )
|
|
|
|
end
|
|
|
|
|
|
-- 플레이어에게 킹퀘 결과 적용
|
|
local PlayerList = Var["Player"]
|
|
if PlayerList == nil
|
|
then
|
|
ErrorLog( "KQReward : PlayerList nil" )
|
|
return
|
|
end
|
|
|
|
for i = 1, #PlayerList
|
|
do
|
|
local PlayerInfo = PlayerList[ i ]
|
|
local RewardInfo = CakeWarResult[ KQResult[ PlayerInfo["TeamType"] ] ]
|
|
|
|
if cIsInMap( PlayerInfo["Handle"], Var["MapIndex"] ) ~= nil
|
|
then
|
|
|
|
cEffectMsg( PlayerInfo["Handle"], RewardInfo["EffectMsg"] )
|
|
cKQRewardIndex( PlayerInfo["Handle"], RewardInfo["RewardIndex"] )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 종료 진행
|
|
Var["StepFunc"] = ReturnToHome
|
|
|
|
end
|
|
|
|
|
|
-- 귀환
|
|
function ReturnToHome( Var )
|
|
cExecCheck "ReturnToHome"
|
|
|
|
|
|
if Var == nil
|
|
then
|
|
ErrorLog( "ReturnToHome : Var nil" )
|
|
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["KQReturn"]["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"] )
|
|
cVanishAll();
|
|
|
|
Var["ReturnToHome"] = nil
|
|
if cEndOfKingdomQuest( Var["MapIndex"] ) == nil
|
|
then
|
|
ErrorLog( "ReturnToHome::Function cEndOfKingdomQuest failed" )
|
|
end
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
|