summaryrefslogtreecommitdiff
path: root/game/client/cstrike/cs_hud_achievement_announce.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/cstrike/cs_hud_achievement_announce.cpp')
-rw-r--r--game/client/cstrike/cs_hud_achievement_announce.cpp415
1 files changed, 415 insertions, 0 deletions
diff --git a/game/client/cstrike/cs_hud_achievement_announce.cpp b/game/client/cstrike/cs_hud_achievement_announce.cpp
new file mode 100644
index 0000000..7739c78
--- /dev/null
+++ b/game/client/cstrike/cs_hud_achievement_announce.cpp
@@ -0,0 +1,415 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "cs_hud_achievement_announce.h"
+#include <vgui/IVGui.h>
+#include "vgui_controls/AnimationController.h"
+#include "iclientmode.h"
+#include "c_cs_player.h"
+#include "c_cs_playerresource.h"
+#include <vgui_controls/Label.h>
+#include <vgui/ILocalize.h>
+#include <vgui/ISurface.h>
+#include "fmtstr.h"
+#include "cs_gamerules.h"
+#include "view.h"
+#include "ivieweffects.h"
+#include "viewrender.h"
+#include "usermessages.h"
+#include "hud_macros.h"
+#include "c_baseanimating.h"
+#include "achievementmgr.h"
+#include "filesystem.h"
+
+
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+DECLARE_HUDELEMENT_DEPTH( CCSAchievementAnnouncePanel, 1 );
+
+#define CALLOUT_WIDE (XRES(100))
+#define CALLOUT_TALL (XRES(50))
+
+
+namespace Interpolators
+
+{
+ inline float Linear( float t ) { return t; }
+
+ inline float SmoothStep( float t )
+ {
+ t = 3 * t * t - 2.0f * t * t * t;
+ return t;
+ }
+
+ inline float SmoothStep2( float t )
+ {
+ return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
+ }
+
+ inline float SmoothStepStart( float t )
+ {
+ t = 0.5f * t;
+ t = 3 * t * t - 2.0f * t * t * t;
+ t = t* 2.0f;
+ return t;
+ }
+
+ inline float SmoothStepEnd( float t )
+ {
+ t = 0.5f * t + 0.5f;
+ t = 3 * t * t - 2.0f * t * t * t;
+ t = (t - 0.5f) * 2.0f;
+ return t;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CCSAchievementAnnouncePanel::CCSAchievementAnnouncePanel( const char *pElementName )
+: EditablePanel( NULL, "AchievementAnnouncePanel" ), CHudElement( pElementName )
+{
+ vgui::Panel *pParent = g_pClientMode->GetViewport();
+ SetParent( pParent );
+ m_bShouldBeVisible = false;
+ SetScheme( "ClientScheme" );
+ m_currentDisplayedAchievement = CSInvalidAchievement;
+ m_pGlowPanel = NULL;
+
+ RegisterForRenderGroup( "hide_for_scoreboard" );
+
+ //Create the grey popup that has the name, text and icon.
+ m_pAchievementInfoPanel = new CCSAchivementInfoPanel(this, "InfoPanel");
+}
+
+CCSAchievementAnnouncePanel::~CCSAchievementAnnouncePanel()
+{
+ if (m_pAchievementInfoPanel)
+ {
+ delete m_pAchievementInfoPanel;
+ }
+}
+
+
+void CCSAchievementAnnouncePanel::Reset()
+{
+ //We don't want to hide the UI here since we want the achievement popup to show through death
+}
+
+void CCSAchievementAnnouncePanel::Init()
+{
+ ListenForGameEvent( "achievement_earned_local" );
+
+ Hide();
+
+ CHudElement::Init();
+}
+
+void CCSAchievementAnnouncePanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ LoadControlSettings( "Resource/UI/Achievement_Glow.res" );
+
+ //This is the glowy flash that comes up under the popup
+ m_pGlowPanel = dynamic_cast<EditablePanel *>( FindChildByName("GlowPanel") );
+
+ Hide();
+}
+
+ConVar cl_show_achievement_popups( "cl_show_achievement_popups", "1", FCVAR_CLIENTDLL | FCVAR_ARCHIVE );
+
+
+void CCSAchievementAnnouncePanel::FireGameEvent( IGameEvent * event )
+{
+ const char *pEventName = event->GetName();
+
+ if ( cl_show_achievement_popups.GetBool() )
+ {
+ if ( Q_strcmp( "achievement_earned_local", pEventName ) == 0 )
+ {
+ //Add achievement to queue and show the UI (since the UI doesn't "Think()" until it is shown
+ Show();
+ m_achievementQueue.Insert((eCSAchievementType)event->GetInt("achievement"));
+ }
+ }
+}
+
+void CCSAchievementAnnouncePanel::Show()
+{
+ m_bShouldBeVisible = true;
+}
+
+void CCSAchievementAnnouncePanel::Hide()
+{
+ m_bShouldBeVisible = false;
+}
+
+bool CCSAchievementAnnouncePanel::ShouldDraw( void )
+{
+ return (m_bShouldBeVisible && CHudElement::ShouldDraw());
+}
+
+void CCSAchievementAnnouncePanel::Paint( void )
+{
+}
+
+void CCSAchievementAnnouncePanel::OnThink( void )
+{
+ BaseClass::OnThink();
+
+ if (!m_pAchievementInfoPanel)
+ {
+ return;
+ }
+
+ //if we have an achievement, update it
+ if (m_currentDisplayedAchievement != CSInvalidAchievement)
+ {
+ //If the match restarts, we need to move the start time for the achievement back.
+ if (m_displayStartTime > gpGlobals->curtime)
+ {
+ m_displayStartTime = gpGlobals->curtime;
+ }
+ float timeSinceDisplayStart = gpGlobals->curtime - m_displayStartTime;
+ float glowAlpha;
+ float achievementPanelAlpha;
+
+ //Update the flash
+ if (m_pGlowPanel)
+ {
+ GetGlowAlpha(timeSinceDisplayStart, glowAlpha);
+ m_pGlowPanel->SetAlpha(glowAlpha);
+ }
+
+ if (GetAchievementPanelAlpha(timeSinceDisplayStart, achievementPanelAlpha))
+ {
+ m_pAchievementInfoPanel->SetAlpha(achievementPanelAlpha);
+ }
+ else
+ {
+ //achievement is faded, so we are done
+ m_pAchievementInfoPanel->SetAlpha(0);
+ m_currentDisplayedAchievement = CSInvalidAchievement;
+
+ if (m_achievementQueue.Count() == 0)
+ {
+ Hide();
+ }
+ }
+ }
+ else
+ {
+ //Check if we need to start the next announcement in the queue. We won't update it this frame, but no time has elapsed anyway.
+ if (m_achievementQueue.Count() > 0)
+ {
+ m_currentDisplayedAchievement = m_achievementQueue.RemoveAtHead();
+ m_displayStartTime = gpGlobals->curtime;
+
+ //=============================================================================
+ // HPE_BEGIN:
+ // [dwenger] Play the achievement earned sound effect
+ //=============================================================================
+
+ vgui::surface()->PlaySound( "UI/achievement_earned.wav" );
+
+ //=============================================================================
+ // HPE_END
+ //=============================================================================
+
+ //Here we get the achievement to be displayed and set that in the popup windows
+ CAchievementMgr *pAchievementMgr = dynamic_cast<CAchievementMgr *>( engine->GetAchievementMgr() );
+ if ( !pAchievementMgr )
+ return;
+
+ IAchievement *pAchievement = pAchievementMgr->GetAchievementByID( m_currentDisplayedAchievement );
+ if ( pAchievement )
+ {
+ m_pAchievementInfoPanel->SetAchievement(pAchievement);
+ }
+ }
+ }
+}
+
+bool CCSAchievementAnnouncePanel::GetAlphaFromTime(float elapsedTime, float delay, float fadeInTime, float holdTime, float fadeOutTime, float&alpha)
+{
+ //We just pass through each phase, subtracting off the full time if we are already done with that phase
+ //We return whether the control should still be active
+
+ //I. Delay before fading in
+ if (elapsedTime > delay)
+ {
+ elapsedTime -= delay;
+ }
+ else
+ {
+ alpha = 0;
+ return true;
+ }
+
+
+ //II. Fade in time
+ if (elapsedTime > fadeInTime)
+ {
+ elapsedTime -= fadeInTime;
+ }
+ else
+ {
+ alpha = 255.0f * elapsedTime / fadeInTime;
+ return true;
+ }
+
+
+ //III. Hold at full alpha time
+ if (elapsedTime > holdTime)
+ {
+ elapsedTime -= holdTime;
+ }
+ else
+ {
+ alpha = 255.0f;
+ return true;
+ }
+
+ //IV. Fade out time
+ if (elapsedTime > fadeOutTime)
+ {
+ alpha = 0;
+ return false;
+ }
+ else
+ {
+ alpha = 1.0f - (elapsedTime / fadeOutTime);
+ alpha = Interpolators::SmoothStepStart(alpha);
+ alpha *= 255.0f;
+
+ if (m_achievementQueue.Count() > 0 && alpha < 128.0f)
+ {
+ return false;
+ }
+ return true;
+ }
+}
+
+ConVar glow_delay( "glow_delay", "0", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+ConVar glow_fadeInTime( "glow_fadeInTime", "0.1", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+ConVar glow_holdTime( "glow_holdTime", "0.1", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+ConVar glow_fadeOutTime( "glow_fadeOutTime", "2.5", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+
+bool CCSAchievementAnnouncePanel::GetGlowAlpha (float time, float& alpha)
+{
+
+
+ /*
+ float delay = 0.0f;
+ float fadeInTime = 0.3f;
+ float holdTime = 0.1f;
+ float fadeOutTime = 0.4f;
+ */
+
+ //return GetAlphaFromTime(time, delay, fadeInTime, holdTime, fadeOutTime, alpha);
+
+ return GetAlphaFromTime(time, glow_delay.GetFloat(), glow_fadeInTime.GetFloat(), glow_holdTime.GetFloat(), glow_fadeOutTime.GetFloat(), alpha);
+}
+
+
+ConVar popup_delay( "popup_delay", "0", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+ConVar popup_fadeInTime( "popup_fadeInTime", "0.3", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+ConVar popup_holdTime( "popup_holdTime", "3.5", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+ConVar popup_fadeOutTime( "popup_fadeOutTime", "3.0", FCVAR_CLIENTDLL | FCVAR_DEVELOPMENTONLY);
+
+bool CCSAchievementAnnouncePanel::GetAchievementPanelAlpha (float time, float& alpha)
+{
+ /*
+ float delay = 0.2f;
+ float fadeInTime = 0.3f;
+ float holdTime = 3.0f;
+ float fadeOutTime = 2.0f;
+ */
+
+ //return GetAlphaFromTime(time, delay, fadeInTime, holdTime, fadeOutTime, alpha);
+
+ return GetAlphaFromTime(time, popup_delay.GetFloat(), popup_fadeInTime.GetFloat(), popup_holdTime.GetFloat(), popup_fadeOutTime.GetFloat(), alpha);
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: creates child panels, passes down name to pick up any settings from res files.
+//-----------------------------------------------------------------------------
+CCSAchivementInfoPanel::CCSAchivementInfoPanel( vgui::Panel *parent, const char* name ) : BaseClass( parent, name )
+{
+ //Create the main components of the display and attach them to the panel
+ m_pAchievementIcon = SETUP_PANEL(new vgui::ScalableImagePanel( this, "Icon" ));
+ m_pAchievementNameLabel = new vgui::Label( this, "Name", "name" );
+ m_pAchievementDescLabel = new vgui::Label( this, "Description", "desc" );
+}
+
+CCSAchivementInfoPanel::~CCSAchivementInfoPanel()
+{
+ if (m_pAchievementIcon)
+ {
+ delete m_pAchievementIcon;
+ }
+
+ if (m_pAchievementNameLabel)
+ {
+ delete m_pAchievementNameLabel;
+ }
+
+ if (m_pAchievementDescLabel)
+ {
+ delete m_pAchievementDescLabel;
+ }
+}
+
+void CCSAchivementInfoPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ LoadControlSettings( "Resource/UI/Achievement_Popup.res" );
+
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ //Override the automatic scheme setting that happen above
+ SetBgColor( pScheme->GetColor( "AchievementsLightGrey", Color(255, 0, 0, 255) ) );
+ m_pAchievementNameLabel->SetFgColor(pScheme->GetColor("SteamLightGreen", Color(255, 255, 255, 255)));
+ m_pAchievementDescLabel->SetFgColor(pScheme->GetColor("White", Color(255, 255, 255, 255)));
+}
+
+void CCSAchivementInfoPanel::SetAchievement(IAchievement* pAchievement)
+{
+ //=============================================================================
+ // HPE_BEGIN:
+ // [dwenger] Get achievement name and description text from the localized file
+ //=============================================================================
+
+ // Set name and description
+ m_pAchievementNameLabel->SetText( ACHIEVEMENT_LOCALIZED_NAME( pAchievement ) );
+ m_pAchievementDescLabel->SetText( ACHIEVEMENT_LOCALIZED_DESC( pAchievement ) );
+
+ //Find, load and show the achievement icon
+ char imagePath[_MAX_PATH];
+ Q_strncpy( imagePath, "achievements\\", sizeof(imagePath) );
+ Q_strncat( imagePath, pAchievement->GetName(), sizeof(imagePath), COPY_ALL_CHARACTERS );
+ Q_strncat( imagePath, ".vtf", sizeof(imagePath), COPY_ALL_CHARACTERS );
+
+ char checkFile[_MAX_PATH];
+ Q_snprintf( checkFile, sizeof(checkFile), "materials\\vgui\\%s", imagePath );
+ if ( !g_pFullFileSystem->FileExists( checkFile ) )
+ {
+ Q_snprintf( imagePath, sizeof(imagePath), "hud\\icon_locked.vtf" );
+ }
+
+ m_pAchievementIcon->SetImage( imagePath );
+ m_pAchievementIcon->SetVisible( true );
+
+ //=============================================================================
+ // HPE_END
+ //=============================================================================
+}