mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-29 09:33:00 +00:00
448 lines
12 KiB
C++
448 lines
12 KiB
C++
//========= 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 );
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------------------------------
|