Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

884 lines
23 KiB

//========= 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 );
}
}