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.
447 lines
12 KiB
447 lines
12 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
|
|
#include "weapon_csbase.h" |
|
#include "cs_ammodef.h" |
|
|
|
#include <vgui/IVGui.h> |
|
#include <vgui/IScheme.h> |
|
#include <vgui/ISurface.h> |
|
#include <vgui_controls/Label.h> |
|
#include <vgui/ILocalize.h> |
|
#include "vgui_controls/BuildGroup.h" |
|
#include "vgui_controls/BitmapImagePanel.h" |
|
#include "vgui_controls/TextEntry.h" |
|
#include "vgui_controls/TextImage.h" |
|
#include "vgui_controls/RichText.h" |
|
#include "vgui_controls/QueryBox.h" |
|
#include "career_box.h" |
|
#include "buypreset_listbox.h" |
|
#include "buypreset_weaponsetlabel.h" |
|
#include "backgroundpanel.h" |
|
|
|
#include "cstrike/bot/shared_util.h" |
|
|
|
using namespace vgui; |
|
|
|
const float horizTitleRatio = 18.0f/68.0f; |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
//-------------------------------------------------------------------------------------------------------------- |
|
/* |
|
class PresetNameTextEntry : public TextEntry |
|
{ |
|
public: |
|
PresetNameTextEntry(Panel *parent, CBuyPresetEditMainMenu *menu, const char *name ) : TextEntry( parent, name ) |
|
{ |
|
m_pMenu = menu; |
|
} |
|
|
|
virtual void FireActionSignal() |
|
{ |
|
TextEntry::FireActionSignal(); |
|
if ( m_pMenu ) |
|
{ |
|
m_pMenu->SetDirty(); |
|
} |
|
} |
|
|
|
private: |
|
CBuyPresetEditMainMenu *m_pMenu; |
|
}; |
|
*/ |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
//-------------------------------------------------------------------------------------------------------------- |
|
int GetScaledValue( HScheme hScheme, int unscaled ) |
|
{ |
|
int val = scheme()->GetProportionalScaledValueEx( hScheme, unscaled ); |
|
return GetAlternateProportionalValueFromScaled( hScheme, val ); |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
//-------------------------------------------------------------------------------------------------------------- |
|
class PresetBackgroundPanel : public vgui::Panel |
|
{ |
|
typedef vgui::Panel BaseClass; |
|
|
|
public: |
|
PresetBackgroundPanel( vgui::Panel *parent, const char *panelName ) : BaseClass( parent, panelName ) |
|
{ |
|
}; |
|
|
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) |
|
{ |
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
SetBorder( pScheme->GetBorder("ButtonBorder") ); |
|
m_lineColor = pScheme->GetColor( "Border.Bright", Color( 0, 0, 0, 0 ) ); |
|
} |
|
|
|
virtual void ApplySettings( KeyValues *inResourceData ) |
|
{ |
|
BaseClass::ApplySettings( inResourceData ); |
|
|
|
m_lines.RemoveAll(); |
|
KeyValues *lines = inResourceData->FindKey( "lines", false ); |
|
if ( lines ) |
|
{ |
|
KeyValues *line = lines->GetFirstValue(); |
|
while ( line ) |
|
{ |
|
const char *str = line->GetString( nullptr, "" ); |
|
Vector4D p; |
|
int numPoints = sscanf( str, "%f %f %f %f", &p[0], &p[1], &p[2], &p[3] ); |
|
if ( numPoints == 4 ) |
|
{ |
|
m_lines.AddToTail( p ); |
|
} |
|
line = line->GetNextValue(); |
|
} |
|
} |
|
} |
|
|
|
virtual void PaintBackground( void ) |
|
{ |
|
BaseClass::PaintBackground(); |
|
|
|
vgui::surface()->DrawSetColor( m_lineColor ); |
|
vgui::surface()->DrawSetTextColor( m_lineColor ); |
|
for ( int i=0; i<m_scaledLines.Count(); ++i ) |
|
{ |
|
int x1, x2, y1, y2; |
|
|
|
x1 = m_scaledLines[i][0]; |
|
y1 = m_scaledLines[i][1]; |
|
x2 = m_scaledLines[i][2]; |
|
y2 = m_scaledLines[i][3]; |
|
|
|
vgui::surface()->DrawFilledRect( x1, y1, x2, y2 ); |
|
} |
|
} |
|
|
|
virtual void PerformLayout( void ) |
|
{ |
|
m_scaledLines.RemoveAll(); |
|
for ( int i=0; i<m_lines.Count(); ++i ) |
|
{ |
|
int x1, x2, y1, y2; |
|
|
|
x1 = GetScaledValue( GetScheme(), m_lines[i][0] ); |
|
y1 = GetScaledValue( GetScheme(), m_lines[i][1] ); |
|
x2 = GetScaledValue( GetScheme(), m_lines[i][2] ); |
|
y2 = GetScaledValue( GetScheme(), m_lines[i][3] ); |
|
|
|
if ( x1 == x2 ) |
|
{ |
|
++x2; |
|
} |
|
|
|
if ( y1 == y2 ) |
|
{ |
|
++y2; |
|
} |
|
|
|
m_scaledLines.AddToTail( Vector4D( x1, y1, x2, y2 ) ); |
|
} |
|
} |
|
|
|
private: |
|
Color m_lineColor; |
|
CUtlVector< Vector4D > m_lines; |
|
CUtlVector< Vector4D > m_scaledLines; |
|
}; |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
//-------------------------------------------------------------------------------------------------------------- |
|
BuyPresetEditPanel::BuyPresetEditPanel( Panel *parent, const char *panelName, const char *resourceFilename, int fallbackIndex, bool editableName ) : BaseClass( parent, panelName ) |
|
{ |
|
SetProportional( parent->IsProportional() ); |
|
if ( IsProportional() ) |
|
{ |
|
m_baseWide = m_baseTall = scheme()->GetProportionalScaledValueEx( GetScheme(), 100 ); |
|
} |
|
else |
|
{ |
|
m_baseWide = m_baseTall = 100; |
|
} |
|
SetSize( m_baseWide, m_baseTall ); |
|
|
|
m_fallbackIndex = fallbackIndex; |
|
|
|
m_pBgPanel = new PresetBackgroundPanel( this, "mainBackground" ); |
|
|
|
m_pTitleEntry = NULL; |
|
m_pTitleLabel = NULL; |
|
m_pCostLabel = NULL; |
|
/* |
|
m_pTitleEntry = new PresetNameTextEntry( this, dynamic_cast<CBuyPresetEditMainMenu *>(parent), "titleEntry" ); |
|
m_pTitleLabel = new Label( this, "title", "" ); |
|
m_pCostLabel = new Label( this, "cost", "" ); |
|
*/ |
|
|
|
m_pPrimaryWeapon = new WeaponLabel( this, "primary" ); |
|
m_pSecondaryWeapon = new WeaponLabel( this, "secondary" ); |
|
|
|
m_pHEGrenade = new EquipmentLabel( this, "hegrenade" ); |
|
m_pSmokeGrenade = new EquipmentLabel( this, "smokegrenade" ); |
|
m_pFlashbangs = new EquipmentLabel( this, "flashbang" ); |
|
|
|
m_pDefuser = new EquipmentLabel( this, "defuser" ); |
|
m_pNightvision = new EquipmentLabel( this, "nightvision" ); |
|
|
|
m_pArmor = new EquipmentLabel( this, "armor" ); |
|
|
|
if ( resourceFilename ) |
|
{ |
|
LoadControlSettings( resourceFilename ); |
|
} |
|
|
|
int x, y, w, h; |
|
m_pBgPanel->GetBounds( x, y, w, h ); |
|
|
|
m_baseWide = x + w; |
|
m_baseTall = y + h; |
|
SetSize( m_baseWide, m_baseTall ); |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
BuyPresetEditPanel::~BuyPresetEditPanel() |
|
{ |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void BuyPresetEditPanel::SetWeaponSet( const WeaponSet *pWeaponSet, bool current ) |
|
{ |
|
// set to empty state |
|
Reset(); |
|
|
|
// now fill in items |
|
if ( pWeaponSet ) |
|
{ |
|
if ( m_pTitleLabel ) |
|
{ |
|
m_pTitleLabel->SetText( SharedVarArgs( "#Cstrike_BuyPresetChoice%d", m_fallbackIndex ) ); |
|
} |
|
if ( m_pTitleEntry ) |
|
{ |
|
m_pTitleEntry->SetText( SharedVarArgs( "#Cstrike_BuyPresetChoice%d", m_fallbackIndex ) ); |
|
} |
|
|
|
if ( m_pCostLabel ) |
|
{ |
|
const int BufLen = 256; |
|
wchar_t wbuf[BufLen]; |
|
g_pVGuiLocalize->ConstructString( wbuf, sizeof( wbuf ), |
|
g_pVGuiLocalize->Find( "#Cstrike_BuyPresetPlainCost" ), |
|
1, NumAsWString( pWeaponSet->FullCost() ) ); |
|
m_pCostLabel->SetText( wbuf ); |
|
} |
|
|
|
m_pPrimaryWeapon->SetWeapon( &pWeaponSet->m_primaryWeapon, true, true ); |
|
m_pSecondaryWeapon->SetWeapon( &pWeaponSet->m_secondaryWeapon, false, true ); |
|
|
|
if ( pWeaponSet->m_HEGrenade ) |
|
m_pHEGrenade->SetItem( "gfx/vgui/hegrenade_square", 1 ); |
|
if ( pWeaponSet->m_smokeGrenade ) |
|
m_pSmokeGrenade->SetItem( "gfx/vgui/smokegrenade_square", 1 ); |
|
if ( pWeaponSet->m_flashbangs ) |
|
m_pFlashbangs->SetItem( "gfx/vgui/flashbang_square", pWeaponSet->m_flashbangs ); |
|
|
|
if ( pWeaponSet->m_defuser ) |
|
m_pDefuser->SetItem( "gfx/vgui/defuser", 1 ); |
|
if ( pWeaponSet->m_nightvision ) |
|
m_pNightvision->SetItem( "gfx/vgui/nightvision", 1 ); |
|
|
|
if ( pWeaponSet->m_armor ) |
|
{ |
|
if ( pWeaponSet->m_helmet ) |
|
m_pArmor->SetItem( "gfx/vgui/kevlar_helmet", 1 ); |
|
else |
|
m_pArmor->SetItem( "gfx/vgui/kevlar", 1 ); |
|
} |
|
} |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void BuyPresetEditPanel::SetText( const wchar_t *text ) |
|
{ |
|
if ( !text ) |
|
text = L""; |
|
if ( m_pTitleLabel ) |
|
{ |
|
m_pTitleLabel->SetText( text ); |
|
} |
|
if ( m_pTitleEntry ) |
|
{ |
|
m_pTitleEntry->SetText( text ); |
|
} |
|
InvalidateLayout(); |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Handle command callbacks |
|
*/ |
|
void BuyPresetEditPanel::OnCommand( const char *command ) |
|
{ |
|
if (stricmp(command, "close")) |
|
{ |
|
PostActionSignal( new KeyValues("Command", "command", SharedVarArgs( "%s %d", command, m_fallbackIndex )) ); |
|
} |
|
|
|
BaseClass::OnCommand(command); |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void BuyPresetEditPanel::ApplySchemeSettings(IScheme *pScheme) |
|
{ |
|
BaseClass::ApplySchemeSettings(pScheme); |
|
SetBgColor( Color( 0, 0, 0, 0 ) ); |
|
|
|
IBorder *pBorder = NULL; |
|
|
|
int i; |
|
|
|
for (i = 0; i < GetChildCount(); i++) |
|
{ |
|
// perform auto-layout on the child panel |
|
Panel *child = GetChild(i); |
|
if (!child) |
|
continue; |
|
|
|
if ( !stricmp( "button", child->GetClassName() ) ) |
|
{ |
|
Button *pButton = dynamic_cast<Button *>(child); |
|
if ( pButton ) |
|
{ |
|
pButton->SetDefaultBorder( pBorder ); |
|
pButton->SetDepressedBorder( pBorder ); |
|
pButton->SetKeyFocusBorder( pBorder ); |
|
} |
|
} |
|
} |
|
|
|
pBorder = pScheme->GetBorder("BuyPresetButtonBorder"); |
|
|
|
const int NumButtons = 4; |
|
const char * buttonNames[4] = { "editPrimary", "editSecondary", "editGrenades", "editEquipment" }; |
|
for ( i=0; i<NumButtons; ++i ) |
|
{ |
|
Panel *pPanel = FindChildByName( buttonNames[i] ); |
|
if ( pPanel ) |
|
{ |
|
pPanel->SetBorder( pBorder ); |
|
if ( !stricmp( "button", pPanel->GetClassName() ) ) |
|
{ |
|
Button *pButton = dynamic_cast<Button *>(pPanel); |
|
if ( pButton ) |
|
{ |
|
pButton->SetDefaultBorder( pBorder ); |
|
pButton->SetDepressedBorder( pBorder ); |
|
pButton->SetKeyFocusBorder( pBorder ); |
|
|
|
Color fgColor, bgColor; |
|
fgColor = GetSchemeColor("Label.TextDullColor", GetFgColor(), pScheme); |
|
bgColor = Color( 0, 0, 0, 0 ); |
|
pButton->SetDefaultColor( fgColor, bgColor ); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
/** |
|
* Overrides EditablePanel's resizing of children to scale them proportionally to the main panel's change. |
|
*/ |
|
void BuyPresetEditPanel::OnSizeChanged( int wide, int tall ) |
|
{ |
|
if ( !m_baseWide ) |
|
m_baseWide = 1; |
|
if ( !m_baseTall ) |
|
m_baseTall = 1; |
|
|
|
Panel::OnSizeChanged(wide, tall); |
|
InvalidateLayout(); |
|
|
|
if ( wide == m_baseWide && tall == m_baseTall ) |
|
{ |
|
Repaint(); |
|
return; |
|
} |
|
|
|
float xScale = wide / (float) m_baseWide; |
|
float yScale = tall / (float) m_baseTall; |
|
|
|
for (int i = 0; i < GetChildCount(); i++) |
|
{ |
|
// perform auto-layout on the child panel |
|
Panel *child = GetChild(i); |
|
if (!child) |
|
continue; |
|
|
|
int x, y, w, t; |
|
child->GetBounds(x, y, w, t); |
|
|
|
int newX = (int) x * xScale; |
|
int newY = (int) y * yScale; |
|
int newW = (int) (x+w) * xScale - newX; |
|
int newT = (int) t * yScale; |
|
|
|
// make sure the child isn't too big... |
|
if(newX+newW>wide) |
|
{ |
|
continue; |
|
} |
|
|
|
if(newY+newT>tall) |
|
{ |
|
continue; |
|
} |
|
|
|
child->SetBounds(newX, newY, newW, newT); |
|
child->InvalidateLayout(); |
|
} |
|
Repaint(); |
|
|
|
// update the baselines |
|
m_baseWide = wide; |
|
m_baseTall = tall; |
|
} |
|
|
|
//-------------------------------------------------------------------------------------------------------------- |
|
void BuyPresetEditPanel::Reset() |
|
{ |
|
if ( m_pTitleLabel ) |
|
{ |
|
m_pTitleLabel->SetText( "#Cstrike_BuyPresetNewChoice" ); |
|
} |
|
if ( m_pTitleEntry ) |
|
{ |
|
m_pTitleEntry->SetText( "#Cstrike_BuyPresetNewChoice" ); |
|
} |
|
if ( m_pCostLabel ) |
|
{ |
|
m_pCostLabel->SetText( "" ); |
|
} |
|
|
|
BuyPresetWeapon weapon; |
|
m_pPrimaryWeapon->SetWeapon( &weapon, true, false ); |
|
m_pSecondaryWeapon->SetWeapon( &weapon, false, false ); |
|
|
|
m_pHEGrenade->SetItem( NULL, 1 ); |
|
m_pSmokeGrenade->SetItem( NULL, 1 ); |
|
m_pFlashbangs->SetItem( NULL, 1 ); |
|
|
|
m_pDefuser->SetItem( NULL, 1 ); |
|
m_pNightvision->SetItem( NULL, 1 ); |
|
|
|
m_pArmor->SetItem( NULL, 1 ); |
|
} |
|
|
|
//--------------------------------------------------------------------------------------------------------------
|
|
|