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.
883 lines
23 KiB
883 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 ); |
|
} |
|
} |
|
|
|
|
|
|
|
|