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

#include "iclientmode.h"
#include "GameEventListener.h"
#include "baseviewport.h"


class CBaseHudChat;
class CBaseHudWeaponSelection;
class CViewSetup;
class C_BaseEntity;
class C_BasePlayer;

namespace vgui
{
class Panel;
}

//=============================================================================
// HPE_BEGIN:
// [tj] Moved this from the .cpp file so derived classes could access it
//=============================================================================
 
#define ACHIEVEMENT_ANNOUNCEMENT_MIN_TIME 10
 
//=============================================================================
// HPE_END
//=============================================================================

class CReplayReminderPanel;

#define USERID2PLAYER(i) ToBasePlayer( ClientEntityList().GetEnt( engine->GetPlayerForUserID( i ) ) )	

extern IClientMode *GetClientModeNormal(); // must be implemented

// This class implements client mode functionality common to HL2 and TF2.
/*
class ClientModeShared : public IClientMode, public CGameEventListener
{
// IClientMode overrides.
public:
	DECLARE_CLASS_NOBASE( ClientModeShared );

					ClientModeShared();
	virtual			~ClientModeShared();
	
	virtual void	Init();
	virtual void	InitViewport();
	virtual void	VGui_Shutdown();
	virtual void	Shutdown();

	virtual void	LevelInit( const char *newmap );
	virtual void	LevelShutdown( void );

	virtual void	Enable();
	virtual void	Disable();
	virtual void	Layout();

	virtual void	ReloadScheme( void );
	virtual void	OverrideView( CViewSetup *pSetup );
	virtual bool	ShouldDrawDetailObjects( );
	virtual bool	ShouldDrawEntity(C_BaseEntity *pEnt);
	virtual bool	ShouldDrawLocalPlayer( C_BasePlayer *pPlayer );
	virtual bool	ShouldDrawViewModel();
	virtual bool	ShouldDrawParticles( );
	virtual bool	ShouldDrawCrosshair( void );
	virtual bool	ShouldBlackoutAroundHUD() OVERRIDE;
	virtual HeadtrackMovementMode_t ShouldOverrideHeadtrackControl() OVERRIDE;
	virtual void	AdjustEngineViewport( int& x, int& y, int& width, int& height );
	virtual void	PreRender(CViewSetup *pSetup);
	virtual void	PostRender();
	virtual void	PostRenderVGui();
	virtual void	ProcessInput(bool bActive);
	virtual bool	CreateMove( float flInputSampleTime, CUserCmd *cmd );
	virtual void	Update();

	// Input
	virtual int		KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding );
	virtual int		HudElementKeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding );
	virtual void	OverrideMouseInput( float *x, float *y );
	virtual void	StartMessageMode( int iMessageModeType );
	virtual vgui::Panel *GetMessagePanel();

	virtual void	ActivateInGameVGuiContext( vgui::Panel *pPanel );
	virtual void	DeactivateInGameVGuiContext();

	// The mode can choose to not draw fog
	virtual bool	ShouldDrawFog( void );
	
	virtual float	GetViewModelFOV( void );
	virtual vgui::Panel* GetViewport() { return m_pViewport; }
	// Gets at the viewports vgui panel animation controller, if there is one...
	virtual vgui::AnimationController *GetViewportAnimationController()
		{ return m_pViewport->GetAnimationController(); }
	
	virtual void FireGameEvent( IGameEvent *event );

	virtual bool CanRecordDemo( char *errorMsg, int length ) const { return true; }

	virtual int HandleSpectatorKeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding );

	virtual void	ComputeVguiResConditions( KeyValues *pkvConditions ) OVERRIDE;

	//=============================================================================
	// HPE_BEGIN:
	// [menglish] Save server information shown to the client in a persistent place
	//=============================================================================
	 
	virtual wchar_t* GetServerName() { return NULL; }
	virtual void SetServerName(wchar_t* name) {};
	virtual wchar_t* GetMapName() { return NULL; }
	virtual void SetMapName(wchar_t* name) {};
	 
	//=============================================================================
	// HPE_END
	//=============================================================================

	virtual bool	DoPostScreenSpaceEffects( const CViewSetup *pSetup );

	virtual void	DisplayReplayMessage( const char *pLocalizeName, float flDuration, bool bUrgent,
										  const char *pSound, bool bDlg );

	virtual bool	IsInfoPanelAllowed() OVERRIDE { return true; }
	virtual void	InfoPanelDisplayed() OVERRIDE { }
	virtual bool	IsHTMLInfoPanelAllowed() OVERRIDE { return true; }

//protected:
	void* ptr1;
	void* ptr2;
	CBaseViewport			*m_pViewport;

	void			DisplayReplayReminder();

//private:
	virtual void	UpdateReplayMessages();

	void			ClearReplayMessageList();

#if defined( REPLAY_ENABLED )
	float					m_flReplayStartRecordTime;
	float					m_flReplayStopRecordTime;
	CReplayReminderPanel	*m_pReplayReminderPanel;
#endif

	// Message mode handling
	// All modes share a common chat interface
	CBaseHudChat			*m_pChatElement;
	vgui::HCursor			m_CursorNone;
	CBaseHudWeaponSelection *m_pWeaponSelection;
	int						m_nRootSize[2];
};
*/

class ClientModeShared : public IClientMode, public CGameEventListener
{
	// IClientMode overrides.
public:
	DECLARE_CLASS_NOBASE(ClientModeShared);

	ClientModeShared();
	virtual				~ClientModeShared();
	virtual void		Init();
	virtual void		InitViewport();
	virtual void		VGui_Shutdown();
	virtual void		Shutdown();
	virtual void		Enable();
	virtual void		EnableWithRootPanel(vgui::VPANEL pRoot);
	virtual void		Disable();
	virtual void		Layout(bool bForce = false);
	virtual vgui::Panel* GetViewport();
	virtual vgui::Panel* GetPanelFromViewport(const char* pchNamePath);
	virtual vgui::AnimationController* GetViewportAnimationController() { return m_pViewport->GetAnimationController(); };
	virtual void		ProcessInput(bool bActive);
	virtual bool		ShouldDrawDetailObjects();
	virtual bool		ShouldDrawEntity(C_BaseEntity* pEnt);
	virtual bool		ShouldDrawLocalPlayer(C_BasePlayer* pPlayer);
	virtual bool		ShouldDrawParticles();
	virtual bool		ShouldDrawFog(void);
	virtual void		OverrideView(CViewSetup* pSetup);
	virtual void		OverrideAudioState(AudioState_t* pAudioState) { return; }
	virtual int			KeyInput(int down, ButtonCode_t keynum, const char* pszCurrentBinding);
	virtual void		StartMessageMode(int iMessageModeType);
	virtual vgui::Panel* GetMessagePanel();
	virtual void		OverrideMouseInput(float* x, float* y);
	virtual bool		CreateMove(float flInputSampleTime, CUserCmd* cmd);
	virtual void		LevelInit(const char* newmap);
	virtual void		LevelShutdown(void);
	virtual bool		ShouldDrawViewModel(void);
	virtual bool		ShouldDrawCrosshair(void);
	virtual void		AdjustEngineViewport(int& x, int& y, int& width, int& height); //29
	// Called before rendering a view.
	virtual void		PreRender(CViewSetup* pSetup) { return; }; // 30 just returns
	// Called after everything is rendered.
	virtual void		PostRender(void);
	virtual void		PostRenderVGui(void);
	virtual void		ActivateInGameVGuiContext(vgui::Panel* pPanel);
	virtual void		DeactivateInGameVGuiContext(void);
	virtual float		GetViewModelFOV(void);
	virtual bool		CanRecordDemo(char* errorMsg, int length) const { return true; }
	virtual wchar_t* GetServerName(void);
	virtual void		SetServerName(char* name);
	virtual wchar_t* GetMapName(void);
	virtual void		SetMapName(char* name); // 40
	virtual void		OnColorCorrectionWeightsReset(void);
	virtual float		GetColorCorrectionScale(void) const;
	virtual int			HudElementKeyInput(int down, ButtonCode_t keynum, const char* pszCurrentBinding);
	virtual bool		DoPostScreenSpaceEffects(const CViewSetup* pSetup); // 44
public:
	// Called every frame.
	virtual void	Update();
	virtual void	SetBlurFade(float scale) {};
	virtual float	GetBlurFade(void) { return 0.0f; };
	virtual void	ReloadScheme(void);
	virtual void	ReloadSchemeWithRoot(unsigned int root);
	virtual void	OverrideRenderBounds(int& a1, int& a2, int& a3, int& a4, int& a5, int& a6); // 50
	virtual void	FireGameEvent(IGameEvent* gameEvent); // 51

	int			GetSplitScreenPlayerSlot() const;

public:
	void* ptr1;
	void* ptr2;
	CBaseViewport* m_pViewport;
	// Message mode handling
	// All modes share a common chat interface
	CHudChat* m_pChatElement;
	vgui::HCursor			m_CursorNone;
	CBaseHudWeaponSelection* m_pWeaponSelection;
	int						m_nRootSize[2];
};

#endif // CLIENTMODE_NORMAL_H