//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $Workfile:     $
// $Date:         $
// $NoKeywords: $
//=============================================================================//
#if !defined( HOST_H )
#define HOST_H
#ifdef _WIN32
#pragma once
#endif

#include "convar.h"
#include "steam/steamclientpublic.h"

#define SCRIPT_DIR			"scripts/"

struct model_t;
struct AudioState_t;


class CCommonHostState
{
public:
	model_t		*worldmodel;	// cl_entitites[0].model
	struct worldbrushdata_t *worldbrush;
	float		interval_per_tick;		// Tick interval for game
	void SetWorldModel( model_t *pModel );
};

extern CCommonHostState host_state;

//=============================================================================
// the host system specifies the base of the directory tree, the mod + base mod
// and the amount of memory available for the program to use
struct engineparms_t
{
	char	*basedir;	// Executable directory ("c:/program files/half-life 2", for example)
	char	*mod;		// Mod name ("cstrike", for example)
	char	*game;		// Root game name ("hl2", for example, in the case of cstrike)
	unsigned int	memsize;
};
extern engineparms_t host_parms;


//-----------------------------------------------------------------------------
// Human readable methods to get at engineparms info
//-----------------------------------------------------------------------------
inline const char *GetCurrentMod()
{
	return host_parms.mod;
}

inline const char *GetCurrentGame()
{
	return host_parms.game;
}

inline const char *GetBaseDirectory()
{
	return host_parms.basedir;
}


//=============================================================================

//
// host
// FIXME, move all this crap somewhere else
//

extern	ConVar		developer;
extern	bool		host_initialized;		// true if into command execution
extern	float		host_frametime;
extern  float		host_frametime_unbounded;
extern  float		host_frametime_stddeviation;
extern	int			host_framecount;	// incremented every frame, never reset
extern	double		realtime;			// not bounded in any way, changed at
// start of every frame, never reset
void Host_Error (PRINTF_FORMAT_STRING const char *error, ...) FMTFUNCTION( 1, 2 );
void Host_EndGame (bool bShowMainMenu, PRINTF_FORMAT_STRING const char *message, ...) FMTFUNCTION( 2, 3 );

// user message
#define MAX_USER_MSG_DATA 255

// build info
// day counter from Sep 30 2003
extern int build_number( void );


// Choke local client's/server's packets?
extern  ConVar		host_limitlocal;      
// Print a debug message when the client or server cache is missed
extern	ConVar		host_showcachemiss;

extern bool			g_bInEditMode;
extern bool			g_bInCommentaryMode;
extern bool			g_bAllowSecureServers;
extern bool			g_bLowViolence;

// Returns true if host is not single stepping/pausing through code/
// FIXME:  Remove from final, retail version of code.
bool Host_ShouldRun( void );
void Host_FreeToLowMark( bool server );
void Host_FreeStateAndWorld( bool server );
void Host_Disconnect( bool bShowMainMenu, const char *pszReason = "" );
void Host_RunFrame( float time );
void Host_DumpMemoryStats( void );
void Host_UpdateMapList( void );
float Host_GetSoundDuration( const char *pSample );
bool Host_IsSinglePlayerGame( void );
int Host_GetServerCount( void );
bool Host_AllowQueuedMaterialSystem( bool bAllow );

bool Host_IsSecureServerAllowed();
void FORCEINLINE Host_DisallowSecureServers()
{
#if !defined(SWDS)
	g_bAllowSecureServers = false;
#endif
}

bool Host_AllowLoadModule( const char *pFilename, const char *pPathID, bool bAllowUnknown, bool bIsServerOnly = false );

// Force the voice stuff to send a packet out.
// bFinal is true when the user is done talking.
void CL_SendVoicePacket(bool bFinal);

// Accumulated filtered time on machine ( i.e., host_framerate can alter host_time )
extern float host_time;

class NET_SetConVar;

void		Host_BuildConVarUpdateMessage( NET_SetConVar *cvarMsg, int flags, bool nonDefault );
char const *Host_CleanupConVarStringValue( char const *invalue );
void		Host_SetAudioState( const AudioState_t &audioState );
void		Host_DefaultMapFileName( const char *pFullMapName, /* out */ char *pDiskName, unsigned int nDiskNameSize );

bool CheckVarRange_Generic( ConVar *pVar, int minVal, int maxVal );

// Total ticks run
extern int	host_tickcount;
// Number of ticks being run this frame
extern int	host_frameticks;
// Which tick are we currently on for this frame
extern int	host_currentframetick;

// PERFORMANCE INFO
#define MIN_FPS         0.1         // Host minimum fps value for maxfps.
#define MAX_FPS         100000000.0 // Upper limit for maxfps.

#define MAX_FRAMETIME	0.1
#define MIN_FRAMETIME	0.001

#define TIME_TO_TICKS( dt )		( (int)( 0.5f + (float)(dt) / host_state.interval_per_tick ) )
#define TICKS_TO_TIME( dt )		( host_state.interval_per_tick * (float)(dt) )

// Normally, this is off, and it keeps the VCR file size smaller, but it can help
// to turn it on when tracking down out-of-sync errors, because it verifies that more
// things are the same during playback.
extern ConVar vcr_verbose;

// Set by the game DLL to tell us to do the same timing tricks as timedemo.
extern bool g_bDedicatedServerBenchmarkMode;

extern uint GetSteamAppID();
extern EUniverse GetSteamUniverse();

#define STEAMREMOTESTORAGE_CLOUD_OFF	0
#define STEAMREMOTESTORAGE_CLOUD_ON		1

#endif // HOST_H