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/dod/dod_hud_playerstatus_ammo.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/dod/dod_hud_playerstatus_ammo.cpp')
| -rw-r--r-- | game/client/dod/dod_hud_playerstatus_ammo.cpp | 700 |
1 files changed, 700 insertions, 0 deletions
diff --git a/game/client/dod/dod_hud_playerstatus_ammo.cpp b/game/client/dod/dod_hud_playerstatus_ammo.cpp new file mode 100644 index 0000000..0e8efac --- /dev/null +++ b/game/client/dod/dod_hud_playerstatus_ammo.cpp @@ -0,0 +1,700 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "iclientmode.h" +#include "c_dod_player.h" + +#include <vgui/IScheme.h> +#include <vgui/ISurface.h> +#include <vgui_controls/AnimationController.h> + +#include "dod_hud_playerstatus_ammo.h" +#include "ihudlcd.h" + +float GetScale( int nIconWidth, int nIconHeight, int nWidth, int nHeight ) +{ + float flScale = 1.0; + + if ( nIconWidth == nWidth && nIconHeight <= nHeight ) // no scaling necessary + { + return flScale; + } + else if ( nIconHeight == nHeight && nIconWidth <= nWidth ) // no scaling necessary + { + return flScale; + } + else if ( nIconWidth < nWidth && nIconHeight < nHeight ) // scale the image up + { + float scaleW = 0.0, scaleH = 0.0; + + if ( nIconWidth < nWidth ) + { + scaleW = (float)nWidth / (float)nIconWidth; + } + + if ( nIconHeight < nHeight ) + { + scaleH = (float)nHeight / (float)nIconHeight; + } + + if ( scaleW != 0.0 && scaleH != 0.0 ) + { + if ( scaleW < scaleH ) + { + flScale = scaleW; + } + else + { + flScale = scaleH; + } + } + else if ( scaleW != 0.0 ) + { + flScale = scaleW; + } + else + { + flScale = scaleH; + } + } + else // scale the image down + { + float scaleW = 0.0, scaleH = 0.0; + + if ( nIconWidth > nWidth ) + { + scaleW = (float)nWidth / (float)nIconWidth; + } + + if ( nIconHeight > nHeight ) + { + scaleH = (float)nHeight / (float)nIconHeight; + } + + if ( scaleW != 0.0 && scaleH != 0.0 ) + { + if ( scaleW < scaleH ) + { + flScale = scaleW; + } + else + { + flScale = scaleH; + } + } + else if ( scaleW != 0.0 ) + { + flScale = scaleW; + } + else + { + flScale = scaleH; + } + } + + return flScale; +} + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CDoDHudAmmo::CDoDHudAmmo( vgui::Panel *parent, const char *name ) : vgui::Panel( parent, name ) +{ + m_iAdditiveWhiteID = vgui::surface()->CreateNewTextureID(); + vgui::surface()->DrawSetTextureFile( m_iAdditiveWhiteID, "vgui/white_additive", true, false ); + + m_clrIcon = Color( 255, 255, 255, 255 ); + + hudlcd->SetGlobalStat( "(ammo_primary)", "0" ); + hudlcd->SetGlobalStat( "(ammo_secondary)", "0" ); + hudlcd->SetGlobalStat( "(weapon_print_name)", "" ); + hudlcd->SetGlobalStat( "(weapon_name)", "" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::Init( void ) +{ + m_iAmmo = -1; + m_iAmmo2 = -1; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + m_clrTextColor = pScheme->GetColor( "HudAmmoCount", GetFgColor() ); + m_clrTextXColor = pScheme->GetColor( "HudPanelBorder", GetFgColor() ); +} + +//----------------------------------------------------------------------------- +// Purpose: called every frame to get ammo info from the weapon +//----------------------------------------------------------------------------- +void CDoDHudAmmo::OnThink() +{ + C_BaseCombatWeapon *wpn = GetActiveWeapon(); + C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); + + hudlcd->SetGlobalStat( "(weapon_print_name)", wpn ? wpn->GetPrintName() : " " ); + hudlcd->SetGlobalStat( "(weapon_name)", wpn ? wpn->GetName() : " " ); + + if ( !wpn || !player || !wpn->UsesPrimaryAmmo() ) + { + hudlcd->SetGlobalStat( "(ammo_primary)", "n/a" ); + hudlcd->SetGlobalStat( "(ammo_secondary)", "n/a" ); + + SetPaintEnabled( false ); + SetPaintBackgroundEnabled( false ); + return; + } + else + { + SetPaintEnabled( true ); + SetPaintBackgroundEnabled( true ); + } + + // get the ammo in our clip + int ammo1 = wpn->Clip1(); + int ammo2; + if ( ammo1 < 0 ) + { + // we don't use clip ammo, just use the total ammo count + ammo1 = player->GetAmmoCount( wpn->GetPrimaryAmmoType() ); + ammo2 = 0; + } + else + { + // we use clip ammo, so the second ammo is the total ammo + ammo2 = player->GetAmmoCount( wpn->GetPrimaryAmmoType() ); + } + + hudlcd->SetGlobalStat( "(ammo_primary)", VarArgs( "%d", ammo1 ) ); + hudlcd->SetGlobalStat( "(ammo_secondary)", VarArgs( "%d", ammo2 ) ); + + if ( wpn == m_hCurrentActiveWeapon ) + { + // same weapon, just update counts + SetAmmo( ammo1, true ); + SetAmmo2( ammo2, true ); + } + else + { + // diferent weapon, change without triggering + SetAmmo( ammo1, false ); + SetAmmo2( ammo2, false ); + + // update whether or not we show the total ammo display + m_bUsesClips = wpn->UsesClipsForAmmo1(); + m_hCurrentActiveWeapon = wpn; + } +} + +//----------------------------------------------------------------------------- +// Purpose: Updates ammo display +//----------------------------------------------------------------------------- +void CDoDHudAmmo::SetAmmo( int ammo, bool playAnimation ) +{ + if ( ammo != m_iAmmo ) + { + m_iAmmo = ammo; + } +} + +//----------------------------------------------------------------------------- +// Purpose: Updates 2nd ammo display +//----------------------------------------------------------------------------- +void CDoDHudAmmo::SetAmmo2( int ammo2, bool playAnimation ) +{ + if ( ammo2 != m_iAmmo2 ) + { + m_iAmmo2 = ammo2; + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::DrawAmmoCount( int count ) +{ + char buf[16]; + Q_snprintf( buf, sizeof(buf), "x" ); + DrawText( buf, clip_count_text_xpos, clip_count_text_ypos, m_clrTextXColor ); + + Q_snprintf( buf, sizeof(buf), " %d", count ); + DrawText( buf, clip_count_text_xpos, clip_count_text_ypos, m_clrTextColor ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::PaintGrenadeAmmo( CWeaponDODBase *pWpn ) +{ + const CHudTexture *pAmmoIcon = pWpn->GetSpriteAmmo(); + + Assert( pAmmoIcon ); + + int xpos = small_icon_xpos, ypos = small_icon_ypos; + int w = small_icon_width, t = small_icon_height; + + int nIconWidth = 0, nIconHeight = 0; + float scale = 1.0f; + + if ( pAmmoIcon ) + { + nIconWidth = pAmmoIcon->Width(); + nIconHeight = pAmmoIcon->Height(); + + scale = GetScale( nIconWidth, nIconHeight, w, t ); + + nIconWidth *= scale; + nIconHeight *= scale; + + if ( nIconWidth < small_icon_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the xpos + { + xpos = small_icon_xpos + small_icon_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < small_icon_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = small_icon_ypos + small_icon_height / 2.0 - nIconHeight / 2.0; + } + + if ( m_iAmmo > 0 ) + { + pAmmoIcon->DrawSelf( xpos, ypos, nIconWidth, nIconHeight, m_clrIcon ); + DrawAmmoCount( m_iAmmo ); + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::PaintRifleGrenadeAmmo( CWeaponDODBase *pWpn ) +{ + const CHudTexture *pAmmoIcon = pWpn->GetSpriteAmmo(); + + Assert( pAmmoIcon ); + + int xpos = small_icon_xpos, ypos = small_icon_ypos; + int w = small_icon_width, t = small_icon_height; + + int nIconWidth = 0, nIconHeight = 0; + float scale = 1.0f; + + if ( pAmmoIcon ) + { + nIconWidth = pAmmoIcon->Width(); + nIconHeight = pAmmoIcon->Height(); + + scale = GetScale( nIconWidth, nIconHeight, w, t ); + + nIconWidth *= scale; + nIconHeight *= scale; + + if ( nIconWidth < small_icon_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the xpos + { + xpos = small_icon_xpos + small_icon_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < small_icon_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = small_icon_ypos + small_icon_height / 2.0 - nIconHeight / 2.0; + } + + int ammo = m_iAmmo + m_iAmmo2; + + if ( ammo > 0 ) + { + pAmmoIcon->DrawSelf( xpos, ypos, nIconWidth, nIconHeight, m_clrIcon ); + DrawAmmoCount( ammo ); + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::PaintBazookaAmmo( CWeaponDODBase *pWpn ) +{ + int panelX, panelY, panelW, panelT; + GetBounds( panelX, panelY, panelW, panelT ); + + const CHudTexture *pTubeIcon = pWpn->GetSpriteAmmo2(); + const CHudTexture *pRocketIcon = pWpn->GetSpriteAmmo(); + const CHudTexture *pExtraIcon = pWpn->GetSpriteAutoaim(); + + Assert( pTubeIcon ); + Assert( pRocketIcon ); + Assert( pExtraIcon ); + + int xpos = 0, ypos = 0; + int nIconWidth = 0, nIconHeight = 0; + float scale = 1.0f; + + if ( pTubeIcon && pRocketIcon ) + { + nIconWidth = pTubeIcon->Width(); + nIconHeight = pTubeIcon->Height(); + + xpos = large_icon_xpos; + ypos = large_icon_ypos; + + // mad hax + int width = large_icon_width + XRES(10); + + scale = GetScale( nIconWidth, nIconHeight, width, large_icon_height ); + + nIconWidth *= scale; + nIconHeight *= scale; + + if ( nIconWidth < large_icon_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the xpos + { + xpos = small_icon_xpos + small_icon_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < large_icon_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = small_icon_ypos + small_icon_height / 2.0 - nIconHeight / 2.0; + } + + pTubeIcon->DrawSelf( xpos, ypos, nIconWidth, nIconHeight, m_clrIcon ); + + // If our clip is full, draw the rocket + if( pRocketIcon ) + { + if( m_iAmmo > 0 ) + { + pRocketIcon->DrawSelf( xpos, ypos, nIconWidth, nIconHeight, m_clrIcon ); + } + } + } + + // Draw the extra rockets + if( m_iAmmo2 > 0 && pExtraIcon ) + { + // Align the extra clip on the same baseline as the large clip + xpos = extra_clip_xpos; + ypos = extra_clip_ypos; + + nIconWidth = pExtraIcon->Width(); + nIconHeight = pExtraIcon->Height(); + + if ( nIconWidth > extra_clip_width || nIconHeight > extra_clip_height ) + { + scale = GetScale( nIconWidth, nIconHeight, extra_clip_width, extra_clip_height ); + nIconWidth *= scale; + nIconHeight *= scale; + } + + if ( nIconWidth < extra_clip_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + xpos = extra_clip_xpos + extra_clip_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < extra_clip_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = extra_clip_ypos + extra_clip_height / 2.0 - nIconHeight / 2.0; + } + + pExtraIcon->DrawSelf( xpos, ypos, pExtraIcon->Width() * scale, pExtraIcon->Height() * scale, m_clrIcon ); + DrawAmmoCount( m_iAmmo2 ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::PaintMGAmmo( CWeaponDODBase *pWpn ) +{ + int panelX, panelY, panelW, panelT; + GetBounds( panelX, panelY, panelW, panelT ); + + const CHudTexture *pFullClip = pWpn->GetSpriteAmmo(); + const CHudTexture *pExtraClip = pWpn->GetSpriteAmmo2(); + + Assert( pFullClip ); + Assert( pExtraClip ); + + int xpos = 0, ypos = 0; + int nIconWidth = 0, nIconHeight = 0; + float scale = 1.0f; + + if ( pFullClip ) + { + nIconWidth = pFullClip->Width(); + nIconHeight = pFullClip->Height(); + + xpos = large_icon_xpos; + ypos = large_icon_ypos; + + scale = GetScale( nIconWidth, nIconHeight, large_icon_width, large_icon_height ); + + nIconWidth *= scale; + nIconHeight *= scale; + + if ( nIconWidth < large_icon_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the xpos + { + xpos = small_icon_xpos + small_icon_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < large_icon_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = small_icon_ypos + small_icon_height / 2.0 - nIconHeight / 2.0; + } + + pFullClip->DrawSelf( xpos, ypos, nIconWidth, nIconHeight, m_clrIcon ); + + char buf[16]; + Q_snprintf( buf, sizeof(buf), "%d", m_iAmmo ); + DrawText( buf, xpos + nIconWidth - ( (float)nIconWidth / 3.0 ), ypos + nIconHeight - ( (float)nIconHeight / 3.0 ), m_clrTextColor ); + } + + //how many full or partially full clips do we have? + int clips = m_iAmmo2 / pWpn->GetMaxClip1(); + + //account for the partial clip, if it exists + if( clips * pWpn->GetMaxClip1() < m_iAmmo2 ) + { + clips++; + } + + if( clips > 0 && pExtraClip ) + { + //align the extra clip on the same baseline as the large clip + xpos = extra_clip_xpos; + ypos = extra_clip_ypos; + + nIconWidth = pExtraClip->Width(); + nIconHeight = pExtraClip->Height(); + + if ( nIconWidth > extra_clip_width || nIconHeight > extra_clip_height ) + { + scale = GetScale( nIconWidth, nIconHeight, extra_clip_width, extra_clip_height ); + nIconWidth *= scale; + nIconHeight *= scale; + } + + if ( nIconWidth < extra_clip_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + xpos = extra_clip_xpos + extra_clip_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < extra_clip_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = extra_clip_ypos + extra_clip_height / 2.0 - nIconHeight / 2.0; + } + + pExtraClip->DrawSelf( xpos, ypos, pExtraClip->Width() * scale, pExtraClip->Height() * scale, m_clrIcon ); + DrawAmmoCount( clips ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::PaintGunAmmo( CWeaponDODBase *pWpn ) +{ + int panelX, panelY, panelW, panelT; + GetBounds( panelX, panelY, panelW, panelT ); + + //regular gun + const CHudTexture *pEmptyClip = pWpn->GetSpriteAmmo(); + const CHudTexture *pFullClip = pWpn->GetSpriteAmmo2(); + const CHudTexture *pExtraClip = pWpn->GetSpriteAutoaim(); + + Assert( pEmptyClip ); + Assert( pFullClip ); + Assert( pExtraClip ); + + int xpos = 0, ypos = 0; + int nIconWidth = 0, nIconHeight = 0; + float scale = 1.0f; + + if ( pFullClip && pEmptyClip ) + { + nIconWidth = pFullClip->Width(); + nIconHeight = pFullClip->Height(); + + xpos = large_icon_xpos; + ypos = large_icon_ypos; + + scale = GetScale( nIconWidth, nIconHeight, large_icon_width, large_icon_height ); + + nIconWidth *= scale; + nIconHeight *= scale; + + if ( nIconWidth < large_icon_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the xpos + { + xpos = small_icon_xpos + small_icon_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < large_icon_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = small_icon_ypos + small_icon_height / 2.0 - nIconHeight / 2.0; + } + + pFullClip->DrawSelf( xpos, ypos, nIconWidth, nIconHeight, m_clrIcon ); + + // base percent is how much of the bullet clip to always draw. + // total cropped height of the bullet sprite will be + // base percent + bullet height * bullets + float flBasePercent = (float)pWpn->GetDODWpnData().m_iHudClipBaseHeight / (float)pWpn->GetDODWpnData().m_iHudClipHeight; + float flBulletHeightPercent = (float)pWpn->GetDODWpnData().m_iHudClipBulletHeight / (float)pWpn->GetDODWpnData().m_iHudClipHeight; + + float flHeight = (float)pEmptyClip->Height(); + + //Now we draw the bullets inside based on how full our clip is + float flDrawHeight = flHeight * ( 1.0 - ( flBasePercent + flBulletHeightPercent * m_iAmmo ) ); + + int nOffset = (int)flDrawHeight; + int yPosOffset = nOffset * scale; + + pEmptyClip->DrawSelfCropped( xpos, ypos + yPosOffset, 0, nOffset, pEmptyClip->Width(), pEmptyClip->Height() - nOffset, nIconWidth, nIconHeight - yPosOffset, m_clrIcon ); + } + + // how many full or partially full clips do we have? + int clips = m_iAmmo2 / pWpn->GetMaxClip1(); + + // account for the partial clip, if it exists + if( clips * pWpn->GetMaxClip1() < m_iAmmo2 ) + { + clips++; + } + + if( clips > 0 && pExtraClip ) + { + //align the extra clip on the same baseline as the large clip + xpos = extra_clip_xpos; + ypos = extra_clip_ypos; + + nIconWidth = pExtraClip->Width(); + nIconHeight = pExtraClip->Height(); + + if ( nIconWidth > extra_clip_width || nIconHeight > extra_clip_height ) + { + scale = GetScale( nIconWidth, nIconHeight, extra_clip_width, extra_clip_height ); + nIconWidth *= scale; + nIconHeight *= scale; + } + + if ( nIconWidth < extra_clip_width - XRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + xpos = extra_clip_xpos + extra_clip_width / 2.0 - nIconWidth / 2.0; + } + + if ( nIconHeight < extra_clip_height - YRES(2) ) // 2 is our buffer for when we need to re-calculate the ypos + { + ypos = extra_clip_ypos + extra_clip_height / 2.0 - nIconHeight / 2.0; + } + + pExtraClip->DrawSelf( xpos, ypos, pExtraClip->Width() * scale, pExtraClip->Height() * scale, m_clrIcon ); + DrawAmmoCount( clips ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::Paint( void ) +{ + C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer(); + + if( !pPlayer ) + return; + + CWeaponDODBase *pWpn = pPlayer->GetActiveDODWeapon(); + + if( !pWpn ) + return; + + switch( pWpn->GetDODWpnData().m_WeaponType ) + { + case WPN_TYPE_GRENADE: + PaintGrenadeAmmo( pWpn ); + break; + + case WPN_TYPE_RIFLEGRENADE: + PaintRifleGrenadeAmmo( pWpn ); + break; + + case WPN_TYPE_BAZOOKA: + PaintBazookaAmmo( pWpn ); + break; + + case WPN_TYPE_MG: + PaintMGAmmo( pWpn ); + break; + + case WPN_TYPE_CAMERA: + break; + + default: + PaintGunAmmo( pWpn ); + break; + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::DrawText( char *text, int x, int y, Color clrText ) +{ + vgui::surface()->DrawSetTextColor( clrText ); + vgui::surface()->DrawSetTextFont( m_hNumberFont ); + vgui::surface()->DrawSetTextPos( x, y ); + + for (char *pch = text; *pch != 0; pch++) + { + vgui::surface()->DrawUnicodeChar(*pch); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudAmmo::DrawNumbers( int num, int x, int y ) +{ + if ( !m_pMGNumbers[0] ) + { + int i; + for ( i = 0 ; i < 10 ; i++ ) + { + char buf[8]; + Q_snprintf( buf, sizeof(buf), "mg_%d", i ); + m_pMGNumbers[i] = gHUD.GetIcon( buf ); + } + } + + Assert( num < 1000 ); + + int xpos = x; + int ypos = y; + int num_working = num; + + int iconWidth = m_pMGNumbers[0]->Width(); + + int hundreds = num_working / 100; + num_working -= hundreds * 100; + + m_pMGNumbers[hundreds]->DrawSelf( xpos, ypos, m_clrIcon ); + xpos += iconWidth; + + int tens = num_working / 10; + num_working -= tens * 10; + + m_pMGNumbers[tens]->DrawSelf( xpos, ypos, m_clrIcon ); + xpos += iconWidth; + + m_pMGNumbers[num_working]->DrawSelf( xpos, ypos, m_clrIcon ); + xpos += iconWidth; +} + |