diff options
Diffstat (limited to 'game/client/cstrike/VGUI/cstrikebuymenu.cpp')
| -rw-r--r-- | game/client/cstrike/VGUI/cstrikebuymenu.cpp | 883 |
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 ); + } +} + + + |