#if defined( FINAL_VAC_BUILD )
#define CL_DLLEXPORT
#else
#define CL_DLLEXPORT __declspec( dllexport )
#endif // FINAL_VAC_BUILD


extern "C" 
{
	// From hl_weapons
	void CL_DLLEXPORT HUD_PostRunCmd( struct local_state_s *from, struct local_state_s *to, struct usercmd_s *cmd, int runfuncs, double time, unsigned int random_seed );

	// From cdll_int
	int CL_DLLEXPORT Initialize( cl_enginefunc_t *pEnginefuncs, int iVersion );
	int CL_DLLEXPORT HUD_VidInit( void );
	void CL_DLLEXPORT HUD_Init( void );
	int CL_DLLEXPORT HUD_Redraw( float flTime, int intermission );
	int CL_DLLEXPORT HUD_UpdateClientData( client_data_t *cdata, float flTime );
	void CL_DLLEXPORT HUD_Reset ( void );
	void CL_DLLEXPORT HUD_PlayerMove( struct playermove_s *ppmove, int server );
	void CL_DLLEXPORT HUD_PlayerMoveInit( struct playermove_s *ppmove );
	char CL_DLLEXPORT HUD_PlayerMoveTexture( char *name );
	int CL_DLLEXPORT HUD_ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size );
	int CL_DLLEXPORT HUD_GetHullBounds( int hullnumber, float *mins, float *maxs );
	void CL_DLLEXPORT HUD_Frame( double time );
	void CL_DLLEXPORT HUD_VoiceStatus(int entindex, qboolean bTalking);
	void CL_DLLEXPORT HUD_DirectorMessage( int iSize, void *pbuf );

	// From demo
	void CL_DLLEXPORT Demo_ReadBuffer( int size, unsigned char *buffer );

	// From entity
	int CL_DLLEXPORT HUD_AddEntity( int type, struct cl_entity_s *ent, const char *modelname );
	void CL_DLLEXPORT HUD_CreateEntities( void );
	void CL_DLLEXPORT HUD_StudioEvent( const struct mstudioevent_s *event, const struct cl_entity_s *entity );
	void CL_DLLEXPORT HUD_TxferLocalOverrides( struct entity_state_s *state, const struct clientdata_s *client );
	void CL_DLLEXPORT HUD_ProcessPlayerState( struct entity_state_s *dst, const struct entity_state_s *src );
	void CL_DLLEXPORT HUD_TxferPredictionData ( struct entity_state_s *ps, const struct entity_state_s *pps, struct clientdata_s *pcd, const struct clientdata_s *ppcd, struct weapon_data_s *wd, const struct weapon_data_s *pwd );
	void CL_DLLEXPORT HUD_TempEntUpdate( double frametime, double client_time, double cl_gravity, struct tempent_s **ppTempEntFree, struct tempent_s **ppTempEntActive, int ( *Callback_AddVisibleEntity )( struct cl_entity_s *pEntity ), void ( *Callback_TempEntPlaySound )( struct tempent_s *pTemp, float damp ) );
	struct cl_entity_s CL_DLLEXPORT *HUD_GetUserEntity( int index );

	// From in_camera
	void CL_DLLEXPORT CAM_Think( void );
	int CL_DLLEXPORT CL_IsThirdPerson( void );
	void CL_DLLEXPORT CL_CameraOffset( float *ofs );

	// From input
	struct kbutton_s CL_DLLEXPORT *KB_Find( const char *name );
	void CL_DLLEXPORT CL_CreateMove ( float frametime, struct usercmd_s *cmd, int active );
	void CL_DLLEXPORT HUD_Shutdown( void );
	int CL_DLLEXPORT HUD_Key_Event( int eventcode, int keynum, const char *pszCurrentBinding );

	// From inputw32
	void CL_DLLEXPORT IN_ActivateMouse( void );
	void CL_DLLEXPORT IN_DeactivateMouse( void );
	void CL_DLLEXPORT IN_MouseEvent (int mstate);
	void CL_DLLEXPORT IN_Accumulate (void);
	void CL_DLLEXPORT IN_ClearStates (void);

	// From tri
	void CL_DLLEXPORT HUD_DrawNormalTriangles( void );
	void CL_DLLEXPORT HUD_DrawTransparentTriangles( void );

	// From view
	void	CL_DLLEXPORT V_CalcRefdef( struct ref_params_s *pparams );

	// From GameStudioModelRenderer
	int CL_DLLEXPORT HUD_GetStudioModelInterface( int version, struct r_studio_interface_s **ppinterface, struct engine_studio_api_s *pstudio );
}



#if defined( FINAL_VAC_BUILD )

extern cldll_func_dst_t *g_pcldstAddrs;

// Macros for the client receiving calls from the engine
#define RecClInitialize(a, b)			(g_pcldstAddrs->pInitFunc(&a, &b))
#define RecClHudInit()					(g_pcldstAddrs->pHudInitFunc())
#define RecClHudVidInit()				(g_pcldstAddrs->pHudVidInitFunc())
#define RecClHudRedraw(a, b)			(g_pcldstAddrs->pHudRedrawFunc(&a, &b))
#define RecClHudUpdateClientData(a, b)	(g_pcldstAddrs->pHudUpdateClientDataFunc(&a, &b))
#define RecClHudReset()					(g_pcldstAddrs->pHudResetFunc())
#define RecClClientMove(a, b)			(g_pcldstAddrs->pClientMove(&a, &b))
#define RecClClientMoveInit(a)			(g_pcldstAddrs->pClientMoveInit(&a))
#define RecClClientTextureType(a)		(g_pcldstAddrs->pClientTextureType(&a))
#define RecClIN_ActivateMouse()			(g_pcldstAddrs->pIN_ActivateMouse())
#define RecClIN_DeactivateMouse()		(g_pcldstAddrs->pIN_DeactivateMouse())
#define RecClIN_MouseEvent(a)			(g_pcldstAddrs->pIN_MouseEvent(&a))
#define RecClIN_ClearStates()			(g_pcldstAddrs->pIN_ClearStates())
#define RecClIN_Accumulate()			(g_pcldstAddrs->pIN_Accumulate())
#define RecClCL_CreateMove(a, b, c)		(g_pcldstAddrs->pCL_CreateMove(&a, &b, &c))
#define RecClCL_IsThirdPerson()			(g_pcldstAddrs->pCL_IsThirdPerson())
#define RecClCL_GetCameraOffsets(a)		(g_pcldstAddrs->pCL_GetCameraOffsets(&a))
#define RecClFindKey(a)					(g_pcldstAddrs->pFindKey(&a))
#define RecClCamThink()					(g_pcldstAddrs->pCamThink())
#define RecClCalcRefdef(a)				(g_pcldstAddrs->pCalcRefdef(&a))
#define RecClAddEntity(a, b, c)			(g_pcldstAddrs->pAddEntity(&a, &b, &c))
#define RecClCreateEntities()			(g_pcldstAddrs->pCreateEntities())
#define RecClDrawNormalTriangles()		(g_pcldstAddrs->pDrawNormalTriangles())
#define RecClDrawTransparentTriangles()	(g_pcldstAddrs->pDrawTransparentTriangles())
#define RecClStudioEvent(a, b)			(g_pcldstAddrs->pStudioEvent(&a, &b))
#define RecClPostRunCmd(a, b, c, d, e, f)		(g_pcldstAddrs->pPostRunCmd(&a, &b, &c, &d, &e, &f))
#define RecClShutdown()					(g_pcldstAddrs->pShutdown())
#define RecClTxferLocalOverrides(a, b)	(g_pcldstAddrs->pTxferLocalOverrides(&a, &b))
#define RecClProcessPlayerState(a, b)	(g_pcldstAddrs->pProcessPlayerState(&a, &b))
#define RecClTxferPredictionData(a, b, c, d, e, f)		(g_pcldstAddrs->pTxferPredictionData(&a, &b, &c, &d, &e, &f))
#define RecClReadDemoBuffer(a, b)		(g_pcldstAddrs->pReadDemoBuffer(&a, &b))
#define RecClConnectionlessPacket(a, b, c, d)		(g_pcldstAddrs->pConnectionlessPacket(&a, &b, &c, &d))
#define RecClGetHullBounds(a, b, c)		(g_pcldstAddrs->pGetHullBounds(&a, &b, &c))
#define RecClHudFrame(a)				(g_pcldstAddrs->pHudFrame(&a))
#define RecClKeyEvent(a, b, c)			(g_pcldstAddrs->pKeyEvent(&a, &b, &c))
#define RecClTempEntUpdate(a, b, c, d, e, f, g)	(g_pcldstAddrs->pTempEntUpdate(&a, &b, &c, &d, &e, &f, &g))
#define RecClGetUserEntity(a)			(g_pcldstAddrs->pGetUserEntity(&a))
#define RecClVoiceStatus(a, b)			(g_pcldstAddrs->pVoiceStatus(&a, &b))
#define RecClDirectorMessage(a, b)		(g_pcldstAddrs->pDirectorMessage(&a, &b))
#define RecClStudioInterface(a, b, c)	(g_pcldstAddrs->pStudioInterface(&a, &b, &c))

#else

#define RecClInitialize(a, b)			
#define RecClHudInit()					
#define RecClHudVidInit()				
#define RecClHudRedraw(a, b)			
#define RecClHudUpdateClientData(a, b)	
#define RecClHudReset()					
#define RecClClientMove(a, b)			
#define RecClClientMoveInit(a)			
#define RecClClientTextureType(a)		
#define RecClIN_ActivateMouse()			
#define RecClIN_DeactivateMouse()		
#define RecClIN_MouseEvent(a)			
#define RecClIN_ClearStates()			
#define RecClIN_Accumulate()			
#define RecClCL_CreateMove(a, b, c)		
#define RecClCL_IsThirdPerson()			
#define RecClCL_GetCameraOffsets(a)		
#define RecClFindKey(a)					
#define RecClCamThink()					
#define RecClCalcRefdef(a)				
#define RecClAddEntity(a, b, c)			
#define RecClCreateEntities()			
#define RecClDrawNormalTriangles()		
#define RecClDrawTransparentTriangles()	
#define RecClStudioEvent(a, b)			
#define RecClPostRunCmd(a, b, c, d, e, f)		
#define RecClShutdown()					
#define RecClTxferLocalOverrides(a, b)	
#define RecClProcessPlayerState(a, b)	
#define RecClTxferPredictionData(a, b, c, d, e, f)		
#define RecClReadDemoBuffer(a, b)		
#define RecClConnectionlessPacket(a, b, c, d)		
#define RecClGetHullBounds(a, b, c)		
#define RecClHudFrame(a)				
#define RecClKeyEvent(a, b, c)			
#define RecClTempEntUpdate(a, b, c, d, e, f, g)	
#define RecClGetUserEntity(a)			
#define RecClVoiceStatus(a, b)			
#define RecClDirectorMessage(a, b)
#define RecClStudioInterface(a, b, c)	

#endif // FINAL_VAC_BUILD