summaryrefslogtreecommitdiff
path: root/game/client/dod/VGUI/dodclassmenu.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/dod/VGUI/dodclassmenu.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/dod/VGUI/dodclassmenu.cpp')
-rw-r--r--game/client/dod/VGUI/dodclassmenu.cpp353
1 files changed, 353 insertions, 0 deletions
diff --git a/game/client/dod/VGUI/dodclassmenu.cpp b/game/client/dod/VGUI/dodclassmenu.cpp
new file mode 100644
index 0000000..a32d1af
--- /dev/null
+++ b/game/client/dod/VGUI/dodclassmenu.cpp
@@ -0,0 +1,353 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "dodclassmenu.h"
+
+#include <KeyValues.h>
+#include <filesystem.h>
+#include <vgui_controls/Button.h>
+#include <vgui_controls/RichText.h>
+#include <vgui/IVGui.h>
+
+#include "hud.h" // for gEngfuncs
+#include "c_dod_player.h"
+#include "c_dod_team.h"
+
+#include "imagemouseoverbutton.h"
+
+#include "dodmouseoverpanelbutton.h"
+#include "dodrandombutton.h"
+#include "IconPanel.h"
+
+#include "IGameUIFuncs.h" // for key bindings
+
+extern IGameUIFuncs *gameuifuncs; // for key binding details
+
+using namespace vgui;
+
+extern ConVar hud_classautokill;
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+Panel *CDODClassInfoPanel::CreateControlByName( const char *controlName )
+{
+ if( !Q_stricmp( "ProgressBar", controlName ) )
+ {
+ return new CDODProgressBar(this);
+ }
+ else if ( !Q_stricmp( "CIconPanel", controlName ) )
+ {
+ return new CIconPanel(this, "icon_panel");
+ }
+ else
+ {
+ return BaseClass::CreateControlByName( controlName );
+ }
+}
+
+void CDODClassInfoPanel::ApplySchemeSettings( IScheme *pScheme )
+{
+ RichText *pClassInfo = dynamic_cast<RichText*>(FindChildByName("classInfo"));
+
+ if ( pClassInfo )
+ {
+ pClassInfo->SetBorder(pScheme->GetBorder("NoBorder"));
+ pClassInfo->SetBgColor(pScheme->GetColor("Blank", Color(0,0,0,0)));
+ }
+
+ BaseClass::ApplySchemeSettings( pScheme );
+}
+
+CDODClassMenu::CDODClassMenu(IViewPort *pViewPort) : CClassMenu(pViewPort)
+{
+ m_mouseoverButtons.RemoveAll();
+ m_iClassMenuKey = BUTTON_CODE_INVALID;
+ m_pInitialButton = NULL;
+
+ m_pBackground = SETUP_PANEL( new CDODMenuBackground( this ) );
+
+ m_pClassInfoPanel = new CDODClassInfoPanel( this, "ClassInfoPanel" );
+
+ vgui::ivgui()->AddTickSignal( GetVPanel() );
+
+ m_iActivePlayerClass = -1;
+ m_iLastPlayerClassCount = -1;
+
+ m_pClassNumLabel[0] = new Label( this, "class_1_num", "" );
+ m_pClassNumLabel[1] = new Label( this, "class_2_num", "" );
+ m_pClassNumLabel[2] = new Label( this, "class_3_num", "" );
+ m_pClassNumLabel[3] = new Label( this, "class_4_num", "" );
+ m_pClassNumLabel[4] = new Label( this, "class_5_num", "" );
+ m_pClassNumLabel[5] = new Label( this, "class_6_num", "" );
+
+ m_pClassFullLabel[0] = new Label( this, "class_1_full", "" );
+ m_pClassFullLabel[1] = new Label( this, "class_2_full", "" );
+ m_pClassFullLabel[2] = new Label( this, "class_3_full", "" );
+ m_pClassFullLabel[3] = new Label( this, "class_4_full", "" );
+ m_pClassFullLabel[4] = new Label( this, "class_5_full", "" );
+ m_pClassFullLabel[5] = new Label( this, "class_6_full", "" );
+
+ m_pSuicideOption = new CheckButton( this, "suicide_option", "Sky is blue?" );
+}
+
+void CDODClassMenu::ShowPanel( bool bShow )
+{
+ if ( bShow )
+ {
+ engine->CheckPoint( "ClassMenu" );
+
+ m_iClassMenuKey = gameuifuncs->GetButtonCodeForBind( "changeclass" );
+
+ m_pSuicideOption->SetSelected( hud_classautokill.GetBool() );
+ }
+
+ for( int i = 0; i< GetChildCount(); i++ )
+ {
+ CImageMouseOverButton<CDODClassInfoPanel> *button =
+ dynamic_cast<CImageMouseOverButton<CDODClassInfoPanel> *>(GetChild(i));
+
+ if ( button )
+ {
+ if( button == m_pInitialButton && bShow == true )
+ button->ShowPage();
+ else
+ button->HidePage();
+ }
+ }
+
+ CDODRandomButton<CDODClassInfoPanel> *pRandom =
+ dynamic_cast<CDODRandomButton<CDODClassInfoPanel> *>( FindChildByName("random") );
+
+ if ( pRandom )
+ pRandom->HidePage();
+
+ // recalc position of checkbox, since it doesn't do right alignment
+ m_pSuicideOption->SizeToContents();
+
+ int x, y, wide, tall;
+ m_pSuicideOption->GetBounds( x, y, wide, tall );
+
+ int parentW, parentH;
+ GetSize( parentW, parentH );
+
+ x = parentW / 2; // - wide;
+ m_pSuicideOption->SetPos( x, y );
+
+ BaseClass::ShowPanel( bShow );
+}
+
+void CDODClassMenu::OnKeyCodePressed( KeyCode code )
+{
+#ifdef REFRESH_CLASSMENU_TOOL
+
+ if ( code == KEY_PAD_MULTIPLY )
+ {
+ OnRefreshClassMenu();
+ }
+#endif
+
+ if ( m_iClassMenuKey != BUTTON_CODE_INVALID && m_iClassMenuKey == code )
+ {
+ ShowPanel( false );
+ }
+ else
+ {
+ BaseClass::OnKeyCodePressed( code );
+ }
+}
+
+void CDODClassMenu::Update()
+{
+ C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer();
+
+ if ( pPlayer && pPlayer->m_Shared.DesiredPlayerClass() == PLAYERCLASS_UNDEFINED )
+ {
+ SetVisibleButton( "CancelButton", false );
+ }
+ else
+ {
+ SetVisibleButton( "CancelButton", true );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+Panel *CDODClassMenu::CreateControlByName( const char *controlName )
+{
+ if ( !Q_stricmp( "DODMouseOverPanelButton", controlName ) )
+ {
+ return new CDODMouseOverButton<CDODClassInfoPanel>( this, NULL, m_pClassInfoPanel );
+ }
+ else if( !Q_stricmp( "DODButton", controlName ) )
+ {
+ return new CDODButton(this);
+ }
+ else if( !Q_stricmp( "DODRandomButton", controlName ) )
+ {
+ return new CDODRandomButton<CDODClassInfoPanel>(this, NULL, m_pClassInfoPanel );
+ }
+ else if ( !Q_stricmp( "ImageButton", controlName ) )
+ {
+ CImageMouseOverButton<CDODClassInfoPanel> *newButton = new CImageMouseOverButton<CDODClassInfoPanel>( this, NULL, m_pClassInfoPanel );
+
+ if( !m_pInitialButton )
+ {
+ m_pInitialButton = newButton;
+ }
+
+ return newButton;
+ }
+ else if ( !Q_stricmp( "CIconPanel", controlName ) )
+ {
+ return new CIconPanel(this, "icon_panel");
+ }
+ else
+ {
+ return BaseClass::CreateControlByName( controlName );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Catch the mouseover event and set the active class
+//-----------------------------------------------------------------------------
+void CDODClassMenu::OnShowPage( const char *pagename )
+{
+ // change which class we are counting based on class name
+
+ // turn the button name into a classname
+
+ char buf[64];
+
+ Q_snprintf( buf, sizeof(buf), "cls_%s", pagename );
+
+ C_DODTeam *pTeam = dynamic_cast<C_DODTeam *>( GetGlobalTeam(GetTeamNumber()) );
+
+ if( !pTeam )
+ return;
+
+ // Pull the index of this class via IsClassOnTeam
+ if ( !pTeam->IsClassOnTeam( buf, m_iActivePlayerClass ) )
+ {
+ Assert( !"bad class name on class button" );
+ }
+
+ UpdateNumClassLabel();
+}
+
+//-----------------------------------------------------------------------------
+// Draw nothing
+//-----------------------------------------------------------------------------
+void CDODClassMenu::PaintBackground( void )
+{
+}
+
+//-----------------------------------------------------------------------------
+// Do things that should be done often, eg number of players in the
+// selected class
+//-----------------------------------------------------------------------------
+void CDODClassMenu::OnTick( void )
+{
+ //When a player changes teams, their class and team values don't get here
+ //necessarily before the command to update the class menu. This leads to the cancel button
+ //being visible and people cancelling before they have a class. check for class == DOD_CLASS_NONE and if so
+ //hide the cancel button
+
+ if ( !IsVisible() )
+ return;
+
+ C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer();
+
+ if( pPlayer && pPlayer->m_Shared.PlayerClass() == PLAYERCLASS_UNDEFINED )
+ {
+ SetVisibleButton("CancelButton", false);
+ }
+
+ UpdateNumClassLabel();
+
+ BaseClass::OnTick();
+}
+
+void CDODClassMenu::UpdateNumClassLabel( void )
+{
+ int iClassCount[NUM_CLASSES];
+ // Initialize to zero. Was previously used uninitialized.
+ int iClassLimit[NUM_CLASSES] = {};
+
+ // count how many of this class there are
+ C_DODTeam *pTeam = dynamic_cast<C_DODTeam *>( GetGlobalTeam(GetTeamNumber()) );
+
+ if ( !pTeam )
+ return;
+
+ char buf[16];
+
+ for( int i=0;i<NUM_CLASSES;i++ )
+ {
+ iClassCount[i] = pTeam->CountPlayersOfThisClass( i );
+
+ if ( !m_pClassNumLabel[i] || !m_pClassFullLabel[i] )
+ continue;
+
+ if ( pTeam->IsClassOnTeam( i ) )
+ {
+ // FIXME - store pointers to these cvars
+ const CDODPlayerClassInfo &pClassInfo = pTeam->GetPlayerClassInfo( i );
+ ConVar *pLimitCvar = ( ConVar * )cvar->FindVar( pClassInfo.m_szLimitCvar );
+
+ if ( pLimitCvar )
+ iClassLimit[i] = MIN( 32, pLimitCvar->GetInt() );
+ }
+
+ if ( iClassLimit[i] < 0 || iClassCount[i] < iClassLimit[i] )
+ m_pClassFullLabel[i]->SetVisible( false );
+ else
+ m_pClassFullLabel[i]->SetVisible( true );
+
+ if ( iClassLimit[i] > -1 )
+ {
+ // draw "3 / 4"
+ Q_snprintf( buf, sizeof(buf), "%d / %d", iClassCount[i], iClassLimit[i] );
+ }
+ else
+ {
+ // just "3"
+ Q_snprintf( buf, sizeof(buf), "x %d", iClassCount[i] );
+ }
+
+ m_pClassNumLabel[i]->SetText( buf );
+ }
+}
+
+void CDODClassMenu::SetVisible( bool state )
+{
+ BaseClass::SetVisible( state );
+}
+
+void CDODClassMenu::OnSuicideOptionChanged( vgui::Panel *Panel )
+{
+ hud_classautokill.SetValue( m_pSuicideOption->IsSelected() );
+}
+
+#ifdef REFRESH_CLASSMENU_TOOL
+
+ void CDODClassMenu::OnRefreshClassMenu( void )
+ {
+ for( int i = 0; i< GetChildCount(); i++ )
+ {
+ CImageMouseOverButton<CDODClassInfoPanel> *button =
+ dynamic_cast<CImageMouseOverButton<CDODClassInfoPanel> *>(GetChild(i));
+
+ if ( button )
+ {
+ button->RefreshClassPage();
+ }
+ }
+ }
+
+#endif