///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_CoreState_Frontend.cpp
// Author : Anthony Gregson
// Date   : 21/11/07
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura.h"

#if defined(AVP_USE_GAME_FRONTEND)

// This file's header...
#include "Core/States/Core/AVP_CoreState_Frontend.h"

// Asura independent header-files...
#include "Core/Asura_MemoryManagement_Enums.h"
#include "Core/Resources/Asura_Resource_System.h"

// Game independent header-files...
#include "Core/AVP_Core.h"
#include "Core/AVP_GameStatus.h"
#include "Core/States/Core/AVP_StateMachine_GameFrontend.h"
#include "FMV/Asura_VideoToTexture_System.h"
#include "FrontEnd/AVP_GameFrontEnd.h"
#include "GUIMenu/AVP_GUIMenu_System.h"

#if defined(ASURA_TOOLS)
// Tools header-files...
#include "Tools_System.h"
#endif	// defined(ASURA_TOOLS)

////////////////////////////////////////////////////////////////////////////////
// Constant declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Static variable declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Private functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Protected functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Public functions...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Function : AVP_CoreState_Frontend::Enter
// Author	: Anthony Gregson
// Date		: 21/11/07
////////////////////////////////////////////////////////////////////////////////

void AVP_CoreState_Frontend::Enter(const u_int uPreviousState)
{
	AVP_GameFrontEnd::Initialise();

#if defined(ASURA_MEMORYMANAGEMENT_ENABLED) && !defined(ASURA_TOOLS)
	Asura_MemoryManagement_System::Checkpoint(ASURA_MM_STATE_PRE_FRONTEND);
#endif
}

/// End of function 'AVP_CoreState_Frontend::Enter'. ///



////////////////////////////////////////////////////////////////////////////////
// Function : AVP_CoreState_Frontend::Update
// Author	: Anthony Gregson
// Date		: 21/11/07
////////////////////////////////////////////////////////////////////////////////

void AVP_CoreState_Frontend::Update()
{
	AVP_Core::Update(false, NULL);

	if(AVP_GameFrontEnd::IsSetupComplete())
	{
		if(AVP_GameStatus::GetQuitApplication())
		{
			m_xParentMachine.ChangeState(AVP_StateMachine_GameFrontend::STATE_SHUTTINGDOWN);
		}
#if defined(AVP_USE_DEV_LOBBY)
		else if(AVP_GameFrontEnd::IsDevLobbyRequested())
		{
			m_xParentMachine.ChangeState(AVP_StateMachine_GameFrontend::STATE_MULTIPLAYERLOBBY);
		}
#endif	//defined(AVP_USE_DEV_LOBBY)
#if defined(AVP_USE_GAME_LOBBY)
		else if(AVP_GameFrontEnd::IsGameLobbyRequested())
		{
			m_xParentMachine.ChangeState(AVP_StateMachine_GameFrontend::STATE_MULTIPLAYERLOBBY);
		}
#endif	//defined(AVP_USE_GAME_LOBBY)
#if defined(ASURA_TOOLS)
		//If doing a single zone then go via tools. RAR 05/10/2006
		else
		{
			Tools_System::RequestAutoQuitToGame();
			AVP_Core::SetToolsRequested(true);
			m_xParentMachine.ChangeState(AVP_StateMachine_GameFrontend::STATE_LOADINGTOOLS);
		}
#else	
		else
		{
			m_xParentMachine.ChangeState(AVP_StateMachine_GameFrontend::STATE_GAME);
		}
#endif
	}
}

/// End of function 'AVP_CoreState_Frontend::Update'. ///



////////////////////////////////////////////////////////////////////////////////
// Function : AVP_CoreState_Frontend::Render
// Author	: Anthony Gregson
// Date		: 21/11/07
////////////////////////////////////////////////////////////////////////////////

void AVP_CoreState_Frontend::Render() const
{
	AVP_Core::BeginRender(false);
	{
#ifdef ASURA_USE_VIDEO_TO_TEXTURE_SYSTEM
		// Make sure the VideoToTexture system gets a chance to render so the FMV
		// textures get updated.
		Asura_VideoToTexture_System::Render();
#endif

		AVP_Core::Platform_BeginHUDRender();

		AVP_GUIMenu_System::Render(false);
	}
	AVP_Core::EndRender();
}

/// End of function 'AVP_CoreState_Frontend::Render'. ///



////////////////////////////////////////////////////////////////////////////////
// Function : AVP_CoreState_Frontend::Exit
// Author	: Anthony Gregson
// Date		: 21/11/07
////////////////////////////////////////////////////////////////////////////////

void AVP_CoreState_Frontend::Exit(const u_int uNextState)
{
	AVP_GameFrontEnd::Shutdown();
}

/// End of function 'AVP_CoreState_Frontend::Exit'. ///

#endif	//defined(AVP_USE_GAME_FRONTEND)


/// End of file. ///
