|
|
//========= 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() ); }
|