|
|
/**************************************************************** |
|
|
* * |
|
|
* hudrpg.cpp * |
|
|
* * |
|
|
* par Julien * |
|
|
* * |
|
|
****************************************************************/ |
|
|
|
|
|
// interface rpg sur le hud |
|
|
|
|
|
//inclusions |
|
|
|
|
|
#include "hud.h" |
|
|
#include "cl_util.h" |
|
|
#include "const.h" |
|
|
#include "parsemsg.h" |
|
|
#include "eventscripts.h" |
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------ |
|
|
// |
|
|
// rafraichissement de l'affichage |
|
|
|
|
|
int CHudRPG :: Draw ( float flTime ) |
|
|
{ |
|
|
//-------------------------------- |
|
|
// menu |
|
|
|
|
|
int iTopleftX = ScreenWidth - 144 - 15; |
|
|
int iTopleftY = ScreenHeight - 65; |
|
|
|
|
|
int iYellow [3] = {255, 255, 0}; |
|
|
int iRed [3] = {255,0,0}; |
|
|
|
|
|
ScaleColors( iYellow[0], iYellow[1], iYellow[2], m_iMenuState & RPG_MENU_ACTIVE ? 200 : 100 ); |
|
|
ScaleColors( iRed[0], iRed[1], iRed[2], m_iMenuState & RPG_MENU_ACTIVE ? 200 : 100 ); |
|
|
|
|
|
// roquette |
|
|
|
|
|
if ( m_iMenuState & RPG_MENU_ROCKET_EMPTY ) |
|
|
SPR_Set( m_sprMenu, iRed[0], iRed[1], iRed[2] ); |
|
|
else |
|
|
SPR_Set( m_sprMenu, iYellow[0], iYellow[1], iYellow[2] ); |
|
|
|
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &m_rcRocket ); |
|
|
|
|
|
if ( m_iMenuState & RPG_MENU_ROCKET_SELECTED ) |
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &m_rcSelect ); |
|
|
else |
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &m_rcEmpty ); |
|
|
|
|
|
|
|
|
// electro |
|
|
|
|
|
if ( m_iMenuState & RPG_MENU_ELECTRO_EMPTY ) |
|
|
SPR_Set( m_sprMenu, iRed[0], iRed[1], iRed[2] ); |
|
|
else |
|
|
SPR_Set( m_sprMenu, iYellow[0], iYellow[1], iYellow[2] ); |
|
|
|
|
|
SPR_DrawAdditive( 0, iTopleftX + 48, iTopleftY, &m_rcElectro ); |
|
|
|
|
|
if ( m_iMenuState & RPG_MENU_ELECTRO_SELECTED ) |
|
|
SPR_DrawAdditive( 0, iTopleftX + 48, iTopleftY, &m_rcSelect ); |
|
|
else |
|
|
SPR_DrawAdditive( 0, iTopleftX + 48, iTopleftY, &m_rcEmpty ); |
|
|
|
|
|
// nuclear |
|
|
|
|
|
if ( m_iMenuState & RPG_MENU_NUCLEAR_EMPTY ) |
|
|
SPR_Set( m_sprMenu, iRed[0], iRed[1], iRed[2] ); |
|
|
else |
|
|
SPR_Set( m_sprMenu, iYellow[0], iYellow[1], iYellow[2] ); |
|
|
|
|
|
SPR_DrawAdditive( 0, iTopleftX + 96, iTopleftY, &m_rcNuclear ); |
|
|
|
|
|
if ( m_iMenuState & RPG_MENU_NUCLEAR_SELECTED ) |
|
|
SPR_DrawAdditive( 0, iTopleftX + 96, iTopleftY, &m_rcSelect ); |
|
|
else |
|
|
SPR_DrawAdditive( 0, iTopleftX + 96, iTopleftY, &m_rcEmpty ); |
|
|
|
|
|
gHUD.DrawHudNumberString |
|
|
( iTopleftX + 10, iTopleftY - 15, iTopleftX - 100, m_iAmmo1, |
|
|
m_iAmmo1 ? iYellow[0] : iRed[0], m_iAmmo1 ? iYellow[1] : iRed[1], m_iAmmo1 ? iYellow[2] : iRed[2] ); |
|
|
|
|
|
gHUD.DrawHudNumberString |
|
|
( iTopleftX + 48 + 10, iTopleftY - 15, iTopleftX - 100, m_iAmmo2, |
|
|
m_iAmmo2 ? iYellow[0] : iRed[0], m_iAmmo2 ? iYellow[1] : iRed[1], m_iAmmo2 ? iYellow[2] : iRed[2] ); |
|
|
|
|
|
gHUD.DrawHudNumberString |
|
|
( iTopleftX + 48 + 48 + 10, iTopleftY - 15, iTopleftX - 100, m_iAmmo3, |
|
|
m_iAmmo3 ? iYellow[0] : iRed[0], m_iAmmo3 ? iYellow[1] : iRed[1], m_iAmmo3 ? iYellow[2] : iRed[2] ); |
|
|
|
|
|
|
|
|
//-------------------------------- |
|
|
// viseur |
|
|
|
|
|
|
|
|
iTopleftX = ScreenWidth / 2 - 32; |
|
|
iTopleftY = ScreenHeight / 2 - 32; |
|
|
|
|
|
|
|
|
SPR_Set( m_sprCrosshair, 255, 255, 255 ); |
|
|
|
|
|
switch ( m_iViseurState ) |
|
|
{ |
|
|
case RPG_CROSSHAIR_NORMAL: |
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &m_rcCrosshair ); |
|
|
break; |
|
|
|
|
|
case RPG_CROSSHAIR_EMPTY: |
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &m_rcCrosshair ); |
|
|
SPR_DrawAdditive( 3, iTopleftX, iTopleftY, &m_rcCrosshair ); |
|
|
break; |
|
|
|
|
|
case RPG_CROSSHAIR_LOCKED: |
|
|
SPR_DrawAdditive( 2, iTopleftX, iTopleftY, &m_rcCrosshair ); |
|
|
SPR_DrawAdditive( 4, iTopleftX, iTopleftY, &m_rcCrosshair ); |
|
|
break; |
|
|
|
|
|
case RPG_CROSSHAIR_PROCESS: |
|
|
{ |
|
|
int iTaux = ( int ) ( 64 * ( m_flSelectTime - flTime ) ); |
|
|
iTaux = iTaux < 0 ? 0 : iTaux; |
|
|
|
|
|
wrect_t rec1 = CreateWrect ( 0, 0, 64, iTaux ); |
|
|
wrect_t rec2 = CreateWrect ( 0, iTaux, 64, 64 ); |
|
|
|
|
|
SPR_DrawAdditive( 1, iTopleftX, iTopleftY, &m_rcCrosshair ); |
|
|
SPR_DrawAdditive( 3, iTopleftX, iTopleftY, &rec1 ); |
|
|
SPR_DrawAdditive( 4, iTopleftX, iTopleftY + iTaux, &rec2 ); |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//-------------------------------- |
|
|
// textes |
|
|
|
|
|
cl_entity_t *pRpg = GetViewEntity(); |
|
|
|
|
|
if ( m_iViseurState != RPG_CROSSHAIR_NORMAL ) |
|
|
{ |
|
|
iTopleftX = 30; |
|
|
iTopleftY = ScreenHeight * 2/3; |
|
|
|
|
|
// premier texte |
|
|
|
|
|
wrect_t rec1; |
|
|
|
|
|
switch ( m_iViseurState ) |
|
|
{ |
|
|
case RPG_CROSSHAIR_EMPTY: |
|
|
rec1 = CreateWrect ( 3, 1, 198, 16 ); |
|
|
pRpg->curstate.skin = 0; |
|
|
break; |
|
|
case RPG_CROSSHAIR_PROCESS: |
|
|
rec1 = CreateWrect ( 3, 17, 198, 32 ); |
|
|
pRpg->curstate.skin = 1; |
|
|
break; |
|
|
case RPG_CROSSHAIR_LOCKED: |
|
|
rec1 = CreateWrect ( 3, 33, 198, 48 ); |
|
|
pRpg->curstate.skin = 2; |
|
|
break; |
|
|
} |
|
|
|
|
|
SPR_Set( m_sprText, 255, 255, 255 ); |
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &rec1 ); |
|
|
|
|
|
// deuxieme texte |
|
|
|
|
|
if ( m_iTextState != 0 ) |
|
|
{ |
|
|
if ( m_iTextState == RPG_TEXT_TOUCHE ) |
|
|
rec1 = CreateWrect ( 3, 49, 198, 64 ); |
|
|
else |
|
|
rec1 = CreateWrect ( 3, 65, 198, 78 ); |
|
|
|
|
|
float flFade = ( m_flTextTime - flTime ) * 255 / 2; |
|
|
|
|
|
if ( flFade < 0 ) |
|
|
m_iTextState = 0; |
|
|
|
|
|
else |
|
|
{ |
|
|
int r = 255, g = 255, b = 255; |
|
|
ScaleColors(r, g, b, flFade ); |
|
|
iTopleftY += 18; |
|
|
|
|
|
SPR_Set( m_sprText, r, g, b ); |
|
|
SPR_DrawAdditive( 0, iTopleftX, iTopleftY, &rec1 ); |
|
|
} |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
pRpg->curstate.skin = 0; |
|
|
} |
|
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//------------------------------------ |
|
|
// |
|
|
// d<EFBFBD>claration des messages du serveur : |
|
|
|
|
|
DECLARE_MESSAGE(m_RPG, RpgViseur); |
|
|
DECLARE_MESSAGE(m_RPG, MenuRpg); |
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------ |
|
|
// |
|
|
// initialisation au chargement de la dll |
|
|
|
|
|
int CHudRPG :: Init( void ) |
|
|
{ |
|
|
m_sprMenu = SPR_Load("sprites/rpg_menu.spr"); |
|
|
m_sprCrosshair = SPR_Load("sprites/rpg_viseur.spr"); |
|
|
m_sprText = SPR_Load("sprites/rpg_txt.spr"); |
|
|
|
|
|
m_rcRocket = CreateWrect ( 0, 0, 48, 48 ); |
|
|
m_rcElectro = CreateWrect ( 48, 0, 96, 48 ); |
|
|
m_rcNuclear = CreateWrect ( 96, 0, 144,48 ); |
|
|
m_rcSelect = CreateWrect ( 144,0, 192,48 ); |
|
|
m_rcEmpty = CreateWrect ( 192,0, 240,48 ); |
|
|
|
|
|
m_rcCrosshair = CreateWrect ( 0, 0, 64, 64 ); |
|
|
|
|
|
HOOK_MESSAGE(RpgViseur); |
|
|
HOOK_MESSAGE(MenuRpg); |
|
|
|
|
|
m_iFlags &= ~HUD_ACTIVE; |
|
|
|
|
|
gHUD.AddHudElem(this); |
|
|
return 1; |
|
|
} |
|
|
|
|
|
|
|
|
//------------------------------------ |
|
|
// |
|
|
// initialisation apr<EFBFBD>s le chargement |
|
|
|
|
|
|
|
|
int CHudRPG :: VidInit( void ) |
|
|
{ |
|
|
m_sprMenu = SPR_Load("sprites/rpg_menu.spr"); |
|
|
m_sprCrosshair = SPR_Load("sprites/rpg_viseur.spr"); |
|
|
m_sprText = SPR_Load("sprites/rpg_txt.spr"); |
|
|
|
|
|
m_rcRocket = CreateWrect ( 0, 0, 48, 48 ); |
|
|
m_rcElectro = CreateWrect ( 48, 0, 96, 48 ); |
|
|
m_rcNuclear = CreateWrect ( 96, 0, 144,48 ); |
|
|
m_rcSelect = CreateWrect ( 144,0, 192,48 ); |
|
|
m_rcEmpty = CreateWrect ( 192,0, 240,48 ); |
|
|
|
|
|
m_rcCrosshair = CreateWrect ( 0, 0, 64, 64 ); |
|
|
|
|
|
m_iFlags &= ~HUD_ACTIVE; |
|
|
return 1; |
|
|
} |
|
|
|
|
|
|
|
|
//------------------------------------ |
|
|
// |
|
|
// gestion des messages serveur |
|
|
|
|
|
|
|
|
int CHudRPG::MsgFunc_RpgViseur( const char *pszName, int iSize, void *pbuf ) |
|
|
{ |
|
|
|
|
|
BEGIN_READ( pbuf, iSize ); |
|
|
|
|
|
int iRead = READ_BYTE(); |
|
|
|
|
|
switch ( iRead ) |
|
|
{ |
|
|
default: |
|
|
case RPG_CROSSHAIR_NORMAL: |
|
|
case RPG_CROSSHAIR_EMPTY: |
|
|
case RPG_CROSSHAIR_LOCKED: |
|
|
m_iViseurState = iRead; |
|
|
break; |
|
|
|
|
|
case RPG_CROSSHAIR_PROCESS: |
|
|
m_iViseurState = iRead; |
|
|
m_flSelectTime = gHUD.m_flTime + 1.0; |
|
|
break; |
|
|
|
|
|
case RPG_TEXT_TOUCHE: |
|
|
case RPG_TEXT_MANQUE: |
|
|
m_iTextState = iRead; |
|
|
m_flTextTime = gHUD.m_flTime + 2.0; |
|
|
break; |
|
|
} |
|
|
|
|
|
return 1; |
|
|
} |
|
|
|
|
|
int CHudRPG::MsgFunc_MenuRpg ( const char *pszName, int iSize, void *pbuf ) |
|
|
{ |
|
|
BEGIN_READ( pbuf, iSize ); |
|
|
|
|
|
m_iMenuState = READ_BYTE(); |
|
|
|
|
|
m_iAmmo1 = READ_BYTE(); |
|
|
m_iAmmo2 = READ_BYTE(); |
|
|
m_iAmmo3 = READ_BYTE(); |
|
|
|
|
|
|
|
|
if ( (m_iMenuState & RPG_MENU_CLOSE) && ( m_iFlags & HUD_ACTIVE ) ) |
|
|
m_iFlags &= ~HUD_ACTIVE; |
|
|
|
|
|
else if ( !(m_iMenuState & RPG_MENU_CLOSE) && !( m_iFlags & HUD_ACTIVE ) ) |
|
|
m_iFlags |= HUD_ACTIVE; |
|
|
|
|
|
return 1; |
|
|
} |
|
|
|
|
|
|
|
|
//------------------------------------ |
|
|
// |
|
|
// outil pour le remplissage des structures wrect |
|
|
|
|
|
wrect_t CreateWrect ( int left, int top, int right, int bottom ) |
|
|
{ |
|
|
wrect_t rec; |
|
|
rec.left = left; |
|
|
rec.top = top; |
|
|
rec.right = right; |
|
|
rec.bottom = bottom; |
|
|
|
|
|
return rec; |
|
|
};
|
|
|
|