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.
 
 
SigFiesta/LuaScript/KQ/KDSpring/KDSpring_StepFunc.lua

1100 lines
31 KiB

------------------------------------------------------------------------------------------
-- 팀 나누기 대기 --
------------------------------------------------------------------------------------------
function SF_DIVIDE_TEAM_WAIT( KSMemory, nCurSec )
cExecCheck "SF_DIVIDE_TEAM_WAIT"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if #KSMemory["PLAYER_LIST"] >= KQ_MAX_PLAYER
then -- 게임 참여 인원 확인
KSMemory["STEP_NEXT_TIME"] = nCurSec -- 다음 단계(팀 나누기)로 진행하기 위해 시간 설정
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
for i = 1, #KSMemory["PLAYER_LIST"]
do -- 모든 플레이어 파티 해제
cPartyLeave( KSMemory["PLAYER_LIST"][i]["PHND"] )
end
if #KQ_STEP >= (KSMemory["STEP_NO"] + 1)
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
return true
end
------------------------------------------------------------------------------------------
-- 팀 나누기 --
------------------------------------------------------------------------------------------
function SF_DIVIDE_TEAM( KSMemory, nCurSec )
cExecCheck "SF_DIVIDE_TEAM"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
local nConnectNum = #KSMemory["PLAYER_LIST"] -- 킹덤 퀘스트 맵에 접속해있는 플레이어 수
-- 게임 참가 플레이어 확인
for i = 1, nConnectNum
do
if cIsInMap( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"] ) == nil
then -- 킹덤 퀘스트 맵에 접속해있는지 확인
nConnectNum = nConnectNum - 1
KSMemory["PLAYER_LIST"][i]["PIS_MAP"] = false
end
end
if nConnectNum <= 1
then -- 킹덤 퀘스트맵에 접속해있는 플레이어 수 확인
return false
end
-- 문 닫기
for i = 1, #KSMemory["DOOR_LIST"]
do
cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "close" )
end
for i = 1, #KQ_NPC
do -- NPC 소환
cNPCRegen( KSMemory["FIELD_NAME"], KQ_NPC[i] )
end
local TeamInfo = KSMemory["TEAM_LIST"] -- 팀 정보
local nTeamNo = KQ_TEAM_NO["KTN_DEFAULT"] -- 팀 번호
local nTeamMemberMaxNum = nConnectNum / 2 -- 팀 멤버 최대맴수
if TeamInfo == nil
then -- 팀 정보 확인
return false
end
-- 게임 참가 플레이어 팀 나누기
for i = 1, #KSMemory["PLAYER_LIST"]
do
if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == true
then -- 킹덤 퀘스트맵에 접속해있는 플레이어
-- 50% 확률로 팀 설정
if cPermileRate( 500 ) == 1
then -- 레드 팀
nTeamNo = KQ_TEAM_NO["KTN_RED"]
if #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"] >= nTeamMemberMaxNum
then -- 레드 팀 멤버 수 확인
if #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"] < nTeamMemberMaxNum
then -- 블루 팀 멤버 수 확인
nTeamNo = KQ_TEAM_NO["KTN_BLUE"]
end
end
else -- 블루 팀
nTeamNo = KQ_TEAM_NO["KTN_BLUE"]
if #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"] >= nTeamMemberMaxNum
then -- 블루 팀 멤버 수 확인
if #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"] < nTeamMemberMaxNum
then -- 레드 팀 멤버 수 확인
nTeamNo = KQ_TEAM_NO["KTN_RED"]
end
end
end
local nIndex = (#TeamInfo[nTeamNo]["TMEMBER_LIST"] + 1) -- 팀 멤버 리스트 인덱스
TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex] = KSMemory["PLAYER_LIST"][i]["PHND"] -- 팀 멤버 리스트
KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] = nTeamNo -- 플레이어 팀 번호
if nIndex > 1
then -- 파티 참가
cPartyJoin( TeamInfo[nTeamNo]["TMEMBER_LIST"][1], TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex] )
end
-- for j = 1, #KQ_TEAM[nTeamNo]["KT_UNIFORM"]
-- do -- 유니폼 설정
-- cViewSlotEquip( TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex], KQ_TEAM[nTeamNo]["KT_UNIFORM"][j] )
-- end
end
end
-- 게임 참가자 팀 위치로 이동
for i = 1, #KSMemory["PLAYER_LIST"]
do
nTeamNo = KSMemory["PLAYER_LIST"][i]["PTEAM_NO"]
if nTeamNo ~= KQ_TEAM_NO["KTN_DEFAULT"]
then -- 팀 번호 확인
cLinkTo( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"] )
end
end
if #KQ_STEP >= (KSMemory["STEP_NO"] + 1)
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
return true
end
------------------------------------------------------------------------------------------
-- 시작 대기 --
------------------------------------------------------------------------------------------
function SF_START_WAIT( KSMemory, nCurSec )
cExecCheck "SF_START_WAIT"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
if KSMemory["FLAG_INFO"] == nil
then -- 깃발 정보 확인
return false
end
cStartMsg_AllInMap( KSMemory["FIELD_NAME"] ) -- 킹퀘 시작 카운트 다운
-- 아이템 몬스터 소환
for i = 1, #KQ_ITEM_MOB
do
KSMemory["MOB_LIST"][i] = {}
KSMemory["MOB_LIST"][i]["MHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_ITEM_MOB[i]["KIM_INDEX"], KQ_ITEM_MOB[i]["KIM_X"], KQ_ITEM_MOB[i]["KIM_Y"], KQ_ITEM_MOB[i]["KIM_DIR"] )
KSMemory["MOB_LIST"][i]["MREGEN_TIME"] = 0
end
local nNextStep = KSMemory["STEP_NO"] + 1 -- 다음 단계
-- 깃발 소환
KSMemory["FLAG_INFO"]["FHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_FLAG_POINT["KFP_INDEX"], KQ_FLAG_POINT["KFP_X"], KQ_FLAG_POINT["KFP_Y"], KQ_FLAG_POINT["KFP_DIR"] )
if KSMemory["FLAG_INFO"]["FHND"] == nil then
nNextStep = 10 -- SF_END_WAIT
else
KSMemory["FLAG_INFO"]["FINDEX"] = KQ_FLAG_POINT["KFP_INDEX"]
-- 깃발 루아 스크립트 설정
cSetAIScript( KQ_SCRIPT_NAME, KSMemory["FLAG_INFO"]["FHND"] )
cAIScriptFunc( KSMemory["FLAG_INFO"]["FHND"], "Entrance", "KF_FLGAG_OBJECT" )
end
if #KQ_STEP >= nNextStep
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = nNextStep -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
return true
end
------------------------------------------------------------------------------------------
-- 시작 --
------------------------------------------------------------------------------------------
function SF_START( KSMemory, nCurSec )
cExecCheck "SF_START"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
-- 문 열기
for i = 1, #KSMemory["DOOR_LIST"]
do
cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "open" )
end
if #KQ_STEP >= (KSMemory["STEP_NO"] + 1)
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
-- 타이머 표시
cTimer( KSMemory["FIELD_NAME"], KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] )
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
end
------------------------------------------------------------------------------------------
-- 진행 --
------------------------------------------------------------------------------------------
function SF_ROUTINE( KSMemory, nCurSec )
cExecCheck "SF_ROUTINE"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
local TeamInfo = KSMemory["TEAM_LIST"]
local FlagInfo = KSMemory["FLAG_INFO"]
if TeamInfo == nil
then
return false
end
if FlagInfo == nil
then
return false
end
-- 깃발 들고 있는 플레이어 확인
FLAG_PLAYER_CHECK( KSMemory, nCurSec )
if FlagInfo["FREGEN_TIME"] ~= 0
then -- 깃발 포인트 리젠 대기 중
if nCurSec >= FlagInfo["FREGEN_TIME"]
then -- 깃발 리젠 시간 확인
-- 깃발 소환
FlagInfo["FHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_FLAG_POINT["KFP_INDEX"], KQ_FLAG_POINT["KFP_X"], KQ_FLAG_POINT["KFP_Y"], KQ_FLAG_POINT["KFP_DIR"] )
if FlagInfo["FHND"] == nil then
FlagInfo["FHND"] = KQ_INVALID_HANDLE
else
-- 깃발 루아 스크립트 설정
cSetAIScript( KQ_SCRIPT_NAME, FlagInfo["FHND"] )
cAIScriptFunc( FlagInfo["FHND"], "Entrance", "KF_FLGAG_OBJECT" )
-- 깃발 정보 초기화
FlagInfo["FPHND"] = KQ_INVALID_HANDLE
FlagInfo["FINDEX"] = KQ_FLAG_POINT["KFP_INDEX"]
FlagInfo["FPICK_TIME"] = 0
FlagInfo["FREGEN_TIME"] = 0
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"]
FlagInfo["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"]
-- 깃발 소환 알림
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_REGEN02"] )
end
end
end
if FlagInfo["FHND"] == KQ_INVALID_HANDLE and -- 깃발 핸들
FlagInfo["FPHND"] == KQ_INVALID_HANDLE and -- 깃발 획득 플레이어 핸들
FlagInfo["FREGEN_TIME"] == 0 -- 깃발 리젠 타임
then -- 킹덤 퀘스트 맵에 깃발이 존재하지는 확인
FlagInfo["FREGEN_TIME"] = KQ_FLAG_POINT["KFP_REGEN_TIME"] + nCurSec
end
if KSMemory["WORK_TICK"] <= nCurSec
then -- 일정 시간마다 처리되는 작업(1초에 한번)
if FlagInfo["FHND"] ~= KQ_INVALID_HANDLE or -- 깃발
FlagInfo["FPHND"] ~= KQ_INVALID_HANDLE -- 깃발 획득 플레이어
then
local MapMarkTable = {}
local mmData = {}
mmData["Group"] = 0
mmData["x"] = FlagInfo["FREGEN_X"]
mmData["y"] = FlagInfo["FREGEN_Y"]
mmData["KeepTime"] = 1000
mmData["IconIndex"] = KQ_FLAG_ICON
MapMarkTable[mmData["Group"]] = mmData
-- 깃발 마킹 정보 알림
cMapMark( KSMemory["FIELD_NAME"], MapMarkTable )
end
-- 게임 참가 플레이어 킹덤 퀘스트맵 접속 여부 확인
local nLogOut_RedTeam = 0 -- 레드 팀 접속하지 않은 멤버 수
local nLogOut_BlueTeam = 0 -- 블루 팀 접속하지 않은 멤버 수
for i = 1, #KSMemory["PLAYER_LIST"]
do
if KSMemory["PLAYER_LIST"] [i]["PIS_MAP"] == true
then -- 킹덤 퀘스트맵에 접속해있는 플레이어
if cIsInMap( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"] ) == nil
then -- 킹덤 퀘스트맵에 접속해있는지 확인
KSMemory["PLAYER_LIST"][i]["PIS_MAP"] = false
end
end
if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == false
then -- 킹덤 퀘스트맵에 접속하지 않은 팀원
if KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_RED"]
then
nLogOut_RedTeam = nLogOut_RedTeam + 1
elseif KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_BLUE"]
then
nLogOut_BlueTeam = nLogOut_BlueTeam + 1
end
end
end
if nLogOut_RedTeam >= #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"] or -- 레드 팀
nLogOut_BlueTeam >= #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"] -- 블루 팀
then -- 킹덤 퀘스트맵에 접속하지 않은 멤버 수 확인
TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] = 0
TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] = 0
KSMemory["GAME_TYPE"] = KQ_GAME_TYEP["KGT_EXTRATIME"]
KSMemory["STEP_NEXT_TIME"] = 0
end
-- 몬스터 확인( 아이템 몬스터 )
for i = 1, #KSMemory["MOB_LIST"]
do
if cIsObjectDead( KSMemory["MOB_LIST"][i]["MHND"] ) ~= nil
then -- 몬스터 죽었는지 확인
if KSMemory["MOB_LIST"][i]["MREGEN_TIME"] == 0
then -- 리젠 시간 설정
KSMemory["MOB_LIST"][i]["MREGEN_TIME"] = KQ_ITEM_MOB[i]["KIM_REGEN_TICK"] + nCurSec
else -- 리젠 시간 확인
if KSMemory["MOB_LIST"][i]["MREGEN_TIME"] <= nCurSec
then -- 몬스터 리젠
KSMemory["MOB_LIST"][i]["KSMM_HND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_ITEM_MOB[i]["KIM_INDEX"], KQ_ITEM_MOB[i]["KIM_X"],
KQ_ITEM_MOB[i]["KIM_Y"], KQ_ITEM_MOB[i]["KIM_DIR"] )
KSMemory["MOB_LIST"][i]["MREGEN_TIME"] = 0
end
end
end
end
-- 다음 시간 설정
KSMemory["WORK_TICK"] = nCurSec + 1
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
if FlagInfo["FPHND"] ~= KQ_INVALID_HANDLE
then -- 깃발 상태이상 해제
for k = 1, #KQ_FLAG_ABSTATE
do
cResetAbstate( FlagInfo["FPHND"], KQ_FLAG_ABSTATE[k]["KFA_INDEX"] )
end
end
if FlagInfo["FHND"] ~= KQ_INVALID_HANDLE
then -- 깃발 오브젝트 삭제
cNPCVanish( FlagInfo["FHND"] )
end
-- 깃발 정보 초기화
FlagInfo["FHND"] = KQ_INVALID_HANDLE
FlagInfo["FPHND"] = KQ_INVALID_HANDLE
FlagInfo["FINDEX"] = ""
FlagInfo["FPICK_TIME"] = 0
FlagInfo["FREGEN_TIME"] = 0
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"]
FlagInfo["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"]
-- 몬스터 삭제( 아이템 몬스터 )
for i = 1, #KSMemory["MOB_LIST"]
do
cNPCVanish( KSMemory["MOB_LIST"][i]["MHND"] )
KSMemory["MOB_LIST"][i] = nil
end
-- 팀별 득점 포인트 삭제
for i = 1, #TeamInfo
do
if TeamInfo[i]["TPOINT_HND"] ~= KQ_INVALID_HANDLE
then -- 득점 포인트 핸들 확인
cNPCVanish( TeamInfo[i]["TPOINT_HND"] )
TeamInfo[i]["TPOINT_HND"] = KQ_INVALID_HANDLE
end
end
cTimer( KSMemory["FIELD_NAME"], 0 )
local nNextStep = 10 -- SF_END_WAIT
if KSMemory["GAME_TYPE"] == KQ_GAME_TYEP["KGT_NORMAL"] and -- 일반 경기
TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] == TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] -- 무승부
then
nNextStep = KSMemory["STEP_NO"] + 1 -- SF_EXTRATIME_INIT
else
for i = 1, #KSMemory["PLAYER_LIST"]
do
cSetAbstate( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_STUN_ABSTATE["KSA_INDEX"], KQ_STUN_ABSTATE["KSA_STR"], KQ_STUN_ABSTATE["KSA_KEEPTIME"] )
end
end
if KSMemory["STEP_NEXT_TIME"] ~= 0
then
cScriptMessage( KSMemory["FIELD_NAME"], KQ_MSG["KM_GAME_TIME"][1]["KM_INDEX"] )
end
if #KQ_STEP >= nNextStep
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = nNextStep -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
return true
end
------------------------------------------------------------------------------------------
-- 연장전 진행을 위한 초기화 --
------------------------------------------------------------------------------------------
function SF_EXTRATIME_INIT( KSMemory, nCurSec )
cExecCheck "SF_EXTRATIME_INIT"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
-- 문 닫기
for i = 1, #KSMemory["DOOR_LIST"]
do
cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "close" )
end
-- 팀위치로 이동
for i = 1, #KSMemory["PLAYER_LIST"]
do
local nTeamNo = KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] -- 팀 번호
if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == true
then -- 킹덤 퀘스트맵에 접속해있는지 확인
cLinkTo( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"] )
end
end
-- 연장전 설정
KSMemory["GAME_TYPE"] = KQ_GAME_TYEP["KGT_EXTRATIME"]
if #KQ_STEP >= (KSMemory["STEP_NO"] + 1)
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
return true
end
------------------------------------------------------------------------------------------
-- 게임 끝 대기 --
------------------------------------------------------------------------------------------
function SF_END_WAIT( KSMemory, nCurSec )
cExecCheck "SF_END_WAIT"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
local TeamInfo = KSMemory["TEAM_LIST"] -- 팀 정보
local RedTeamResult = nil -- 레드 팀 결과 정보
local BlueTeamResult = nil -- 블루 팀 결과 정보
local PlayerReward = nil -- 플레이어 결과 정보
if TeamInfo == nil
then -- 팀 정보 확인
return false
end
if TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] == TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"]
then -- 무승부
RedTeamResult = KQ_RESULT["KR_DRAW"]
BlueTeamResult = KQ_RESULT["KR_DRAW"]
elseif TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] > TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"]
then -- 레드팀 승리
RedTeamResult = KQ_RESULT["KR_WIN"]
BlueTeamResult = KQ_RESULT["KR_LOSE"]
else -- 블루팀 승리
RedTeamResult = KQ_RESULT["KR_LOSE"]
BlueTeamResult = KQ_RESULT["KR_WIN"]
end
-- 게임 결과 처리
for i = 1, #KSMemory["PLAYER_LIST"]
do
if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == true
then -- 킹덤 퀘스트맵에 접속해있는지 확인
if KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_RED"]
then -- 레드 팀
PlayerReward = RedTeamResult
elseif KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_BLUE"]
then -- 블루 팀
PlayerReward = BlueTeamResult
end
cPartyLeave( KSMemory["PLAYER_LIST"][i]["PHND"] ) -- 파티 해제
cViewSlotUnEquipAll( KSMemory["PLAYER_LIST"][i]["PHND"] ) -- 코스튬 해제
cResetAbstate( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_MAPLOGIN_ABSTATE["KMA_INDEX"] ) -- 이동 속도 증가 상태이상 제거
cKQRewardIndex( KSMemory["PLAYER_LIST"][i]["PHND"], PlayerReward["KRE_REWAED"] ) -- 보상
cEffectMsg( KSMemory["PLAYER_LIST"][i]["PHND"], PlayerReward["KRE_EFFECT_MSG"] ) -- 이펙트 메세지
cEmoticon( KSMemory["PLAYER_LIST"][i]["PHND"], PlayerReward["KRE_EMOTICON"] ) -- 이모션
end
-- 팀 번호 초기화
KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] = KQ_TEAM_NO["KTN_DEFAULT"]
end
-- 팀 정보 초기화
for i = 1, #KSMemory["TEAM_LIST"]
do
KSMemory["TEAM_LIST"][i]["TSCORE"] = 0
KSMemory["TEAM_LIST"][i]["TPOINT_HND"] = KQ_INVALID_HANDLE
KSMemory["TEAM_LIST"][i]["TMEMBER_LIST"] = nil
KSMemory["TEAM_LIST"][i]["TMEMBER_LIST"] = {}
end
-- 타이머 초기화
cTimer( KSMemory["FIELD_NAME"], 0 )
if #KQ_STEP >= (KSMemory["STEP_NO"] + 1)
then -- 다음 단계 확인
-- 단계 설정
KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간
local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보
if MsgIndex ~= nil
then -- 메세지 인덱스 확인
local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보
if MsgData ~= nil
then -- 메세지 정보 학인
KSMemory["MSG_NO"] = 1 -- 메세지 단계
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간
end
end
end
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
end
------------------------------------------------------------------------------------------
-- 게임 끝 --
------------------------------------------------------------------------------------------
function SF_END( KSMemory, nCurSec )
cExecCheck "SF_END"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KSMemory["STEP_NEXT_TIME"] <= nCurSec
then -- 현재 단계 진행 시간 확인
-- 마을로 이동
cLinkToAll( KSMemory["FIELD_NAME"], KQ_RETURN_MAP["KRM_INDEX"], KQ_RETURN_MAP["KRM_X"], KQ_RETURN_MAP["KRM_Y"] )
-- 킹덤 퀘스트 종료
cEndOfKingdomQuest( KSMemory["FIELD_NAME"] )
-- 다음 단계 설정
KSMemory["STEP_NO"] = nil
KSMemory["STEP_NEXT_TIME"] = nil
return true
end
-- 메시지 출력
KF_MESSAGE( KSMemory, nCurSec )
return true
end
------------------------------------------------------------------------------------------
-- 플레이어 깃발 확인 --
------------------------------------------------------------------------------------------
function FLAG_PLAYER_CHECK( KSMemory, nCurSec )
cExecCheck "FLAG_PLAYER_CHECK"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
local TeamInfo = KSMemory["TEAM_LIST"]
local FlagInfo = KSMemory["FLAG_INFO"]
if TeamInfo == nil
then -- 팀 정보 확인
return
end
if FlagInfo == nil
then -- 깃발 정보 확인
return
end
if FlagInfo["FREGEN_TIME"] ~= 0
then -- 깃발 리젠 타임 확인
return
end
if FlagInfo["FPHND"] == KQ_INVALID_HANDLE
then -- 깃발 획득 플레이어 확인
return
end
local PlayerInfo = nil -- 플레이어 정보
local PlayerMaxNum = #KSMemory["PLAYER_LIST"] -- 게임 참가 플레이어 수
-- 깃발 획득 플레이어 찾기
for i = 1, PlayerMaxNum
do
if FlagInfo["FPHND"] == KSMemory["PLAYER_LIST"][i]["PHND"]
then
PlayerInfo = KSMemory["PLAYER_LIST"][i]
end
end
if PlayerInfo == nil
then -- 플레이어 정보 확인
return
end
if cIsInMap( PlayerInfo["PHND"], KSMemory["FIELD_NAME"] ) == nil
then -- 킹덤 퀘스트맵에 접속해있지 않을 경우
-- 마지막 위치에 깃발 소환
FlagInfo["FHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_FLAG["KF_INDEX"], FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"], 0 )
if FlagInfo["FHND"] == nil then
FlagInfo["FHND"] = KQ_INVALID_HANDLE
else
-- 깃발 루아 스크립트 설정
cSetAIScript( KQ_SCRIPT_NAME, FlagInfo["FHND"] )
cAIScriptFunc( FlagInfo["FHND"], "Entrance", "KF_FLGAG_OBJECT" )
-- 깃발 드랍 알림
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_DROP"], PlayerInfo["PNAME"] )
-- 깃발 정보 설정
FlagInfo["FPHND"] = KQ_INVALID_HANDLE
FlagInfo["FINDEX"] = KQ_FLAG["KF_INDEX"]
FlagInfo["FPICK_TIME"] = nCurSec + KQ_FLAG["KF_PICK_DELAY"]
FlagInfo["FREGEN_TIME"] = 0
-- 득점 포인트 삭제
if TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ~= KQ_INVALID_HANDLE
then
cNPCVanish( TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] )
TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] = KQ_INVALID_HANDLE
end
end
else
-- 깃발 상태이상 지속시간
local RestTime = cAbstateRestTime( PlayerInfo["PHND"], KQ_FLAG_ABSTATE[1]["KFA_INDEX"] )
if RestTime == nil
then -- 깃발 상태이상 지속시간 확인
-- 깃발 화살표 상태이상 제거
cResetAbstate( FlagInfo["FPHND"], KQ_FLAG_ABSTATE[2]["KFA_INDEX"] )
-- 깃발 소환
FlagInfo["FHND"] = cMobRegen_Obj( KQ_FLAG["KF_INDEX"], PlayerInfo["PHND"] )
if FlagInfo["FHND"] == nil then
FlagInfo["FHND"] = KQ_INVALID_HANDLE
else
-- 깃발 루아 스크립트 설정
cSetAIScript( KQ_SCRIPT_NAME, FlagInfo["FHND"] )
cAIScriptFunc( FlagInfo["FHND"], "Entrance", "KF_FLGAG_OBJECT" )
-- 깃발 드랍 알림
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_DROP"], PlayerInfo["PNAME"] )
-- 깃발 정보 설정
FlagInfo["FPHND"] = KQ_INVALID_HANDLE
FlagInfo["FINDEX"] = KQ_FLAG["KF_INDEX"]
FlagInfo["FPICK_TIME"] = nCurSec + KQ_FLAG["KF_PICK_DELAY"]
FlagInfo["FREGEN_TIME"] = 0
-- 깃발 위치 설정
FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"] = cObjectLocate( PlayerInfo["PHND"] )
if FlagInfo["FREGEN_X"] == nil or FlagInfo["FREGEN_Y"] == nil
then -- 플레이어 위치 정보 확인
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"]
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_Y"]
end
-- 득점 포인트 삭제
if TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ~= KQ_INVALID_HANDLE
then
cNPCVanish( TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] )
TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] = KQ_INVALID_HANDLE
end
end
else
if TeamInfo[PlayerInfo["PTEAM_NO"]] ~= nil
then -- 플레이어 정보 확인
-- 플레이어 위치
FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"] = cObjectLocate( PlayerInfo["PHND"] )
if FlagInfo["FREGEN_X"] == nil or FlagInfo["FREGEN_Y"] == nil
then -- 플레이어 위치 정보 확인
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"]
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_Y"]
end
-- 스코어 포인트 거리
local Dist = cDistanceSquar( KQ_TEAM[PlayerInfo["PTEAM_NO"]]["KT_POINT_X"], KQ_TEAM[PlayerInfo["PTEAM_NO"]]["KT_POINT_Y"], FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"] )
local CheckDist = ( KQ_TEAM_POINT_CHECK_DIST * KQ_TEAM_POINT_CHECK_DIST )
if Dist <= CheckDist
then -- 스코어 포인트 거리 확인
-- 깃발 해제
for k = 1, #KQ_FLAG_ABSTATE
do
cResetAbstate( PlayerInfo["PHND"], KQ_FLAG_ABSTATE[k]["KFA_INDEX"] )
end
-- 깃발 정보 초기화 및 리젠 시간 설정
FlagInfo["FHND"] = KQ_INVALID_HANDLE
FlagInfo["FPHND"] = KQ_INVALID_HANDLE
FlagInfo["FINDEX"] = ""
FlagInfo["FPICK_TIME"] = 0
FlagInfo["FREGEN_TIME"] = nCurSec + KQ_FLAG_POINT["KFP_REGEN_TIME"]
FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"]
FlagInfo["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"]
-- 득점
TeamInfo[PlayerInfo["PTEAM_NO"]]["TSCORE"] = TeamInfo[PlayerInfo["PTEAM_NO"]]["TSCORE"] + 1
-- 팀 정보 알림
cScoreInfo_AllInMap( KSMemory["FIELD_NAME"], #KQ_TEAM , TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"],
TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] )
-- 득점 포인트 삭제
if TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ~= KQ_INVALID_HANDLE
then
cNPCVanish( TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] )
TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] = KQ_INVALID_HANDLE
end
-- 연장전에서 득점시, 바로 경기 종료
if KSMemory["GAME_TYPE"] == KQ_GAME_TYEP["KGT_EXTRATIME"]
then
KSMemory["STEP_NEXT_TIME"] = 0
else
-- 득점 알림
if PlayerInfo["PTEAM_NO"] == KQ_TEAM_NO["KTN_RED"]
then -- 레드 팀
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_POINT_RED"], PlayerInfo["PNAME"] )
elseif PlayerInfo["PTEAM_NO"] == KQ_TEAM_NO["KTN_BLUE"]
then -- 블루 팀
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_POINT_BLUE"], PlayerInfo["PNAME"] )
end
-- 득,실점 사운드
for i = 1, #KSMemory["PLAYER_LIST"]
do
if KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == PlayerInfo["PTEAM_NO"]
then
cPlaySound( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_SOUND["KS_GETPOINT"] );
else
cPlaySound( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_SOUND["KS_LOSEPOINT"] );
end
end
-- 깃발 생성 관련 메세지 알림
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_REGEN01"] )
end
end
end
end
end
end
-- 킹덤 퀘스트 단계별 데이터
KQ_STEP =
{
--------------------------------------------------------------------------------------------
-- 진행 함수, 다음 진행 시간, 메시지 데이터( KDSpring_Data )
--------------------------------------------------------------------------------------------
{ KS_FUNC = SF_DIVIDE_TEAM_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 30, KS_MSG = nil }, -- 1 팀 나누기 대기
{ KS_FUNC = SF_DIVIDE_TEAM, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 5, KS_MSG = "KM_DIVIDE_TEAM" }, -- 2 팀 나누기
{ KS_FUNC = SF_START_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 55, KS_MSG = "KM_START_WAIT" }, -- 3 게임 시작 대기
{ KS_FUNC = SF_START, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 5, KS_MSG = nil }, -- 4 게임 시작
{ KS_FUNC = SF_ROUTINE, KS_TIMER = true, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 600, KS_MSG = nil }, -- 5 게임 진행
-- 연장전
{ KS_FUNC = SF_EXTRATIME_INIT, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 10, KS_MSG = "KM_EXTRA_TIME_WAIT" }, -- 6 연장전 시작을 위한 초기화
{ KS_FUNC = SF_START_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 10, KS_MSG = nil }, -- 7 연장전 게임 시작 대기
{ KS_FUNC = SF_START, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 5, KS_MSG = nil }, -- 8 연장전 게임 시작
{ KS_FUNC = SF_ROUTINE, KS_TIMER = true, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 180, KS_MSG = nil }, -- 9 연장전 게임 진행
{ KS_FUNC = SF_END_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 2, KS_MSG = nil }, -- 10 게임 종료 대기
{ KS_FUNC = SF_END, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 60, KS_MSG = "KM_END" }, -- 11 게임 종료
}