--------------------------------------------------------------------------------
--                             Routine                            		     --
--------------------------------------------------------------------------------



function DummyRoutineFunc()
cExecCheck "DummyRoutineFunc"

	return ReturnAI["END"]
end


----------------------------------------------------------------------
-- MapLogin Function
----------------------------------------------------------------------
function PlayerMapLogin( MapIndex, Handle )
cExecCheck "PlayerMapLogin"


	local CurSec	= cCurrentSecond()
	local TeamType	= cGetKQTeamType( Handle )
	local CharNo	= cGetCharNo( Handle )


	local Var = InstanceField[ MapIndex ]
	if Var == nil
	then
		ErrorLog( "PlayerMapLogin : Var nil" )
		return
	end

	if CurSec == nil
	then
		ErrorLog( "PlayerMapLogin : CurSec nil" )
		return
	end

	if TeamType == nil
	then
		ErrorLog( "PlayerMapLogin : TeamType nil" )
		return
	end

	if TeamType ~= KQ_TEAM["RED"] and TeamType ~= KQ_TEAM["BLUE"]
	then
		ErrorLog( "PlayerMapLogin : Invalid TeamType "..TeamType )
		return
	end

	if CharNo == nil
	then
		ErrorLog( "PlayerMapLogin : CharNo nil" )
		return
	end

	if Var["Team"] == nil
	then
		ErrorLog( "PlayerMapLogin : Var[\"Team\"] nil" )
		return
	end


	-- ���ӽ� ���� ������ �����̻�
	for i = 1, #LoginResetAbstate
	do
		cResetAbstate( Handle, LoginResetAbstate[ i ] )
	end


	-- �÷��̾� ���� �߰�, ����
	local PlayerInfo = Player_Get( Var, CharNo )
	if PlayerInfo == nil
	then

		-- �ű� �÷��̾� ���� �߰�
		Player_Insert( Var, CharNo, Handle, TeamType )

	else

		-- ���� �÷��̾� ���� ����
		PlayerInfo["Handle"] 	= Handle
		PlayerInfo["IsInMap"] 	= true

	end


	-- �� ������ ����, ����� ������ �Ӹ��� ȭ��ǥ �����̻� ����
	for i = 1, #TeamUniform[ TeamType ]
	do
		cViewSlotEquip( Handle, TeamUniform[ TeamType ][ i ] )
		cSetAbstate( Handle, TeamAbstate[ TeamType ]["Index"], TeamAbstate[ TeamType ]["Str"], TeamAbstate[ TeamType ]["KeepTime"], Handle )
	end


	-- �̵� �ӵ� ����
	cStaticWalkSpeed( Handle, true, 33 )
	cStaticRunSpeed( Handle, true, 127 )


	-- ���� ���� ���� �ƴϸ� �Լ� ����
	if Var["RoundEndTime"] <= 0
	then
		return
	end

	-- ����, Ÿ�̸� ���� ����
	local RedTeamInfo	= Var["Team"][ KQ_TEAM["RED"] ]
	local BlueTeamInfo	= Var["Team"][ KQ_TEAM["BLUE"] ]


	-- ���� ���� ��, �÷��̾� ������ ������
	if PlayerInfo ~= nil
	then
		if PlayerInfo["IsOut"] == false
		then
			Var["Team"][ TeamType ]["Score"] = Var["Team"][ TeamType ]["Score"] + 1
		end
	end


	-- ����, �ð� ���� �˸�
	cScoreBoard( Handle, true, Var["Round"], RedTeamInfo["RoundResultCount"]["Win"], RedTeamInfo["Score"], BlueTeamInfo["RoundResultCount"]["Win"], BlueTeamInfo["Score"] )
	cTimer_Obj( Handle, (Var["RoundEndTime"] - CurSec) )

end


----------------------------------------------------------------------
-- ServantSummon Function
----------------------------------------------------------------------
function ServantSummon( MapIndex, ServantHandle, ServantIndex, MasterHandle )
cExecCheck "ServantSummon"


	if ServantIndex == Cake["MobIndex"]
	then

		cSetAIScript ( MainLuaScriptPath, ServantHandle )
		cAIScriptFunc( ServantHandle, "Entrance",  "Cake_Entrance" )
		cAIScriptFunc( ServantHandle, "NPCAction", "Cake_NPCAction" )

	elseif ServantIndex == DrinkCannon["MobIndex"]
	then

		cSetAIScript ( MainLuaScriptPath, ServantHandle )
		cAIScriptFunc( ServantHandle, "Entrance",  "DrinkCannon_Entrance" )

	end

end


----------------------------------------------------------------------
-- Cake_Explosion Function
----------------------------------------------------------------------
function Cake_Explosion( Var, NPCHandle )
cExecCheck "Cake_Explosion"


	local CurSec = cCurrentSecond()
	local TeamType	= cGetKQTeamType( NPCHandle )


	if Var == nil
	then
		ErrorLog( "Cake_Explosion : Var nil" )
		return
	end

	if NPCHandle == nil
	then
		ErrorLog( "Cake_Explosion : Var nil" )
		return
	end

	if CurSec == nil
	then
		ErrorLog( "Cake_Explosion : CurSec nil" )
		return
	end

	if TeamType == nil
	then
		ErrorLog( "Cake_Explosion : TeamType nil" )
		return
	end

	if TeamType ~= KQ_TEAM["RED"] and TeamType ~= KQ_TEAM["BLUE"]
	then
		ErrorLog( "Cake_Explosion : Invalid TeamType "..TeamType )
		return
	end


	-- ���� ���� ���̸� �ƹ� ó���� ���� �ʴ´�
	if Var["RoundEndTime"] > 0
	then

		-- �÷��̾� ����Ʈ���� ���� �Ÿ��� Ȯ��
		local PlayerList = Var["Player"]
		if PlayerList == nil
		then
			ErrorLog( "Cake_Explosion : PlayerList nil" )
			return
		end


		for i = 1, #PlayerList
		do
			local PlayerInfo = PlayerList[ i ]


			-- ��� ���� Ȯ��
			if PlayerInfo["IsInMap"]  == true and															-- �ʿ� �����ϴ���
			   PlayerInfo["TeamType"] == OpposingTeamInfo[ TeamType ] and									-- �� ������
			   PlayerInfo["PrisonLinkToWaitTime"] == 0 and													-- ������ �� ��������
			   PlayerInfo["IsOut"] == false and																-- ������ �ۿ� �ִ���
			   cDistanceSquar( NPCHandle, PlayerInfo["Handle"] ) <= ( Cake["Dist"] * Cake["Dist"] )			-- ���� �ȿ� �����ϴ���
			then

				local Player_x, Player_y = cObjectLocate( PlayerInfo["Handle"] )

				if Player_x ~= nil and Player_y ~= nil
				then

					if cFindAttackBlockLocate( NPCHandle, Player_x, Player_y ) == true	-- ���� ���� Ȯ��
					then

						PlayerInfo["CakeHandle"]			= NPCHandle
						PlayerInfo["CakeAbstateTime"]		= CurSec + Cake["SetAbstateWait"]
						PlayerInfo["PrisonLinkToWaitTime"]	= CurSec + Cake["LinktoWait"]
					end
				end
			end
		end

	end


	cSkillBlast( NPCHandle, NPCHandle, Cake["SkillIndex"] )
	cVanishReserv( NPCHandle, 3 )

end


----------------------------------------------------------------------
-- Cake_Entrance Function
----------------------------------------------------------------------
function Cake_Entrance( Handle, MapIndex )
cExecCheck "Cake_Entrance"


	-- �׾����� ��ũ��Ʈ ����
	if cIsObjectDead( Handle ) ~= nil
	then
		cAIScriptSet( Handle )
		return ReturnAI["END"]
	end

	-- ���� ���� ��ũ��Ʈ ����
	if cIsObjectAlreadyDead( Handle ) == true
	then
		cAIScriptSet( Handle )
		return ReturnAI["END"]
	end


	-- �̵��� ���߾����� ����
	--if cGetMoveState( Handle ) ~= 0
	local MoveState, MoveStateTime, MoveStateSetTime = cGetMoveState( Handle )
	if MoveState ~= 0 or MoveStateSetTime == 0
	then
		return ReturnAI["CPP"]
	end


	local Var = InstanceField[ MapIndex ]

	if Var == nil
	then
		ErrorLog( "Cake_Entrance : Var nil" )
		return ReturnAI["END"]
	end


	Cake_Explosion( Var, Handle )


	return ReturnAI["END"]
end


----------------------------------------------------------------------
-- Cake_NPCAction Function
----------------------------------------------------------------------
function Cake_NPCAction( MapIndex, NPCHandle, PlyHandle, PlyCharNo )
cExecCheck "Cake_NPCAction"


	local TeamType		= cGetKQTeamType( NPCHandle )
	local Var			= InstanceField[ MapIndex ]
	local MasterHandle	= cGetMaster( NPCHandle )

	if Var == nil
	then
		ErrorLog( "Cake_NPCAction : Var nil" )
		return
	end

	if TeamType == nil
	then
		ErrorLog( "Cake_NPCAction : TeamType nil" )
		return
	end

	if TeamType ~= KQ_TEAM["RED"] and TeamType ~= KQ_TEAM["BLUE"]
	then
		ErrorLog( "Cake_NPCAction : Invalid TeamType "..TeamType )
		return
	end

	-- ��ȯ�� ������ Ȯ��
	if MasterHandle == PlyHandle
	then
		return
	end


	-- NPC�̵� ����
	cMoveStop( NPCHandle )

	-- ����
	Cake_Explosion( Var, NPCHandle )

end


----------------------------------------------------------------------
-- DrinkCannon_Entrance Function
----------------------------------------------------------------------
function DrinkCannon_Entrance( Handle, MapIndex )
cExecCheck "DrinkCannon_Entrance"

	local CurSec	= cCurrentSecond()
	local TeamType	= cGetKQTeamType( Handle )
	local Var		= InstanceField[ MapIndex ]


	if Var == nil
	then
		ErrorLog( "DrinkCannon_Entrance : Var nil" )
		return
	end

	-- ���� ���� ���̸� �ƹ� ó���� ���� �ʴ´�.
	if Var["RoundEndTime"] <= 0
	then
		return
	end


	if CurSec == nil
	then
		ErrorLog( "DrinkCannon_Entrance : CurSec nil" )
		return
	end

	if TeamType == nil
	then
		ErrorLog( "DrinkCannon_Entrance : TeamType nil" )
		return
	end

	if TeamType ~= KQ_TEAM["RED"] and TeamType ~= KQ_TEAM["BLUE"]
	then
		ErrorLog( "DrinkCannon_Entrance : Invalid TeamType "..TeamType )
		return
	end


	-- �÷��̾� ����Ʈ���� ���� �Ÿ��� Ȯ��
	local PlayerList = Var["Player"]
	if PlayerList == nil
	then
		ErrorLog( "DrinkCannon_Entrance : PlayerList nil" )
		return false
	end

	for i = 1, #PlayerList
	do
		local PlayerInfo = PlayerList[ i ]

		-- ��� ���� Ȯ��
		if PlayerInfo["IsInMap"]  == true and																-- �ʿ� �����ϴ���
		   PlayerInfo["TeamType"] == OpposingTeamInfo[ TeamType ] and										-- �� ������
		   PlayerInfo["PrisonLinkToWaitTime"] == 0 and														-- ������ �� ��������
		   PlayerInfo["IsOut"] == false and																	-- ������ �ۿ� �ִ���
		   cDistanceSquar( Handle, PlayerInfo["Handle"] ) <= ( DrinkCannon["Dist"] * DrinkCannon["Dist"] )	-- ���� �ȿ� �ִ���
		then

			local Player_x, Player_y = cObjectLocate( PlayerInfo["Handle"] )

			if Player_x ~= nil and Player_y ~= nil
			then

				if cFindAttackBlockLocate( Handle, Player_x, Player_y ) == true	-- ���� ���� Ȯ��
				then

					cSetAbstate( PlayerInfo["Handle"], DrinkCannon["Abstate"]["Index"], 1, DrinkCannon["Abstate"]["KeepTime"], Handle )
					PlayerInfo["PrisonLinkToWaitTime"] = CurSec + DrinkCannon["LinktoWait"]
				end
			end
		end
	end


	cNPCVanish( Handle )


	return ReturnAI["END"]
end