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.
1574 lines
39 KiB
1574 lines
39 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "hudelement.h" |
|
#include "hud_numericdisplay.h" |
|
#include <vgui_controls/Panel.h> |
|
#include "hud.h" |
|
#include "hud_suitpower.h" |
|
#include "hud_macros.h" |
|
#include "iclientmode.h" |
|
#include <vgui_controls/AnimationController.h> |
|
#include <vgui/ISurface.h> |
|
#include <vgui/ILocalize.h> |
|
#include "KeyValues.h" |
|
#include "filesystem.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
struct portalcreditname_t |
|
{ |
|
char szCreditName[256]; |
|
char szFontName[256]; |
|
wchar_t szLyricLine[256]; |
|
float flYPos; |
|
float flXPos; |
|
bool bActive; |
|
float flTime; |
|
float flTimeAdd; |
|
float flTimeStart; |
|
float flTimeEnd; |
|
float flTimeInit; |
|
int iAsciiIndex; |
|
bool bReset; |
|
int iXOffset; |
|
int iSlot; |
|
}; |
|
|
|
#define CREDITS_FILE "scripts/credits.txt" |
|
#define CREDITS_FILE_PORTAL "scripts/credits.txt" |
|
|
|
enum |
|
{ |
|
LOGO_FADEIN = 0, |
|
LOGO_FADEHOLD, |
|
LOGO_FADEOUT, |
|
LOGO_FADEOFF, |
|
}; |
|
|
|
#define CREDITS_LOGO 1 |
|
#define CREDITS_INTRO 2 |
|
#define CREDITS_OUTRO 3 |
|
#define CREDITS_OUTRO_PORTAL 4 |
|
|
|
bool g_bPortalRollingCredits = false; |
|
|
|
int g_iPortalCreditsPixelHeight = 0; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Shows the flashlight icon |
|
//----------------------------------------------------------------------------- |
|
class CHudPortalCredits : public CHudElement, public vgui::Panel |
|
{ |
|
DECLARE_CLASS_SIMPLE( CHudPortalCredits, vgui::Panel ); |
|
|
|
public: |
|
CHudPortalCredits( const char *pElementName ); |
|
virtual void Init( void ); |
|
virtual void LevelShutdown( void ); |
|
|
|
int GetStringPixelWidth ( wchar_t *pString, vgui::HFont hFont ); |
|
int GetPixelWidth( char *pString, vgui::HFont hFont ); |
|
|
|
void MsgFunc_CreditsPortalMsg( bf_read &msg ); |
|
void MsgFunc_LogoTimeMsg( bf_read &msg ); |
|
|
|
virtual bool ShouldDraw( void ) |
|
{ |
|
g_bPortalRollingCredits = IsActive(); |
|
|
|
if ( g_bPortalRollingCredits && m_iCreditsType == CREDITS_INTRO ) |
|
g_bPortalRollingCredits = false; |
|
|
|
return IsActive(); |
|
} |
|
|
|
protected: |
|
virtual void Paint(); |
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); |
|
|
|
private: |
|
|
|
void Clear(); |
|
|
|
void ReadNames( KeyValues *pKeyValue ); |
|
void ReadLyrics( KeyValues *pKeyValue ); |
|
void ReadAscii( KeyValues *pKeyValue ); |
|
void ReadParams( KeyValues *pKeyValue ); |
|
void PrepareCredits( const char *pKeyName ); |
|
void DrawOutroCreditsName( void ); |
|
void DrawPortalOutroCreditsName( void ); |
|
void DrawPortalOutroCreditsLyrics( void ); |
|
void DrawIntroCreditsName( void ); |
|
void DrawPortalAsciiArt( void ); |
|
void DrawLogo( void ); |
|
|
|
void PrepareLogo( float flTime ); |
|
void PrepareOutroCredits( void ); |
|
void PreparePortalOutroCredits( void ); |
|
void PrepareIntroCredits( void ); |
|
|
|
float FadeBlend( float fadein, float fadeout, float hold, float localTime ); |
|
|
|
CPanelAnimationVar( vgui::HFont, m_hTextFont, "TextFont", "Default" ); |
|
CPanelAnimationVar( Color, m_TextColor, "TextColor", "FgColor" ); |
|
|
|
CUtlVector<portalcreditname_t> m_CreditsList; |
|
|
|
CUtlVector<portalcreditname_t> m_LyricsList; |
|
|
|
CUtlVector<portalcreditname_t> m_AsciiList; |
|
|
|
char m_szCreditPrint[256]; |
|
char m_szBorderH[512]; |
|
|
|
float m_flScrollTime; |
|
float m_flSeparation; |
|
float m_flFadeTime; |
|
float m_flCursorBlinkTime; |
|
bool m_bLastOneInPlace; |
|
int m_Alpha; |
|
char m_szAsciiArtFont[256]; |
|
|
|
int m_iCreditsType; |
|
int m_iLogoState; |
|
int m_iCurrentAsciiArt; |
|
|
|
int m_iCurrentLowY; |
|
int m_iYOffset; |
|
int m_iYOffsetNames; |
|
int m_iYDrawOffset; |
|
int m_iXOffset; |
|
int m_iXOffsetNames; |
|
int m_iLongestName; |
|
|
|
float m_flFadeInTime; |
|
float m_flFadeHoldTime; |
|
float m_flFadeOutTime; |
|
float m_flNextStartTime; |
|
float m_flPauseBetweenWaves; |
|
float m_flLastPaintTime; |
|
float m_flLastBlinkTime; |
|
float m_flCurrentDelayTime; |
|
float m_flNameCharTime; |
|
float m_flScrollCreditsStart; |
|
float m_flSongStartTime; |
|
|
|
|
|
//Screen adjustment properties |
|
int m_iScreenXOffset; |
|
int m_iScreenYOffset; |
|
int m_iScreenWidthAdjustment; |
|
int m_iScreenHeightAdjustment; |
|
|
|
//Ascii Art positioning |
|
int m_iAASeparation; |
|
int m_iAAScreenXOffset; |
|
int m_iAAScreenYOffset; |
|
|
|
|
|
float m_flLogoTimeMod; |
|
float m_flLogoTime; |
|
float m_flLogoDesiredLength; |
|
|
|
float m_flX; |
|
float m_flY; |
|
|
|
bool m_bStartSong; |
|
float m_flLyricsStartTime; |
|
|
|
Color m_cColor; |
|
}; |
|
|
|
void CHudPortalCredits::PrepareCredits( const char *pKeyName ) |
|
{ |
|
Clear(); |
|
|
|
KeyValues *pKV= new KeyValues( "CreditsFile" ); |
|
|
|
if (m_iCreditsType == CREDITS_OUTRO_PORTAL) |
|
{ |
|
if ( !pKV->LoadFromFile( filesystem, CREDITS_FILE_PORTAL, "MOD" ) ) |
|
{ |
|
pKV->deleteThis(); |
|
|
|
Assert( !"env_portal_credits couldn't be initialized!" ); |
|
return; |
|
} |
|
} |
|
else |
|
{ |
|
if ( !pKV->LoadFromFile( filesystem, CREDITS_FILE, "MOD" ) ) |
|
{ |
|
pKV->deleteThis(); |
|
|
|
Assert( !"env_portal_credits couldn't be initialized!" ); |
|
return; |
|
} |
|
} |
|
|
|
KeyValues *pKVSubkey = pKV->FindKey( pKeyName ); |
|
|
|
ReadNames( pKVSubkey ); |
|
|
|
pKVSubkey = pKV->FindKey( "CreditsParams" ); |
|
|
|
ReadParams( pKVSubkey ); |
|
|
|
pKVSubkey = pKV->FindKey( "OutroSongLyrics" ); |
|
|
|
ReadLyrics( pKVSubkey ); |
|
|
|
pKVSubkey = pKV->FindKey( "OutroAsciiArt" ); |
|
|
|
ReadAscii( pKVSubkey ); |
|
|
|
pKV->deleteThis(); |
|
} |
|
|
|
using namespace vgui; |
|
|
|
DECLARE_HUDELEMENT( CHudPortalCredits ); |
|
DECLARE_HUD_MESSAGE( CHudPortalCredits, CreditsPortalMsg ); |
|
DECLARE_HUD_MESSAGE( CHudPortalCredits, LogoTimeMsg ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CHudPortalCredits::CHudPortalCredits( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudCredits" ) |
|
{ |
|
vgui::Panel *pParent = g_pClientMode->GetViewport(); |
|
SetParent( pParent ); |
|
} |
|
|
|
void CHudPortalCredits::LevelShutdown() |
|
{ |
|
Clear(); |
|
} |
|
|
|
void CHudPortalCredits::Clear( void ) |
|
{ |
|
SetActive( false ); |
|
m_CreditsList.RemoveAll(); |
|
m_LyricsList.RemoveAll(); |
|
m_bLastOneInPlace = false; |
|
m_Alpha = m_TextColor[3]; |
|
m_iLogoState = LOGO_FADEOFF; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CHudPortalCredits::Init() |
|
{ |
|
HOOK_HUD_MESSAGE( CHudPortalCredits, CreditsPortalMsg ); |
|
HOOK_HUD_MESSAGE( CHudPortalCredits, LogoTimeMsg ); |
|
SetActive( false ); |
|
} |
|
|
|
void CHudPortalCredits::ReadNames( KeyValues *pKeyValue ) |
|
{ |
|
if ( pKeyValue == NULL ) |
|
{ |
|
Assert( !"CHudPortalCredits couldn't be initialized!" ); |
|
return; |
|
} |
|
|
|
// Now try and parse out each act busy anim |
|
KeyValues *pKVNames = pKeyValue->GetFirstSubKey(); |
|
|
|
char *cTmp; |
|
|
|
while ( pKVNames ) |
|
{ |
|
portalcreditname_t Credits; |
|
V_strcpy_safe( Credits.szCreditName, pKVNames->GetName() ); |
|
V_strcpy_safe( Credits.szFontName, pKeyValue->GetString( Credits.szCreditName, "Default" ) ); |
|
|
|
Credits.flTimeInit = 0.00; |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"["); |
|
if (!(cTmp == NULL)) { |
|
Credits.flTimeInit = Q_atof(cTmp+1); |
|
} |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"]"); |
|
if (!(cTmp == NULL)) { |
|
Q_strcpy(Credits.szCreditName,cTmp+1); |
|
} |
|
|
|
m_CreditsList.AddToTail( Credits ); |
|
pKVNames = pKVNames->GetNextKey(); |
|
} |
|
} |
|
|
|
void CHudPortalCredits::ReadLyrics( KeyValues *pKeyValue ) |
|
{ |
|
if ( pKeyValue == NULL ) |
|
{ |
|
Assert( !"CHudPortalCredits couldn't be initialized!" ); |
|
return; |
|
} |
|
|
|
KeyValues *pKVNames = pKeyValue->GetFirstSubKey(); |
|
|
|
char *cTmp; |
|
|
|
int iHeight = 0; |
|
int iXOffsetTemp = 0; |
|
bool bNextOnSameLine = false; |
|
bool bNoY = false; |
|
|
|
char tmpstr[255] = ""; |
|
|
|
float flTotalTime = 0.00; |
|
|
|
while ( pKVNames ) |
|
{ |
|
bNoY = false; |
|
portalcreditname_t Credits; |
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( "CreditsOutroText", true ); |
|
V_strcpy_safe( Credits.szCreditName, pKVNames->GetName()); |
|
V_strcpy_safe( Credits.szFontName, pKeyValue->GetString( Credits.szCreditName, "Default" ) ); |
|
|
|
Credits.flTimeInit = 0.00; |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"["); |
|
if (!(cTmp == NULL)) { |
|
Credits.flTimeInit = Q_atof(cTmp+1); |
|
} |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"]"); |
|
if (!(cTmp == NULL)) { |
|
Q_strcpy(Credits.szCreditName,cTmp+1); |
|
} |
|
|
|
Credits.iAsciiIndex = 0; |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"<<<"); |
|
if (!(cTmp == NULL)) { |
|
Credits.iAsciiIndex = Q_atoi(cTmp+3); |
|
} |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,">>>"); |
|
if (!(cTmp == NULL)) { |
|
Q_strcpy(Credits.szCreditName,cTmp+3); |
|
} |
|
|
|
if (Q_strcmp("&",Credits.szCreditName)==0) //clear screen code |
|
{ |
|
iHeight = 0; |
|
Credits.bReset = true; |
|
Q_strcpy(Credits.szCreditName," "); |
|
} |
|
else Credits.bReset = false; |
|
|
|
Credits.flYPos = iHeight; |
|
Credits.bActive = false; |
|
|
|
if (bNextOnSameLine) |
|
{ |
|
Credits.iXOffset=iXOffsetTemp; |
|
//GetPixelWidth( tmpstr, m_hTFont ) |
|
bNextOnSameLine = false; |
|
} |
|
else |
|
{ |
|
iXOffsetTemp=0; |
|
Credits.iXOffset = 0; |
|
} |
|
|
|
if (Credits.szCreditName[0] == '*') |
|
{ |
|
bNextOnSameLine = true; |
|
Q_strcpy(tmpstr,&Credits.szCreditName[1]); |
|
Q_strcpy(Credits.szCreditName,tmpstr); |
|
bNoY = true; |
|
} |
|
|
|
if ((!(Q_strcmp(" ",Credits.szCreditName)==0)) && !bNoY) |
|
{ |
|
iHeight += surface()->GetFontTall ( m_hTFont ) + m_flSeparation; |
|
if (Q_strcmp("^",Credits.szCreditName)==0) |
|
{ |
|
Q_strcpy(Credits.szCreditName," "); |
|
} |
|
} |
|
|
|
if ( Credits.szCreditName[0] == '#' ) |
|
{ |
|
g_pVGuiLocalize->ConstructString( Credits.szLyricLine, sizeof(Credits.szLyricLine), g_pVGuiLocalize->Find(Credits.szCreditName), 0 ); |
|
if (bNextOnSameLine) |
|
{ |
|
iXOffsetTemp+=GetStringPixelWidth( Credits.szLyricLine, m_hTFont ); |
|
} |
|
} |
|
else |
|
{ |
|
g_pVGuiLocalize->ConvertANSIToUnicode( Credits.szCreditName, Credits.szLyricLine, sizeof( Credits.szLyricLine ) ); |
|
if (bNextOnSameLine) |
|
{ |
|
iXOffsetTemp+=GetStringPixelWidth( Credits.szLyricLine, m_hTFont ); |
|
} |
|
} |
|
|
|
Credits.flTimeStart = flTotalTime; |
|
flTotalTime+=Credits.flTimeInit; |
|
Credits.flTimeEnd = flTotalTime; |
|
|
|
|
|
m_LyricsList.AddToTail( Credits ); |
|
pKVNames = pKVNames->GetNextKey(); |
|
} |
|
|
|
g_iPortalCreditsPixelHeight = iHeight; |
|
|
|
} |
|
|
|
|
|
void CHudPortalCredits::ReadAscii( KeyValues *pKeyValue ) |
|
{ |
|
if ( pKeyValue == NULL ) |
|
{ |
|
Assert( !"CHudPortalCredits couldn't be initialized!" ); |
|
return; |
|
} |
|
|
|
KeyValues *pKVNames = pKeyValue->GetFirstSubKey(); |
|
|
|
char *cTmp; |
|
|
|
while ( pKVNames ) |
|
{ |
|
portalcreditname_t Credits; |
|
//Q_strcpy( Credits.szCreditName, pKVNames->GetName()); |
|
//Q_strcpy( Credits.szFontName, pKeyValue->GetString( Credits.szCreditName, "Default" ) ); |
|
|
|
V_strcpy_safe( Credits.szFontName, pKVNames->GetName() ); |
|
V_strcpy_safe( Credits.szCreditName, pKeyValue->GetString( Credits.szFontName, "Default" ) ); |
|
|
|
Credits.flTimeInit = 0.00; |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"["); |
|
if (!(cTmp == NULL)) { |
|
Credits.flTimeInit = Q_atof(cTmp+1); |
|
} |
|
|
|
cTmp=Q_strstr(Credits.szCreditName,"]"); |
|
if (!(cTmp == NULL)) { |
|
Q_strcpy(Credits.szCreditName,cTmp+1); |
|
} |
|
|
|
m_AsciiList.AddToTail( Credits ); |
|
pKVNames = pKVNames->GetNextKey(); |
|
} |
|
} |
|
|
|
void CHudPortalCredits::ReadParams( KeyValues *pKeyValue ) |
|
{ |
|
if ( pKeyValue == NULL ) |
|
{ |
|
Assert( !"CHudPortalCredits couldn't be initialized!" ); |
|
return; |
|
} |
|
|
|
m_flScrollTime = pKeyValue->GetFloat( "scrolltime", 57 ); |
|
m_flSeparation = pKeyValue->GetFloat( "separation", 5 ); |
|
|
|
m_flFadeInTime = pKeyValue->GetFloat( "fadeintime", 1 ); |
|
m_flFadeHoldTime = pKeyValue->GetFloat( "fadeholdtime", 3 ); |
|
m_flFadeOutTime = pKeyValue->GetFloat( "fadeouttime", 2 ); |
|
m_flNextStartTime = pKeyValue->GetFloat( "nextfadetime", 2 ); |
|
m_flPauseBetweenWaves = pKeyValue->GetFloat( "pausebetweenwaves", 2 ); |
|
|
|
m_flCursorBlinkTime = pKeyValue->GetFloat( "cursorblinktime", 0.3 ); |
|
|
|
m_flLogoTimeMod = pKeyValue->GetFloat( "logotime", 2 ); |
|
|
|
m_flScrollCreditsStart = pKeyValue->GetFloat( "scrollcreditsstart", 6 ); |
|
m_flSongStartTime = pKeyValue->GetFloat( "songstarttime", 6.85 ); |
|
|
|
m_iScreenXOffset = pKeyValue->GetInt( "screenxoffset", 0 ); |
|
m_iScreenYOffset = pKeyValue->GetInt( "screenyoffset", 0 ); |
|
m_iScreenWidthAdjustment = pKeyValue->GetInt( "screenwidthadjustment", 0 ); |
|
m_iScreenHeightAdjustment = pKeyValue->GetInt( "screenheightadjustment", 0 ); |
|
|
|
V_strcpy_safe( m_szAsciiArtFont, pKeyValue->GetString( "asciiartfont", "Default" ) ); |
|
|
|
m_iAAScreenXOffset = pKeyValue->GetInt( "aascreenxoffset", 0 ); |
|
m_iAAScreenYOffset = pKeyValue->GetInt( "aascreenyoffset", 0 ); |
|
m_iAASeparation = pKeyValue->GetInt( "aaseparation", 0 ); |
|
|
|
|
|
|
|
m_flX = pKeyValue->GetFloat( "posx", 2 ); |
|
m_flY = pKeyValue->GetFloat( "posy", 2 ); |
|
|
|
m_cColor = pKeyValue->GetColor( "color" ); |
|
} |
|
|
|
int CHudPortalCredits::GetStringPixelWidth( wchar_t *pString, vgui::HFont hFont ) |
|
{ |
|
int iLength = 0; |
|
|
|
for ( wchar_t *wch = pString; *wch != 0; wch++ ) |
|
{ |
|
iLength += surface()->GetCharacterWidth( hFont, *wch ); |
|
} |
|
|
|
return iLength; |
|
} |
|
|
|
int CHudPortalCredits::GetPixelWidth( char *pString, vgui::HFont hFont ) |
|
{ |
|
int iLength = 0; |
|
int iStrLen = Q_strlen(pString); |
|
|
|
for ( int i=0; i<iStrLen; i++ ) |
|
{ |
|
iLength += surface()->GetCharacterWidth( hFont, pString[i] ); |
|
} |
|
|
|
return iLength; |
|
} |
|
|
|
|
|
void CHudPortalCredits::DrawOutroCreditsName( void ) |
|
{ |
|
if ( m_CreditsList.Count() == 0 ) |
|
return; |
|
|
|
// fill the screen |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
SetSize( iWidth, iTall ); |
|
|
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
|
|
int iFontTall = surface()->GetFontTall ( m_hTFont ); |
|
|
|
if ( pCredit->flYPos < -iFontTall || pCredit->flYPos > iTall ) |
|
{ |
|
pCredit->bActive = false; |
|
} |
|
else |
|
{ |
|
pCredit->bActive = true; |
|
} |
|
|
|
Color cColor = m_TextColor; |
|
|
|
//HACKHACK |
|
//Last one stays on screen and fades out |
|
if ( i == m_CreditsList.Count()-1 ) |
|
{ |
|
if ( m_bLastOneInPlace == false ) |
|
{ |
|
pCredit->flYPos -= gpGlobals->frametime * ( (float)g_iPortalCreditsPixelHeight / m_flScrollTime ); |
|
|
|
if ( (int)pCredit->flYPos + ( iFontTall / 2 ) <= iTall / 2 ) |
|
{ |
|
m_bLastOneInPlace = true; |
|
m_flFadeTime = gpGlobals->curtime + 10.0f; |
|
} |
|
} |
|
else |
|
{ |
|
if ( m_flFadeTime <= gpGlobals->curtime ) |
|
{ |
|
if ( m_Alpha > 0 ) |
|
{ |
|
m_Alpha -= gpGlobals->frametime * ( m_flScrollTime * 2 ); |
|
|
|
if ( m_Alpha <= 0 ) |
|
{ |
|
pCredit->bActive = false; |
|
engine->ClientCmd( "creditsdone" ); |
|
} |
|
} |
|
} |
|
|
|
cColor[3] = MAX( 0, m_Alpha ); |
|
} |
|
} |
|
else |
|
{ |
|
pCredit->flYPos -= gpGlobals->frametime * ( (float)g_iPortalCreditsPixelHeight / m_flScrollTime ); |
|
|
|
} |
|
|
|
if ( pCredit->bActive == false ) |
|
continue; |
|
|
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( cColor[0], cColor[1], cColor[2], cColor[3] ); |
|
|
|
wchar_t unicode[256]; |
|
|
|
if ( pCredit->szCreditName[0] == '#' ) |
|
{ |
|
g_pVGuiLocalize->ConstructString( unicode, sizeof(unicode), g_pVGuiLocalize->Find(pCredit->szCreditName), 0 ); |
|
} |
|
else |
|
{ |
|
g_pVGuiLocalize->ConvertANSIToUnicode( pCredit->szCreditName, unicode, sizeof( unicode ) ); |
|
} |
|
|
|
int iStringWidth = GetStringPixelWidth( unicode, m_hTFont ); |
|
|
|
surface()->DrawSetTextPos( ( iWidth / 2 ) - ( iStringWidth / 2 ), pCredit->flYPos ); |
|
surface()->DrawUnicodeString( unicode ); |
|
} |
|
} |
|
|
|
|
|
void CHudPortalCredits::DrawPortalOutroCreditsName( void ) |
|
{ |
|
|
|
if ( m_CreditsList.Count() == 0 ) |
|
return; |
|
|
|
static int iCounter=0; |
|
static bool bCursor = false; |
|
|
|
// fill the screen |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
iWidth += m_iScreenWidthAdjustment; |
|
iTall += m_iScreenHeightAdjustment; |
|
SetSize( iWidth+m_iScreenXOffset, iTall+m_iScreenYOffset ); |
|
|
|
if (gpGlobals->curtime - m_flLastPaintTime > 0.05) |
|
{ |
|
m_flLastPaintTime = gpGlobals->curtime; |
|
iCounter += 100; |
|
if (iCounter> (int)m_flScrollTime && m_iYOffset<(m_CreditsList.Count()-1)) |
|
{ |
|
bCursor = !bCursor; |
|
iCounter = 0; |
|
m_iXOffset += 1; |
|
|
|
if (m_iXOffset > Q_strlen(m_CreditsList[m_iYOffset].szCreditName) && m_iYOffset<(m_CreditsList.Count()-1)) |
|
{ |
|
m_iXOffset = 1; |
|
m_iYOffset += 1; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( m_CreditsList[m_iYOffset].szFontName, true ); |
|
int iFontTall = surface()->GetFontTall ( m_hTFont )+ m_flSeparation; |
|
|
|
if ( m_CreditsList[m_iYOffset].flYPos +iFontTall > iTall ) |
|
{ |
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
if ( pCredit == NULL ) |
|
continue; |
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
int iFontTall = surface()->GetFontTall ( m_hTFont )+ m_flSeparation; |
|
pCredit->flYPos -= iFontTall; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
|
|
int iFontTall = surface()->GetFontTall ( m_hTFont ); |
|
|
|
if ( pCredit->flYPos < -iFontTall || pCredit->flYPos > iTall ) |
|
{ |
|
pCredit->bActive = false; |
|
} |
|
else |
|
{ |
|
if (i <= m_iYOffset) |
|
pCredit->bActive = true; |
|
} |
|
|
|
Color cColor = m_TextColor; |
|
|
|
//HACKHACK |
|
//Last one stays on screen and fades out |
|
if ( i == m_CreditsList.Count()-1 ) |
|
{ |
|
if ( m_bLastOneInPlace == false ) |
|
{ |
|
pCredit->flYPos -= gpGlobals->frametime * ( (float)g_iPortalCreditsPixelHeight / m_flScrollTime ); |
|
|
|
if ( (int)pCredit->flYPos + ( iFontTall / 2 ) <= iTall / 2 ) |
|
{ |
|
m_bLastOneInPlace = true; |
|
m_flFadeTime = gpGlobals->curtime + 10.0f; |
|
} |
|
} |
|
else |
|
{ |
|
if ( m_flFadeTime <= gpGlobals->curtime ) |
|
{ |
|
if ( m_Alpha > 0 ) |
|
{ |
|
m_Alpha -= gpGlobals->frametime * ( m_flScrollTime * 2 ); |
|
|
|
if ( m_Alpha <= 0 ) |
|
{ |
|
pCredit->bActive = false; |
|
engine->ClientCmd( "creditsdone" ); |
|
} |
|
} |
|
} |
|
|
|
cColor[3] = MAX( 0, m_Alpha ); |
|
} |
|
} |
|
else |
|
{ |
|
//m_iYOffset += (int) (gpGlobals->frametime * ( (float)g_iPortalCreditsPixelHeight / m_flScrollTime )); |
|
//m_iYOffset += (int) (gpGlobals->frametime * ( (float)g_iPortalCreditsPixelHeight / 1000 )); |
|
//iCounter += 1; |
|
//pCredit->flYPos -= gpGlobals->frametime * ( (float)g_iPortalCreditsPixelHeight / m_flScrollTime ); |
|
} |
|
|
|
if ( pCredit->bActive == false ) |
|
continue; |
|
|
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( cColor[0], cColor[1], cColor[2], cColor[3] ); |
|
|
|
wchar_t unicode[256]; |
|
|
|
char tmpstr[256]; |
|
if (m_iYOffset == i) |
|
{ |
|
char tmpstr2[256]; |
|
Q_strncpy( tmpstr2, pCredit->szCreditName, m_iXOffset ); |
|
if (bCursor) |
|
Q_snprintf( tmpstr, 256, "%s_",tmpstr2); |
|
else |
|
Q_snprintf( tmpstr, 256, "%s",tmpstr2); |
|
} |
|
else |
|
{ |
|
Q_strncpy( tmpstr, pCredit->szCreditName, Q_strlen( pCredit->szCreditName )+1 ); |
|
} |
|
|
|
if ( tmpstr[0] == '#' ) |
|
{ |
|
g_pVGuiLocalize->ConstructString( unicode, sizeof(unicode), g_pVGuiLocalize->Find(tmpstr), 0 ); |
|
} |
|
else |
|
{ |
|
g_pVGuiLocalize->ConvertANSIToUnicode( tmpstr, unicode, sizeof( unicode ) ); |
|
} |
|
|
|
// int iStringWidth = GetStringPixelWidth( unicode, m_hTFont ); |
|
// surface()->DrawSetTextPos( ( iWidth / 2 ) - ( iStringWidth / 2 ), pCredit->flYPos ); |
|
surface()->DrawSetTextColor( m_cColor[0], m_cColor[1], m_cColor[2], 255 ); |
|
surface()->DrawSetTextPos( 20+m_iScreenXOffset, pCredit->flYPos + m_iScreenYOffset ); |
|
surface()->DrawUnicodeString( unicode ); |
|
} |
|
} |
|
|
|
void CHudPortalCredits::DrawPortalAsciiArt( void ) |
|
{ |
|
if ( m_AsciiList.Count() == 0 ) |
|
return; |
|
|
|
if (m_iCurrentAsciiArt == 0) |
|
return; |
|
|
|
//get the screen stats |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
iWidth += m_iScreenWidthAdjustment; |
|
iTall += m_iScreenHeightAdjustment; |
|
SetSize( iWidth+m_iScreenXOffset, iTall+m_iScreenYOffset ); |
|
int ift = 0; |
|
|
|
for ( int i = 0; i < 20; i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_AsciiList[((m_iCurrentAsciiArt - 1) *20)+i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
//vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( m_szAsciiArtFont, true ); |
|
|
|
int iFontTall = surface()->GetFontTall ( m_hTFont ); |
|
if (ift == 0) { |
|
ift = iFontTall; |
|
ift+=m_iAASeparation; |
|
} |
|
iFontTall+= (int) m_flSeparation; |
|
|
|
Color cColor = m_TextColor; |
|
|
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( cColor[0], cColor[1], cColor[2], cColor[3] ); |
|
|
|
wchar_t unicode[256]; |
|
char tmpstr[256]; |
|
Q_strncpy( tmpstr, pCredit->szCreditName, Q_strlen( pCredit->szCreditName )+1 ); |
|
|
|
//Q_strncpy( tmpstr, pCredit->szFontName, Q_strlen( pCredit->szFontName )+1 ); |
|
|
|
//if ( tmpstr[0] == '#' ) |
|
//{ |
|
// g_pVGuiLocalize->ConstructString( unicode, sizeof(unicode), g_pVGuiLocalize->Find(tmpstr), 0 ); |
|
//} |
|
//else |
|
//{ |
|
g_pVGuiLocalize->ConvertANSIToUnicode( tmpstr, unicode, sizeof( unicode ) ); |
|
//} |
|
surface()->DrawSetTextColor( m_cColor[0], m_cColor[1], m_cColor[2], cColor[3] ); |
|
//surface()->DrawSetTextPos( 20+(iWidth/2), 10+(iTall/2)+(i*iFontTall) ); |
|
surface()->DrawSetTextPos( 20+(iWidth/2)+m_iAAScreenXOffset, 10+(iTall/2)+m_iAAScreenYOffset+(i*ift) ); |
|
surface()->DrawUnicodeString( unicode ); |
|
} |
|
|
|
} |
|
|
|
|
|
void CHudPortalCredits::DrawPortalOutroCreditsLyrics( void ) |
|
{ |
|
if ( m_LyricsList.Count() == 0 ) |
|
return; |
|
|
|
static bool bCursor = false; |
|
static int iLastNameY = 0; |
|
|
|
if (m_flLyricsStartTime == -1) m_flLyricsStartTime = gpGlobals->curtime; |
|
|
|
//get the screen stats |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
iWidth += m_iScreenWidthAdjustment; |
|
iTall += m_iScreenHeightAdjustment; |
|
SetSize( iWidth+m_iScreenXOffset, iTall+m_iScreenYOffset ); |
|
|
|
if (gpGlobals->curtime - m_flLastBlinkTime > m_flCursorBlinkTime) |
|
{ |
|
bCursor = !bCursor; |
|
m_flLastBlinkTime = gpGlobals->curtime; |
|
} |
|
|
|
|
|
float flCurTime = gpGlobals->curtime - m_flLyricsStartTime; |
|
|
|
if (m_bStartSong && flCurTime>= m_flSongStartTime) |
|
{ |
|
surface()->PlaySound( "music/portal_still_alive.mp3" ); |
|
m_bStartSong=false; |
|
//engine->ClientCmd( "play music/portal_still_alive.mp3" ); |
|
} |
|
|
|
//Draw Lyrics |
|
bool bBorders = false; |
|
for ( int i = 0; i < m_LyricsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_LyricsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
if (pCredit->flTimeStart > flCurTime) break; |
|
if (pCredit->flTimeStart <= flCurTime && pCredit->flTimeEnd > flCurTime) |
|
{ |
|
m_iYOffset = i; |
|
if (pCredit->bReset) |
|
{ |
|
m_iCurrentLowY = i; |
|
} |
|
m_iXOffset = (int) (((flCurTime-pCredit->flTimeStart) / pCredit->flTimeInit)*Q_wcslen(pCredit->szLyricLine))+1; |
|
if ( m_iXOffset<1 ) |
|
m_iXOffset = 1; |
|
else if ( m_iXOffset>Q_wcslen(pCredit->szLyricLine) ) |
|
m_iXOffset = Q_wcslen(pCredit->szLyricLine); |
|
} |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
|
|
int iFontTall = surface()->GetFontTall ( m_hTFont )+ (int) m_flSeparation; |
|
|
|
if ( pCredit->flYPos < -iFontTall || pCredit->flYPos > iTall || i<m_iCurrentLowY) |
|
{ |
|
pCredit->bActive = false; |
|
} |
|
else |
|
{ |
|
if (i <= m_iYOffset) |
|
pCredit->bActive = true; |
|
} |
|
|
|
Color cColor = m_TextColor; |
|
|
|
if ( pCredit->bActive == false ) |
|
continue; |
|
|
|
if (pCredit->iAsciiIndex>0) |
|
{ |
|
m_iCurrentAsciiArt = pCredit->iAsciiIndex; |
|
} |
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( cColor[0], cColor[1], cColor[2], cColor[3] ); |
|
|
|
if (!bBorders) |
|
{ |
|
wchar_t bunicode[512]; |
|
wchar_t bVunicode[2]; |
|
wchar_t bVunicode2[3]; |
|
|
|
int iBorderEndX = GetPixelWidth( m_szBorderH, m_hTFont ); |
|
|
|
g_pVGuiLocalize->ConvertANSIToUnicode( m_szBorderH, bunicode, sizeof( bunicode ) ); |
|
g_pVGuiLocalize->ConvertANSIToUnicode( "|", bVunicode, sizeof( bVunicode ) ); |
|
g_pVGuiLocalize->ConvertANSIToUnicode( "||", bVunicode2, sizeof( bVunicode2 ) ); |
|
int iBorderPipeWidth = GetPixelWidth( "||", m_hTFont); |
|
surface()->DrawSetTextColor( m_cColor[0], m_cColor[1], m_cColor[2], cColor[3] ); |
|
surface()->DrawSetTextPos( 5+m_iScreenXOffset, 10+m_iScreenYOffset); |
|
surface()->DrawUnicodeString( bunicode ); |
|
surface()->DrawSetTextPos( (iWidth/2)+m_iScreenXOffset, 10+m_iScreenYOffset); |
|
surface()->DrawUnicodeString( bunicode ); |
|
surface()->DrawSetTextPos( 5+m_iScreenXOffset, (iTall - (iFontTall*2))+m_iScreenYOffset); |
|
surface()->DrawUnicodeString( bunicode ); |
|
surface()->DrawSetTextPos( (iWidth/2)+m_iScreenXOffset, (iTall/2)+m_iScreenYOffset); |
|
surface()->DrawUnicodeString( bunicode ); |
|
|
|
int iBorderY = 10+iFontTall; |
|
while (iBorderY < (iTall - (iFontTall*3))) |
|
{ |
|
surface()->DrawSetTextPos( 5+m_iScreenXOffset, iBorderY+m_iScreenYOffset); |
|
surface()->DrawUnicodeString( bVunicode ); |
|
surface()->DrawSetTextPos( iBorderEndX+m_iScreenXOffset, iBorderY+m_iScreenYOffset); |
|
if (iBorderY<(iTall/2)) |
|
{ |
|
surface()->DrawUnicodeString( bVunicode2 ); |
|
surface()->DrawSetTextPos( (iWidth-iBorderPipeWidth)+m_iScreenXOffset, iBorderY+m_iScreenYOffset); |
|
surface()->DrawUnicodeString( bVunicode ); |
|
} |
|
else |
|
{ |
|
surface()->DrawUnicodeString( bVunicode ); |
|
} |
|
iBorderY+=iFontTall; |
|
} |
|
bBorders = true; |
|
} |
|
|
|
wchar_t tmpstr[256]; |
|
memset( tmpstr, 0, sizeof(tmpstr)); |
|
if (m_iYOffset == i) |
|
{ |
|
Q_wcsncpy( tmpstr, pCredit->szLyricLine, m_iXOffset * sizeof( wchar_t ) ); |
|
if (bCursor) |
|
tmpstr[m_iXOffset - 1] = '_'; |
|
|
|
} |
|
else |
|
{ |
|
Q_wcsncpy( tmpstr, pCredit->szLyricLine, (Q_wcslen( pCredit->szLyricLine ) + 1) * sizeof( wchar_t )); |
|
} |
|
|
|
surface()->DrawSetTextColor( m_cColor[0], m_cColor[1], m_cColor[2], cColor[3] ); |
|
surface()->DrawSetTextPos( 20+pCredit->iXOffset+m_iScreenXOffset, 30+pCredit->flYPos+m_iScreenYOffset ); |
|
surface()->DrawUnicodeString( tmpstr ); |
|
} |
|
|
|
DrawPortalAsciiArt(); |
|
|
|
//Draw Credits |
|
int iCreditsListCount = m_CreditsList.Count(); |
|
for ( int i = iCreditsListCount-1; i >=0; i-- ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
if (pCredit->flYPos < 0) break; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
int iFontTall = surface()->GetFontTall ( m_hTFont ); |
|
|
|
if (pCredit->flTimeStart <= flCurTime && pCredit->flTimeEnd > flCurTime) |
|
{ |
|
if (iLastNameY!=i) |
|
{ |
|
int iYDelta = iFontTall + (int) m_flSeparation; |
|
for (int j = 0; j <i; j++) |
|
{ |
|
m_CreditsList[j].flYPos -= (float) iYDelta; |
|
} |
|
m_CreditsList[i].flYPos = (iTall/2) - iYDelta; |
|
iLastNameY=i; |
|
} |
|
m_iYOffsetNames = i; |
|
m_iXOffsetNames = (int) (((flCurTime-pCredit->flTimeStart) / pCredit->flTimeInit)*Q_strlen(pCredit->szCreditName))+1; |
|
if (m_iXOffsetNames<1) m_iXOffsetNames = 1; |
|
else if (m_iXOffsetNames>Q_strlen(pCredit->szCreditName) ) m_iXOffsetNames = Q_strlen(pCredit->szCreditName); |
|
} |
|
|
|
|
|
//if ( pCredit->flYPos < -iFontTall || pCredit->flYPos > iTall) |
|
if ( pCredit->flYPos < 20 || pCredit->flYPos > (iTall/2)) |
|
{ |
|
pCredit->bActive = false; |
|
} |
|
else |
|
{ |
|
if (i <= m_iYOffsetNames) |
|
pCredit->bActive = true; |
|
} |
|
|
|
Color cColor = m_TextColor; |
|
|
|
if ( pCredit->bActive == false ) |
|
continue; |
|
|
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( cColor[0], cColor[1], cColor[2], cColor[3] ); |
|
|
|
wchar_t unicode[256]; |
|
|
|
char tmpstr[256]; |
|
if (m_iYOffsetNames == i) |
|
{ |
|
char tmpstr2[256]; |
|
Q_strncpy( tmpstr2, pCredit->szCreditName, m_iXOffsetNames ); |
|
if (!bCursor) |
|
Q_snprintf( tmpstr, 256, "%s_",tmpstr2); |
|
else |
|
Q_snprintf( tmpstr, 256, "%s",tmpstr2); |
|
} |
|
else |
|
{ |
|
Q_strncpy( tmpstr, pCredit->szCreditName, Q_strlen( pCredit->szCreditName )+1 ); |
|
} |
|
|
|
if ( tmpstr[0] == '#' ) |
|
{ |
|
g_pVGuiLocalize->ConstructString( unicode, sizeof(unicode), g_pVGuiLocalize->Find(tmpstr), 0 ); |
|
} |
|
else |
|
{ |
|
g_pVGuiLocalize->ConvertANSIToUnicode( tmpstr, unicode, sizeof( unicode ) ); |
|
} |
|
|
|
// int iStringWidth = GetStringPixelWidth( unicode, m_hTFont ); |
|
// surface()->DrawSetTextPos( ( iWidth / 2 ) - ( iStringWidth / 2 ), pCredit->flYPos ); |
|
surface()->DrawSetTextColor( m_cColor[0], m_cColor[1], m_cColor[2], cColor[3] ); |
|
surface()->DrawSetTextPos( (iWidth/2)+10+m_iScreenXOffset, pCredit->flYPos+m_iScreenYOffset ); |
|
surface()->DrawUnicodeString( unicode ); |
|
|
|
} |
|
} |
|
|
|
|
|
void CHudPortalCredits::DrawLogo( void ) |
|
{ |
|
if( m_iLogoState == LOGO_FADEOFF ) |
|
{ |
|
SetActive( false ); |
|
return; |
|
} |
|
|
|
switch( m_iLogoState ) |
|
{ |
|
case LOGO_FADEIN: |
|
{ |
|
float flDeltaTime = ( m_flFadeTime - gpGlobals->curtime ); |
|
|
|
m_Alpha = MAX( 0, RemapValClamped( flDeltaTime, 5.0f, 0, -128, 255 ) ); |
|
|
|
if ( flDeltaTime <= 0.0f ) |
|
{ |
|
m_iLogoState = LOGO_FADEHOLD; |
|
m_flFadeTime = gpGlobals->curtime + m_flLogoDesiredLength; |
|
} |
|
|
|
break; |
|
} |
|
|
|
case LOGO_FADEHOLD: |
|
{ |
|
if ( m_flFadeTime <= gpGlobals->curtime ) |
|
{ |
|
m_iLogoState = LOGO_FADEOUT; |
|
m_flFadeTime = gpGlobals->curtime + 2.0f; |
|
} |
|
break; |
|
} |
|
|
|
case LOGO_FADEOUT: |
|
{ |
|
float flDeltaTime = ( m_flFadeTime - gpGlobals->curtime ); |
|
|
|
m_Alpha = RemapValClamped( flDeltaTime, 0.0f, 2.0f, 0, 255 ); |
|
|
|
if ( flDeltaTime <= 0.0f ) |
|
{ |
|
m_iLogoState = LOGO_FADEOFF; |
|
SetActive( false ); |
|
} |
|
|
|
break; |
|
} |
|
} |
|
|
|
// fill the screen |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
iWidth += m_iScreenWidthAdjustment; |
|
iTall += m_iScreenHeightAdjustment; |
|
|
|
SetSize( iWidth, iTall ); |
|
|
|
char szLogoFont[64]; |
|
|
|
if ( IsXbox() ) |
|
{ |
|
Q_snprintf( szLogoFont, sizeof( szLogoFont ), "WeaponIcons_Small" ); |
|
} |
|
else if ( hl2_episodic.GetBool() ) |
|
{ |
|
Q_snprintf( szLogoFont, sizeof( szLogoFont ), "ClientTitleFont" ); |
|
} |
|
else |
|
{ |
|
Q_snprintf( szLogoFont, sizeof( szLogoFont ), "WeaponIcons" ); |
|
} |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( szLogoFont ); |
|
|
|
int iFontTall = surface()->GetFontTall ( m_hTFont ); |
|
|
|
Color cColor = m_TextColor; |
|
cColor[3] = m_Alpha; |
|
|
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( cColor[0], cColor[1], cColor[2], cColor[3] ); |
|
|
|
wchar_t unicode[256]; |
|
g_pVGuiLocalize->ConvertANSIToUnicode( "HALF-LIFE'", unicode, sizeof( unicode ) ); |
|
|
|
int iStringWidth = GetStringPixelWidth( unicode, m_hTFont ); |
|
|
|
surface()->DrawSetTextPos( ( iWidth / 2 ) - ( iStringWidth / 2 ), ( iTall / 2 ) - ( iFontTall / 2 ) ); |
|
surface()->DrawUnicodeString( unicode ); |
|
|
|
//Adrian: This should really be exposed. |
|
if ( hl2_episodic.GetBool() ) |
|
{ |
|
g_pVGuiLocalize->ConvertANSIToUnicode( "== episode one==", unicode, sizeof( unicode ) ); |
|
|
|
iStringWidth = GetStringPixelWidth( unicode, m_hTFont ); |
|
|
|
surface()->DrawSetTextPos( ( iWidth / 2 ) - ( iStringWidth / 2 ), ( iTall / 2 ) + ( iFontTall / 2 )); |
|
surface()->DrawUnicodeString( unicode ); |
|
} |
|
|
|
|
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
float CHudPortalCredits::FadeBlend( float fadein, float fadeout, float hold, float localTime ) |
|
{ |
|
float fadeTime = fadein + hold; |
|
float fadeBlend; |
|
|
|
if ( localTime < 0 ) |
|
return 0; |
|
|
|
if ( localTime < fadein ) |
|
{ |
|
fadeBlend = 1 - ((fadein - localTime) / fadein); |
|
} |
|
else if ( localTime > fadeTime ) |
|
{ |
|
if ( fadeout > 0 ) |
|
fadeBlend = 1 - ((localTime - fadeTime) / fadeout); |
|
else |
|
fadeBlend = 0; |
|
} |
|
else |
|
fadeBlend = 1; |
|
|
|
if ( fadeBlend < 0 ) |
|
fadeBlend = 0; |
|
|
|
return fadeBlend; |
|
} |
|
|
|
void CHudPortalCredits::DrawIntroCreditsName( void ) |
|
{ |
|
if ( m_CreditsList.Count() == 0 ) |
|
return; |
|
|
|
// fill the screen |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
SetSize( iWidth, iTall ); |
|
|
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
if ( pCredit->bActive == false ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName ); |
|
|
|
float localTime = gpGlobals->curtime - pCredit->flTimeStart; |
|
|
|
surface()->DrawSetTextFont( m_hTFont ); |
|
surface()->DrawSetTextColor( m_cColor[0], m_cColor[1], m_cColor[2], FadeBlend( m_flFadeInTime, m_flFadeOutTime, m_flFadeHoldTime + pCredit->flTimeAdd, localTime ) * m_cColor[3] ); |
|
|
|
wchar_t unicode[256]; |
|
g_pVGuiLocalize->ConvertANSIToUnicode( pCredit->szCreditName, unicode, sizeof( unicode ) ); |
|
|
|
surface()->DrawSetTextPos( XRES( pCredit->flXPos ), YRES( pCredit->flYPos ) ); |
|
surface()->DrawUnicodeString( unicode ); |
|
|
|
if ( m_flLogoTime > gpGlobals->curtime ) |
|
continue; |
|
|
|
if ( pCredit->flTime - m_flNextStartTime <= gpGlobals->curtime ) |
|
{ |
|
if ( m_CreditsList.IsValidIndex( i + 3 ) ) |
|
{ |
|
portalcreditname_t *pNextCredits = &m_CreditsList[i + 3]; |
|
|
|
if ( pNextCredits && pNextCredits->flTime == 0.0f ) |
|
{ |
|
pNextCredits->bActive = true; |
|
|
|
if ( i < 3 ) |
|
{ |
|
pNextCredits->flTimeAdd = ( i + 1.0f ); |
|
pNextCredits->flTime = gpGlobals->curtime + m_flFadeInTime + m_flFadeOutTime + m_flFadeHoldTime + pNextCredits->flTimeAdd; |
|
} |
|
else |
|
{ |
|
pNextCredits->flTimeAdd = m_flPauseBetweenWaves; |
|
pNextCredits->flTime = gpGlobals->curtime + m_flFadeInTime + m_flFadeOutTime + m_flFadeHoldTime + pNextCredits->flTimeAdd; |
|
} |
|
|
|
pNextCredits->flTimeStart = gpGlobals->curtime; |
|
|
|
pNextCredits->iSlot = pCredit->iSlot; |
|
} |
|
} |
|
} |
|
|
|
if ( pCredit->flTime <= gpGlobals->curtime ) |
|
{ |
|
pCredit->bActive = false; |
|
|
|
if ( i == m_CreditsList.Count()-1 ) |
|
{ |
|
Clear(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void CHudPortalCredits::ApplySchemeSettings( IScheme *pScheme ) |
|
{ |
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
|
|
SetVisible( ShouldDraw() ); |
|
|
|
SetBgColor( Color(0, 0, 0, 0) ); |
|
} |
|
|
|
void CHudPortalCredits::Paint() |
|
{ |
|
if ( m_iCreditsType == CREDITS_LOGO ) |
|
{ |
|
DrawLogo(); |
|
} |
|
else if ( m_iCreditsType == CREDITS_INTRO ) |
|
{ |
|
DrawIntroCreditsName(); |
|
} |
|
else if ( m_iCreditsType == CREDITS_OUTRO ) |
|
{ |
|
DrawOutroCreditsName(); |
|
} |
|
else if ( m_iCreditsType == CREDITS_OUTRO_PORTAL ) |
|
{ |
|
//DrawPortalOutroCreditsName(); |
|
DrawPortalOutroCreditsLyrics(); |
|
} |
|
|
|
} |
|
|
|
void CHudPortalCredits::PrepareLogo( float flTime ) |
|
{ |
|
m_Alpha = 0; |
|
m_flLogoDesiredLength = flTime; |
|
m_flFadeTime = gpGlobals->curtime + 5.0f; |
|
m_iLogoState = LOGO_FADEIN; |
|
SetActive( true ); |
|
} |
|
|
|
void CHudPortalCredits::PrepareOutroCredits( void ) |
|
{ |
|
PrepareCredits( "OutroCreditsNames" ); |
|
|
|
if ( m_CreditsList.Count() == 0 ) |
|
return; |
|
|
|
// fill the screen |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
SetSize( iWidth, iTall ); |
|
|
|
int iHeight = iTall; |
|
|
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
|
|
pCredit->flYPos = iHeight; |
|
pCredit->bActive = false; |
|
|
|
iHeight += surface()->GetFontTall ( m_hTFont ) + m_flSeparation; |
|
} |
|
|
|
SetActive( true ); |
|
|
|
g_iPortalCreditsPixelHeight = iHeight; |
|
} |
|
|
|
void CHudPortalCredits::PreparePortalOutroCredits( void ) |
|
{ |
|
m_iCurrentLowY = 0; |
|
m_bStartSong = true; |
|
m_flLyricsStartTime = -1; |
|
|
|
m_iCurrentAsciiArt = 0; |
|
|
|
PrepareCredits( "OutroCreditsNames" ); |
|
|
|
if ( m_CreditsList.Count() == 0 ) |
|
return; |
|
|
|
// fill the screen |
|
int iWidth, iTall; |
|
GetHudSize(iWidth, iTall); |
|
|
|
iWidth = static_cast<int>( static_cast<float>(iTall) * (4.0f/3.0f) ); |
|
|
|
iWidth += m_iScreenWidthAdjustment; |
|
iTall += m_iScreenHeightAdjustment; |
|
SetSize( iWidth+m_iScreenXOffset, iTall +m_iScreenYOffset ); |
|
|
|
m_iYOffset = 0; |
|
m_iXOffset = 1; |
|
m_iYOffsetNames = 0; |
|
m_iXOffsetNames = 1; |
|
|
|
//int iHeight = iTall; |
|
int iHeight = -1; |
|
int iTotalNameLen = 0; |
|
|
|
|
|
//Prepare Credit Names |
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
|
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName, true ); |
|
|
|
if (iHeight == -1) iHeight = (iTall/2) - (surface()->GetFontTall ( m_hTFont ) + m_flSeparation); |
|
else iHeight += surface()->GetFontTall ( m_hTFont ) + m_flSeparation; |
|
|
|
if (i==0) |
|
{ |
|
Q_strcpy(m_szBorderH,"-"); |
|
while(GetPixelWidth( m_szBorderH, m_hTFont )< ((iWidth/2)-GetPixelWidth( "---", m_hTFont ))) |
|
{ |
|
int iCurrentLength = Q_strlen(m_szBorderH); |
|
if (iCurrentLength < sizeof(m_szBorderH)) |
|
{ |
|
m_szBorderH[iCurrentLength] = '-'; |
|
} |
|
else |
|
{ |
|
break; |
|
} |
|
} |
|
} |
|
|
|
|
|
pCredit->flYPos = iHeight; |
|
pCredit->bActive = false; |
|
|
|
iTotalNameLen += Q_strlen(pCredit->szCreditName); |
|
|
|
} |
|
|
|
m_flNameCharTime = m_flScrollTime / iTotalNameLen; |
|
|
|
float flStart = m_flScrollCreditsStart; |
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
m_CreditsList[i].flTimeStart=flStart; |
|
m_CreditsList[i].flTimeInit = Q_strlen(m_CreditsList[i].szCreditName)*m_flNameCharTime; |
|
flStart += m_CreditsList[i].flTimeInit; |
|
m_CreditsList[i].flTimeEnd=flStart; |
|
} |
|
|
|
SetActive( true ); |
|
|
|
|
|
m_flScrollTime = 2; |
|
m_flLastPaintTime = gpGlobals->curtime; |
|
m_flLastBlinkTime = gpGlobals->curtime; |
|
} |
|
|
|
void CHudPortalCredits::PrepareIntroCredits( void ) |
|
{ |
|
PrepareCredits( "IntroCreditsNames" ); |
|
|
|
int iSlot = 0; |
|
|
|
for ( int i = 0; i < m_CreditsList.Count(); i++ ) |
|
{ |
|
portalcreditname_t *pCredit = &m_CreditsList[i]; |
|
|
|
if ( pCredit == NULL ) |
|
continue; |
|
|
|
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); |
|
vgui::HFont m_hTFont = vgui::scheme()->GetIScheme(scheme)->GetFont( pCredit->szFontName ); |
|
|
|
pCredit->flYPos = m_flY + ( iSlot * surface()->GetFontTall ( m_hTFont ) ); |
|
pCredit->flXPos = m_flX; |
|
|
|
if ( i < 3 ) |
|
{ |
|
pCredit->bActive = true; |
|
pCredit->iSlot = iSlot; |
|
pCredit->flTime = gpGlobals->curtime + m_flFadeInTime + m_flFadeOutTime + m_flFadeHoldTime; |
|
pCredit->flTimeStart = gpGlobals->curtime; |
|
m_flLogoTime = pCredit->flTime + m_flLogoTimeMod; |
|
} |
|
else |
|
{ |
|
pCredit->bActive = false; |
|
pCredit->flTime = 0.0f; |
|
} |
|
|
|
iSlot = ( iSlot + 1 ) % 3; |
|
} |
|
|
|
SetActive( true ); |
|
} |
|
|
|
void CHudPortalCredits::MsgFunc_CreditsPortalMsg( bf_read &msg ) |
|
{ |
|
m_iCreditsType = msg.ReadByte(); |
|
|
|
switch ( m_iCreditsType ) |
|
{ |
|
case CREDITS_LOGO: |
|
{ |
|
PrepareLogo( 5.0f ); |
|
break; |
|
} |
|
case CREDITS_INTRO: |
|
{ |
|
PrepareIntroCredits(); |
|
break; |
|
} |
|
case CREDITS_OUTRO: |
|
{ |
|
PrepareOutroCredits(); |
|
break; |
|
} |
|
case CREDITS_OUTRO_PORTAL: |
|
{ |
|
PreparePortalOutroCredits(); |
|
break; |
|
} |
|
|
|
} |
|
} |
|
|
|
void CHudPortalCredits::MsgFunc_LogoTimeMsg( bf_read &msg ) |
|
{ |
|
m_iCreditsType = CREDITS_LOGO; |
|
PrepareLogo( msg.ReadFloat() ); |
|
} |
|
|
|
|
|
|