|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
// Author: Matthew D. Campbell ([email protected]), 2003
#include "cbase.h"
#include <vgui/KeyCode.h>
#include "career_box.h"
#include "career_button.h"
#include "buypreset_listbox.h"
#include <vgui_controls/TextImage.h>
#include <vgui_controls/CheckButton.h>
#include <vgui_controls/ComboBox.h>
#include "cs_ammodef.h"
#include "weapon_csbase.h"
#include "backgroundpanel.h"
#include "cs_gamerules.h"
#include <vgui/IInput.h>
#include "bot/shared_util.h"
#include <vgui_controls/BitmapImagePanel.h>
#include <vgui/ISurface.h>
#include <vgui/ILocalize.h>
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
using namespace vgui;
//--------------------------------------------------------------------------------------------------------------
class ConVarToggleCheckButton : public vgui::CheckButton { DECLARE_CLASS_SIMPLE( ConVarToggleCheckButton, vgui::CheckButton );
public: ConVarToggleCheckButton( vgui::Panel *parent, const char *panelName, const char *text ); ~ConVarToggleCheckButton();
virtual void SetSelected( bool state );
virtual void Paint();
void Reset(); void ApplyChanges(); bool HasBeenModified(); void SetConVar( const char *name );
virtual void ApplySettings( KeyValues *inResourceData ) { BaseClass::ApplySettings( inResourceData );
const char *name = inResourceData->GetString( "convar", NULL ); if ( name ) { SetConVar( name ); } }
private: MESSAGE_FUNC( OnButtonChecked, "CheckButtonChecked" );
char *m_pszCvarName; bool m_bStartValue; };
//--------------------------------------------------------------------------------------------------------------
ConVarToggleCheckButton::ConVarToggleCheckButton( Panel *parent, const char *panelName, const char *text ) : CheckButton( parent, panelName, text ) { m_pszCvarName = NULL; AddActionSignalTarget( this ); }
//--------------------------------------------------------------------------------------------------------------
ConVarToggleCheckButton::~ConVarToggleCheckButton() { if ( m_pszCvarName ) delete[] m_pszCvarName; }
//--------------------------------------------------------------------------------------------------------------
void ConVarToggleCheckButton::SetConVar( const char *name ) { if ( m_pszCvarName ) delete[] m_pszCvarName;
m_pszCvarName = CloneString( name );
if (m_pszCvarName && *m_pszCvarName) { Reset(); } }
//--------------------------------------------------------------------------------------------------------------
void ConVarToggleCheckButton::Paint() { if ( !m_pszCvarName || !m_pszCvarName[ 0 ] ) { BaseClass::Paint(); return; }
// Look up current value
ConVar const *var = cvar->FindVar( m_pszCvarName ); if ( !var ) return; bool value = var->GetBool(); if (value != m_bStartValue) { SetSelected( value ); m_bStartValue = value; } BaseClass::Paint(); }
//--------------------------------------------------------------------------------------------------------------
void ConVarToggleCheckButton::ApplyChanges() { m_bStartValue = IsSelected(); ConVar *var = (ConVar *)cvar->FindVar( m_pszCvarName ); if ( !var ) return; var->SetValue(m_bStartValue);
}
//--------------------------------------------------------------------------------------------------------------
void ConVarToggleCheckButton::Reset() { ConVar const *var = cvar->FindVar( m_pszCvarName ); if ( !var ) return; m_bStartValue = var->GetBool(); SetSelected(m_bStartValue); }
//--------------------------------------------------------------------------------------------------------------
bool ConVarToggleCheckButton::HasBeenModified() { return IsSelected() != m_bStartValue; }
//--------------------------------------------------------------------------------------------------------------
void ConVarToggleCheckButton::SetSelected( bool state ) { BaseClass::SetSelected( state );
if ( !m_pszCvarName || !m_pszCvarName[ 0 ] ) return; }
//--------------------------------------------------------------------------------------------------------------
void ConVarToggleCheckButton::OnButtonChecked() { if (HasBeenModified()) { PostActionSignal(new KeyValues("ControlModified")); } }
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
CCareerBaseBox::CCareerBaseBox(Panel *parent, const char *panelName, bool loadResources, bool useCareerButtons) : Frame(parent, panelName, false) { // @TODO: SetScheme("CareerBoxScheme");
SetScheme("ClientScheme"); SetProportional( true ); SetMoveable(false); SetSizeable(false);
m_bgColor = Color( 0, 0, 0, 0 ); m_borderColor = Color( 0, 0, 0, 0 );
m_pTextLabel = new Label( this, "TextLabel", "" );
if ( useCareerButtons ) { m_pOkButton = new CCareerButton( this, "OkButton", "", "", false ); m_pCancelButton = new CCareerButton( this, "CancelButton", "", "", false ); } else { m_pOkButton = new Button( this, "OkButton", "" ); m_pCancelButton = new Button( this, "CancelButton", "" ); } m_pOkButton->SetVisible(false); if ( useCareerButtons ) { m_buttons.PutElement( m_pOkButton ); m_buttons.PutElement( m_pCancelButton ); } m_cancelFocus = false;
if (loadResources) { const int BufLen = strlen(panelName) + 32; char *buf = new char[BufLen]; Q_snprintf( buf, BufLen, "Resource/Career/%s.res", panelName ); LoadControlSettings( buf ); delete[] buf; } }
//--------------------------------------------------------------------------------------------------------------
vgui::Panel * CCareerBaseBox::CreateControlByName(const char *controlName) { if ( Q_stricmp( controlName, "ConVarCheckButton" ) == 0 ) { ConVarToggleCheckButton *button = new ConVarToggleCheckButton( NULL, controlName, "" ); m_conVarCheckButtons.PutElement( button ); return button; }
return BaseClass::CreateControlByName( controlName ); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::SetCancelButtonAsDefault() { m_cancelFocus = true; }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::SetLabelText( const wchar_t *text ) { m_pTextLabel->SetText(text); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::SetLabelText( const char *text ) { m_pTextLabel->SetText(text); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::ApplySchemeSettings( vgui::IScheme *pScheme ) { BaseClass::ApplySchemeSettings( pScheme );
for (int i=0; i<m_buttons.GetCount(); ++i) { m_buttons[i]->SetArmedSound("UI/buttonrollover.wav"); m_buttons[i]->SetDepressedSound("UI/buttonclick.wav"); m_buttons[i]->SetReleasedSound("UI/buttonclickrelease.wav"); }
m_bgColor = GetSchemeColor("Popup.BgColor", Color( 64, 64, 64, 255 ), pScheme); m_borderColor = GetSchemeColor("FgColor", Color( 64, 64, 64, 255 ), pScheme);
SetBorder( pScheme->GetBorder( "BaseBorder" ) ); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::PerformLayout( ) { BaseClass::PerformLayout();
int x, y, w, h; GetBounds(x, y, w, h);
int screenWide, screenTall; GetHudSize( screenWide, screenTall ); if ( x + w/2 != screenWide/2 ) { SetPos( screenWide/2 - w/2, screenTall/2 - h/2 ); GetBounds(x, y, w, h); } }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::PaintBackground( ) { int wide, tall; GetSize( wide, tall );
DrawRoundedBackground( m_bgColor, wide, tall ); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::PaintBorder( ) { int wide, tall; GetSize( wide, tall );
DrawRoundedBorder( m_borderColor, wide, tall ); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::ShowWindow() { SetVisible( true ); SetEnabled( true ); MoveToFront();
if ( m_pCancelButton->IsVisible() && m_cancelFocus ) { m_pCancelButton->RequestFocus(); } else if ( m_pOkButton->IsVisible() ) { m_pOkButton->RequestFocus(); } else // handle message boxes with no button
{ RequestFocus(); }
InvalidateLayout(); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::DoModal() { ShowWindow(); input()->SetAppModalSurface(GetVPanel()); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::OnKeyCodeTyped(KeyCode code) { if (code == KEY_ESCAPE) { OnCommand("Cancel"); } else if (code == KEY_ENTER) { BaseClass::OnKeyCodeTyped( KEY_SPACE ); } else { BaseClass::OnKeyCodeTyped(code); } }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::OnCommand(const char *command) { KeyValues *okSettings = new KeyValues( "GetCommand" ); if ( m_pOkButton->RequestInfo( okSettings ) ) { const char *okCommand = okSettings->GetString( "command", "Ok" ); if ( stricmp(command, okCommand) == 0 ) { for (int i=0; i<m_conVarCheckButtons.GetCount(); ++i) { m_conVarCheckButtons[i]->ApplyChanges(); } } }
if (stricmp(command, "close")) { PostActionSignal( new KeyValues("Command", "command", command) ); }
BaseClass::OnCommand(command);
Close(); }
//--------------------------------------------------------------------------------------------------------------
void CCareerBaseBox::AddButton( vgui::Button *pButton ) { m_buttons.PutElement( pButton ); }
//--------------------------------------------------------------------------------------------------------------
CCareerQueryBox::CCareerQueryBox(vgui::Panel *parent, const char *panelName, const char *resourceName) : CCareerBaseBox(parent, panelName, (resourceName == NULL)) { if ( resourceName ) { LoadControlSettings( resourceName ); } }
//--------------------------------------------------------------------------------------------------------------
CCareerQueryBox::CCareerQueryBox(const char *title, const char *labelText, const char *panelName, vgui::Panel *parent) : CCareerBaseBox(parent, panelName) { }
//--------------------------------------------------------------------------------------------------------------
CCareerQueryBox::CCareerQueryBox(const wchar_t *title, const wchar_t *labelText, const char *panelName, vgui::Panel *parent) : CCareerBaseBox(parent, panelName) { }
//--------------------------------------------------------------------------------------------------------------
CCareerQueryBox::~CCareerQueryBox() { }
// sorted order weapon list -----------------------------------------------------------------------
const int NUM_SECONDARY_WEAPONS = 7; static CSWeaponID s_secondaryWeapons[NUM_SECONDARY_WEAPONS] = { WEAPON_NONE, WEAPON_USP, WEAPON_GLOCK, WEAPON_DEAGLE, WEAPON_ELITE, WEAPON_P228, WEAPON_FIVESEVEN, };
const int NUM_PRIMARY_WEAPONS = 23; static CSWeaponID s_primaryWeapons[NUM_PRIMARY_WEAPONS] = { WEAPON_NONE,
// Assault Rifles
CSWeaponID(-WEAPONTYPE_RIFLE), WEAPON_SG552, WEAPON_AUG, WEAPON_AK47, WEAPON_M4A1, WEAPON_GALIL, WEAPON_FAMAS,
// Snipers
CSWeaponID(-WEAPONTYPE_SNIPER_RIFLE), WEAPON_AWP, WEAPON_SG550, WEAPON_G3SG1, WEAPON_SCOUT,
// SMG
CSWeaponID(-WEAPONTYPE_SUBMACHINEGUN), WEAPON_P90, WEAPON_UMP45, WEAPON_MP5NAVY, WEAPON_MAC10, WEAPON_TMP,
// Heavy
CSWeaponID(-WEAPONTYPE_SHOTGUN), WEAPON_M249, WEAPON_XM1014, WEAPON_M3, // WEAPON_SHIELDGUN,
};
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
class CWeaponButton : public vgui::Button { typedef vgui::Button BaseClass;
public: CWeaponButton( BuyPresetListBox *pParent, CSWeaponID weaponID, bool isPrimary ) : BaseClass( pParent->GetParent(), SharedVarArgs( "WeaponButton%d", weaponID ), "" ) { m_isPrimary = isPrimary; m_pImage = NULL; m_pTitleImage = new TextImage( WeaponIDToDisplayName( weaponID ) ); m_pCostImage = new TextImage( L"" );
m_pListBox = pParent; BuyPresetWeapon weapon( weaponID ); SetWeapon( weapon ); }
virtual ~CWeaponButton() { delete m_pTitleImage; delete m_pCostImage; }
virtual void ApplySchemeSettings( IScheme *pScheme );
virtual Color GetBgColor() { return (IsCurrent()) ? m_selectedBgColor : Button::GetBgColor(); } virtual Color GetFgColor() { return (IsCurrent()) ? m_selectedFgColor : Button::GetFgColor(); }
void SetCurrent() { s_current = this; } bool IsCurrent() const { return s_current == this; }
void SetWeapon( const BuyPresetWeapon& weapon ); const BuyPresetWeapon& GetWeapon() { return m_weapon; }
virtual void Paint(); virtual void PerformLayout(); virtual void PaintBorder() {}
virtual void OnMousePressed( MouseCode code ) { if ( code == MOUSE_LEFT ) { SetCurrent(); m_pListBox->GetParent()->OnCommand( "select_weapon" ); } Button::OnMousePressed( code ); }
virtual void OnMouseDoublePressed( MouseCode code ) { if ( code == MOUSE_LEFT ) { SetCurrent(); m_pListBox->GetParent()->OnCommand( "select_weapon" ); m_pListBox->GetParent()->OnCommand( "popup_ok" ); } Button::OnMouseDoublePressed( code ); }
protected: static CWeaponButton * s_current; BuyPresetListBox * m_pListBox; BuyPresetWeapon m_weapon;
IImage *m_pImage; TextImage *m_pTitleImage; TextImage *m_pCostImage; int m_imageWide; int m_imageTall; int m_imageX; int m_imageY;
Color m_selectedBgColor; Color m_selectedFgColor;
bool m_isPrimary; };
//--------------------------------------------------------------------------------------------------------------
CWeaponButton * CWeaponButton::s_current = NULL;
//--------------------------------------------------------------------------------------------------------------
void CWeaponButton::ApplySchemeSettings( IScheme *pScheme ) { CWeaponButton * current = s_current; // save off current so Button::ApplySchemeSettings() can get the right colors
s_current = NULL; Button::ApplySchemeSettings( pScheme ); m_selectedBgColor = GetSchemeColor( "Button.ArmedBgColor", Button::GetBgColor(), pScheme ); m_selectedFgColor = GetSchemeColor( "Button.ArmedTextColor", Button::GetFgColor(), pScheme ); s_current = current; m_pTitleImage->SetColor( pScheme->GetColor( "Button.TextColor", Color() ) ); m_pTitleImage->SetFont( pScheme->GetFont( "Default", IsProportional() ) ); m_pTitleImage->SetWrap( true ); m_pCostImage->SetColor( pScheme->GetColor( "Button.TextColor", Color() ) ); m_pCostImage->SetFont( pScheme->GetFont( "Default", IsProportional() ) ); m_pCostImage->SetWrap( true ); SetWeapon( m_weapon ); SetBorder( NULL ); }
//--------------------------------------------------------------------------------------------------------------
void CWeaponButton::SetWeapon( const BuyPresetWeapon& weapon ) { m_weapon = weapon; if ( m_weapon.GetName() ) { // weapon string
const wchar_t * name = m_weapon.GetName(); m_pTitleImage->SetText( name );
// cost string
CCSWeaponInfo *info = GetWeaponInfo( m_weapon.GetWeaponID() ); if ( info ) { const int BufLen = 256; wchar_t wbuf[BufLen]; g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( info->GetWeaponPrice() ) ); m_pCostImage->SetText( wbuf ); } else { m_pCostImage->SetText( L"" ); } } else { m_pTitleImage->SetText( L"" ); m_pCostImage->SetText( L"" ); }
m_pTitleImage->ResizeImageToContent(); m_pCostImage->ResizeImageToContent();
InvalidateLayout( true, false );
m_pImage = scheme()->GetImage( ImageFnameFromWeaponID( m_weapon.GetWeaponID(), m_isPrimary ), true ); }
//--------------------------------------------------------------------------------------------------------------
void CWeaponButton::PerformLayout() { BaseClass::PerformLayout();
// Calculate some sizes
int oldWide, oldTall; GetSize( oldWide, oldTall );
const float IMAGE_PERCENT = 0.42f; const float TITLE_PERCENT = 0.45f; const float COST_PERCENT = 1.0f - TITLE_PERCENT - IMAGE_PERCENT;
int maxTitleWide = (int) oldWide * TITLE_PERCENT; int maxImageWide = (int) oldWide * IMAGE_PERCENT; int maxCostWide = (int) oldWide * COST_PERCENT; int textTall = surface()->GetFontTall( m_pTitleImage->GetFont() ) * 2; if ( oldTall != textTall ) { oldTall = textTall; SetSize( oldWide, oldTall ); m_pListBox->InvalidateLayout(); }
// Position the weapon name
{ m_pTitleImage->SetSize( maxTitleWide, oldTall ); m_pTitleImage->RecalculateNewLinePositions(); m_pTitleImage->ResizeImageToContent();
int textContentWide, textContentTall; m_pTitleImage->GetSize( textContentWide, textContentTall );
if ( textContentTall < textTall ) { m_pTitleImage->SetSize( maxTitleWide, textContentTall ); m_pTitleImage->SetPos( maxImageWide, (textTall - textContentTall) / 2 ); } else { m_pTitleImage->SetPos( maxImageWide, 0 ); } }
// Position the weapon cost
{ m_pCostImage->SetSize( maxCostWide, oldTall ); m_pCostImage->RecalculateNewLinePositions(); m_pCostImage->ResizeImageToContent();
int textContentWide, textContentTall; m_pCostImage->GetSize( textContentWide, textContentTall );
if ( textContentTall < textTall ) { m_pCostImage->SetSize( maxCostWide, textContentTall ); m_pCostImage->SetPos( oldWide - maxCostWide, (textTall - textContentTall) / 2 ); } else { m_pCostImage->SetPos( oldWide - maxCostWide, 0 ); } }
// Position the weapon image
m_pImage = scheme()->GetImage( ImageFnameFromWeaponID( m_weapon.GetWeaponID(), m_isPrimary ), true );
int maxImageTall = textTall;
m_pImage->GetContentSize( m_imageWide, m_imageTall ); if ( m_imageTall > maxImageTall ) { m_imageWide = (int) m_imageWide * 1.0f * maxImageTall / m_imageTall; m_imageTall = maxImageTall; } if ( m_imageWide > maxImageWide ) { m_imageTall = (int) m_imageTall * 1.0f * maxImageWide / m_imageWide; m_imageWide = maxImageWide; } m_imageY = (textTall - m_imageTall) / 2; m_imageX = (((int) oldWide * IMAGE_PERCENT) - m_imageWide) / 2; }
//--------------------------------------------------------------------------------------------------------------
void CWeaponButton::Paint() { if ( m_pImage ) { m_pImage->SetSize( m_imageWide, m_imageTall ); m_pImage->SetPos( m_imageX, m_imageY ); m_pImage->Paint(); m_pImage->SetSize( 0, 0 ); } m_pTitleImage->Paint(); m_pCostImage->Paint();
BaseClass::Paint(); }
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
class WeaponComboBox : public vgui::ComboBox { public: WeaponComboBox( CWeaponSelectBox *parent, const char *name, int numEntries, bool editable ) : ComboBox( parent, name, numEntries, editable ) { m_pBox = parent; }
virtual void OnSetText( const wchar_t *newText ) { ComboBox::OnSetText( newText ); if ( m_pBox ) m_pBox->UpdateClips(); } private: CWeaponSelectBox *m_pBox; };
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
CWeaponSelectBox::CWeaponSelectBox(vgui::Panel *parent, WeaponSet *pWeaponSet, bool isSecondary ) : CCareerBaseBox(parent, "BuyBoxSelectWeapon", false) { m_pWeaponSet = pWeaponSet; m_isSecondary = isSecondary;
m_numWeapons = NUM_PRIMARY_WEAPONS; m_weaponIDs = s_primaryWeapons;
BuyPresetWeapon *weapon; if ( !m_isSecondary ) { weapon = &m_pWeaponSet->m_primaryWeapon; if ( !IsPrimaryWeapon( weapon->GetWeaponID() ) && weapon->GetWeaponID() != WEAPON_NONE ) { BuyPresetWeapon tmp( WEAPON_NONE ); m_pWeaponSet->m_primaryWeapon = tmp; } } else { m_numWeapons = NUM_SECONDARY_WEAPONS; m_weaponIDs = s_secondaryWeapons; weapon = &m_pWeaponSet->m_secondaryWeapon; if ( !IsSecondaryWeapon( weapon->GetWeaponID() ) && weapon->GetWeaponID() != WEAPON_NONE ) { BuyPresetWeapon tmp( WEAPON_NONE ); *weapon = tmp; } }
int maxClips = 0; const CCSWeaponInfo *info = GetWeaponInfo( weapon->GetWeaponID() ); if ( info ) { int maxRounds = GetCSAmmoDef()->MaxCarry( info->iAmmoType ); int buyClipSize = GetCSAmmoDef()->GetBuySize( info->iAmmoType ); maxClips = (buyClipSize > 0) ? ceil(maxRounds/(float)buyClipSize) : 0; } else { maxClips = NUM_CLIPS_FOR_CURRENT; // so we can buy ammo for our current gun
}
m_pClips = new WeaponComboBox( this, "Clips", 2*maxClips+1, false ); m_pClips->SetOpenDirection( Menu::UP ); m_pListBox = new BuyPresetListBox( this, "WeaponListBox" ); m_pBullets = new Label( this, "bullets", "" );
int selectedWeaponIndex = -1; int i; for ( i=0; i<m_numWeapons; ++i ) { if ( m_weaponIDs[i] < 0 ) { const char *text = ""; switch ( (int)m_weaponIDs[i] ) { case -WEAPONTYPE_RIFLE: text = "#Cstrike_BuyPresetCategoryRifle"; break; case -WEAPONTYPE_SNIPER_RIFLE: text = "#Cstrike_BuyPresetCategorySniper"; break; case -WEAPONTYPE_SUBMACHINEGUN: text = "#Cstrike_BuyPresetCategorySMG"; break; case -WEAPONTYPE_SHOTGUN: text = "#Cstrike_BuyPresetCategoryHeavy"; break; } Label *pLabel = new Label( m_pListBox, SharedVarArgs("weaponlabel%d", i), text ); m_pListBox->AddItem( pLabel, NULL ); } else { CWeaponButton *pWeaponButton = new CWeaponButton( m_pListBox, m_weaponIDs[i], !m_isSecondary ); m_pListBox->AddItem( pWeaponButton, NULL ); if ( m_weaponIDs[i] == weapon->GetWeaponID() ) { pWeaponButton->SetCurrent(); selectedWeaponIndex = i; } } } m_pListBox->MakeItemVisible( selectedWeaponIndex );
LoadControlSettings( "resource/UI/BuyPreset/BoxSelectWeapon.res" ); PopulateControls(); }
//--------------------------------------------------------------------------------------------------------------
CWeaponSelectBox::~CWeaponSelectBox() { }
//--------------------------------------------------------------------------------------------------------------
void CWeaponSelectBox::ActivateBuildMode() { SetClipsVisible( true ); m_pListBox->DeleteAllItems(); BaseClass::ActivateBuildMode(); }
//--------------------------------------------------------------------------------------------------------------
void CWeaponSelectBox::SetClipsVisible( bool visible ) { SetLabelVisible( visible ); m_pClips->SetVisible( visible ); }
//--------------------------------------------------------------------------------------------------------------
void CWeaponSelectBox::PopulateControls() { BuyPresetWeapon *weapon; if (!m_isSecondary) { weapon = &m_pWeaponSet->m_primaryWeapon; } else { weapon = &m_pWeaponSet->m_secondaryWeapon; }
int i; int maxClips = 0; const CCSWeaponInfo *info = GetWeaponInfo( weapon->GetWeaponID() ); if ( info ) { int maxRounds = GetCSAmmoDef()->MaxCarry( info->iAmmoType ); int buyClipSize = GetCSAmmoDef()->GetBuySize( info->iAmmoType ); maxClips = (buyClipSize > 0) ? ceil(maxRounds/(float)buyClipSize) : 0; } else { maxClips = NUM_CLIPS_FOR_CURRENT; } m_pClips->SetNumberOfEditLines( 2*maxClips+1 );
SetClipsVisible( maxClips != 0 );
m_pClips->DeleteAllItems();
// populate clips combo box
m_pClips->AddItem( "#Cstrike_BuyPresetEditWeaponFullClips", NULL );
const int BufLen = 64; wchar_t buf[BufLen]; for ( i=maxClips-1; i>=0; --i ) { const char* clipsOrMore = "#Cstrike_BuyPresetEditClipsOrMore"; const char* clips = "#Cstrike_BuyPresetEditClips"; if ( i == 1 ) { clipsOrMore = "#Cstrike_BuyPresetEditClipOrMore"; clips = "#Cstrike_BuyPresetEditClip"; } g_pVGuiLocalize->ConstructString( buf, sizeof(buf), g_pVGuiLocalize->Find( clipsOrMore ), 1, NumAsWString( i )); m_pClips->AddItem( buf, NULL ); g_pVGuiLocalize->ConstructString( buf, sizeof(buf), g_pVGuiLocalize->Find( clips ), 1, NumAsWString( i )); m_pClips->AddItem( buf, NULL ); }
// now select the proper entry
int clipIndexToSelect = weapon->GetFillAmmo(); clipIndexToSelect += 2 * weapon->GetAmmoAmount(); clipIndexToSelect = maxClips*2 - clipIndexToSelect; m_pClips->ActivateItemByRow( clipIndexToSelect );
if ( m_isSecondary ) { Panel *pPanel = FindChildByName( "TitleLabel" ); if ( pPanel ) { const wchar_t *title = g_pVGuiLocalize->Find( "#Cstrike_BuyPresetWizardSecondary" ); if ( title ) PostMessage(pPanel, new KeyValues("SetText", "text", title)); } }
UpdateClips(); }
//--------------------------------------------------------------------------------------------------------------
void CWeaponSelectBox::UpdateClips() { if ( !m_pClips ) return;
int numEntries = m_pClips->GetItemCount(); int activeID = m_pClips->GetActiveItem(); int combined = numEntries - activeID + 1; int numClips = combined/2 - 1; //bool isFill = (combined%2) != 0;
BuyPresetWeapon *weapon; if (!m_isSecondary) { weapon = &m_pWeaponSet->m_primaryWeapon; } else { weapon = &m_pWeaponSet->m_secondaryWeapon; }
const CCSWeaponInfo *info = GetWeaponInfo( weapon->GetWeaponID() ); if ( info ) { int maxRounds = GetCSAmmoDef()->MaxCarry( info->iAmmoType ); int buyClipSize = GetCSAmmoDef()->GetBuySize( info->iAmmoType ); m_pBullets->SetVisible( true );
const int BufLen = 64; wchar_t buf[BufLen]; g_pVGuiLocalize->ConstructString( buf, sizeof(buf), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetsBullets" ), 2, NumAsWString( MIN( maxRounds, numClips * buyClipSize ) ), NumAsWString( maxRounds ) ); m_pBullets->SetText( buf ); } else { m_pBullets->SetVisible( false ); } }
//--------------------------------------------------------------------------------------------------------------
void CWeaponSelectBox::ApplySchemeSettings( IScheme *pScheme ) { BaseClass::ApplySchemeSettings(pScheme);
HFont font = pScheme->GetFont("Default", IsProportional()); int tall = surface()->GetFontTall(font) + 2; if ( font != INVALID_FONT ) { Menu *pMenu = m_pClips->GetMenu(); pMenu->SetMenuItemHeight( tall ); }
for ( int i=0; i<m_pListBox->GetItemCount(); ++i ) { if ( m_weaponIDs[i] >= 0 ) { CWeaponButton *pButton = static_cast< CWeaponButton * >(m_pListBox->GetItemPanel(i)); if ( pButton && pButton->IsCurrent() ) { m_pListBox->MakeItemVisible( i ); } } else { // it's a caption label
Label *pLabel = static_cast< Label * >(m_pListBox->GetItemPanel(i)); if ( pLabel ) { pLabel->SetContentAlignment( Label::a_center ); pLabel->SetBorder( pScheme->GetBorder( "ButtonBorder" ) ); pLabel->SetBgColor( pScheme->GetColor( "Frame.BgColor", Color( 0, 0, 0, 255 ) ) ); } } } }
//--------------------------------------------------------------------------------------------------------------
CSWeaponID CWeaponSelectBox::GetSelectedWeaponID() { int selectedIndex = -1; for ( int i=0; i<m_pListBox->GetItemCount(); ++i ) { if ( m_weaponIDs[selectedIndex] >= 0 ) { CWeaponButton *pButton = static_cast< CWeaponButton * >(m_pListBox->GetItemPanel(i)); if ( pButton && pButton->IsCurrent() ) { selectedIndex = i; } } } if ( selectedIndex >= 0 ) { return m_weaponIDs[selectedIndex]; }
return WEAPON_NONE; }
//--------------------------------------------------------------------------------------------------------------
void CWeaponSelectBox::OnCommand(const char *command) { if (!stricmp(command, "select_weapon")) { CSWeaponID weaponID = GetSelectedWeaponID(); BuyPresetWeapon weapon( weaponID ); if ( m_isSecondary ) { m_pWeaponSet->m_secondaryWeapon = weapon; } else { m_pWeaponSet->m_primaryWeapon = weapon; }
PopulateControls(); return; }
if (!stricmp(command, "popup_ok")) { if ( !m_pClips ) return;
int numEntries = m_pClips->GetItemCount(); int activeID = m_pClips->GetActiveItem(); int combined = numEntries - activeID + 1; int numClips = combined/2 - 1; bool isFill = (combined%2) != 0;
BuyPresetWeapon weapon( GetSelectedWeaponID() ); weapon.SetAmmoType( AMMO_CLIPS ); weapon.SetAmmoAmount( numClips ); weapon.SetFillAmmo( isFill );
if ( m_isSecondary ) { m_pWeaponSet->m_secondaryWeapon = weapon; } else { m_pWeaponSet->m_primaryWeapon = weapon; } BaseClass::OnCommand( command ); } else { BaseClass::OnCommand(command); } }
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
class EquipmentComboBox : public ComboBox { public: EquipmentComboBox( CBaseSelectBox *parent, const char *name, int numEntries, bool editable ) : ComboBox( parent, name, numEntries, editable ) { m_pBox = parent; }
virtual void OnSetText( const wchar_t *newText ) { ComboBox::OnSetText( newText ); m_pBox->OnControlChanged(); } private: CBaseSelectBox *m_pBox; };
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
CGrenadeSelectBox::CGrenadeSelectBox( vgui::Panel *parent, WeaponSet *pWeaponSet ) : BaseClass( parent, "BuyBoxSelectGrenades", false ) { m_pWeaponSet = pWeaponSet;
// Equipment controls
m_pHEGrenade = new EquipmentComboBox( this, "hegrenade", 2, false ); m_pSmokeGrenade = new EquipmentComboBox( this, "smokegrenade", 2, false ); m_pFlashbangs = new EquipmentComboBox( this, "flashbangs", 3, false );
// Equipment images
m_pHEGrenadeImage = new EquipmentLabel( this, "HEGrenadeImage" ); m_pSmokeGrenadeImage = new EquipmentLabel( this, "SmokeGrenadeImage" ); m_pFlashbangImage = new EquipmentLabel( this, "FlashbangImage" );
m_pHELabel = new Label( this, "HECost", "" ); m_pSmokeLabel = new Label( this, "SmokeCost", "" ); m_pFlashLabel = new Label( this, "FlashCost", "" );
LoadControlSettings( "Resource/UI/BuyPreset/BoxSelectGrenades.res" );
// Add entries to the combo boxes
m_pHEGrenade->AddItem( "0", NULL ); m_pHEGrenade->AddItem( "1", NULL );
m_pSmokeGrenade->AddItem( "0", NULL ); m_pSmokeGrenade->AddItem( "1", NULL );
m_pFlashbangs->AddItem( "0", NULL ); m_pFlashbangs->AddItem( "1", NULL ); m_pFlashbangs->AddItem( "2", NULL );
// populate the data
m_pHEGrenade->ActivateItemByRow( m_pWeaponSet->m_HEGrenade ); m_pSmokeGrenade->ActivateItemByRow( m_pWeaponSet->m_smokeGrenade ); m_pFlashbangs->ActivateItemByRow( m_pWeaponSet->m_flashbangs );
m_pHEGrenadeImage->SetItem( "gfx/vgui/hegrenade_square", 1 ); m_pSmokeGrenadeImage->SetItem( "gfx/vgui/smokegrenade_square", 1 ); m_pFlashbangImage->SetItem( "gfx/vgui/flashbang_square", 1 );
OnControlChanged(); }
//--------------------------------------------------------------------------------------------------------------
void CGrenadeSelectBox::OnControlChanged() { const int BufLen = 256; wchar_t wbuf[BufLen];
CCSWeaponInfo *info;
int numGrenades; info = GetWeaponInfo( WEAPON_HEGRENADE ); if ( info ) { numGrenades = m_pHEGrenade->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( info->GetWeaponPrice() * numGrenades ) ); m_pHELabel->SetText( wbuf ); }
info = GetWeaponInfo( WEAPON_SMOKEGRENADE ); if ( info ) { numGrenades = m_pSmokeGrenade->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( info->GetWeaponPrice() * numGrenades ) ); m_pSmokeLabel->SetText( wbuf ); }
info = GetWeaponInfo( WEAPON_FLASHBANG ); if ( info ) { numGrenades = m_pFlashbangs->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( info->GetWeaponPrice() * numGrenades ) ); m_pFlashLabel->SetText( wbuf ); } }
//--------------------------------------------------------------------------------------------------------------
void CGrenadeSelectBox::OnCommand( const char *command ) { if (!stricmp(command, "popup_ok")) { // stuff values back in m_pWeaponSet
m_pWeaponSet->m_HEGrenade = m_pHEGrenade->GetActiveItem(); m_pWeaponSet->m_smokeGrenade = m_pSmokeGrenade->GetActiveItem(); m_pWeaponSet->m_flashbangs = m_pFlashbangs->GetActiveItem(); } BaseClass::OnCommand( command ); }
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
CEquipmentSelectBox::CEquipmentSelectBox( vgui::Panel *parent, WeaponSet *pWeaponSet ) : BaseClass( parent, "BuyBoxSelectEquipment", false ) { m_pWeaponSet = pWeaponSet;
// Equipment controls
m_pKevlar = new EquipmentComboBox( this, "kevlar", 2, false ); m_pHelmet = new EquipmentComboBox( this, "helmet", 2, false ); m_pDefuser = new EquipmentComboBox( this, "defuser", 2, false ); m_pNightvision = new EquipmentComboBox( this, "nightvision", 2, false );
// Equipment labels
m_pKevlarLabel = new Label( this, "kevlarCost", "" ); m_pHelmetLabel = new Label( this, "helmetCost", "" ); m_pDefuserLabel = new Label( this, "defuserCost", "" ); m_pNightvisionLabel = new Label( this, "nightvisionCost", "" );
// Equipment images
m_pKevlarImage = new EquipmentLabel( this, "KevlarImage" ); m_pHelmetImage = new EquipmentLabel( this, "HelmetImage" ); m_pDefuserImage = new EquipmentLabel( this, "DefuserImage" ); m_pNightvisionImage = new EquipmentLabel( this, "NightvisionImage" );
LoadControlSettings( "Resource/UI/BuyPreset/BoxSelectEquipment.res" );
// Add entries to the combo boxes
m_pKevlar->AddItem( "0", NULL ); m_pKevlar->AddItem( "1", NULL );
m_pHelmet->AddItem( "0", NULL ); m_pHelmet->AddItem( "1", NULL );
m_pDefuser->AddItem( "0", NULL ); m_pDefuser->AddItem( "1", NULL );
m_pNightvision->AddItem( "0", NULL ); m_pNightvision->AddItem( "1", NULL );
// populate the data
m_pKevlar->ActivateItemByRow( ( m_pWeaponSet->m_armor > 0 ) ); m_pHelmet->ActivateItemByRow( ( m_pWeaponSet->m_armor && m_pWeaponSet->m_helmet ) ); m_pDefuser->ActivateItemByRow( m_pWeaponSet->m_defuser ); m_pNightvision->ActivateItemByRow( m_pWeaponSet->m_nightvision );
m_pKevlarImage->SetItem( "gfx/vgui/kevlar", 1 ); m_pHelmetImage->SetItem( "gfx/vgui/helmet", 1 ); m_pDefuserImage->SetItem( "gfx/vgui/defuser", 1 ); m_pNightvisionImage->SetItem( "gfx/vgui/nightvision", 1 );
OnControlChanged(); }
//--------------------------------------------------------------------------------------------------------------
void CEquipmentSelectBox::OnControlChanged() { const int BufLen = 256; wchar_t wbuf[BufLen];
int iHelmetPrice = HELMET_PRICE; int iKevlarPrice = KEVLAR_PRICE; int iNVGPrice = NVG_PRICE;
if ( CSGameRules()->IsBlackMarket() ) { iHelmetPrice = CSGameRules()->GetBlackMarketPriceForWeapon( WEAPON_ASSAULTSUIT ) - CSGameRules()->GetBlackMarketPriceForWeapon( WEAPON_KEVLAR ); iKevlarPrice = CSGameRules()->GetBlackMarketPriceForWeapon( WEAPON_KEVLAR ); iNVGPrice = CSGameRules()->GetBlackMarketPriceForWeapon( WEAPON_NVG ); }
int count = m_pKevlar->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( iKevlarPrice * count ) ); m_pKevlarLabel->SetText( wbuf );
m_pHelmet->SetEnabled( count ); if ( !count && m_pHelmet->GetActiveItem() ) m_pHelmet->ActivateItemByRow( 0 );
count = m_pHelmet->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( iHelmetPrice * count ) ); m_pHelmetLabel->SetText( wbuf );
count = m_pDefuser->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( DEFUSEKIT_PRICE * count ) ); m_pDefuserLabel->SetText( wbuf );
count = m_pNightvision->GetActiveItem(); g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), 1, NumAsWString( NVG_PRICE * count ) ); m_pNightvisionLabel->SetText( wbuf ); }
//--------------------------------------------------------------------------------------------------------------
void CEquipmentSelectBox::OnCommand( const char *command ) { if (!stricmp(command, "popup_ok")) { // stuff values back in m_pWeaponSet
m_pWeaponSet->m_armor = m_pKevlar->GetActiveItem() ? 100 : 0; m_pWeaponSet->m_helmet = m_pWeaponSet->m_armor && m_pHelmet->GetActiveItem(); m_pWeaponSet->m_defuser = m_pDefuser->GetActiveItem(); m_pWeaponSet->m_nightvision = m_pNightvision->GetActiveItem(); } BaseClass::OnCommand( command ); }
//--------------------------------------------------------------------------------------------------------------
|