summaryrefslogtreecommitdiff
path: root/game/client/cstrike/VGUI/cstrikebuymenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/cstrike/VGUI/cstrikebuymenu.cpp')
-rw-r--r--game/client/cstrike/VGUI/cstrikebuymenu.cpp883
1 files changed, 883 insertions, 0 deletions
diff --git a/game/client/cstrike/VGUI/cstrikebuymenu.cpp b/game/client/cstrike/VGUI/cstrikebuymenu.cpp
new file mode 100644
index 0000000..e637c89
--- /dev/null
+++ b/game/client/cstrike/VGUI/cstrikebuymenu.cpp
@@ -0,0 +1,883 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "cstrikebuysubmenu.h"
+#include "cstrikebuymenu.h"
+#include "cs_shareddefs.h"
+#include "backgroundpanel.h"
+#include "buy_presets/buy_presets.h"
+#include "cstrike/bot/shared_util.h"
+#include <vgui/ISurface.h>
+#include <vgui/ILocalize.h>
+#include "buypreset_weaponsetlabel.h"
+#include "career_box.h"
+#include "cs_gamerules.h"
+#include "vgui_controls/RichText.h"
+#include "cs_weapon_parse.h"
+#include "c_cs_player.h"
+#include "cs_ammodef.h"
+
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+/**
+ * This button resizes any images to fit in the width/height constraints
+ */
+class BuyPresetButton : public vgui::Button
+{
+ typedef vgui::Button BaseClass;
+
+public:
+ BuyPresetButton(vgui::Panel *parent, const char *buttonName, const char *buttonText );
+ virtual ~BuyPresetButton();
+
+ virtual void PerformLayout( void );
+ virtual void ClearImages( void );
+
+ virtual void SetFgColor( Color c )
+ {
+ BaseClass::SetFgColor( c );
+ }
+
+ void SetAvailable( bool available )
+ {
+ m_available = available;
+ }
+
+ virtual int AddImage( vgui::IImage *image, int offset )
+ {
+ if ( image )
+ {
+ if ( !m_available )
+ {
+ image->SetColor( Color( 128, 128, 128, 255 ) );
+ }
+ }
+ return BaseClass::AddImage( image, offset );
+ }
+
+ virtual void ApplySchemeSettings( vgui::IScheme *pScheme )
+ {
+ BaseClass::ApplySchemeSettings( pScheme );
+ m_availableColor = pScheme->GetColor( "Label.TextColor", Color( 0, 0, 0, 0 ) );
+ m_unavailableColor = pScheme->GetColor( "Label.DisabledFgColor2", Color( 0, 0, 0, 0 ) );
+ }
+
+ virtual Color GetButtonFgColor( void )
+ {
+ return ( m_available ) ? m_availableColor : m_unavailableColor;
+ }
+
+private:
+
+ bool m_available;
+ Color m_availableColor;
+ Color m_unavailableColor;
+};
+
+//-----------------------------------------------------------------------------
+BuyPresetButton::BuyPresetButton(vgui::Panel *parent, const char *buttonName, const char *buttonText ) : Button( parent, buttonName, buttonText )
+{
+ m_available = false;
+}
+
+//-----------------------------------------------------------------------------
+BuyPresetButton::~BuyPresetButton()
+{
+ ClearImages();
+}
+
+//-----------------------------------------------------------------------------
+void BuyPresetButton::ClearImages( void )
+{
+ int imageCount = GetImageCount();
+ for ( int i=0; i<imageCount; ++i )
+ {
+ BuyPresetImage *image = dynamic_cast< BuyPresetImage * >(GetImageAtIndex( i ));
+ if ( image )
+ {
+ delete image;
+ }
+ }
+
+ Button::ClearImages();
+}
+
+//-----------------------------------------------------------------------------
+void BuyPresetButton::PerformLayout( void )
+{
+ // resize images
+ int imageCount = GetImageCount();
+ if ( imageCount > 1 )
+ {
+ int wide, tall;
+ GetSize( wide, tall );
+
+ for ( int i=1; i<imageCount; ++i )
+ {
+ IImage *image = GetImageAtIndex( i );
+ if ( image )
+ {
+ int imageWide, imageTall;
+ image->GetSize( imageWide, imageTall );
+
+ float scaleX = 1.0f, scaleY = 1.0f;
+ float widthPercent = 0.2f;
+ if ( i == 1 )
+ {
+ widthPercent = 0.6f;
+ }
+
+ if ( imageWide > wide * widthPercent )
+ {
+ scaleX = (float)wide * widthPercent / (float)imageWide;
+ }
+ if ( imageTall > tall )
+ {
+ scaleY = (float)tall / (float)imageTall;
+ }
+
+ float scale = MIN( scaleX, scaleY );
+ if ( scale < 1.0f )
+ {
+ imageWide *= scale;
+ imageTall *= scale;
+ image->SetSize( imageWide, imageTall );
+ }
+ }
+ }
+ }
+
+ Button::PerformLayout();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CCSBuyMenu_CT::CCSBuyMenu_CT(IViewPort *pViewPort) : CCSBaseBuyMenu( pViewPort, "BuySubMenu_CT" )
+{
+ m_pMainMenu->LoadControlSettings( "Resource/UI/BuyMenu_CT.res" );
+ m_pMainMenu->SetVisible( false );
+
+ m_iTeam = TEAM_CT;
+
+ CreateBackground( this );
+ m_backgroundLayoutFinished = false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CCSBuyMenu_TER::CCSBuyMenu_TER(IViewPort *pViewPort) : CCSBaseBuyMenu( pViewPort, "BuySubMenu_TER" )
+{
+ m_pMainMenu->LoadControlSettings( "Resource/UI/BuyMenu_TER.res" );
+ m_pMainMenu->SetVisible( false );
+
+ m_iTeam = TEAM_TERRORIST;
+
+ CreateBackground( this );
+ m_backgroundLayoutFinished = false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CCSBaseBuyMenu::CCSBaseBuyMenu(IViewPort *pViewPort, const char *subPanelName) : CBuyMenu( pViewPort )
+{
+ SetTitle( "#Cstrike_Buy_Menu", true);
+
+ SetProportional( true );
+
+ m_pMainMenu = new CCSBuySubMenu( this, subPanelName );
+ m_pMainMenu->SetSize( 10, 10 ); // Quiet "parent not sized yet" spew
+#if USE_BUY_PRESETS
+ for ( int i=0; i<NUM_BUY_PRESET_BUTTONS; ++i )
+ {
+ m_pBuyPresetButtons[i] = new BuyPresetButton( m_pMainMenu, VarArgs( "BuyPresetButton%c", 'A' + i ), "" );
+ }
+ m_pMoney = new Label( m_pMainMenu, "money", "" );
+ //=============================================================================
+ // HPE_BEGIN:
+ // [pfreese] mainBackground was the little orange box outside that buy window
+ // that shouldn't have been there. Maybe this was left over from some
+ // copied code.
+ //=============================================================================
+
+ m_pMainBackground = NULL;
+// m_pMainBackground = new Panel( m_pMainMenu, "mainBackground" );
+
+ //=============================================================================
+ // HPE_END
+ //=============================================================================
+ m_pLoadout = new BuyPresetEditPanel( m_pMainMenu, "loadoutPanel", "Resource/UI/Loadout.res", 0, false );
+#else
+ for ( int i=0; i<NUM_BUY_PRESET_BUTTONS; ++i )
+ {
+ m_pBuyPresetButtons[i] = NULL;
+ }
+ m_pMoney = NULL;
+ m_pMainBackground = NULL;
+#endif // USE_BUY_PRESETS
+ m_lastMoney = -1;
+
+ m_pBlackMarket = new EditablePanel( m_pMainMenu, "BlackMarket_Bargains" );
+ m_pBlackMarket->LoadControlSettings( "Resource/UI/BlackMarket_Bargains.res" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::SetVisible(bool state)
+{
+ BaseClass::SetVisible(state);
+
+ if ( state )
+ {
+ Panel *defaultButton = FindChildByName( "CancelButton" );
+ if ( defaultButton )
+ {
+ defaultButton->RequestFocus();
+ }
+ SetMouseInputEnabled( true );
+ m_pMainMenu->SetMouseInputEnabled( true );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: shows/hides the buy menu
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::ShowPanel(bool bShow)
+{
+ CBuyMenu::ShowPanel( bShow );
+
+#if USE_BUY_PRESETS
+ if ( bShow )
+ {
+ UpdateBuyPresets( true );
+ }
+#endif // USE_BUY_PRESETS
+}
+
+//-----------------------------------------------------------------------------
+static void GetPanelBounds( Panel *pPanel, wrect_t& bounds )
+{
+ if ( !pPanel )
+ {
+ bounds.bottom = bounds.left = bounds.right = bounds.top = 0;
+ }
+ else
+ {
+ pPanel->GetBounds( bounds.left, bounds.top, bounds.right, bounds.bottom );
+ bounds.right += bounds.left;
+ bounds.bottom += bounds.top;
+ }
+}
+
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::Paint()
+{
+#if USE_BUY_PRESETS
+ C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer();
+ int account = (pPlayer) ? pPlayer->GetAccount() : 0;
+
+ if ( m_pMoney && m_lastMoney != account )
+ {
+ m_lastMoney = account;
+
+ const int BufLen = 128;
+ wchar_t wbuf[BufLen] = L"";
+ const wchar_t *formatStr = g_pVGuiLocalize->Find("#Cstrike_Current_Money");
+ if ( !formatStr )
+ formatStr = L"%s1";
+ g_pVGuiLocalize->ConstructString( wbuf, sizeof(wbuf), formatStr, 1, NumAsWString( m_lastMoney ) );
+ m_pMoney->SetText( wbuf );
+ }
+#endif // USE_BUY_PRESETS
+
+ CBuyMenu::Paint();
+}
+
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::UpdateBuyPresets( bool showDefaultPanel )
+{
+ bool setPanelVisible = false;
+ if ( !showDefaultPanel )
+ {
+ setPanelVisible = true;
+ }
+
+ if ( !TheBuyPresets )
+ TheBuyPresets = new BuyPresetManager();
+
+ int i;
+ // show buy preset buttons
+ int numPresets = MIN( TheBuyPresets->GetNumPresets(), NUM_BUY_PRESET_BUTTONS );
+ for ( i=0; i<numPresets; ++i )
+ {
+ if ( !m_pBuyPresetButtons[i] )
+ continue;
+
+ const BuyPreset *preset = TheBuyPresets->GetPreset(i);
+
+ int setIndex;
+ int currentCost = -1;
+ WeaponSet currentSet;
+ const WeaponSet *fullSet = NULL;
+ for ( setIndex = 0; setIndex < preset->GetNumSets(); ++setIndex )
+ {
+ const WeaponSet *itemSet = preset->GetSet( setIndex );
+ if ( itemSet )
+ {
+ itemSet->GetCurrent( currentCost, currentSet );
+ if ( currentCost >= 0 )
+ {
+ fullSet = itemSet;
+ break;
+ }
+ }
+ }
+
+ if ( !fullSet && preset->GetNumSets() )
+ {
+ fullSet = preset->GetSet( 0 );
+ }
+
+ // set the button's images
+ m_pBuyPresetButtons[i]->ClearImages();
+ m_pBuyPresetButtons[i]->SetTextImageIndex( 0 );
+ m_pBuyPresetButtons[i]->SetText( "" );
+
+ m_pBuyPresetButtons[i]->SetAvailable( currentCost >= 0 );
+
+ const char *imageName = "";
+ if ( fullSet )
+ {
+ if ( fullSet->GetPrimaryWeapon().GetWeaponID() != WEAPON_NONE )
+ {
+ imageName = ImageFnameFromWeaponID( fullSet->GetPrimaryWeapon().GetWeaponID(), true );
+ BuyPresetImage * image = new BuyPresetImage( scheme()->GetImage(imageName, true) );
+ m_pBuyPresetButtons[i]->AddImage( image, 0 );
+ }
+ if ( fullSet->GetSecondaryWeapon().GetWeaponID() != WEAPON_NONE )
+ {
+ imageName = ImageFnameFromWeaponID( fullSet->GetSecondaryWeapon().GetWeaponID(), false );
+ BuyPresetImage * image = new BuyPresetImage( scheme()->GetImage(imageName, true) );
+ m_pBuyPresetButtons[i]->AddImage( image, 0 );
+ }
+ }
+
+ int displayCost = currentCost;
+ if ( displayCost < 0 )
+ displayCost = 0;
+
+ const int BufLen = 1024;
+ char aBuf[BufLen];
+ Q_snprintf(aBuf, BufLen, "#Cstrike_BuyMenuPreset%d", i + 1);
+ m_pBuyPresetButtons[i]->SetText( g_pVGuiLocalize->Find(aBuf) );
+ Q_snprintf(aBuf, BufLen, "cl_buy_favorite %d", i + 1);
+ m_pBuyPresetButtons[i]->SetCommand( aBuf );
+ m_pBuyPresetButtons[i]->SetVisible( true );
+ m_pBuyPresetButtons[i]->SetEnabled( true );
+ }
+
+ // hide unused buy preset buttons
+ for ( i=numPresets+1; i<NUM_BUY_PRESET_BUTTONS; ++i )
+ {
+ if ( m_pBuyPresetButtons[i] )
+ {
+ m_pBuyPresetButtons[i]->SetVisible( false );
+ m_pBuyPresetButtons[i]->SetEnabled( true );
+ }
+ }
+
+ HandleBlackMarket();
+}
+
+const char *g_pWeaponNames[] =
+{
+ " ",
+ "#Cstrike_TitlesTXT_P228",
+ "#Cstrike_TitlesTXT_Glock18",
+ "#Cstrike_TitlesTXT_Scout",
+ "#Cstrike_TitlesTXT_HE_Grenade",
+ "#Cstrike_TitlesTXT_XM1014",
+ " ",
+ "#Cstrike_TitlesTXT_Mac10",
+ "#Cstrike_TitlesTXT_Aug",
+ "#Cstrike_TitlesTXT_Smoke_Grenade",
+ "#Cstrike_TitlesTXT_Dual40",
+ "#Cstrike_TitlesTXT_FiveSeven",
+ "#Cstrike_TitlesTXT_UMP45",
+ "#Cstrike_TitlesTXT_SG550",
+ "#Cstrike_TitlesTXT_Galil",
+ "#Cstrike_TitlesTXT_Famas",
+ "#Cstrike_TitlesTXT_USP45",
+ "#Cstrike_TitlesTXT_Magnum",
+ "#Cstrike_TitlesTXT_mp5navy",
+ "#Cstrike_TitlesTXT_ESM249",
+ "#Cstrike_TitlesTXT_Leone12",
+ "#Cstrike_TitlesTXT_M4A1",
+ "#Cstrike_TitlesTXT_tmp",
+ "#Cstrike_TitlesTXT_G3SG1",
+ "#Cstrike_TitlesTXT_Flashbang",
+ "#Cstrike_TitlesTXT_DesertEagle",
+ "#Cstrike_TitlesTXT_SG552",
+ "#Cstrike_TitlesTXT_AK47",
+ " ",
+ "#Cstrike_TitlesTXT_FNP90",
+ " ",
+ "#Cstrike_TitlesTXT_Kevlar_Vest",
+ "#Cstrike_TitlesTXT_Kevlar_Vest_Ballistic_Helmet",
+ "#Cstrike_TitlesTXT_Nightvision_Goggles"
+};
+
+int GetWeeklyBargain( void )
+{
+ if ( CSGameRules() == NULL || CSGameRules()->m_pPrices == NULL )
+ return 0;
+
+ C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer();
+
+ if ( pPlayer == NULL )
+ return 0;
+
+ int iBestIndex = 0;
+ int iBestBargain = 99999;
+
+ for ( int i = 1; i < WEAPON_MAX; i++ )
+ {
+ if ( i == WEAPON_SHIELDGUN )
+ continue;
+
+ CCSWeaponInfo *info = GetWeaponInfo( (CSWeaponID)i );
+
+ if ( info == NULL )
+ continue;
+
+ if ( info->m_iTeam == TEAM_UNASSIGNED || info->m_iTeam == pPlayer->m_iTeamNum )
+ {
+ int iBargain = info->GetWeaponPrice() - info->GetPrevousPrice();
+
+ if ( iBargain < iBestBargain )
+ {
+ iBestIndex = i;
+ iBestBargain = iBargain;
+ }
+ }
+ }
+
+ return iBestIndex;
+}
+
+#ifdef _DEBUG
+ConVar cs_testbargain( "cs_testbargain", "1" );
+#endif
+
+void CCSBaseBuyMenu::HandleBlackMarket( void )
+{
+ if ( CSGameRules() == NULL )
+ return;
+
+ if ( m_pLoadout )
+ {
+ if ( CSGameRules()->IsBlackMarket() )
+ {
+ if ( CSGameRules()->m_pPrices == NULL )
+ return;
+
+ if ( m_pBlackMarket == NULL )
+ return;
+
+ int iBargain = GetWeeklyBargain();
+ CCSWeaponInfo *info = GetWeaponInfo( (CSWeaponID)iBargain );
+
+ wchar_t *wszWeaponName = g_pVGuiLocalize->Find( g_pWeaponNames[iBargain]);
+
+ if ( wszWeaponName == NULL )
+ return;
+
+ if ( info == NULL )
+ return;
+
+ m_pLoadout->SetVisible( false );
+ Label *pLabel = dynamic_cast< Label * >(m_pMainMenu->FindChildByName( "loadoutLabel" ));
+
+ if ( pLabel )
+ {
+ pLabel->SetVisible( false );
+ }
+
+ pLabel = dynamic_cast< Label * >(m_pBlackMarket->FindChildByName( "MarketHeadline" ));
+
+ if ( pLabel )
+ {
+ const int BufLen = 2048;
+
+ wchar_t wbuf[BufLen] = L"";
+ const wchar_t *formatStr = g_pVGuiLocalize->Find("#Cstrike_MarketHeadline");
+
+ if ( !formatStr )
+ formatStr = L"%s1";
+
+ g_pVGuiLocalize->ConstructString( wbuf, sizeof(wbuf), formatStr, 1, wszWeaponName );
+ pLabel->SetText( wbuf );
+ }
+
+ pLabel = dynamic_cast< Label * >(m_pBlackMarket->FindChildByName( "MarketBargain" ));
+
+ if ( pLabel )
+ {
+ const int BufLen = 2048;
+ wchar_t wbuf[BufLen] = L"";
+ const wchar_t *formatStr = g_pVGuiLocalize->Find("#Cstrike_MarketBargain");
+
+ if ( !formatStr )
+ formatStr = L"%s1";
+
+ g_pVGuiLocalize->ConstructString( wbuf, sizeof(wbuf), formatStr, 1, wszWeaponName );
+ pLabel->SetText( wbuf );
+ }
+
+ pLabel = dynamic_cast< Label * >(m_pBlackMarket->FindChildByName( "MarketStickerPrice" ));
+
+ if ( pLabel )
+ {
+ char wbuf[16];
+
+ Q_snprintf( wbuf, 16, "%d", CSGameRules()->m_pPrices->iCurrentPrice[iBargain] );
+
+ pLabel->SetText( wbuf );
+ }
+
+ RichText *pText = dynamic_cast< RichText * >(m_pBlackMarket->FindChildByName( "MarketDescription" ));
+
+ if ( pText )
+ {
+ char wbuf[2048];
+ g_pVGuiLocalize->ConvertUnicodeToANSI( g_pVGuiLocalize->Find("#Cstrike_MarketDescription"), wbuf, 2048 );
+
+ pText->SetText( "" );
+ pText->InsertPossibleURLString( wbuf, Color( 255, 255, 255, 255 ), Color( 255, 176, 0, 255 ) );
+ pText->SetVerticalScrollbar( false );
+ pText->SetPaintBorderEnabled( false );
+ pText->SetUnderlineFont( m_hUnderlineFont );
+ }
+
+ pLabel = dynamic_cast< Label * >(m_pBlackMarket->FindChildByName( "MarketBargainIcon" ));
+
+ if ( pLabel )
+ {
+ char wbuff[12];
+ Q_snprintf( wbuff, 12, "%c", info->iconActive->cCharacterInFont );
+
+ pLabel->SetText( wbuff );
+ }
+
+ Button *pButton = dynamic_cast< Button * >(m_pMainMenu->FindChildByName( "BargainbuyButton" ));
+
+ if ( pButton )
+ {
+ char command[512];
+ char *pWeaponName = Q_stristr( info->szClassName, "_" );
+
+ if ( pWeaponName )
+ {
+ pWeaponName++;
+
+ Q_snprintf( command, 512, "buy %s", pWeaponName );
+ }
+
+ pButton->SetCommand( command );
+ pButton->SetVisible( true );
+ }
+
+
+ m_pBlackMarket->SetVisible( true );
+ m_pBlackMarket->SetZPos( -2 );
+ }
+ else
+ {
+ WeaponSet ws;
+
+ TheBuyPresets->GetCurrentLoadout( &ws );
+ m_pLoadout->SetWeaponSet( &ws, true );
+
+ m_pLoadout->SetVisible( true );
+ Panel *pLabel = dynamic_cast< Label * >(m_pMainMenu->FindChildByName( "loadoutLabel" ));
+
+ if ( pLabel )
+ {
+ pLabel->SetVisible( true );
+ }
+
+ if ( m_pBlackMarket )
+ {
+ m_pBlackMarket->SetVisible( false );
+
+ Button *pButton = dynamic_cast< Button * >(m_pMainMenu->FindChildByName( "BargainbuyButton" ));
+
+ if ( pButton )
+ {
+ pButton->SetVisible( false );
+ }
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: The CS background is painted by image panels, so we should do nothing
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::PaintBackground()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Scale / center the window
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ // stretch the window to fullscreen
+ if ( !m_backgroundLayoutFinished )
+ LayoutBackgroundPanel( this );
+ m_backgroundLayoutFinished = true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSBaseBuyMenu::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+ ApplyBackgroundSchemeSettings( this, pScheme );
+
+ if ( m_pMainBackground )
+ {
+ m_pMainBackground->SetBorder(pScheme->GetBorder("ButtonDepressedBorder"));
+ m_pMainBackground->SetBgColor( GetSchemeColor( "Button.BgColor", GetBgColor(), pScheme ) );
+ }
+
+ m_hUnderlineFont = pScheme->GetFont( "CSUnderline", IsProportional() );
+
+#if USE_BUY_PRESETS
+ UpdateBuyPresets( true );
+#endif // USE_BUY_PRESETS
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+static bool IsWeaponInvalid( CSWeaponID weaponID )
+{
+ if ( weaponID == WEAPON_NONE )
+ return false;
+
+ return !CanBuyWeapon( WEAPON_NONE, WEAPON_NONE, weaponID );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSBuySubMenu::OnThink()
+{
+ UpdateVestHelmPrice();
+ BaseClass::OnThink();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: When buying vest+helmet, if you already have a vest with no damage
+// then the price is reduced to just the helmet. Because this can change during
+// the game, we need to update the enable/disable state of the menu item dynamically.
+//-----------------------------------------------------------------------------
+void CCSBuySubMenu::UpdateVestHelmPrice()
+{
+ C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer();
+ if ( pPlayer == NULL )
+ return;
+
+ BuyMouseOverPanelButton *pButton = dynamic_cast< BuyMouseOverPanelButton * > ( FindChildByName( "kevlar_helmet", false ) );
+ if ( pButton )
+ {
+ // Set its price to the current value from the player.
+ pButton->SetCurrentPrice( pPlayer->GetCurrentAssaultSuitPrice() );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSBuySubMenu::OnCommand( const char *command )
+{
+#if USE_BUY_PRESETS
+ const char *buyPresetSetString = "cl_buy_favorite_query_set ";
+ if ( !strnicmp( command, buyPresetSetString, strlen( buyPresetSetString ) ) )
+ {
+ bool invalid = IsWeaponInvalid( GetClientWeaponID( true ) ) || IsWeaponInvalid( GetClientWeaponID( false ) );
+ if ( invalid )
+ {
+ // can't save the favorite because it has an invalid weapon (colt for a T, etc)
+ C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer();
+ if ( pPlayer )
+ {
+ pPlayer->EmitSound( "BuyPreset.CantBuy" );
+ }
+
+ if ( cl_buy_favorite_nowarn.GetBool() )
+ {
+ BaseClass::OnCommand( "vguicancel" );
+ }
+ else
+ {
+ CCareerQueryBox *pBox = new CCareerQueryBox( this, "SetLoadoutError", "Resource/UI/SetLoadoutError.res" );
+ pBox->AddActionSignalTarget( this );
+ pBox->DoModal();
+ }
+ }
+ else
+ {
+ // can save
+ if ( cl_buy_favorite_quiet.GetBool() )
+ {
+ BaseClass::OnCommand( VarArgs( "cl_buy_favorite_set %d", atoi( command + strlen( buyPresetSetString ) ) ) );
+ }
+ else
+ {
+ CCareerQueryBox *pBox = new CCareerQueryBox( this, "SetLoadoutQuery", "Resource/UI/SetLoadoutQuery.res" );
+ pBox->SetCancelButtonAsDefault();
+ if ( pBox->GetOkButton() )
+ {
+ pBox->GetOkButton()->SetCommand( VarArgs( "cl_buy_favorite_set %d", atoi( command + strlen( buyPresetSetString ) ) ) );
+ }
+ pBox->AddActionSignalTarget( this );
+ pBox->DoModal();
+ }
+ }
+ return;
+ }
+#endif // USE_BUY_PRESETS
+
+ if ( FStrEq( command, "buy_unavailable" ) )
+ {
+ C_CSPlayer *pPlayer = C_CSPlayer::GetLocalCSPlayer();
+ if ( pPlayer )
+ {
+ pPlayer->EmitSound( "BuyPreset.CantBuy" );
+ }
+ BaseClass::OnCommand( "vguicancel" );
+ return;
+ }
+
+ BaseClass::OnCommand( command );
+}
+
+void CCSBuySubMenu::OnSizeChanged(int newWide, int newTall)
+{
+ m_backgroundLayoutFinished = false;
+ BaseClass::OnSizeChanged( newWide, newTall );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSBuySubMenu::PerformLayout()
+{
+ BaseClass::PerformLayout();
+
+ // Buy submenus need to be shoved over for widescreen
+ int screenW, screenH;
+ GetHudSize( screenW, screenH );
+
+ int fullW, fullH;
+ fullW = scheme()->GetProportionalScaledValueEx( GetScheme(), 640 );
+ fullH = scheme()->GetProportionalScaledValueEx( GetScheme(), 480 );
+
+ fullW = GetAlternateProportionalValueFromScaled( GetScheme(), fullW );
+ fullH = GetAlternateProportionalValueFromScaled( GetScheme(), fullH );
+
+ int offsetX = (screenW - fullW)/2;
+ int offsetY = (screenH - fullH)/2;
+
+ if ( !m_backgroundLayoutFinished )
+ ResizeWindowControls( this, GetWide(), GetTall(), offsetX, offsetY );
+ m_backgroundLayoutFinished = true;
+
+ HandleBlackMarket();
+}
+
+void CCSBuySubMenu::HandleBlackMarket( void )
+{
+ if ( CSGameRules() == NULL )
+ return;
+
+ int iBestBargain = 99999;
+ BuyMouseOverPanelButton *pButtonBargain = NULL;
+
+ for (int i = 0; i < GetChildCount(); i++)
+ {
+ BuyMouseOverPanelButton *pButton = dynamic_cast< BuyMouseOverPanelButton * > ( GetChild(i) );
+ if (!pButton)
+ continue;
+
+ pButton->SetBargainButton( false );
+
+ const char *pWeaponName = Q_stristr( pButton->GetBuyCommand(), " " );
+
+ if ( pWeaponName )
+ {
+ pWeaponName++;
+
+ int iWeaponID = AliasToWeaponID(GetTranslatedWeaponAlias(pWeaponName));
+
+ if ( iWeaponID == 0 )
+ continue;
+
+ CCSWeaponInfo *info = GetWeaponInfo( (CSWeaponID)iWeaponID );
+
+ if ( info == NULL )
+ continue;
+
+ if ( CSGameRules()->IsBlackMarket() == false )
+ {
+ //=============================================================================
+ // HPE_BEGIN:
+ // [dwenger] Removed to avoid clearing of default price when not in black market mode
+ //=============================================================================
+
+ // pButton->SetCurrentPrice( info->GetDefaultPrice() );
+
+ //=============================================================================
+ // HPE_END
+ //=============================================================================
+ }
+ else
+ {
+ int iBargain = info->GetWeaponPrice() - info->GetPrevousPrice();
+
+ pButton->SetCurrentPrice( info->GetWeaponPrice() );
+ pButton->SetPreviousPrice( info->GetPrevousPrice() );
+
+ if ( iBargain < iBestBargain )
+ {
+ iBestBargain = iBargain;
+ pButtonBargain = pButton;
+ }
+ }
+ }
+ }
+
+ if ( pButtonBargain )
+ {
+ pButtonBargain->SetBargainButton( true );
+ }
+}
+
+
+