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.
 
 

551 lines
11 KiB

--------------------------------------------------------------------------------
-- Gold Hill Progress Func --
--------------------------------------------------------------------------------
-- 던전 초기화
function InitDungeon( Var )
cExecCheck "InitDungeon"
if Var == nil
then
return
end
-- 킹덤 퀘스트 시작 전에 플레이어의 첫 로그인을 기다린다.
if Var["bPlayerMapLogin"] == nil
then
if Var["InitialSec"] + WAIT_PLAYER_MAP_LOGIN_SEC_MAX <= cCurrentSecond()
then
GoToFail( Var )
return
end
return
end
-- 1초마다 체크
if Var["CurSec"] + 1 > cCurrentSecond()
then
return
else
Var["CurSec"] = cCurrentSecond()
end
if Var["InitDungeon"] == nil
then
DebugLog( "Start InitDungeon" )
local Doors = RegenInfo["Stuff"]
Var["Door"] = {}
-- 문 생성
for i = 1, #LayerNameTable
do
local LayerName = LayerNameTable[ i ]
Var["Door"][ LayerName ] = cDoorBuild( Var["MapIndex"], Doors[ LayerName ]["Index"], Doors[ LayerName ]["x"], Doors[ LayerName ]["y"], Doors[ LayerName ]["dir"], Doors[ LayerName ]["scale"] )
if Var["Door"][ LayerName ] ~= nil
then
cSetAIScript ( MainLuaScriptPath, Var["Door"][ LayerName ] )
cAIScriptFunc( Var["Door"][ LayerName ], "NPCClick", "DoorClick" )
cDoorAction( Var["Door"][ LayerName ], Doors[ LayerName ]["Block"], "close" )
end
end
Var["InitDungeon"] = {}
Var["InitDungeon"]["WaitSecDuringInit"] = Var["CurSec"] + DelayTime["AfterInit"]
end
-- 일정 시간 뒤 다음 단계로
if Var["InitDungeon"]["WaitSecDuringInit"] <= Var["CurSec"]
then
GoToNextStep( Var )
Var["InitDungeon"] = nil
DebugLog( "End InitDungeon" )
return
end
end
-- 인트로
function Intro( Var )
cExecCheck "Intro"
if Var == nil
then
return
end
-- 1초마다 체크
if Var["CurSec"] + 1 > cCurrentSecond()
then
return
else
Var["CurSec"] = cCurrentSecond()
end
if Var["Intro"] == nil
then
DebugLog( "Start Intro" )
Var["Intro"] = {}
Var["Intro"]["DialogStepSec"] = Var["CurSec"]
Var["Intro"]["DialogStepNo"] = 1
end
-- 다이얼로그(페이스컷) 단계 체크 및 실행
if Var["Intro"]["DialogStepNo"] <= #TombRaiderChat["Intro"]
then
-- 페이스컷 처리
if Var["Intro"]["DialogStepSec"] <= Var["CurSec"]
then
cMobDialog( Var["MapIndex"], RegenInfo["Mob"]["TombRaider"]["Index"], TombRaiderChat["ScriptFileName"], TombRaiderChat["Intro"][ Var["Intro"]["DialogStepNo"] ]["Index"] )
Var["Intro"]["DialogStepSec"] = Var["CurSec"] + DelayTime["BetweenIntroDialog"] -- 다음 페이스 컷 띄울 시간 셋팅
Var["Intro"]["DialogStepNo"] = Var["Intro"]["DialogStepNo"] + 1 -- 다음 페이스 컷으로 단계 셋팅
end
else
GoToNextStep( Var )
Var["Intro"] = nil
DebugLog( "End Intro" )
return
end
end
-- 황금언던 Layer 1 ~ 4
function LayerStep( Var )
cExecCheck "LayerStep"
if Var == nil
then
return
end
-- 1초마다 체크
if Var["CurSec"] + 1 > cCurrentSecond()
then
return
else
Var["CurSec"] = cCurrentSecond()
end
if Var["LayerStep"] == nil
then
Var["LayerStep"] = {}
Var["LayerStep"]["LayerNumber"] = 1
end
if Var["LayerStep"]["LayerNumber"] <= #LayerNameTable
then
local LayerName = LayerNameTable[ Var["LayerStep"]["LayerNumber"] ]
if Var[ LayerName ] == nil
then
DebugLog( "Start LayerStep "..LayerName )
-- 몬스터 소환
local CurRegenLayer = RegenInfo["Group"][ LayerName ]
for i = 1, #CurRegenLayer
do
cGroupRegenInstance( Var["MapIndex"], CurRegenLayer[i] )
end
Var[ LayerName ] = {}
-- Var[ LayerName ]["WaitSecDuringMobGen"] = Var["CurSec"] + DelayTime["AfterMobGen"]
-- 제한 시간 설정
Var["KQLimitTime"] = Var["CurSec"] + LimitTime[ LayerName ]
cShowKQTimerWithLife( Var["MapIndex"], LimitTime[ LayerName ] )
return;
end
if Var[ LayerName ]["KeyCore"] == nil
then
-- 다이얼로그 출력
cMobDialog( Var["MapIndex"], RegenInfo["Mob"]["TombRaider"]["Index"], TombRaiderChat["ScriptFileName"], TombRaiderChat[ LayerName ]["Index"] )
-- 광석 열쇠 드랍 설정
local TotalCore = 0
for i = 1, #ItemDrop["DropMob"]
do
local CoreList = { cFindNearestMobList( Var["MapIndex"], ItemDrop["DropMob"][ i ] ) }
TotalCore = TotalCore + #CoreList
for j = 1, #CoreList
do
if CoreList[ j ] ~= nil
then
cSetAIScript ( MainLuaScriptPath, CoreList[ j ] )
cAIScriptFunc( CoreList[ j ], "Entrance", "CoreBreakRoutine" )
end
end
end
local ItemDropInfo = ItemDrop[ LayerName ]
Var[ LayerName ]["KeyCore"] = {}
Var[ LayerName ]["DeadCoreCount"] = 0
for i = 1, #ItemDropInfo
do
Var[ LayerName ]["KeyCore"][i] = cRandomInt( ItemDropInfo[i]["RandMin"], ItemDropInfo[i]["RandMax"] )
Var[ LayerName ]["KeyCore"][i] = (Var[ LayerName ]["KeyCore"][i] * TotalCore) / 100
end
end
-- Fail Case : 전멸 시 혹은 플레이어가 아무도 없을 경우
if cObjectCount( Var["MapIndex"], ObjectType["Player"] ) <= 0
then
GoToFail( Var )
Var[ LayerName ] = nil
Var["LayerStep"] = nil
return
end
-- Fail Case : 타임 오버
if IsKQTimeOver( Var ) == true
then
GoToFail( Var )
Var[ LayerName ] = nil
Var["LayerStep"] = nil
return
end
else
DebugLog( "End LayerStep" )
Var["LayerStep"] = nil
GoToNextStep( Var )
return
end
end
-- 보스 전투
function LastBattle( Var )
cExecCheck "LastBattle"
if Var == nil
then
return
end
-- 1초마다 체크
if Var["CurSec"] + 1 > cCurrentSecond()
then
return
else
Var["CurSec"] = cCurrentSecond()
end
-- 최상층 셋팅
if Var["LastBattle"] == nil
then
DebugLog( "Start LastBattle" )
local RegenTombRaider = RegenInfo["Mob"]["TombRaider"]
Var["Enemy"]["TombRaider"] = cMobRegen_XY( Var["MapIndex"], RegenTombRaider["Index"], RegenTombRaider["x"], RegenTombRaider["y"], RegenTombRaider["dir"] )
Var["LastBattle"] = {}
Var["LastBattle"]["DialogStepSec"] = Var["CurSec"]
Var["LastBattle"]["DialogStepNo"] = 1
-- 제한 시간 설정
Var["KQLimitTime"] = Var["CurSec"] + LimitTime[ "LastBattle" ]
cShowKQTimerWithLife( Var["MapIndex"], LimitTime[ "LastBattle" ] )
end
-- 다이얼로그(페이스컷) 단계 체크 및 실행
if Var["LastBattle"]["DialogStepNo"] <= #TombRaiderChat["LastBattle"]
then
-- 다이얼로그 처리
if Var["LastBattle"]["DialogStepSec"] <= Var["CurSec"]
then
cMobDialog( Var["MapIndex"], RegenInfo["Mob"]["TombRaider"]["Index"], TombRaiderChat["ScriptFileName"], TombRaiderChat["LastBattle"][ Var["LastBattle"]["DialogStepNo"] ]["Index"] )
Var["LastBattle"]["DialogStepSec"] = Var["CurSec"] + DelayTime["BetweenLastBattleDialog"] -- 다음 페이스컷 띄울 시간 셋팅
Var["LastBattle"]["DialogStepNo"] = Var["LastBattle"]["DialogStepNo"] + 1 -- 다음 단계 변호 셋팅
end
end
-- Fail Case : 전멸 시 혹은 플레이어가 아무도 없을 경우
if cObjectCount( Var["MapIndex"], ObjectType["Player"] ) <= 0
then
GoToFail( Var )
Var["LastBattle"] = nil
return
end
-- Fail Case : 타임 오버
if IsKQTimeOver( Var ) == true
then
GoToFail( Var )
Var["LastBattle"] = nil
return
end
--
local bEndLastBattle = true
if Var["Enemy"]["TombRaider"] ~= nil
then
if cIsObjectDead( Var["Enemy"]["TombRaider"] ) == nil
then
bEndLastBattle = false
end
end
-- Success Case :
if bEndLastBattle == true
then
GoToNextStep( Var )
Var["LastBattle"] = nil
Var["Enemy"]["TombRaider"] = nil
DebugLog( "End LastBattle" )
return
end
end
-- 킹덤 퀘스트 완료 게이트
function EndGate( Var )
cExecCheck "EndGate"
if Var == nil
then
return
end
-- 1초마다 체크
if Var["CurSec"] + 1 > cCurrentSecond()
then
return
else
Var["CurSec"] = cCurrentSecond()
end
if Var["EndGate"] == nil
then
DebugLog( "Start EndGate" )
local RegenNPC = RegenInfo["NPC"]["Gate"]
local NPCHandle = cMobRegen_XY( Var["MapIndex"], RegenNPC["Index"], RegenNPC["x"], RegenNPC["y"], RegenNPC["dir"] )
if NPCHandle ~= nil
then
cSetAIScript ( MainLuaScriptPath, NPCHandle )
cAIScriptFunc( NPCHandle, "Entrance", "DummyFunc" )
cAIScriptFunc( NPCHandle, "NPCClick", "EndGateClick" )
end
Var["EndGate"] = {}
end
-- Fail Case : 타임 오버
if IsKQTimeOver( Var ) == true
then
GoToFail( Var )
Var["LastBattle"] = nil
return
end
end
-- 킹덤 퀘스트 클리어
function QuestSuccess( Var )
cExecCheck "QuestSuccess"
if Var == nil
then
return
end
DebugLog( "Start QuestSuccess" )
-- Success 띄우고
cVanishTimer( Var["MapIndex"] )
cQuestResult( Var["MapIndex"], "Success" )
-- 플레이어에게 클리어 보상 주기
cReward( Var["MapIndex"], "KQ" )
-- Quest Mob Kill 세기.
cQuestMobKill_AllInMap( Var["MapIndex"], QuestMobKillInfo["QuestID"], QuestMobKillInfo["MobIndex"], QuestMobKillInfo["MaxKillCount"] )
GoToNextStep( Var )
Var["QuestSuccess"] = nil
DebugLog( "End QuestSuccess" )
end
-- 킹덤 퀘스트 실패
function QuestFailed( Var )
cExecCheck "QuestFailed"
if Var == nil
then
return
end
DebugLog( "Start QuestFailed" )
-- Fail 띄우고
cVanishTimer( Var["MapIndex"] )
cQuestResult( Var["MapIndex"], "Fail" )
GoToNextStep( Var )
DebugLog( "End QuestFailed" )
Var["QuestFailed"] = {}
end
-- 귀환
function ReturnToHome( Var )
cExecCheck "ReturnToHome"
if Var == nil
then
return
end
-- 1초마다 체크
if Var["CurSec"] + 1 > cCurrentSecond()
then
return
else
Var["CurSec"] = cCurrentSecond()
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["BetweenKQReturnNotice"]
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"] )
GoToNextStep( Var )
Var["ReturnToHome"] = nil
if cEndOfKingdomQuest( Var["MapIndex"] ) == nil
then
ErrorLog( "ReturnToHome::Function cEndOfKingdomQuest failed" )
end
DebugLog( "End ReturnToHome" )
end
return
end
end
-- 스텝 구분을 위한 던전 진행 함수 리스트
KQ_StepsList =
{
{ Function = InitDungeon, Name = "InitDungeon", },
{ Function = Intro, Name = "Intro", },
{ Function = LayerStep, Name = "LayerStep", },
{ Function = LastBattle, Name = "LastBattle", },
{ Function = EndGate, Name = "EndGate", },
{ Function = QuestSuccess, Name = "QuestSuccess", },
{ Function = QuestFailed, Name = "QuestFailed", },
{ Function = ReturnToHome, Name = "ReturnToHome", },
}
-- 역참조 리스트
KQ_StepsIndexList =
{
}
for index, funcValue in pairs ( KQ_StepsList )
do
KQ_StepsIndexList[ funcValue["Name"] ] = index
end