mirror of
https://github.com/shawns-valve/halflife.git
synced 2024-11-25 21:51:06 +00:00
593 lines
16 KiB
C++
593 lines
16 KiB
C++
|
//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. ===========
|
||
|
//
|
||
|
// The copyright to the contents herein is the property of Valve, L.L.C.
|
||
|
// The contents may be used and/or copied only with the written permission of
|
||
|
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
|
||
|
// the agreement/contract under which the contents have been supplied.
|
||
|
//
|
||
|
// Purpose: VGUI objects for Discwar
|
||
|
//
|
||
|
// $Workfile: $
|
||
|
// $Date: $
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// $Log: $
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================
|
||
|
|
||
|
#include "VGUI_Font.h"
|
||
|
|
||
|
#include "hud.h"
|
||
|
#include "cl_util.h"
|
||
|
#include "camera.h"
|
||
|
#include "kbutton.h"
|
||
|
#include "cvardef.h"
|
||
|
#include "usercmd.h"
|
||
|
#include "const.h"
|
||
|
#include "camera.h"
|
||
|
#include "in_defs.h"
|
||
|
#include "parsemsg.h"
|
||
|
#include "ammo.h"
|
||
|
#include "string.h"
|
||
|
#include "ammohistory.h"
|
||
|
|
||
|
#include "vgui_int.h"
|
||
|
#include "vgui_TeamFortressViewport.h"
|
||
|
#include "vgui_ServerBrowser.h"
|
||
|
#include "vgui_discobjects.h"
|
||
|
|
||
|
// Positions and Dimensions
|
||
|
#define ARENAWINDOW_SIZE_X (ScreenWidth)
|
||
|
#define ARENAWINDOW_SIZE_Y YRES(128)
|
||
|
#define ARENAWINDOW_X ((ScreenWidth - ARENAWINDOW_SIZE_X) / 2)
|
||
|
#define ARENAWINDOW_Y (ScreenHeight - ARENAWINDOW_SIZE_Y)
|
||
|
|
||
|
#define POWERUP_SIZE_X (ScreenWidth)
|
||
|
#define POWERUP_SIZE_Y YRES(32)
|
||
|
#define POWERUP_X ((ScreenWidth - POWERUP_SIZE_X) / 2)
|
||
|
#define POWERUP_Y (ScreenHeight - POWERUP_SIZE_Y)
|
||
|
|
||
|
#define REWARD_SIZE_X (ScreenWidth)
|
||
|
#define REWARD_SIZE_Y YRES(48)
|
||
|
#define REWARD_X ((ScreenWidth - POWERUP_SIZE_X) / 2)
|
||
|
#define REWARD_Y (ScreenHeight / 6)
|
||
|
|
||
|
extern WeaponsResource gWR;
|
||
|
int g_iCannotFire;
|
||
|
|
||
|
//===========================================================
|
||
|
// Disc ammo icon
|
||
|
CDiscPanel::CDiscPanel(int x,int y,int wide,int tall) : Label("", x,y,wide,tall)
|
||
|
{
|
||
|
setContentFitted(true);
|
||
|
|
||
|
// Standard discs
|
||
|
m_pDiscTGA_Red = LoadTGAForRes("discred");
|
||
|
m_pDiscTGA_RedGlow = LoadTGAForRes("discred2");
|
||
|
m_pDiscTGA_Blue = LoadTGAForRes("discblue");
|
||
|
m_pDiscTGA_BlueGlow = LoadTGAForRes("discblue2");
|
||
|
m_pDiscTGA_Grey = LoadTGAForRes("discgrey");
|
||
|
|
||
|
// Powerup discs
|
||
|
m_pDiscTGA_Fast = LoadTGAForRes("fast");
|
||
|
m_pDiscTGA_Freeze = LoadTGAForRes("freeze");
|
||
|
m_pDiscTGA_Hard = LoadTGAForRes("hard");
|
||
|
m_pDiscTGA_Triple = LoadTGAForRes("triple");
|
||
|
|
||
|
setImage( m_pDiscTGA_Red );
|
||
|
}
|
||
|
|
||
|
void CDiscPanel::Update( int iDiscNo, bool bGlow, int iPowerup )
|
||
|
{
|
||
|
int iDiscs = gWR.GetAmmo( 1 );
|
||
|
|
||
|
// Grey disc for missing discs
|
||
|
if ( iDiscs < iDiscNo+1 )
|
||
|
{
|
||
|
setImage( m_pDiscTGA_Grey );
|
||
|
}
|
||
|
// Powerups override team colored discs
|
||
|
else if ( iPowerup & POW_TRIPLE )
|
||
|
{
|
||
|
setImage( m_pDiscTGA_Triple );
|
||
|
}
|
||
|
else if ( iPowerup & POW_FAST )
|
||
|
{
|
||
|
setImage( m_pDiscTGA_Fast );
|
||
|
}
|
||
|
else if ( iPowerup & POW_FREEZE )
|
||
|
{
|
||
|
setImage( m_pDiscTGA_Freeze );
|
||
|
}
|
||
|
else if ( iPowerup & POW_HARD )
|
||
|
{
|
||
|
setImage( m_pDiscTGA_Hard );
|
||
|
}
|
||
|
else if (g_iTeamNumber == 1)
|
||
|
{
|
||
|
if ( gWR.GetAmmo( 1 ) == 3 )
|
||
|
setImage( m_pDiscTGA_RedGlow );
|
||
|
else
|
||
|
setImage( m_pDiscTGA_Red );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( gWR.GetAmmo( 1 ) == 3 )
|
||
|
setImage( m_pDiscTGA_BlueGlow );
|
||
|
else
|
||
|
setImage( m_pDiscTGA_Blue );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Arena window
|
||
|
CDiscArenaPanel::CDiscArenaPanel( int x, int y, int wide, int tall ) : CTransparentPanel(255, x,y,wide,tall)
|
||
|
{
|
||
|
m_iNumPlayers = 0;
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Message handler. Gets the Ids of the players in the round.
|
||
|
int CDiscArenaPanel::MsgFunc_GetPlayers(const char *pszName, int iSize, void *pbuf )
|
||
|
{
|
||
|
BEGIN_READ( pbuf, iSize );
|
||
|
|
||
|
m_iRoundNumber = READ_BYTE();
|
||
|
m_iSecondsToGo = READ_BYTE();
|
||
|
|
||
|
m_iNumPlayers = READ_BYTE();
|
||
|
if ( m_iNumPlayers > 0 && m_iNumPlayers <= MAX_PLAYERS )
|
||
|
{
|
||
|
for (int i = 0; i < m_iNumPlayers; i++)
|
||
|
m_iClients[i] = READ_SHORT();
|
||
|
}
|
||
|
|
||
|
RecalculateText();
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Message handler. Gets the Ids of the players in the round.
|
||
|
void CDiscArenaPanel::GetClientList( char *pszString )
|
||
|
{
|
||
|
strcpy( pszString, "" );
|
||
|
for (int i = 0; i < m_iNumPlayers; i++ )
|
||
|
{
|
||
|
if ( m_iClients[i] <= 0 || m_iClients[i] > MAX_PLAYERS )
|
||
|
{
|
||
|
gEngfuncs.Con_Printf( "Combatant %d out of range: %d\n", i, m_iClients[i] );
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if ( g_PlayerInfoList[ m_iClients[i] ].name && g_PlayerInfoList[ m_iClients[i] ].name[0] )
|
||
|
{
|
||
|
if ( i > 0 )
|
||
|
{
|
||
|
if ( i == (m_iNumPlayers - 1) )
|
||
|
{
|
||
|
strcat( pszString, CHudTextMessage::BufferedLocaliseTextString( "#And" ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
strcat( pszString, ", " );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
strcat( pszString, g_PlayerInfoList[ m_iClients[i] ].name );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Round start window
|
||
|
#define ROUND_Y YRES(0)
|
||
|
#define TEAMONE_Y (ROUND_Y + YRES(32))
|
||
|
#define VERSUS_Y (TEAMONE_Y + YRES(32))
|
||
|
#define TEAMTWO_Y (VERSUS_Y + YRES(32))
|
||
|
|
||
|
CDiscArena_RoundStart::CDiscArena_RoundStart( void ) : CDiscArenaPanel( ARENAWINDOW_X, ARENAWINDOW_Y, ARENAWINDOW_SIZE_X, ARENAWINDOW_SIZE_Y )
|
||
|
{
|
||
|
m_pRound = new Label( "Round 1", 0, ROUND_Y, getWide(), YRES(32) );
|
||
|
m_pRound->setParent( this );
|
||
|
m_pRound->setBgColor( 0, 0, 0, 128 );
|
||
|
m_pRound->setFgColor( 255,255,255, 0 );
|
||
|
m_pRound->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
m_pTeamOne = new Label( "Team One", 0, TEAMONE_Y, getWide(), YRES(32) );
|
||
|
m_pTeamOne->setParent( this );
|
||
|
m_pTeamOne->setBgColor( 128, 0, 0, 128 );
|
||
|
m_pTeamOne->setFgColor( 255,255,255, 0 );
|
||
|
m_pTeamOne->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
// Trim the trailing \n from the VS string
|
||
|
char sz[32];
|
||
|
strcpy( sz, CHudTextMessage::BufferedLocaliseTextString( "#Versus" ) );
|
||
|
sz[ strlen(sz) - 1 ] = '\0';
|
||
|
Label *pLabel = new Label( sz, 0, VERSUS_Y, getWide(), YRES(32) );
|
||
|
pLabel->setParent( this );
|
||
|
pLabel->setBgColor( 0, 0, 0, 255 );
|
||
|
pLabel->setFgColor( 255,255,255, 0 );
|
||
|
pLabel->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
m_pTeamTwo = new Label( "Team Two", 0, TEAMTWO_Y, getWide(), YRES(32) );
|
||
|
m_pTeamTwo->setParent( this );
|
||
|
m_pTeamTwo->setBgColor( 0, 0, 128, 128 );
|
||
|
m_pTeamTwo->setFgColor( 255,255,255, 0 );
|
||
|
m_pTeamTwo->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
setVisible(false);
|
||
|
}
|
||
|
|
||
|
// Recalculate the Text in the window
|
||
|
void CDiscArena_RoundStart::RecalculateText( void )
|
||
|
{
|
||
|
char sz[1024];
|
||
|
char szOpponents[1024];
|
||
|
char szTemp[256];
|
||
|
char szTemp2[256];
|
||
|
char szTemp3[256];
|
||
|
char *pszLocalized = NULL;
|
||
|
|
||
|
// Round started?
|
||
|
if (m_iSecondsToGo == 0)
|
||
|
{
|
||
|
setVisible(false);
|
||
|
g_iCannotFire = FALSE;
|
||
|
|
||
|
// Force spectator menu to update
|
||
|
if (gViewPort)
|
||
|
gViewPort->m_iUser1 = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
g_iCannotFire = TRUE;
|
||
|
|
||
|
// Round Number
|
||
|
if ( m_iSecondsToGo != 1 )
|
||
|
{
|
||
|
pszLocalized = "#Round_Start_n_Seconds";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pszLocalized = "#Round_Start_1_Second";
|
||
|
}
|
||
|
|
||
|
strncpy( szTemp3, CHudTextMessage::BufferedLocaliseTextString( pszLocalized ), sizeof( szTemp3 ) - 1 );
|
||
|
szTemp3[ sizeof( szTemp3 ) - 1 ] = '\0';
|
||
|
sprintf( sz, szTemp3, m_iRoundNumber, m_iSecondsToGo );
|
||
|
|
||
|
m_pRound->setText( sz );
|
||
|
|
||
|
// We may have just got an update for the time to go. If so, m_iNumPlayers will be 0.
|
||
|
if ( !m_iNumPlayers )
|
||
|
return;
|
||
|
|
||
|
if (gViewPort)
|
||
|
gViewPort->GetAllPlayersInfo();
|
||
|
|
||
|
// Find out what team this client's on (if a new battle's just starting)
|
||
|
strcpy( szOpponents, "" );
|
||
|
int iMyTeamNumber = 0;
|
||
|
if ( m_iRoundNumber == 1 )
|
||
|
{
|
||
|
for (int i = 0; i < m_iNumPlayers; i++ )
|
||
|
{
|
||
|
if ( g_PlayerInfoList[ m_iClients[i] ].thisplayer )
|
||
|
iMyTeamNumber = (i < (m_iNumPlayers / 2)) ? 1 : 2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Team 1
|
||
|
strcpy( sz, "" );
|
||
|
int i;
|
||
|
for (i = 0; i < (m_iNumPlayers / 2); i++ )
|
||
|
{
|
||
|
if ( g_PlayerInfoList[ m_iClients[i] ].name && g_PlayerInfoList[ m_iClients[i] ].name[0] )
|
||
|
strcat( sz, g_PlayerInfoList[ m_iClients[i] ].name );
|
||
|
|
||
|
if ( iMyTeamNumber == 2 )
|
||
|
{
|
||
|
strcpy( szTemp, CHudTextMessage::BufferedLocaliseTextString( "#Opponent" ) );
|
||
|
sprintf( szTemp2, szTemp, g_PlayerInfoList[ m_iClients[i] ].name, g_PlayerExtraInfo[ m_iClients[i] ].deaths, g_PlayerExtraInfo[ m_iClients[i] ].frags );
|
||
|
strcat( szOpponents, szTemp2 );
|
||
|
}
|
||
|
}
|
||
|
m_pTeamOne->setText( sz );
|
||
|
|
||
|
// Team 2
|
||
|
strcpy( sz, "" );
|
||
|
for ( ; i < m_iNumPlayers; i++ )
|
||
|
{
|
||
|
if ( g_PlayerInfoList[ m_iClients[i] ].name && g_PlayerInfoList[ m_iClients[i] ].name[0] )
|
||
|
strcat( sz, g_PlayerInfoList[ m_iClients[i] ].name );
|
||
|
|
||
|
if ( iMyTeamNumber == 1 )
|
||
|
{
|
||
|
strcpy( szTemp, CHudTextMessage::BufferedLocaliseTextString( "#Opponent" ) );
|
||
|
sprintf( szTemp2, szTemp, g_PlayerInfoList[ m_iClients[i] ].name, g_PlayerExtraInfo[ m_iClients[i] ].deaths, g_PlayerExtraInfo[ m_iClients[i] ].frags );
|
||
|
strcat( szOpponents, szTemp2 );
|
||
|
}
|
||
|
}
|
||
|
m_pTeamTwo->setText( sz );
|
||
|
|
||
|
// Bring up the Opponent details
|
||
|
if (gViewPort)
|
||
|
gViewPort->m_pDiscRewardWindow->SetMessage( szOpponents );
|
||
|
|
||
|
// Become visible
|
||
|
setVisible(true);
|
||
|
|
||
|
// Hide the other windows if it's up
|
||
|
if (gViewPort)
|
||
|
{
|
||
|
gViewPort->m_pSpectatorMenu->setVisible( false );
|
||
|
gViewPort->m_pDiscPowerupWindow->setVisible( false );
|
||
|
gViewPort->m_pDiscEndRound->setVisible( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Round end window
|
||
|
CDiscArena_RoundEnd::CDiscArena_RoundEnd( void ) : CDiscArenaPanel( ARENAWINDOW_X, ARENAWINDOW_Y, ARENAWINDOW_SIZE_X, ARENAWINDOW_SIZE_Y )
|
||
|
{
|
||
|
m_pRound = new Label( "Round 1 Won By", 0, ROUND_Y, getWide(), YRES(32) );
|
||
|
m_pRound->setParent( this );
|
||
|
m_pRound->setBgColor( 0, 0, 0, 128 );
|
||
|
m_pRound->setFgColor( 255,255,255, 0 );
|
||
|
m_pRound->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
m_pWinners = new Label( "Winners", 0, TEAMONE_Y, getWide(), YRES(32) );
|
||
|
m_pWinners->setParent( this );
|
||
|
m_pWinners->setBgColor( 128, 0, 0, 128 );
|
||
|
m_pWinners->setFgColor( 255,255,255, 0 );
|
||
|
m_pWinners->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
m_pWinningTeam = new Label( "Winners", 0, TEAMTWO_Y, getWide(), YRES(32) );
|
||
|
m_pWinningTeam->setParent( this );
|
||
|
m_pWinningTeam->setBgColor( 128, 0, 0, 128 );
|
||
|
m_pWinningTeam->setFgColor( 255,255,255, 0 );
|
||
|
m_pWinningTeam->setContentAlignment( vgui::Label::a_center );
|
||
|
|
||
|
setVisible(false);
|
||
|
}
|
||
|
|
||
|
// Recalculate the Text in the window
|
||
|
void CDiscArena_RoundEnd::RecalculateText( void )
|
||
|
{
|
||
|
char sz[1024];
|
||
|
char szTemp1[256];
|
||
|
char szTemp2[256];
|
||
|
|
||
|
// Sends down a 0 for time when this should be removed
|
||
|
if (m_iSecondsToGo == 0)
|
||
|
{
|
||
|
setVisible(false);
|
||
|
g_iCannotFire = FALSE;
|
||
|
|
||
|
// Force spectator menu to update
|
||
|
if (gViewPort)
|
||
|
gViewPort->m_iUser1 = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
g_iCannotFire = TRUE;
|
||
|
|
||
|
// Round Number
|
||
|
strncpy( szTemp1, CHudTextMessage::BufferedLocaliseTextString( "#Round_Won" ), sizeof( szTemp1 ) - 1 );
|
||
|
szTemp1[ sizeof( szTemp1 ) - 1 ] = '\0';
|
||
|
sprintf( sz, szTemp1, m_iRoundNumber );
|
||
|
|
||
|
m_pRound->setText( sz );
|
||
|
|
||
|
if (gViewPort)
|
||
|
gViewPort->GetAllPlayersInfo();
|
||
|
|
||
|
// Winners
|
||
|
GetClientList( sz );
|
||
|
m_pWinners->setText( sz );
|
||
|
|
||
|
// Scores
|
||
|
m_iNumPlayers = READ_BYTE();
|
||
|
if ( m_iNumPlayers >= 0 && m_iNumPlayers <= MAX_PLAYERS )
|
||
|
{
|
||
|
for (int i = 0; i < m_iNumPlayers; i++)
|
||
|
m_iClients[i] = READ_SHORT();
|
||
|
|
||
|
int iWinningScore = READ_BYTE();
|
||
|
int iLosingScore = READ_BYTE();
|
||
|
int iBattleOver = READ_BYTE();
|
||
|
|
||
|
// Battle over?
|
||
|
if ( iBattleOver )
|
||
|
{
|
||
|
GetClientList( sz );
|
||
|
|
||
|
strncpy( szTemp2, CHudTextMessage::BufferedLocaliseTextString( "#Round_Won_Scores" ), sizeof( szTemp2 ) - 1 );
|
||
|
szTemp2[ sizeof( szTemp2 ) - 1 ] = '\0';
|
||
|
|
||
|
_snprintf( sz, sizeof( sz ) - 1, szTemp2, sz, iWinningScore, iLosingScore );
|
||
|
}
|
||
|
// Tied?
|
||
|
else if ( iWinningScore == iLosingScore )
|
||
|
{
|
||
|
strncpy( szTemp2, CHudTextMessage::BufferedLocaliseTextString( "#Round_Tied" ), sizeof( szTemp2 ) - 1 );
|
||
|
szTemp2[ sizeof( szTemp2 ) - 1 ] = '\0';
|
||
|
|
||
|
_snprintf( sz, sizeof( sz ) - 1, szTemp2, iWinningScore );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char *pszTemp = NULL;
|
||
|
|
||
|
GetClientList( sz );
|
||
|
|
||
|
if ( m_iNumPlayers == 1 )
|
||
|
{
|
||
|
pszTemp = "#Round_Leads";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pszTemp = "#Round_Lead";
|
||
|
}
|
||
|
|
||
|
strncpy( szTemp2, CHudTextMessage::BufferedLocaliseTextString( pszTemp ), sizeof( szTemp2 ) - 1 );
|
||
|
szTemp2[ sizeof( szTemp2 ) - 1 ] = '\0';
|
||
|
|
||
|
_snprintf( sz, sizeof( sz ) - 1, szTemp2, sz, iWinningScore, iLosingScore );
|
||
|
}
|
||
|
|
||
|
sz[ sizeof( sz ) - 1 ] = '\0';
|
||
|
m_pWinningTeam->setText( sz );
|
||
|
}
|
||
|
|
||
|
// Become visible
|
||
|
setVisible(true);
|
||
|
|
||
|
// Hide the other windows if it's up
|
||
|
if (gViewPort)
|
||
|
{
|
||
|
gViewPort->m_pSpectatorMenu->setVisible( false );
|
||
|
gViewPort->m_pDiscPowerupWindow->setVisible( false );
|
||
|
gViewPort->m_pDiscStartRound->setVisible( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Powerup name window
|
||
|
CDiscPowerups::CDiscPowerups() : CTransparentPanel( 255, POWERUP_X, POWERUP_Y, POWERUP_SIZE_X, POWERUP_SIZE_Y )
|
||
|
{
|
||
|
m_pLabel = new Label( "Powerups Go Here", 0, ROUND_Y, getWide(), YRES(32) );
|
||
|
m_pLabel->setParent( this );
|
||
|
m_pLabel->setBgColor( 0, 0, 0, 255 );
|
||
|
m_pLabel->setFgColor( 255,255,255, 0 );
|
||
|
m_pLabel->setContentAlignment( vgui::Label::a_center );
|
||
|
setVisible(false);
|
||
|
};
|
||
|
|
||
|
void CDiscPowerups::RecalculateText( int iPowerup )
|
||
|
{
|
||
|
char sz[512];
|
||
|
bool bAnd = false;
|
||
|
|
||
|
// Don't appear if a round message is up
|
||
|
if (gViewPort)
|
||
|
{
|
||
|
if ( gViewPort->m_pDiscStartRound->isVisible() || gViewPort->m_pDiscEndRound->isVisible() )
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
sprintf(sz, "");
|
||
|
|
||
|
if ( iPowerup & POW_TRIPLE )
|
||
|
{
|
||
|
strcat(sz, CHudTextMessage::BufferedLocaliseTextString("#Triple") );
|
||
|
bAnd = true;
|
||
|
}
|
||
|
|
||
|
if ( iPowerup & POW_FAST )
|
||
|
{
|
||
|
if (bAnd)
|
||
|
strcat(sz, ", ");
|
||
|
strcat(sz, CHudTextMessage::BufferedLocaliseTextString("#Fast") );
|
||
|
bAnd = true;
|
||
|
}
|
||
|
|
||
|
if ( iPowerup & POW_FREEZE )
|
||
|
{
|
||
|
if (bAnd)
|
||
|
strcat(sz, ", ");
|
||
|
strcat(sz, CHudTextMessage::BufferedLocaliseTextString("#Freeze") );
|
||
|
bAnd = true;
|
||
|
}
|
||
|
|
||
|
if ( iPowerup & POW_HARD )
|
||
|
{
|
||
|
if (bAnd)
|
||
|
strcat(sz, ", ");
|
||
|
strcat(sz, CHudTextMessage::BufferedLocaliseTextString("#Hard") );
|
||
|
}
|
||
|
|
||
|
m_pLabel->setText( sz );
|
||
|
|
||
|
// Become visible
|
||
|
if (sz && sz[0])
|
||
|
setVisible(true);
|
||
|
else
|
||
|
setVisible(false);
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// Reward menu
|
||
|
CDiscRewards::CDiscRewards() : CTransparentPanel( 255, REWARD_X, REWARD_Y, REWARD_SIZE_X, REWARD_SIZE_Y )
|
||
|
{
|
||
|
m_pReward = new Label( "Well Done!", 0, ROUND_Y, getWide(), (REWARD_SIZE_Y / 2) );
|
||
|
m_pReward->setParent( this );
|
||
|
m_pReward->setBgColor( 0, 0, 0, 255 );
|
||
|
m_pReward->setFgColor( 255,255,255, 0 );
|
||
|
m_pReward->setContentAlignment( vgui::Label::a_center );
|
||
|
setVisible(false);
|
||
|
|
||
|
m_pTeleBonus = new Label( CHudTextMessage::BufferedLocaliseTextString( "#Hit_Tele" ), 0, (REWARD_SIZE_Y / 2), getWide(), (REWARD_SIZE_Y / 2) );
|
||
|
m_pTeleBonus->setParent( this );
|
||
|
m_pTeleBonus->setBgColor( 0, 0, 0, 255 );
|
||
|
m_pTeleBonus->setFgColor( 255,255,255, 0 );
|
||
|
m_pTeleBonus->setContentAlignment( vgui::Label::a_center );
|
||
|
};
|
||
|
|
||
|
void CDiscRewards::RecalculateText( int iReward )
|
||
|
{
|
||
|
char sz[512];
|
||
|
|
||
|
// Don't appear if a round message is up
|
||
|
if (gViewPort)
|
||
|
{
|
||
|
if ( gViewPort->m_pDiscStartRound->isVisible() || gViewPort->m_pDiscEndRound->isVisible() )
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( !iReward )
|
||
|
{
|
||
|
setVisible( false );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Rewards
|
||
|
if ( iReward & REWARD_BOUNCE_NONE )
|
||
|
sprintf( sz, CHudTextMessage::BufferedLocaliseTextString( "#Hit_Direct" ) );
|
||
|
if ( iReward & REWARD_BOUNCE_ONE )
|
||
|
sprintf( sz, CHudTextMessage::BufferedLocaliseTextString( "#Hit_One" ) );
|
||
|
if ( iReward & REWARD_BOUNCE_TWO )
|
||
|
sprintf( sz, CHudTextMessage::BufferedLocaliseTextString( "#Hit_Two" ) );
|
||
|
if ( iReward & REWARD_BOUNCE_THREE )
|
||
|
sprintf( sz, CHudTextMessage::BufferedLocaliseTextString( "#Hit_Three" ) );
|
||
|
if ( iReward & REWARD_DECAPITATE )
|
||
|
sprintf( sz, CHudTextMessage::BufferedLocaliseTextString( "#Hit_Decap" ) );
|
||
|
if ( iReward & REWARD_DOUBLEKILL )
|
||
|
sprintf( sz, CHudTextMessage::BufferedLocaliseTextString( "#Hit_Multiple" ) );
|
||
|
|
||
|
if ( iReward & REWARD_TELEPORT )
|
||
|
m_pTeleBonus->setVisible( true );
|
||
|
else
|
||
|
m_pTeleBonus->setVisible( false );
|
||
|
|
||
|
m_pReward->setText( sz );
|
||
|
setVisible( true );
|
||
|
}
|
||
|
|
||
|
void CDiscRewards::SetMessage( char *pMessage )
|
||
|
{
|
||
|
if (!pMessage)
|
||
|
{
|
||
|
setVisible(false);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_pTeleBonus->setVisible( false );
|
||
|
m_pReward->setText( pMessage );
|
||
|
setVisible( true );
|
||
|
|
||
|
if (gViewPort)
|
||
|
gViewPort->m_flRewardOpenTime = gHUD.m_flTime + 5.0;
|
||
|
}
|