mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-06-08 08:18:13 +00:00
229 lines
8.7 KiB
C++
229 lines
8.7 KiB
C++
#include "cbase.h"
|
|
#include "mission_complete_message.h"
|
|
#include "vgui_controls/Label.h"
|
|
#include "vgui_controls/ImagePanel.h"
|
|
#include "vgui_controls/TextEntry.h"
|
|
#include <vgui/isurface.h>
|
|
#include "asw_scalable_text.h"
|
|
#include "asw_gamerules.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
using namespace vgui;
|
|
|
|
CMission_Complete_Message::CMission_Complete_Message( vgui::Panel *parent, const char *name ) : BaseClass( parent, name )
|
|
{
|
|
m_flMessageBackgroundStartTime = 0.0f;
|
|
m_flMessageBackgroundFadeDuration = 0.0f;
|
|
}
|
|
|
|
CMission_Complete_Message::~CMission_Complete_Message()
|
|
{
|
|
|
|
}
|
|
|
|
void CMission_Complete_Message::ApplySchemeSettings( vgui::IScheme *pScheme )
|
|
{
|
|
BaseClass::ApplySchemeSettings( pScheme );
|
|
|
|
//LoadControlSettings( "resource/ui/mission_complete_message.res" );
|
|
}
|
|
|
|
void CMission_Complete_Message::PerformLayout()
|
|
{
|
|
BaseClass::PerformLayout();
|
|
|
|
SetBounds( 0, 0, ScreenWidth(), ScreenHeight() );
|
|
}
|
|
|
|
void CMission_Complete_Message::OnThink()
|
|
{
|
|
BaseClass::OnThink();
|
|
}
|
|
|
|
void CMission_Complete_Message::Paint()
|
|
{
|
|
BaseClass::Paint();
|
|
|
|
PaintMessageBackground();
|
|
PaintLetters();
|
|
}
|
|
|
|
void CMission_Complete_Message::PaintMessageBackground()
|
|
{
|
|
float flLerpAmount = ( gpGlobals->curtime - m_flMessageBackgroundStartTime ) / ( m_flMessageBackgroundFadeDuration );
|
|
flLerpAmount = clamp<float>( flLerpAmount, 0.0f, 1.0f );
|
|
|
|
if ( m_bSuccess )
|
|
{
|
|
surface()->DrawSetColor(Color(35,41,57,flLerpAmount * 128.0f));
|
|
surface()->DrawSetColor(Color(0,0,0,flLerpAmount * 128.0f));
|
|
}
|
|
else
|
|
{
|
|
surface()->DrawSetColor(Color(64,0,0,flLerpAmount * 192.0f));
|
|
}
|
|
int top = ScreenHeight() * 0.22f;
|
|
int bottom = ScreenHeight() * 0.62f;
|
|
surface()->DrawFilledRect( 0, top, ScreenWidth() + 1, bottom );
|
|
|
|
if ( !m_bSuccess )
|
|
{
|
|
// fail hint bg
|
|
surface()->DrawSetColor(Color(64,0,0,flLerpAmount * 192.0f));
|
|
top = ScreenHeight() * 0.72f;
|
|
bottom = ScreenHeight() * 0.82f;
|
|
surface()->DrawFilledRect( 0, top, ScreenWidth() + 1, bottom );
|
|
}
|
|
}
|
|
|
|
void CMission_Complete_Message::StartMessage( bool bSuccess )
|
|
{
|
|
m_bSuccess = bSuccess;
|
|
int row_middle_x = ScreenWidth() * 0.5f;
|
|
int row_middle_y = ScreenHeight() * 0.35f;
|
|
|
|
m_aAnimatingLetters.PurgeAndDeleteElements();
|
|
|
|
m_flMessageBackgroundStartTime = gpGlobals->curtime + 0.4f;
|
|
m_flMessageBackgroundFadeDuration = 0.6f;
|
|
|
|
// MISSION
|
|
float flStartTime = gpGlobals->curtime + 0.2f;
|
|
float flLetterTimeInterval = 0.075f;
|
|
if ( m_bSuccess && ASWGameRules() && ASWGameRules()->IsCampaignGame() && ASWGameRules()->CampaignMissionsLeft() <= 1 )
|
|
{
|
|
float flShiftRight = 0.2f;
|
|
AddLetter( 'C', row_middle_x, row_middle_y, -3.56 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'A', row_middle_x, row_middle_y, -2.6 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'M', row_middle_x, row_middle_y, -1.49 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'P', row_middle_x, row_middle_y, -0.43 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'A', row_middle_x, row_middle_y, 0.50 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'I', row_middle_x, row_middle_y, 1.27 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'G', row_middle_x, row_middle_y, 2.00 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'N', row_middle_x, row_middle_y, 3.00 + flShiftRight, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
}
|
|
else
|
|
{
|
|
AddLetter( 'M', row_middle_x, row_middle_y, -2.44, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'I', row_middle_x, row_middle_y, -1.6, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'S', row_middle_x, row_middle_y, -0.9, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'S', row_middle_x, row_middle_y, 0, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'I', row_middle_x, row_middle_y, 0.71, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'O', row_middle_x, row_middle_y, 1.47, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'N', row_middle_x, row_middle_y, 2.5, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
}
|
|
|
|
flStartTime += 0.2f;
|
|
|
|
// COMPLETE
|
|
row_middle_y = ScreenHeight() * 0.50f;
|
|
|
|
if ( m_bSuccess )
|
|
{
|
|
row_middle_x += 18.0f * ( ScreenHeight() / 1050.0f );
|
|
AddLetter( 'C', row_middle_x, row_middle_y, -3.56, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'O', row_middle_x, row_middle_y, -2.6, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'M', row_middle_x, row_middle_y, -1.49, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'P', row_middle_x, row_middle_y, -0.43, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'L', row_middle_x, row_middle_y, 0.45, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'E', row_middle_x, row_middle_y, 1.32, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'T', row_middle_x, row_middle_y, 2.25, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'E', row_middle_x, row_middle_y, 3.16, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
}
|
|
else
|
|
{
|
|
row_middle_x += 20.0f * ( ScreenHeight() / 1050.0f );
|
|
AddLetter( 'F', row_middle_x, row_middle_y, -2.1, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'A', row_middle_x, row_middle_y, -1.2, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'I', row_middle_x, row_middle_y, -0.43, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'L', row_middle_x, row_middle_y, 0.22, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'E', row_middle_x, row_middle_y, 1.08, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
AddLetter( 'D', row_middle_x, row_middle_y, 2.01, flStartTime ); flStartTime += flLetterTimeInterval;
|
|
}
|
|
}
|
|
|
|
void CMission_Complete_Message::AddLetter( char letter, int x, int y, float letter_offset, float flStartTime )
|
|
{
|
|
const int letter_end_spacing = YRES( 50 );
|
|
const int letter_start_spacing = YRES( 100 );
|
|
const int letter_start_width = 300;
|
|
const int letter_start_height = letter_start_width;
|
|
const int letter_end_width = 80;
|
|
const int letter_end_height = letter_end_width;
|
|
const float flAnimTime = 0.35f;
|
|
|
|
CAnimating_Letter *pLetter = new CAnimating_Letter;
|
|
pLetter->m_chLetter = letter;
|
|
pLetter->m_flStartTime = flStartTime;
|
|
pLetter->m_flEndTime = flStartTime + flAnimTime;
|
|
|
|
pLetter->m_nStartX = x + letter_offset * letter_start_spacing;
|
|
pLetter->m_nStartY = y;
|
|
pLetter->m_nEndX = x + letter_offset * letter_end_spacing;
|
|
pLetter->m_nEndY = y;
|
|
pLetter->m_nStartWidth = letter_start_width;
|
|
pLetter->m_nStartHeight = letter_start_height;
|
|
pLetter->m_nEndWidth = letter_end_width;
|
|
pLetter->m_nEndHeight = letter_end_height;
|
|
|
|
m_aAnimatingLetters.AddToTail( pLetter );
|
|
}
|
|
|
|
void CMission_Complete_Message::PaintLetters()
|
|
{
|
|
if ( !ASWScalableText() )
|
|
return;
|
|
|
|
int nCount = m_aAnimatingLetters.Count();
|
|
for ( int i = 0; i < nCount; i++ )
|
|
{
|
|
PaintLetter( m_aAnimatingLetters[i], true );
|
|
}
|
|
for ( int i = 0; i < nCount; i++ )
|
|
{
|
|
PaintLetter( m_aAnimatingLetters[i], false );
|
|
}
|
|
}
|
|
|
|
void CMission_Complete_Message::PaintLetter( CAnimating_Letter *pLetter, bool bGlow )
|
|
{
|
|
float flLerpAmount = ( gpGlobals->curtime - pLetter->m_flStartTime ) / ( pLetter->m_flEndTime - pLetter->m_flStartTime );
|
|
flLerpAmount = clamp<float>( flLerpAmount, 0.0f, 1.0f );
|
|
flLerpAmount *= flLerpAmount;
|
|
flLerpAmount *= flLerpAmount;
|
|
|
|
float flX = (float) pLetter->m_nStartX + ( (float) pLetter->m_nEndX - (float) pLetter->m_nStartX ) * flLerpAmount;
|
|
float flY = (float) pLetter->m_nStartY + ( (float) pLetter->m_nEndY - (float) pLetter->m_nStartY ) * flLerpAmount;
|
|
float flWidth = (float) YRES( pLetter->m_nStartWidth ) + ( (float) YRES( pLetter->m_nEndWidth ) - (float) YRES( pLetter->m_nStartWidth ) ) * flLerpAmount;
|
|
float flHeight = (float) YRES( pLetter->m_nStartHeight ) + ( (float) YRES( pLetter->m_nEndHeight ) - (float) YRES( pLetter->m_nStartHeight ) ) * flLerpAmount;
|
|
flWidth *= 0.5f;
|
|
flHeight *= 0.5f;
|
|
|
|
if ( bGlow )
|
|
{
|
|
if ( m_bSuccess )
|
|
{
|
|
surface()->DrawSetColor(Color(35,214,250,flLerpAmount * 112.0f));
|
|
}
|
|
else
|
|
{
|
|
surface()->DrawSetColor(Color(250,0,0,flLerpAmount * 192.0f));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
surface()->DrawSetColor(Color(255,255,255,flLerpAmount * 255.0f));
|
|
}
|
|
ASWScalableText()->DrawSetLetterTexture( pLetter->m_chLetter, bGlow );
|
|
|
|
Vertex_t points[4] =
|
|
{
|
|
Vertex_t( Vector2D(flX - flWidth, flY - flHeight), Vector2D(0,0) ),
|
|
Vertex_t( Vector2D(flX + flWidth, flY - flHeight), Vector2D(1,0) ),
|
|
Vertex_t( Vector2D(flX + flWidth, flY + flHeight), Vector2D(1,1) ),
|
|
Vertex_t( Vector2D(flX - flWidth, flY + flHeight), Vector2D(0,1) )
|
|
};
|
|
surface()->DrawTexturedPolygon( 4, points );
|
|
} |