Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
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.

240 lines
3.8 KiB

/****************************************************************
* *
* nvg.cpp *
* *
* par Julien *
* *
****************************************************************/
// code de la vision infrarouge
//inclusions
#include "hud.h"
#include "cl_util.h"
#include "const.h"
#include "parsemsg.h"
//------------------------------------
//
// rafraichissement de l'affichage
int CHudNVG :: Draw ( float flTime )
{
float delta = flTime - lasttime;
lasttime = flTime;
frame += delta * 10; // 10fps
while ( (int)frame > 4 )
frame -= 5;
nombre = 0;
wrect_t rec;
rec.left = rec.top = 0;
rec.right = rec.bottom = 256;
int x = (int)(ScreenWidth / 256) + 1;
int y = (int)(ScreenHeight / 256) + 1;
SPR_Set( m_sprNVG, 175, 175, 175);
for ( int i = 0; i < x; i ++ )
{
for ( int j = 0; j < y; j ++ )
SPR_DrawAdditive( Frame(), 256 * i, 256 * j, &rec );
}
// viseur
rec = CreateWrect (0,0,256,256);
x = (int)(ScreenWidth / 2) - 128;
y = (int)(ScreenHeight / 2) - 128;
SPR_Set( m_sprEnnemy, 0, 200, 0);
SPR_DrawAdditive( 0, x, y, &rec );
return 1;
}
//------------------------------------
//
// num<EFBFBD>ro de la frame <EFBFBD> afficher
int CHudNVG :: Frame( void )
{
/* int returnframe = (int)frame + nombre;
while ( returnframe > 4 )
returnframe -= 5;
nombre ++;
return returnframe;
*/
return (int)frame;
}
//------------------------------------
//
// d<EFBFBD>claration du message :
// gmsgSwitchNVG
// gmsgInfosNVG
DECLARE_MESSAGE(m_NVG, SwitchNVG );
DECLARE_MESSAGE(m_NVG, InfosNVG );
//------------------------------------
//
// initialisation au chargement de la dll
int CHudNVG :: Init( void )
{
m_sprNVG = SPR_Load("sprites/nvg.spr");
m_sprEnnemy = SPR_Load("sprites/irgunviseur.spr"); // pour pas recompiler le hud.h :)
lasttime = frame = 0;
ClearEnnemies ();
HOOK_MESSAGE( SwitchNVG );
HOOK_MESSAGE( InfosNVG );
m_iFlags &= ~HUD_ACTIVE;
gHUD.AddHudElem(this);
return 1;
}
//------------------------------------
//
// initialisation apr<EFBFBD>s le chargement
int CHudNVG :: VidInit( void )
{
m_sprNVG = SPR_Load("sprites/nvg.spr");
m_sprEnnemy = SPR_Load("sprites/irgunviseur.spr"); // pour pas recompiler le hud.h :)
lasttime = frame = 0;
ClearEnnemies ();
m_iFlags &= ~HUD_ACTIVE;
return 1;
}
//------------------------------------
//
// gestion des messages serveur
int CHudNVG::MsgFunc_SwitchNVG( const char *pszName, int iSize, void *pbuf )
{
BEGIN_READ( pbuf, iSize );
int iOnOff = READ_BYTE();
if ( iOnOff == 1 )
m_iFlags |= HUD_ACTIVE;
if ( iOnOff == 0 )
{
m_iFlags &= ~HUD_ACTIVE;
ClearEnnemies ();
}
return 1;
}
int CHudNVG::MsgFunc_InfosNVG ( const char *pszName, int iSize, void *pbuf )
{
ClearEnnemies ();
BEGIN_READ( pbuf, iSize );
int nument = READ_BYTE();
if ( nument == 0 )
return 1;
for ( int i = 0; i < nument; i++ )
{
// lecture
int entindex = READ_BYTE();
vec3_t color;
color.x = READ_COORD() / 255;
color.y = READ_COORD() / 255;
color.z = READ_COORD() / 255;
// enregistrement
nvg_ennemy_t *p = NULL;
p = new nvg_ennemy_t;
p->index = entindex;
p->color = color;
if ( pEnnemy )
p->pNext = pEnnemy;
else
p->pNext = NULL;
pEnnemy = p;
}
return 1;
}
//------------------------------------
//
// destruction du registre des
// entit<EFBFBD>s visibles
void CHudNVG :: ClearEnnemies ( void )
{
nvg_ennemy_t *p;
while ( pEnnemy )
{
p = pEnnemy;
pEnnemy = p->pNext;
delete p;
}
}
//------------------------------------
// cherche si l'entit<EFBFBD> est visible
nvg_ennemy_t *CHudNVG :: IsEnnemy ( int index )
{
if ( pEnnemy == NULL )
return NULL;
nvg_ennemy_t *p = pEnnemy;
do
{
if ( p->index == index )
return p;
p = p->pNext;
}
while ( p != NULL );
// sort de la boucle : aucune entit<EFBFBD> trouv<EFBFBD>e
return NULL;
}