-------------------------------------------------------------------------------- -- 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