diff options
Diffstat (limited to 'game/client/portal/portal_credits.cpp')
| -rw-r--r-- | game/client/portal/portal_credits.cpp | 1574 |
1 files changed, 1574 insertions, 0 deletions
diff --git a/game/client/portal/portal_credits.cpp b/game/client/portal/portal_credits.cpp new file mode 100644 index 0000000..86ad0bc --- /dev/null +++ b/game/client/portal/portal_credits.cpp @@ -0,0 +1,1574 @@ +//========= 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() ); +} + + |