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.
423 lines
11 KiB
423 lines
11 KiB
--------------------------------------------------------------------------------
|
|
-- Tower Of Iyzel 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
|
|
|
|
|
|
if Var["InitDungeon"] == nil
|
|
then
|
|
DebugLog( "Start InitDungeon" )
|
|
|
|
Var["InitDungeon"] = {}
|
|
|
|
-- 층 사이에 있는 문 생성
|
|
for i = 0, 17
|
|
do
|
|
local DoorTableIndex = nil
|
|
|
|
if i < 10
|
|
then
|
|
DoorTableIndex = "Door0"..i
|
|
else
|
|
DoorTableIndex = "Door"..i
|
|
end
|
|
|
|
local CurRegenDoor = RegenInfo["Stuff"][ DoorTableIndex ]
|
|
|
|
if CurRegenDoor ~= nil
|
|
then
|
|
local nCurDoorHandle = cDoorBuild( Var["MapIndex"], CurRegenDoor["Index"], CurRegenDoor["x"], CurRegenDoor["y"], CurRegenDoor["dir"], CurRegenDoor["scale"] )
|
|
|
|
if nCurDoorHandle ~= nil
|
|
then
|
|
cDoorAction( nCurDoorHandle , CurRegenDoor["Block"], "close" )
|
|
|
|
-- 리젠 정보 보관
|
|
Var["Door"][ nCurDoorHandle ] = CurRegenDoor
|
|
|
|
-- 핸들 보관 : 접근용으로
|
|
Var["Door"..(i+1) ] = nCurDoorHandle
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-- 입구쪽 출구게이트 생성
|
|
local RegenExitGate = RegenInfo["Stuff"]["ExitGate"]
|
|
local nExitGateHandle = cDoorBuild( Var["MapIndex"], RegenExitGate["Index"], RegenExitGate["x"], RegenExitGate["y"], RegenExitGate["dir"], RegenExitGate["scale"] )
|
|
|
|
if nExitGateHandle ~= nil
|
|
then
|
|
if cSetAIScript ( MainLuaScriptPath, nExitGateHandle ) == nil
|
|
then
|
|
ErrorLog( "InitDungeon::cSetAIScript ( MainLuaScriptPath, nExitGateHandle ) == nil" )
|
|
end
|
|
|
|
if cAIScriptFunc( nExitGateHandle, "NPCClick", "ExitGateClick" ) == nil
|
|
then
|
|
ErrorLog( "InitDungeon::cAIScriptFunc( nExitGateHandle, \"NPCClick\", \"ExitGateClick\" ) == nil" )
|
|
end
|
|
end
|
|
|
|
-- 대기시간 설정
|
|
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
|
|
|
|
|
|
-- 1~19 번째 층의 몹들과 보스전
|
|
function EachFloor( Var )
|
|
cExecCheck "EachFloor"
|
|
|
|
if Var == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if Var["EachFloor"] == nil
|
|
then
|
|
Var["EachFloor"] = {}
|
|
end
|
|
|
|
|
|
-- 단계 번호 설정
|
|
if Var["EachFloor"]["StepNumber"] == nil
|
|
then
|
|
Var["EachFloor"]["StepNumber"] = 1
|
|
end
|
|
|
|
|
|
-- 단계이름 받아오기
|
|
local CurStepNo = Var["EachFloor"]["StepNumber"] -- ex) 1
|
|
local CurStep = StepNameTable[ CurStepNo ] -- ex) Floor01
|
|
|
|
|
|
-- 각 단계 초기 설정
|
|
if Var["EachFloor"..CurStepNo ] == nil
|
|
then
|
|
|
|
DebugLog( "Start EachFloor "..CurStepNo )
|
|
|
|
Var["EachFloor"..CurStepNo ] = {}
|
|
|
|
|
|
-- 몹 그룹 젠
|
|
local CurStepRegen = RegenInfo["Group"][ CurStep ]
|
|
|
|
for i = 1, #CurStepRegen
|
|
do
|
|
cGroupRegenInstance( Var["MapIndex"], CurStepRegen[i] )
|
|
end
|
|
|
|
-- 보스 젠( 있을경우 Only : 4, 9, 13, 19 층 )
|
|
if RegenInfo["Mob"][ CurStep ] ~= nil
|
|
then
|
|
local RegenBoss = nil
|
|
local BossHandle = nil
|
|
|
|
for MobName, MobRegenInfo in pairs ( RegenInfo["Mob"][ CurStep ] )
|
|
do
|
|
RegenBoss = MobRegenInfo
|
|
BossHandle = cMobRegen_XY( Var["MapIndex"], RegenBoss["Index"], RegenBoss["x"], RegenBoss["y"], RegenBoss["dir"] )
|
|
end
|
|
|
|
if BossHandle ~= nil
|
|
then
|
|
Var["Enemy"][ BossHandle ] = RegenBoss
|
|
Var["EachFloor"..CurStepNo ]["BossHandle"] = BossHandle
|
|
|
|
Var["RoutineTime"][ BossHandle ] = cCurrentSecond()
|
|
cSetAIScript ( MainLuaScriptPath, BossHandle )
|
|
cAIScriptFunc( BossHandle, "Entrance", "BossRoutine" )
|
|
end
|
|
end
|
|
|
|
-- 페이스컷 단계 구분용 변수 설정
|
|
Var["EachFloor"..CurStepNo ]["StartDialogStepSec"] = Var["CurSec"]
|
|
Var["EachFloor"..CurStepNo ]["StartDialogStepNo"] = 1
|
|
Var["EachFloor"..CurStepNo ]["ClearDialogStepSec"] = Var["CurSec"]
|
|
Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"] = 1
|
|
Var["EachFloor"..CurStepNo ]["BossBattleDialogStepSec"] = Var["CurSec"]
|
|
Var["EachFloor"..CurStepNo ]["BossBattleDialogStepNo"] = 1
|
|
|
|
-- 페이스컷 종료 여부 설정
|
|
Var["EachFloor"..CurStepNo ]["bStartDialogEnd"] = false
|
|
Var["EachFloor"..CurStepNo ]["bClearDialogEnd"] = false
|
|
Var["EachFloor"..CurStepNo ]["bBossBattleDialogEnd"] = false
|
|
|
|
-- 몹 전멸 여부 설정
|
|
Var["EachFloor"..CurStepNo ]["bMobEliminated"] = false
|
|
|
|
Var["EachFloor"..CurStepNo ]["WaitMobGenSec"] = Var["CurSec"] + DelayTime["WaitAfterGenMob"]
|
|
end
|
|
|
|
-- 해당 단계 시작시의 페이스컷
|
|
if NPC_GuardChat["StartDialog"][ CurStep ] ~= nil
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["bStartDialogEnd"] == false
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["StartDialogStepNo"] <= #NPC_GuardChat["StartDialog"][ CurStep ]
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["StartDialogStepSec"] <= Var["CurSec"]
|
|
then
|
|
cMobDialog( Var["MapIndex"], NPC_GuardChat["SpeakerIndex"], NPC_GuardChat["ScriptFileName"], NPC_GuardChat["StartDialog"][ CurStep ][ Var["EachFloor"..CurStepNo ]["StartDialogStepNo"] ]["Index"] )
|
|
DebugLog( "EachFloor"..CurStepNo.."::Index("..NPC_GuardChat["StartDialog"][ CurStep ][ Var["EachFloor"..CurStepNo ]["StartDialogStepNo"] ]["Index"].."), StepNo("..Var["EachFloor"..CurStepNo ]["StartDialogStepNo"]..")" )
|
|
|
|
Var["EachFloor"..CurStepNo ]["StartDialogStepNo"] = Var["EachFloor"..CurStepNo ]["StartDialogStepNo"] + 1
|
|
Var["EachFloor"..CurStepNo ]["StartDialogStepSec"] = Var["CurSec"] + DelayTime["GapDialog"]
|
|
end
|
|
|
|
-- 해당 페이스컷 타이밍이 될 때까지 다른기능 실행 없이 딜레이 걸기
|
|
return
|
|
else
|
|
-- 페이스컷 종료
|
|
Var["EachFloor"..CurStepNo ]["bStartDialogEnd"] = true
|
|
end
|
|
end
|
|
else
|
|
-- 페이스컷 자체가 없을 때
|
|
Var["EachFloor"..CurStepNo ]["bStartDialogEnd"] = true
|
|
end
|
|
|
|
|
|
-- 몹 전멸체크
|
|
if Var["EachFloor"..CurStepNo ]["bMobEliminated"] == false
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["WaitMobGenSec"] <= Var["CurSec"]
|
|
then
|
|
if cObjectCount( Var["MapIndex"], ObjectType["Mob"] ) <= 0
|
|
then
|
|
Var["EachFloor"..CurStepNo ]["bMobEliminated"] = true
|
|
end
|
|
end
|
|
|
|
return
|
|
else
|
|
-- 해당 층 몹 전멸 시
|
|
|
|
-- 클리어 페이스컷
|
|
if NPC_GuardChat["ClearDialog"][ CurStep ] ~= nil
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["bClearDialogEnd"] == false
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"] <= #NPC_GuardChat["ClearDialog"][ CurStep ]
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["ClearDialogStepSec"] <= Var["CurSec"]
|
|
then
|
|
cMobDialog( Var["MapIndex"], NPC_GuardChat["SpeakerIndex"], NPC_GuardChat["ScriptFileName"], NPC_GuardChat["ClearDialog"][ CurStep ][ Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"] ]["Index"] )
|
|
DebugLog( "EachFloor"..CurStepNo.."::Index("..NPC_GuardChat["ClearDialog"][ CurStep ][ Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"] ]["Index"].."), StepNo("..Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"]..")" )
|
|
|
|
Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"] = Var["EachFloor"..CurStepNo ]["ClearDialogStepNo"] + 1
|
|
Var["EachFloor"..CurStepNo ]["ClearDialogStepSec"] = Var["CurSec"] + DelayTime["GapDialog"]
|
|
end
|
|
|
|
-- 해당 페이스컷 타이밍이 될 때까지 다른기능 실행 없이 딜레이 걸기
|
|
return
|
|
else
|
|
-- 페이스컷 종료
|
|
Var["EachFloor"..CurStepNo ]["bClearDialogEnd"] = true
|
|
end
|
|
end
|
|
else
|
|
-- 페이스컷 자체가 없을 때
|
|
Var["EachFloor"..CurStepNo ]["bClearDialogEnd"] = true
|
|
end
|
|
end
|
|
|
|
|
|
-- Next Case : 해당 층의 몹 전멸 후 클리어 페이스컷 여부에 따라 그 페이스 컷이 종료하면.
|
|
if Var["EachFloor"..CurStepNo ]["WaitMobGenSec"] <= Var["CurSec"]
|
|
then
|
|
if Var["EachFloor"..CurStepNo ]["bClearDialogEnd"] == true
|
|
then
|
|
-- 해당 층 몹 전멸 상황이 아닌경우 다음단계로 넘어가지 않는다.
|
|
if Var["EachFloor"..CurStepNo ]["bMobEliminated"] ~= true
|
|
then
|
|
return
|
|
end
|
|
|
|
-- 클리어 액션
|
|
if Var["Door"..CurStepNo ] ~= nil
|
|
then
|
|
cDoorAction( Var["Door"..CurStepNo ], Var["Door"][ Var["Door"..CurStepNo ] ]["Block"], "open" )
|
|
end
|
|
|
|
-- 다음 단계로
|
|
Var["EachFloor"..CurStepNo ] = nil
|
|
Var["EachFloor"]["StepNumber"] = CurStepNo + 1
|
|
|
|
DebugLog( "End EachFloor "..CurStepNo )
|
|
|
|
-- 모든 층 클리어 시
|
|
if Var["EachFloor"]["StepNumber"] > #StepNameTable
|
|
then
|
|
|
|
Var["EachFloor"] = nil
|
|
GoToSuccess( Var )
|
|
return
|
|
end
|
|
|
|
return
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-- 킹덤 퀘스트 클리어 : ID 에선 기능 거의 없음
|
|
function QuestSuccess( Var )
|
|
cExecCheck "QuestSuccess"
|
|
|
|
if Var == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
DebugLog( "Start QuestSuccess" )
|
|
|
|
-- Quest Mob Kill 세기.
|
|
cQuestMobKill_AllInMap( Var["MapIndex"], QuestMobKillInfo["QuestID"], QuestMobKillInfo["MobIndex"], QuestMobKillInfo["MaxKillCount"] )
|
|
|
|
GoToNextStep( Var )
|
|
|
|
DebugLog( "End QuestSuccess" )
|
|
|
|
end
|
|
|
|
|
|
-- 킹덤 퀘스트 실패 : ID 에선 기능 없음
|
|
function QuestFailed( Var )
|
|
cExecCheck "QuestFailed"
|
|
|
|
if Var == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
DebugLog( "Start QuestFailed" )
|
|
GoToNextStep( Var )
|
|
DebugLog( "End QuestFailed" )
|
|
|
|
end
|
|
|
|
|
|
-- 귀환
|
|
function ReturnToHome( Var )
|
|
cExecCheck "ReturnToHome"
|
|
|
|
if Var == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
if Var["ReturnToHome"] == nil
|
|
then
|
|
DebugLog( "Start ReturnToHome" )
|
|
Var["ReturnToHome"] = {}
|
|
|
|
Var["ReturnToHome"]["ReturnStepNo"] = 1
|
|
Var["ReturnToHome"]["ReturnStepSec"] = Var["CurSec"]
|
|
Var["ReturnToHome"]["ReturnNoticeIndex"] = "IDReturn"
|
|
end
|
|
|
|
|
|
local sReturnNoticeIndex = Var["ReturnToHome"]["ReturnNoticeIndex"]
|
|
|
|
-- Return : return notice substep
|
|
if Var["ReturnToHome"]["ReturnStepNo"] <= #NoticeInfo[ sReturnNoticeIndex ]
|
|
then
|
|
|
|
if Var["ReturnToHome"]["ReturnStepSec"] <= Var["CurSec"]
|
|
then
|
|
|
|
-- Notice of Escape
|
|
if NoticeInfo[ sReturnNoticeIndex ][ Var["ReturnToHome"]["ReturnStepNo"] ]["Index"] ~= nil
|
|
then
|
|
cNotice( Var["MapIndex"], NoticeInfo["ScriptFileName"], NoticeInfo[ sReturnNoticeIndex ][ Var["ReturnToHome"]["ReturnStepNo"] ]["Index"] )
|
|
end
|
|
|
|
-- Go To Next Notice
|
|
Var["ReturnToHome"]["ReturnStepNo"] = Var["ReturnToHome"]["ReturnStepNo"] + 1
|
|
Var["ReturnToHome"]["ReturnStepSec"] = Var["CurSec"] + DelayTime["GapIDReturnNotice"]
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
-- Return : linkto substep
|
|
if Var["ReturnToHome"]["ReturnStepNo"] > #NoticeInfo[ sReturnNoticeIndex ]
|
|
then
|
|
|
|
if Var["ReturnToHome"]["ReturnStepSec"] <= Var["CurSec"]
|
|
then
|
|
--Finish_ID
|
|
cLinkToAll( Var["MapIndex"], LinkInfo["ReturnMapOnClear"]["MapIndex"], LinkInfo["ReturnMapOnClear"]["x"], LinkInfo["ReturnMapOnClear"]["y"] )
|
|
|
|
GoToNextStep( Var )
|
|
Var["ReturnToHome"] = nil
|
|
|
|
DebugLog( "End ReturnToHome" )
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
-- 스텝 구분을 위한 던전 진행 함수 리스트
|
|
ID_StepsList =
|
|
{
|
|
{ Function = InitDungeon, Name = "InitDungeon", },
|
|
{ Function = EachFloor, Name = "EachFloor", },
|
|
{ Function = QuestSuccess, Name = "QuestSuccess", },
|
|
{ Function = QuestFailed, Name = "QuestFailed", },
|
|
{ Function = ReturnToHome, Name = "ReturnToHome", },
|
|
}
|
|
|
|
-- 역참조 리스트
|
|
ID_StepsIndexList =
|
|
{
|
|
}
|
|
|
|
for index, funcValue in pairs ( ID_StepsList )
|
|
do
|
|
ID_StepsIndexList[ funcValue["Name"] ] = index
|
|
end
|
|
|