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.
 
 

507 lines
12 KiB

--------------------------------------------------------------------------------
-- Arena Progress Func --
--------------------------------------------------------------------------------
function InitSoccer( Var )
cExecCheck "InitSoccer"
if Var == nil
then
ErrorLog( "InitSoccer : 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
-- 투명한 Door를 소환해 DoorBlock 관려가 필요함.
local RegenInvisibleDoor = RegenInfo["InvisibleDoor"]
Var["InvisibleDoor"] = cDoorBuild( Var["MapIndex"], RegenInvisibleDoor["Index"], RegenInvisibleDoor["X"], RegenInvisibleDoor["Y"], RegenInvisibleDoor["Dir"], 1000 )
if Var["InvisibleDoor"] == nil
then
GoToFail( Var, "Invisible door regen fail" )
return
end
cDoorAction( Var["InvisibleDoor"], InvisibleDoor["BlockName"], "open" )
-- 축구공 소환
SoccerBall_Regen( Var, RegenInfo["SoccerBall"]["X"], RegenInfo["SoccerBall"]["Y"], RegenInfo["SoccerBall"]["Dir"] )
cDoorAction( Var["InvisibleDoor"], InvisibleDoor["BlockName"], "close" )
-- 심판 소환
local RegenReferee = RegenInfo["Referee"]
local RefereeHandle
RefereeHandle = cMobRegen_XY( Var["MapIndex"], RegenReferee["Index"], RegenReferee["X"], RegenReferee["Y"], RegenReferee["Dir"] )
if RefereeHandle == nil
then
GoToFail( Var, "Referee regen fail" )
return
end
Var["Referee"]["Handle"] = RefereeHandle
Var["Referee"]["FollowCheckTime"] = 0
Var["Referee"]["RoutineCheckTime"] = 0
cSetAIScript ( MainLuaScriptPath, RefereeHandle )
cAIScriptFunc( RefereeHandle, "Entrance", "Referee_Routine" )
-- 골키퍼 소환
for i = 1, #RegenInfo["GoalKeeper"]
do
local RegenKeeper = RegenInfo["GoalKeeper"][ i ]
local KeeperHandle
KeeperHandle = cMobRegen_XY( Var["MapIndex"], RegenKeeper["Index"], RegenKeeper["X"], RegenKeeper["Y"], RegenKeeper["Dir"] )
if KeeperHandle == nil
then
GoToFail( Var, "Goalkeeper regen fail" )
return
end
Var["Keeper"][ i ] = {}
Var["Keeper"][ i ]["Handle"] = KeeperHandle
Var["Keeper"][ i ]["TeamType"] = RegenKeeper["TeamType"]
Var["Keeper"][ i ]["RoutineCheckTime"] = 0
Var["Keeper"][ i ]["MoveStep"] = 1
Var["Keeper"][ i ]["MoveBack"] = false
cSetAIScript ( MainLuaScriptPath, KeeperHandle )
cAIScriptFunc( KeeperHandle, "Entrance", "Keeper_Routine" )
end
-- 관중 소환
for i = 1, #RegenInfo["Spectator"]
do
cGroupRegenInstance( Var["MapIndex"], RegenInfo["Spectator"][i] )
end
-- 투명 몬스터 소환
for i = 1, #RegenInfo[ "InvisibleMonster" ]
do
local RegenInvisibleMonster = RegenInfo[ "InvisibleMonster" ][ i ]
local InvisibleMonsterHandle
InvisibleMonsterHandle = cMobRegen_XY( Var["MapIndex"], RegenInvisibleMonster[ "Index" ], RegenInvisibleMonster[ "X" ], RegenInvisibleMonster[ "Y" ], RegenInvisibleMonster[ "Dir" ] )
if InvisibleMonsterHandle == nil
then
GoToFail( Var, "InvisibleMonster regen fail" )
return
end
local setScriptResult = cSetAIScript( MainLuaScriptPath, InvisibleMonsterHandle ) --해당 스크립트의 LuaScriptScenario* 를 찾아서, 해당 몬스터에 셋팅해줍니다. 말하자면 몬스터가 AI를 학습하는것이라고 할수있습니다.
local setEntranceFunctionResult = cAIScriptFunc( InvisibleMonsterHandle, "Entrance", "InvisibleMonster_Routine" ) --해당 몬스터의 LuaAi 내 Entrance 문자열에, InvisibleMonster_Routine 루아함수 이름 문자열을 세팅합니다.
if setScriptResult == nil or
setScriptResult == 0 or
setEntranceFunctionResult == nil or
setEntranceFunctionResult == 0
then
GoToFail( Var, "InvisibleMonster setAI fail" )
return
end
Var[ "InvisibleMonster" ][ i ] = {}
Var[ "InvisibleMonster" ][ i ][ "Handle" ] = InvisibleMonsterHandle
Var[ "InvisibleMonster" ][ i ][ "MonsterNumber" ] = RegenInvisibleMonster[ "MonsterNumber" ]
Var[ "InvisibleMonster" ][ i ][ "RoutineCheckTime" ] = 0
Var[ "InvisibleMonster" ][ i ][ "MoveStep" ] = 1
Var[ "InvisibleMonster" ][ i ][ "MoveBack" ] = false
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"] + DelayTime["StartDialogInterval"]
StartWaitInfo["DialogStep"] = 1
end
-- 다이얼로그 출력
if StartWaitInfo["DialogTime"] ~= nil
then
if StartWaitInfo["DialogTime"] <= Var["CurSec"]
then
local DialogStep = StartWaitInfo["DialogStep"]
local MaxDialogStep = #Referee_Chat["StartDialog"]
if DialogStep <= MaxDialogStep
then
cScriptMsg( Var["MapIndex"], nil, Referee_Chat["StartDialog"][ DialogStep ] )
StartWaitInfo["DialogTime"] = Var["CurSec"] + DelayTime["StartDialogInterval"]
StartWaitInfo["DialogStep"] = DialogStep + 1
end
if StartWaitInfo["DialogStep"] > MaxDialogStep
then
StartWaitInfo["DialogTime"] = nil
StartWaitInfo["DialogStep"] = nil
end
end
end
-- 다음 단계 진행
if StartWaitInfo["NextSetpWaitTime"] <= Var["CurSec"]
then
Var["StepFunc"] = SoccerProcess
Var["StartWait"] = nil
StartWaitInfo = nil
end
end
function SoccerProcess( Var )
cExecCheck "SoccerProcess"
if Var == nil
then
ErrorLog( "SoccerProcess : Var nil" )
return
end
-- 스탭 초기화
if Var["KQLimitTime"] == 0
then
Var["KQLimitTime"] = Var[ "CurSec"] + DelayTime["LimitTime"]
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["Start"] )
-- cScoreInfo_AllInMap( Var["MapIndex"], KQ_TEAM["MAX"], Var["Team"][ KQ_TEAM["RED"] ], Var["Team"][ KQ_TEAM["BLUE"] ] )
cWinter_Event_ScoreBoard_AllInMap( Var["MapIndex"], Var["Team"][ KQ_TEAM["RED"] ], Var["Team"][ KQ_TEAM["BLUE"] ] )
cTimer( Var["MapIndex"], DelayTime["LimitTime"] )
end
-- 다음 단계 진행
if Var["KQLimitTime"] <= Var["CurSec"]
then
Var["StepFunc"] = SoccerEnd
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["End"] )
cScriptMsg( Var["MapIndex"], Var["Referee"]["Handle"], Referee_Chat["TimeOut"] )
return
end
-- 플레이어 관리자
if Player_Manager( Var ) == false
then
-- 어느 한쪽 팀이 전부 로그아웃되었을 경우
Var["Team"][ KQ_TEAM["RED"] ] = 0
Var["Team"][ KQ_TEAM["BLUE"] ] = 0
Var["StepFunc"] = SoccerEnd
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["End"] )
cScriptMsg( Var["MapIndex"], Var["Referee"]["Handle"], Referee_Chat["TimeOut"] )
return
end
BuffBox_Manager( Var )
SoccerBall_Manager( Var )
end
-- 경기 종료
function SoccerEnd( Var )
cExecCheck "SoccerEnd"
if Var == nil
then
ErrorLog( "SoccerEnd : Var nil" )
return
end
local TeamInfo = Var["Team"]
if TeamInfo == nil
then
ErrorLog( "SoccerEnd : Var[\"Team\"] nil" )
return
end
local PlayerList = Var["Player"]
if PlayerList == nil
then
ErrorLog( "SoccerEnd : PlayerList nil" )
return
end
Var["KQLimitTime"] = 0
cTimer( Var["MapIndex"], 0 )
local TeamReward = {}
local WinnerTeam = nil
-- 레드 팀 우승
if TeamInfo[ KQ_TEAM["RED"] ] > TeamInfo[ KQ_TEAM["BLUE"] ]
then
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["Win"][ KQ_TEAM["RED"] ] )
TeamReward[ KQ_TEAM["RED"] ] = SoccerResult["WIN"]
TeamReward[ KQ_TEAM["BLUE"] ] = SoccerResult["LOSE"]
WinnerTeam = KQ_TEAM["RED"]
-- 블루 팀 우승
elseif TeamInfo[ KQ_TEAM["RED"] ] < TeamInfo[ KQ_TEAM["BLUE"] ]
then
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["Win"][ KQ_TEAM["BLUE"] ] )
TeamReward[ KQ_TEAM["RED"] ] = SoccerResult["LOSE"]
TeamReward[ KQ_TEAM["BLUE"] ] = SoccerResult["WIN"]
WinnerTeam = KQ_TEAM["BLUE"]
-- 동점
else
cScriptMsg( Var["MapIndex"], nil, NoticeInfo["Draw"] )
TeamReward[ KQ_TEAM["RED"] ] = SoccerResult["DRAW"]
TeamReward[ KQ_TEAM["BLUE"] ] = SoccerResult["DRAW"]
end
-- 보상 지급
for i = 1, #PlayerList
do
local PlayerInfo = PlayerList[ i ]
local RewardInfo = TeamReward[ PlayerInfo["TeamType"] ]
if PlayerInfo["IsInMap"] == true and
RewardInfo ~= nil
then
cEffectMsg( PlayerInfo["Handle"], RewardInfo["EffectMsg"] )
cKQRewardIndex( PlayerInfo["Handle"], RewardInfo["RewardIndex"] )
cCharTitleAddValue( PlayerInfo["Handle"], SoccerResult["SoccerPlayerTitle"], 1 )
end
end
-- 최고 득점자 타이틀
if WinnerTeam ~= nil
then
local TopScore = 0
-- 가장 높은 점수 찾기
for i = 1, #PlayerList
do
local PlayerInfo = PlayerList[ i ]
if PlayerInfo["IsInMap"] == true
then
if TopScore < PlayerInfo["Goal"]
then
TopScore = PlayerInfo["Goal"]
end
end
end
if TopScore ~= 0
then
for i = 1, #PlayerList
do
local PlayerInfo = PlayerList[ i ]
if PlayerInfo["IsInMap"] == true
then
if TopScore == PlayerInfo["Goal"]
then
cCharTitleAddValue( PlayerInfo["Handle"], SoccerResult["SoccerTopScorerTitle"], 1 )
end
end
end
end
end
-- 도어 삭제
cNPCVanish( Var["InvisibleDoor"] )
-- 축구공 삭제
if Var["SoccerBall"] ~= nil
then
cNPCVanish( Var["SoccerBall"] )
end
-- 심판 삭제
if Var["Referee"] ~= nil
then
cNPCVanish( Var["Referee"]["Handle"] )
end
-- 골키퍼 삭제
if Var["Keeper"] ~= nil
then
for i = 1, #Var["Keeper"]
do
if Var["Keeper"][ i ]["Handle"] ~= nil
then
cNPCVanish( Var["Keeper"][ i ]["Handle"] )
end
end
end
-- 버프박스 삭제
for i = 1,#RegenInfo["BuffBox"]
do
cVanishAll( Var["MapIndex"], RegenInfo["BuffBox"][ i ]["Index"] )
end
-- 몬스터 삭제
if Var[ "InvisibleMonster" ] ~= nil
then
for i = 1, #Var[ "InvisibleMonster" ]
do
if Var[ "InvisibleMonster" ][ i ][ "Handle" ] ~= nil
then
cNPCVanish( Var[ "InvisibleMonster" ][ i ][ "Handle" ] )
end
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
--[[
--변신을 해제시켜줍니다
local PlayerList = Var[ "Player" ]
if PlayerList ~= nil
then
for i = 1, #PlayerList
do
local TargetPlayerInfo = PlayerList[ i ]
if TargetPlayerInfo ~= nil --and TargetPlayerInfo[ "IsInMap" ] == true
then
cResetAbstate( TargetPlayerInfo[ "Handle" ], LoginSetAbstate[ TargetPlayerInfo[ "TeamType" ] ] )
end
end
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