/**************************************************************** * * * 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é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è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; };