summaryrefslogtreecommitdiff
path: root/game/client/tf2/playeroverlayclass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf2/playeroverlayclass.cpp')
-rw-r--r--game/client/tf2/playeroverlayclass.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/game/client/tf2/playeroverlayclass.cpp b/game/client/tf2/playeroverlayclass.cpp
new file mode 100644
index 0000000..12684eb
--- /dev/null
+++ b/game/client/tf2/playeroverlayclass.cpp
@@ -0,0 +1,269 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Workfile: $
+// $Date: $
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "playeroverlayclass.h"
+#include "playeroverlay.h"
+#include <KeyValues.h>
+#include "commanderoverlay.h"
+#include "clientmode_tfnormal.h"
+#include "tf_shareddefs.h"
+#include "hud_commander_statuspanel.h"
+#include "vgui_bitmapimage.h"
+#include "igamesystem.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+//-----------------------------------------------------------------------------
+// Class info. Only load it once.
+//-----------------------------------------------------------------------------
+
+CHudPlayerOverlayClass::CMapClassColors** CHudPlayerOverlayClass::s_ppClassInfo = 0;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CCleanupPlayerOverlayClass : public CAutoGameSystem
+{
+public:
+ virtual void Shutdown()
+ {
+ if ( !CHudPlayerOverlayClass::s_ppClassInfo )
+ return;
+
+ for (int i = 0; i <= MAX_TF_TEAMS; ++i)
+ {
+ for ( int j = 0; j < TFCLASS_CLASS_COUNT; j++ )
+ {
+ delete CHudPlayerOverlayClass::s_ppClassInfo[i][j].m_pClassImage;
+ }
+ delete[] CHudPlayerOverlayClass::s_ppClassInfo[i];
+ }
+ delete[] CHudPlayerOverlayClass::s_ppClassInfo;
+ }
+};
+
+static CCleanupPlayerOverlayClass g_CleanupPlayerOverlayClass;
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+
+CHudPlayerOverlayClass::CHudPlayerOverlayClass( CHudPlayerOverlay *baseOverlay )
+: BaseClass( NULL, "CHudPlayerOverlayClass" )
+{
+ m_pBaseOverlay = baseOverlay;
+
+ m_pImage = NULL;
+ SetPaintBackgroundEnabled( false );
+
+ // Send mouse inputs (but not cursorenter/exit for now) up to parent
+ SetReflectMouse( true );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+
+CHudPlayerOverlayClass::~CHudPlayerOverlayClass( void )
+{
+ delete m_pImage;
+}
+
+
+//-----------------------------------------------------------------------------
+// Parse class icons
+//-----------------------------------------------------------------------------
+
+bool CHudPlayerOverlayClass::ParseTeamClassInfo( KeyValues *pClassIcons, const char *classname, CMapClassColors *pClassColors )
+{
+ const char *classimage;
+ KeyValues *pClass;
+ pClass = pClassIcons->FindKey( classname );
+ if ( !pClass )
+ return false;
+
+ classimage = pClass->GetString( "material" );
+ if ( classimage && classimage[ 0 ] )
+ {
+ pClassColors->m_pClassImage = new BitmapImage( NULL, classimage );
+ }
+ else
+ {
+ return( false );
+ }
+
+ return ParseRGBA( pClass, "color", pClassColors->m_clrClass );
+}
+
+bool CHudPlayerOverlayClass::ParseTeamClassIcons( CMapClassColors *pT, KeyValues *pTeam )
+{
+ if ( !ParseTeamClassInfo( pTeam, "Recon", &pT[ TFCLASS_RECON ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Sniper", &pT[ TFCLASS_SNIPER ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Commando", &pT[ TFCLASS_COMMANDO ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Support", &pT[ TFCLASS_SUPPORT ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Medic", &pT[ TFCLASS_MEDIC ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Escort", &pT[ TFCLASS_ESCORT ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Defender", &pT[ TFCLASS_DEFENDER ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Sapper", &pT[ TFCLASS_SAPPER ] ) )
+ return false;
+ if ( !ParseTeamClassInfo( pTeam, "Infiltrator", &pT[ TFCLASS_INFILTRATOR ] ) )
+ return false;
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Initialization
+//-----------------------------------------------------------------------------
+
+bool CHudPlayerOverlayClass::InitClassInfo( KeyValues* pKeyValues )
+{
+ if (s_ppClassInfo)
+ return true;
+
+ char teamkey[ 128 ];
+ s_ppClassInfo = new CMapClassColors*[MAX_TF_TEAMS+1];
+ for (int i = 0; i <= MAX_TF_TEAMS; ++i)
+ {
+ s_ppClassInfo[i] = new CMapClassColors[TFCLASS_CLASS_COUNT];
+ Q_snprintf( teamkey, sizeof( teamkey ), "Team%i", i );
+ KeyValues *pTeam = pKeyValues->FindKey( teamkey );
+ if (pTeam)
+ {
+ if (!ParseTeamClassIcons( s_ppClassInfo[i], pTeam ))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Initialization
+//-----------------------------------------------------------------------------
+
+bool CHudPlayerOverlayClass::Init( KeyValues* pKeyValues )
+{
+ if (!pKeyValues)
+ return false;
+
+ int x, y, w, h;
+ if (!ParseRect(pKeyValues, "friendlyposition", x, y, w, h ))
+ return false;
+
+ if (!InitClassInfo( pKeyValues ))
+ return false;
+
+ SetPos( x, y );
+ SetSize( w, h );
+
+ SetImage( 0 );
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pImage - Class specific image
+//-----------------------------------------------------------------------------
+void CHudPlayerOverlayClass::SetImage( BitmapImage *pImage )
+{
+ m_pImage = pImage;
+ if (m_pImage)
+ {
+ // Make sure the image size is correct
+ int w,h;
+ GetSize(w,h);
+ }
+}
+
+void CHudPlayerOverlayClass::SetTeamAndClass( int team, int playerclass )
+{
+ if (!s_ppClassInfo)
+ return;
+
+ CMapClassColors *pCC = &s_ppClassInfo[ team ][ playerclass ];
+ if ( pCC )
+ {
+ int r, g, b, a;
+ pCC->m_clrClass.GetColor( r, g, b, a );
+ SetColor( r, g, b, a );
+ SetImage( pCC->m_pClassImage );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// If this guy changes size, so must the associated image
+//-----------------------------------------------------------------------------
+
+void CHudPlayerOverlayClass::SetSize( int w, int h )
+{
+ // chain...
+ Panel::SetSize( w, h );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : r -
+// g -
+// b -
+// a -
+//-----------------------------------------------------------------------------
+void CHudPlayerOverlayClass::SetColor( int r, int g, int b, int a )
+{
+ m_r = r;
+ m_g = g;
+ m_b = b;
+ m_a = a;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CHudPlayerOverlayClass::Paint( void )
+{
+ int w, h;
+
+ m_pBaseOverlay->SetColorLevel( this, m_fgColor, m_bgColor );
+
+ GetSize( w, h );
+ vgui::surface()->DrawSetColor( m_r, m_g, m_b, m_a * m_pBaseOverlay->GetAlphaFrac() );
+
+ if ( !m_pImage )
+ return;
+
+ Color color;
+ color.SetColor( m_r, m_g, m_b, m_a * m_pBaseOverlay->GetAlphaFrac() );
+ m_pImage->SetColor( color );
+ m_pImage->DoPaint( GetVPanel() );
+}
+
+void CHudPlayerOverlayClass::OnCursorEntered()
+{
+ if ( m_pBaseOverlay->GetMouseOverText() )
+ {
+ StatusPrint( TYPE_HINT, "%s", m_pBaseOverlay->GetMouseOverText() );
+ }
+}
+
+void CHudPlayerOverlayClass::OnCursorExited()
+{
+ if ( m_pBaseOverlay->GetMouseOverText() )
+ {
+ StatusClear();
+ }
+} \ No newline at end of file