--------------------------------------------------------------------------------
--               Mini Dragon (Hard Mode) 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"] = {}
		Var["InitDungeon"]["WaitSecDuringInit"] = Var["CurSec"] + DelayTime["AfterInit"]

	end

	-- 일정 시간 뒤 다음 단계로
	if Var["InitDungeon"]["WaitSecDuringInit"] <= Var["CurSec"]
	then

		local nLimitSec = cGetKQLimitSecond( Var["MapIndex"] )

		if nLimitSec == nil
		then
			ErrorLog( "GuideOfGuard::nLimitSec == nil" )
		else
			-- Real Kingdom Quest 시작 !!!!
			Var["KQLimitTime"] = Var["CurSec"] + nLimitSec
			-- 타이머 시작!
			cShowKQTimerWithLife( Var["MapIndex"], nLimitSec )
		end

		GoToNextStep( Var )
		Var["InitDungeon"] = nil
		DebugLog( "End InitDungeon" )
		return
	end

end


-- 1, 2, 3, 4 번째 필드 쫄들과 중간보스 몹들과의 전투
function MidBossStep( Var )
cExecCheck "MidBossStep"

	if Var == nil
	then
		return
	end

	if Var["MidBossStep"] == nil
	then
		Var["MidBossStep"] = {}
	end

	if Var["MidBossStep"]["StepNumber"] == nil
	then
		Var["MidBossStep"]["StepNumber"] = 1
	end

	local CurStepNo = Var["MidBossStep"]["StepNumber"]

	-- 각 단계 초기 설정
	if Var["MidBossStep"..CurStepNo ] == nil
	then

		DebugLog( "Start MidBossStep "..CurStepNo )

		Var["MidBossStep"..CurStepNo ] = {}

		-- 단계이름 받아오기
		local CurStep 		= StepNameTable[ CurStepNo ]

		-- 몹 그룹 젠
		local CurStepRegen 	= RegenInfo["Group"][ CurStep ]

		for i = 1, #CurStepRegen
		do
			cGroupRegenInstance( Var["MapIndex"], CurStepRegen[i] )
		end

		-- 중간보스 젠
		local RegenMidBoss	= nil
		local MidBossHandle = nil

		for MobName, MobRegenInfo in pairs ( RegenInfo["Mob"][ CurStep ] )
		do
			RegenMidBoss 	= MobRegenInfo
			MidBossHandle  	= cMobRegen_XY( Var["MapIndex"], RegenMidBoss["Index"], RegenMidBoss["x"], RegenMidBoss["y"], RegenMidBoss["dir"] )
		end

		if MidBossHandle ~= nil
		then
			Var["Enemy"][ MidBossHandle ] = RegenMidBoss
			Var["MidBossStep"..CurStepNo ]["MidBossHandle"] = MidBossHandle

			Var["RoutineTime"][ MidBossHandle ] = cCurrentSecond()
			cSetAIScript ( MainLuaScriptPath, MidBossHandle )
			cAIScriptFunc( MidBossHandle, "Entrance", "MidBossRoutine" )
		end

	end


	-- Fail Case : 전멸 시 혹은 플레이어가 아무도 없을 경우
	if cObjectCount( Var["MapIndex"], ObjectType["Player"] ) <= 0
	then
		GoToFail( Var )

		Var["MidBossStep"..CurStepNo ] = nil
		Var["MidBossStep"] = nil
		return
	end


	-- Fail Case : 타임 오버
	if IsKQTimeOver( Var ) == true
	then
		GoToFail( Var )

		Var["MidBossStep"..CurStepNo ] = nil
		Var["MidBossStep"] = nil
		return
	end

	local nMidBossHandle = Var["MidBossStep"..CurStepNo ]["MidBossHandle"]

	-- Next Case : 중간보스 사망시
	if Var["Enemy"][ nMidBossHandle ] == nil
	then
		-- 안 죽은 잔몹 자살
		cMobSuicide( Var["MapIndex"] )

		-- 다음 단계로
		Var["MidBossStep"..CurStepNo ] = nil
		Var["MidBossStep"]["StepNumber"] = CurStepNo + 1

		DebugLog( "End MidBossStep "..CurStepNo )

		-- 중간보스 올 클리어 : 보스 전으로
		if Var["MidBossStep"]["StepNumber"] >= #StepNameTable
		then

			Var["MidBossStep"] = nil
			GoToNextStep( Var )
			return
		end

		return
	end

end


-- 보스 미니드래곤과의 전투
function BossBattle( Var )
cExecCheck "BossBattle"


	if Var == nil
	then
		return
	end


	-- 보스전 셋팅
	if Var["BossBattle"] == nil
	then
		DebugLog( "Start BossBattle" )

		Var["BossBattle"] = {}


		-- 미니 드래곤 젠
		local RegenMiniDragon	= RegenInfo["Mob"]["BossBattle"]["MiniDragon"]
		local MiniDragonHandle	= cMobRegen_XY( Var["MapIndex"], RegenMiniDragon["Index"], RegenMiniDragon["x"], RegenMiniDragon["y"], RegenMiniDragon["dir"] )

		if MiniDragonHandle ~= nil
		then
			Var["Enemy"][ MiniDragonHandle ] = RegenMiniDragon
			Var["BossBattle"]["BossHandle"]  = MiniDragonHandle

			cMobDetectRange( MiniDragonHandle, BossDetectRange["Regen"] )

			Var["RoutineTime"][ MiniDragonHandle ] = cCurrentSecond()
			cSetAIScript ( MainLuaScriptPath, MiniDragonHandle )
			cAIScriptFunc( MiniDragonHandle, "Entrance", "MiniDragonRoutine" )
		end

	end


	-- Fail Case : 전멸 시 혹은 플레이어가 아무도 없을 경우
	if cObjectCount( Var["MapIndex"], ObjectType["Player"] ) <= 0
	then
		GoToFail( Var )
		Var["BossBattle"] = nil
		return
	end

	-- Fail Case : 타임 오버
	if IsKQTimeOver( Var ) == true
	then
		GoToFail( Var )
		Var["BossBattle"] = nil
		return
	end


	-- Success Case : 미니드래곤 사망시
	local nBossHandle = Var["BossBattle"]["BossHandle"]
	if Var["Enemy"][ nBossHandle ] == nil
	then
		GoToSuccess( Var )
		Var["BossBattle"] = nil
		DebugLog( "End BossBattle" )
		return
	end

end


-- 킹덤 퀘스트 클리어
function QuestSuccess( Var )
cExecCheck "QuestSuccess"

	if Var == nil
	then
		return
	end

	if Var["QuestSuccess"] == nil
	then
		DebugLog( "Start QuestSuccess" )

		Var["QuestSuccess"] = {}
		Var["QuestSuccess"]["WaitSecAfterKillBoss"] = Var["CurSec"] + DelayTime["WaitAfterKillBoss"]
	end

	-- 보스 죽인 후 잠시 기다려 줌
	if Var["QuestSuccess"]["WaitSecAfterKillBoss"] <= Var["CurSec"]
	then
		-- 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"] )

		-- 보상용 광석그룹 젠
		cGroupRegenInstance( Var["MapIndex"], RegenInfo["Group"]["QuestSuccess"] )

		-- 귀환 하러
		GoToNextStep( Var )
		DebugLog( "End QuestSuccess" )
	end

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

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

		if Var["QuestSuccess"] ~= nil
		then
			-- 성공시
			Var["ReturnToHome"]["ReturnNoticeIndex"] = "KQReturn"
			Var["QuestSuccess"] = nil
		else
			-- 실패시
			Var["ReturnToHome"]["ReturnNoticeIndex"] = "KQFReturn"
		end


	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["GapKQReturnNotice"]

		end

		return

	end


	-- Return : linkto substep
	if Var["ReturnToHome"]["ReturnStepNo"] > #NoticeInfo[ sReturnNoticeIndex ]
	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 = MidBossStep,  Name = "MidBossStep",  },
	{ Function = BossBattle,   Name = "BossBattle",   },
	{ 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