diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/hl1/hl1_hud_damagetiles.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/hl1/hl1_hud_damagetiles.cpp')
| -rw-r--r-- | game/client/hl1/hl1_hud_damagetiles.cpp | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/game/client/hl1/hl1_hud_damagetiles.cpp b/game/client/hl1/hl1_hud_damagetiles.cpp new file mode 100644 index 0000000..cc21c51 --- /dev/null +++ b/game/client/hl1/hl1_hud_damagetiles.cpp @@ -0,0 +1,322 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + + +#include "cbase.h" +#include "hud.h" +#include "text_message.h" +#include "hud_macros.h" +#include "iclientmode.h" +#include "view.h" +#include <KeyValues.h> +#include <vgui/ISurface.h> +#include <vgui_controls/Panel.h> +#include "VGuiMatSurface/IMatSystemSurface.h" +#include "materialsystem/imaterial.h" +#include "materialsystem/imesh.h" +#include "materialsystem/imaterialvar.h" +#include "IEffects.h" +#include "hudelement.h" + +using namespace vgui; + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +#define DMG_IMAGE_LIFE 2 // seconds that image is up +#define NUM_DMG_TYPES 8 + +typedef struct +{ + float flExpire; + float flBaseline; + int x; + int y; + CHudTexture *icon; + long fFlags; +} damagetile_t; + +//----------------------------------------------------------------------------- +// Purpose: HDU Damage type tiles +//----------------------------------------------------------------------------- +class CHudDamageTiles : public CHudElement, public vgui::Panel +{ + DECLARE_CLASS_SIMPLE( CHudDamageTiles, vgui::Panel ); + +public: + CHudDamageTiles( const char *pElementName ); + + void Init( void ); + void VidInit( void ); + void Reset( void ); + bool ShouldDraw( void ); + + // Handler for our message + void MsgFunc_Damage(bf_read &msg); + +private: + void Paint(); + void ApplySchemeSettings(vgui::IScheme *pScheme); + +private: + CHudTexture *DamageTileIcon( int i ); + long DamageTileFlags( int i ); + void UpdateTiles( long bits ); + +private: + long m_bitsDamage; + damagetile_t m_dmgTileInfo[ NUM_DMG_TYPES ]; +}; + + +DECLARE_HUDELEMENT( CHudDamageTiles ); +DECLARE_HUD_MESSAGE( CHudDamageTiles, Damage ); + + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CHudDamageTiles::CHudDamageTiles( const char *pElementName ) : CHudElement( pElementName ), BaseClass(NULL, "HudDamageTiles") +{ + vgui::Panel *pParent = g_pClientMode->GetViewport(); + SetParent( pParent ); + + SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT ); +} + +void CHudDamageTiles::Init( void ) +{ + HOOK_HUD_MESSAGE( CHudDamageTiles, Damage ); +} + + +void CHudDamageTiles::VidInit( void ) +{ + Reset(); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CHudDamageTiles::Reset( void ) +{ + m_bitsDamage = 0; + for ( int i = 0; i < NUM_DMG_TYPES; i++ ) + { + m_dmgTileInfo[ i ].flExpire = 0; + m_dmgTileInfo[ i ].flBaseline = 0; + m_dmgTileInfo[ i ].x = 0; + m_dmgTileInfo[ i ].y = 0; + m_dmgTileInfo[ i ].icon = DamageTileIcon( i ); + m_dmgTileInfo[ i ].fFlags = DamageTileFlags( i ); + } +} + + +CHudTexture *CHudDamageTiles::DamageTileIcon( int i ) +{ + switch ( i ) + { + case 0: + default: + return gHUD.GetIcon( "dmg_poison" ); + break; + case 1: + return gHUD.GetIcon( "dmg_chem" ); + break; + case 2: + return gHUD.GetIcon( "dmg_cold" ); + break; + case 3: + return gHUD.GetIcon( "dmg_drown" ); + break; + case 4: + return gHUD.GetIcon( "dmg_heat" ); + break; + case 5: + return gHUD.GetIcon( "dmg_gas" ); + break; + case 6: + return gHUD.GetIcon( "dmg_rad" ); + break; + case 7: + return gHUD.GetIcon( "dmg_shock" ); + break; + } +} + +long CHudDamageTiles::DamageTileFlags( int i ) +{ + switch ( i ) + { + case 0: + default: + return DMG_POISON; + + case 1: + return DMG_ACID; + + case 2: + // HL2 hijacked DMG_FREEZE and made it DMG_VEHICLE + // HL2 hijacked DMG_SLOWFREEZE and made it DMG_DISSOLVE +// return DMG_FREEZE | DMG_SLOWFREEZE; + return DMG_VEHICLE | DMG_DISSOLVE; + + case 3: + return DMG_DROWN; + + case 4: + return DMG_BURN | DMG_SLOWBURN; + + case 5: + return DMG_NERVEGAS; + + case 6: + return DMG_RADIATION; + + case 7: + return DMG_SHOCK; + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Message handler for Damage message +//----------------------------------------------------------------------------- +void CHudDamageTiles::MsgFunc_Damage( bf_read &msg ) +{ + msg.ReadByte(); // armor + msg.ReadByte(); // health + long bitsDamage = msg.ReadLong(); // damage bits, ignore + + UpdateTiles( bitsDamage ); +} + +bool CHudDamageTiles::ShouldDraw( void ) +{ + if ( !CHudElement::ShouldDraw() ) + return false; + + if ( !m_bitsDamage ) + return false; + + return true; +} + +void CHudDamageTiles::Paint( void ) +{ + int r, g, b, a, nUnused; + damagetile_t *pDmgTile; + Color clrTile; + + (gHUD.m_clrYellowish).GetColor( r, g, b, nUnused ); + a = (int)( fabs( sin( gpGlobals->curtime * 2 ) ) * 256.0 ); + clrTile.SetColor( r, g, b, a ); + + int i; + // Draw all the items + for ( i = 0; i < NUM_DMG_TYPES; i++ ) + { + pDmgTile = &m_dmgTileInfo[ i ]; + if ( m_bitsDamage & pDmgTile->fFlags ) + { + if ( pDmgTile->icon ) + { + ( pDmgTile->icon )->DrawSelf( pDmgTile->x, pDmgTile->y, clrTile ); + } + } + } + + // check for bits that should be expired + for ( i = 0; i < NUM_DMG_TYPES; i++ ) + { + pDmgTile = &m_dmgTileInfo[ i ]; + + if ( m_bitsDamage & pDmgTile->fFlags ) + { + pDmgTile->flExpire = MIN( gpGlobals->curtime + DMG_IMAGE_LIFE, pDmgTile->flExpire ); + + if ( pDmgTile->flExpire <= gpGlobals->curtime // when the time has expired + && a < 40 ) // and the flash is at the low point of the cycle + { + pDmgTile->flExpire = 0; + + int y = pDmgTile->y; + pDmgTile->x = 0; + pDmgTile->y = 0; + + m_bitsDamage &= ~pDmgTile->fFlags; // clear the bits + + // move everyone above down + for ( int j = 0; j < NUM_DMG_TYPES; j++ ) + { + damagetile_t *pDmgTileIter = &m_dmgTileInfo[ j ]; + if ( ( pDmgTileIter->y ) && ( pDmgTileIter->y < y ) && ( pDmgTileIter->icon ) ) + pDmgTileIter->y += ( pDmgTileIter->icon )->Height(); + } + } + } + } +} + + +void CHudDamageTiles::UpdateTiles( long bitsDamage ) +{ + damagetile_t *pDmgTile; + + // Which types are new? + long bitsOn = ~m_bitsDamage & bitsDamage; + + for ( int i = 0; i < NUM_DMG_TYPES; i++ ) + { + pDmgTile = &m_dmgTileInfo[ i ]; + + // Is this one already on? + if ( m_bitsDamage & pDmgTile->fFlags ) + { + pDmgTile->flExpire = gpGlobals->curtime + DMG_IMAGE_LIFE; // extend the duration + if ( !pDmgTile->flBaseline ) + { + pDmgTile->flBaseline = gpGlobals->curtime; + } + } + + // Are we just turning it on? + if ( bitsOn & pDmgTile->fFlags ) + { + // put this one at the bottom + if ( pDmgTile->icon ) + { + pDmgTile->x = ( pDmgTile->icon )->Width() / 8; + pDmgTile->y = GetTall() - ( pDmgTile->icon )->Height() * 2; + } + pDmgTile->flExpire = gpGlobals->curtime + DMG_IMAGE_LIFE; + + // move everyone else up + for ( int j = 0; j < NUM_DMG_TYPES; j++ ) + { + if ( j == i ) + continue; + + pDmgTile = &m_dmgTileInfo[ j ]; + if ( pDmgTile->y && pDmgTile->icon ) + pDmgTile->y -= ( pDmgTile->icon )->Height(); + + } + pDmgTile = &m_dmgTileInfo[ i ]; + } + } + + // damage bits are only turned on here; they are turned off when the draw time has expired (in Paint()) + m_bitsDamage |= bitsDamage; +} + +void CHudDamageTiles::ApplySchemeSettings(vgui::IScheme *pScheme) +{ + BaseClass::ApplySchemeSettings(pScheme); + SetPaintBackgroundEnabled(false); +} |