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.
160 lines
4.8 KiB
160 lines
4.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
|
|
#ifndef GAMEMANAGER_H |
|
#define GAMEMANAGER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "tier1/utlvector.h" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// State we are in |
|
//----------------------------------------------------------------------------- |
|
enum LevelState_t |
|
{ |
|
NOT_IN_LEVEL = 0, |
|
LOADING_LEVEL, |
|
IN_LEVEL, |
|
SHUTTING_DOWN_LEVEL, |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// State we are in |
|
//----------------------------------------------------------------------------- |
|
enum LevelRetVal_t |
|
{ |
|
FAILED = 0, |
|
MORE_WORK, |
|
FINISHED, |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Tick interval |
|
//----------------------------------------------------------------------------- |
|
#define TICK_INTERVAL 0.015f |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Game managers are singleton objects in the game code responsible for various tasks |
|
// The order in which the server systems appear in this list are the |
|
// order in which they are initialized and updated. They are shut down in |
|
// reverse order from which they are initialized. |
|
//----------------------------------------------------------------------------- |
|
abstract_class IGameManager |
|
{ |
|
public: |
|
// GameManagers are expected to implement these methods. |
|
virtual bool Init() = 0; |
|
virtual LevelRetVal_t LevelInit( bool bFirstCall ) = 0; |
|
virtual void Update( ) = 0; |
|
virtual LevelRetVal_t LevelShutdown( bool bFirstCall ) = 0; |
|
virtual void Shutdown() = 0; |
|
|
|
// Called during game save |
|
virtual void OnSave() = 0; |
|
|
|
// Called during game restore |
|
virtual void OnRestore() = 0; |
|
|
|
// This this game manager involved in I/O or simulation? |
|
virtual bool PerformsSimulation() = 0; |
|
|
|
// Add, remove game managers |
|
static void Add( IGameManager* pSys ); |
|
static void Remove( IGameManager* pSys ); |
|
static void RemoveAll( ); |
|
|
|
// Init, shutdown game managers |
|
static bool InitAllManagers(); |
|
static void ShutdownAllManagers(); |
|
|
|
// Start, stop running game managers |
|
static void Start (); |
|
static void Stop (); |
|
static int FrameNumber(); |
|
|
|
// Used in simulation |
|
static float CurrentSimulationTime(); |
|
static float SimulationDeltaTime(); |
|
|
|
// Used in rendering |
|
static float CurrentTime(); |
|
static float DeltaTime(); |
|
|
|
// Start loading a level |
|
static void StartNewLevel(); |
|
static void ShutdownLevel(); |
|
static LevelState_t GetLevelState(); |
|
|
|
protected: |
|
// Updates the state machine related to loading levels |
|
static void UpdateLevelStateMachine(); |
|
|
|
virtual ~IGameManager() {} |
|
|
|
typedef LevelRetVal_t (IGameManager::*GameManagerLevelFunc_t)( bool bFirstCall ); |
|
typedef bool (IGameManager::*GameManagerInitFunc_t)(); |
|
typedef void (IGameManager::*GameManagerFunc_t)(); |
|
|
|
// Used to invoke a method of all added game managers in order |
|
static void InvokeMethod( GameManagerFunc_t f ); |
|
static void InvokeMethodReverseOrder( GameManagerFunc_t f ); |
|
static bool InvokeMethod( GameManagerInitFunc_t f ); |
|
static LevelRetVal_t InvokeLevelMethod( GameManagerLevelFunc_t f, bool bFirstCall ); |
|
static LevelRetVal_t InvokeLevelMethodReverseOrder( GameManagerLevelFunc_t f, bool bFirstCall ); |
|
|
|
static bool m_bLevelShutdownRequested; |
|
static bool m_bLevelStartRequested; |
|
static bool m_bStopRequested; |
|
static CUtlVector< IGameManager* > m_GameManagers; |
|
static bool m_bIsRunning; |
|
static bool m_bIsInitialized; |
|
static int m_nFrameNumber; |
|
static float m_flCurrentTime; |
|
static float m_flLastTime; |
|
static LevelState_t m_LevelState; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Default decorator base-class for IGameManager |
|
//----------------------------------------------------------------------------- |
|
template< class BaseClass = IGameManager > |
|
class CGameManager : public BaseClass |
|
{ |
|
public: |
|
virtual ~CGameManager(); |
|
|
|
// GameManagers are expected to implement these methods. |
|
// NOTE: If Init or LevelInit fail, they are expected to call |
|
virtual bool Init() { return true; } |
|
virtual LevelRetVal_t LevelInit( bool bFirstCall ) { return FINISHED; } |
|
virtual void Update( ) {} |
|
virtual LevelRetVal_t LevelShutdown( bool bFirstCall ) { return FINISHED; } |
|
virtual void Shutdown() {} |
|
virtual void OnSave() {} |
|
virtual void OnRestore() {} |
|
virtual bool PerformsSimulation() { return false; } |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Automatically remove the game system if it gets deleted. |
|
//----------------------------------------------------------------------------- |
|
template< class BaseClass > |
|
inline CGameManager< BaseClass >::~CGameManager() |
|
{ |
|
Remove( this ); |
|
} |
|
|
|
|
|
#endif // GAMEMANAGER_H
|
|
|