diff options
Diffstat (limited to 'mp/src/game/client/hud_controlpointicons.h')
| -rw-r--r-- | mp/src/game/client/hud_controlpointicons.h | 438 |
1 files changed, 438 insertions, 0 deletions
diff --git a/mp/src/game/client/hud_controlpointicons.h b/mp/src/game/client/hud_controlpointicons.h new file mode 100644 index 00000000..46e2fc93 --- /dev/null +++ b/mp/src/game/client/hud_controlpointicons.h @@ -0,0 +1,438 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#ifndef HUD_CONTROLPOINTICONS_H
+#define HUD_CONTROLPOINTICONS_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "cbase.h"
+#include "hudelement.h"
+#include <vgui_controls/Panel.h>
+#include <vgui_controls/Label.h>
+#include <vgui_controls/ImagePanel.h>
+#include "vgui_controls/EditablePanel.h"
+#include "vgui_controls/AnimationController.h"
+#include "vgui_controls/CircularProgressBar.h"
+#include <vgui/ISurface.h>
+#include "tf_controls.h"
+#include "IconPanel.h"
+
+#define PULSE_TIME_PER_ICON 1.5f
+
+#define PULSE_RAMP_TIME 0.5
+#define PULSE_REMAP_SIZE 6.0
+#define FAKE_CAPTURE_TIME 5.0
+#define FAKE_CAPTURE_POST_PAUSE 2.0
+
+extern ConVar mp_capstyle;
+extern ConVar mp_blockstyle;
+
+#define STARTCAPANIM_SWOOP_LENGTH 0.4
+#define STARTCAPANIM_ICON_SWITCH 0.15
+#define FINISHCAPANIM_SWOOP_LENGTH 0.2
+
+#define CAP_BOX_INDENT_X XRES(2)
+#define CAP_BOX_INDENT_Y YRES(2)
+
+#define CP_TEXTURE_COUNT 8
+
+class CControlPointIcon;
+
+// Options for how the cap progress teardrop positions itself around the cap point icon
+enum
+{
+ CP_DIR_N,
+ CP_DIR_NW,
+ CP_DIR_NE,
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CControlPointCountdown : public vgui::EditablePanel
+{
+ DECLARE_CLASS_SIMPLE( CControlPointCountdown, vgui::EditablePanel );
+
+public:
+ CControlPointCountdown(Panel *parent, const char *name);
+
+ virtual void ApplySchemeSettings( IScheme *scheme );
+ virtual void PerformLayout();
+ virtual void OnTick( void );
+
+ void SetUnlockTime( float flTime );
+ float GetUnlockTime( void ){ return m_flUnlockTime; }
+
+private:
+
+ bool m_bFire5SecRemain;
+ bool m_bFire4SecRemain;
+ bool m_bFire3SecRemain;
+ bool m_bFire2SecRemain;
+ bool m_bFire1SecRemain;
+ bool m_bFire0SecRemain;
+
+ int m_flUnlockTime;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CControlPointProgressBar : public vgui::EditablePanel
+{
+ DECLARE_CLASS_SIMPLE( CControlPointProgressBar, vgui::EditablePanel );
+public:
+ CControlPointProgressBar(Panel *parent);
+
+ virtual void ApplySchemeSettings( IScheme *pScheme );
+ virtual void PerformLayout( void );
+ virtual void Paint( void );
+ virtual bool IsVisible( void );
+ virtual void Reset( void );
+
+ void SetupForPoint( CControlPointIcon *pIcon );
+ void UpdateBarText( void );
+
+private:
+ CControlPointIcon *m_pAttachedToIcon;
+ vgui::CircularProgressBar *m_pBar;
+ vgui::Label *m_pBarText;
+ CIconPanel *m_pTeardrop;
+ CIconPanel *m_pTeardropSide;
+ CIconPanel *m_pBlocked;
+ int m_iOrgHeight;
+ int m_iMidGroupIndex;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CControlPointIconSwoop : public vgui::ImagePanel, public CGameEventListener
+{
+ DECLARE_CLASS_SIMPLE( CControlPointIconSwoop, vgui::ImagePanel );
+public:
+ CControlPointIconSwoop(Panel *parent, const char *name) : vgui::ImagePanel( parent, name )
+ {
+ SetImage( "../sprites/obj_icons/capture_highlight" );
+ SetShouldScaleImage( true );
+ ListenForGameEvent( "localplayer_changeteam" );
+ }
+
+ virtual void PaintBackground( void )
+ {
+ float flElapsedTime = (gpGlobals->curtime - m_flStartCapAnimStart);
+
+ if (GetImage())
+ {
+ surface()->DrawSetColor(255, 255, 255, 255);
+ int iYPos = RemapValClamped( flElapsedTime, 0, STARTCAPANIM_SWOOP_LENGTH, 0, GetTall() );
+ GetImage()->SetPos( 0, iYPos );
+ GetImage()->Paint();
+ }
+
+ // Once we've finished the swoop, go away
+ if ( flElapsedTime >= STARTCAPANIM_SWOOP_LENGTH )
+ {
+ SetVisible( false );
+ }
+ }
+
+ virtual bool IsVisible( void )
+ {
+ if ( IsInFreezeCam() == true )
+ return false;
+
+ return BaseClass::IsVisible();
+ }
+
+ void StartSwoop( void )
+ {
+ m_flStartCapAnimStart = gpGlobals->curtime;
+ }
+
+ void FireGameEvent( IGameEvent * event )
+ {
+ if ( FStrEq( "localplayer_changeteam", event->GetName() ) )
+ {
+ SetVisible( false );
+ }
+ }
+
+private:
+ float m_flStartCapAnimStart;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CControlPointIconCapArrow : public vgui::Panel
+{
+ DECLARE_CLASS_SIMPLE( CControlPointIconCapArrow, vgui::Panel );
+public:
+ CControlPointIconCapArrow( CControlPointIcon *pIcon, Panel *parent, const char *name);
+
+ virtual void Paint( void );
+ virtual bool IsVisible( void );
+
+ void SetImage( const char *pszImage )
+ {
+ m_pArrowMaterial = materials->FindMaterial( pszImage, TEXTURE_GROUP_VGUI );
+ }
+
+private:
+ IMaterial *m_pArrowMaterial;
+ CControlPointIcon *m_pAttachedToIcon;
+
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CControlPointIconCapturePulse : public vgui::ImagePanel
+{
+ DECLARE_CLASS_SIMPLE( CControlPointIconCapturePulse, vgui::ImagePanel );
+public:
+ CControlPointIconCapturePulse(Panel *parent, const char *name) : vgui::ImagePanel( parent, name )
+ {
+ SetImage( "../sprites/obj_icons/icon_obj_white" );
+ SetShouldScaleImage( true );
+ }
+
+ virtual void PaintBackground( void )
+ {
+ if ( m_flFinishCapAnimStart && gpGlobals->curtime > m_flFinishCapAnimStart )
+ {
+ float flElapsedTime = MAX( 0, (gpGlobals->curtime - m_flFinishCapAnimStart) );
+ if (GetImage())
+ {
+ surface()->DrawSetColor(255, 255, 255, 255);
+ int iSize = RemapValClamped( flElapsedTime, 0, FINISHCAPANIM_SWOOP_LENGTH, GetWide(), m_iShrinkSize );
+ GetImage()->SetPos( (GetWide() - iSize)*0.5, (GetTall() - iSize)*0.5 );
+ GetImage()->SetSize( iSize, iSize );
+ GetImage()->Paint();
+ }
+
+ // Once we've finished the swoop, go away
+ if ( flElapsedTime >= FINISHCAPANIM_SWOOP_LENGTH )
+ {
+ SetVisible( false );
+ }
+ }
+ }
+
+ void StartPulse( float flTime, int iShrinkSize )
+ {
+ m_flFinishCapAnimStart = flTime;
+ m_iShrinkSize = iShrinkSize;
+
+ if ( GetWide() < m_iShrinkSize )
+ {
+ SetWide( m_iShrinkSize );
+ }
+ }
+
+ virtual bool IsVisible( void )
+ {
+ if ( IsInFreezeCam() == true )
+ return false;
+
+ return BaseClass::IsVisible();
+ }
+
+private:
+ float m_flFinishCapAnimStart;
+ int m_iShrinkSize;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: The base image in the cap point icons that pulses.
+//-----------------------------------------------------------------------------
+class CControlPointIconPulseable : public vgui::ImagePanel
+{
+ DECLARE_CLASS_SIMPLE( CControlPointIconPulseable, vgui::ImagePanel );
+public:
+ CControlPointIconPulseable(Panel *parent, const char *name, int iIndex) : vgui::ImagePanel( parent, name )
+ {
+ SetShouldScaleImage( true );
+ m_pPulseImage = NULL;
+ m_iCPIndex = iIndex;
+ }
+
+ virtual void ApplySchemeSettings( IScheme *pScheme );
+ virtual void OnSizeChanged(int newWide, int newTall);
+ virtual void PaintBackground( void );
+
+ void StartPulsing( float flDelay, float flPulseTime, bool bAccelerate );
+ void StopPulsing( void );
+
+ virtual bool IsVisible( void )
+ {
+ if ( IsInFreezeCam() == true )
+ return false;
+
+ return BaseClass::IsVisible();
+ }
+
+private:
+ int m_iCPIndex;
+ float m_flStartCapAnimStart;
+ float m_flPulseTime;
+ bool m_bAccelerateOverCapture;
+ IImage *m_pPulseImage;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: A single icon that shows the state of one control point
+//-----------------------------------------------------------------------------
+class CControlPointIcon : public vgui::EditablePanel, public CHudElement
+{
+ DECLARE_CLASS_SIMPLE( CControlPointIcon, vgui::EditablePanel );
+public:
+ CControlPointIcon( Panel *parent, const char *pName, int iIndex );
+ ~CControlPointIcon( void );
+
+ virtual void ApplySchemeSettings( IScheme *scheme );
+ virtual void PerformLayout( void );
+
+ void UpdateImage( void );
+ void UpdateCapImage( void );
+ bool IsPointLocked( void );
+ int GetCapIndex( void ) { return m_iCPIndex; }
+ void SetSwipeUp( bool bUp ) { m_bSwipeUp = bUp; }
+ bool ShouldSwipeUp( void ) { return m_bSwipeUp; }
+ int GetCapProgressDir( void ) { return m_iCapProgressDir; }
+ void SetCapProgressDir( int iDir ) { m_iCapProgressDir = iDir; }
+ void FakePulse( float flTime );
+ bool IsVisible( void );
+ virtual void Paint( void );
+ bool IsPointUnlockCountdownRunning( void );
+
+ virtual void FireGameEvent( IGameEvent *event );
+
+ void SetUnlockTime( float flTime )
+ {
+ if ( m_pCountdown )
+ {
+ m_pCountdown->SetUnlockTime( flTime );
+ }
+ }
+
+ void SetTimerTime( float flTime ); // used to display CCPTimerLogic countdowns
+
+private:
+ virtual void OnTick();
+
+private:
+ int m_iCPIndex;
+ vgui::ImagePanel *m_pOverlayImage;
+ CControlPointIconPulseable *m_pBaseImage;
+ CControlPointIconCapArrow *m_pCapImage;
+ DHANDLE< CControlPointIconSwoop > m_pCapHighlightImage;
+ DHANDLE< CControlPointIconCapturePulse > m_pCapPulseImage;
+ vgui::ImagePanel *m_pCapPlayerImage;
+ vgui::Label *m_pCapNumPlayers;
+ bool m_bSwipeUp;
+ float m_flStartCapAnimStart;
+ int m_iCapProgressDir;
+ int m_iPrevCappers;
+ bool m_bCachedLockedState;
+
+ bool m_bCachedCountdownState;
+ CControlPointCountdown *m_pCountdown;
+
+ DHANDLE< CExLabel > m_pCPTimerLabel; // used to display CCPTimerLogic countdowns
+ DHANDLE< vgui::ImagePanel > m_pCPTimerBG; // used to display CCPTimerLogic countdowns
+ float m_flCPTimerTime;
+ bool m_bRedText;
+ Color m_cRegularColor;
+ Color m_cHighlightColor;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CHudControlPointIcons : public CHudElement, public vgui::Panel
+{
+public:
+ DECLARE_CLASS_SIMPLE( CHudControlPointIcons, vgui::Panel );
+
+ CHudControlPointIcons( const char *pName );
+ virtual ~CHudControlPointIcons( void );
+
+ virtual void ApplySchemeSettings( IScheme *scheme );
+ virtual void PerformLayout( void );
+ virtual void Paint();
+ virtual void Init();
+ virtual void Reset();
+ virtual bool IsVisible( void );
+ virtual void LevelShutdown( void );
+
+ virtual bool ShouldDraw( void )
+ {
+ return IsVisible();
+ }
+
+ virtual void FireGameEvent( IGameEvent *event );
+
+ void UpdateProgressBarFor( int iIndex );
+ void InitIcons();
+ void ShutdownIcons();
+ void DrawBackgroundBox( int xpos, int ypos, int nBoxWidth, int nBoxHeight, bool bCutCorner );
+ bool PaintTeamBaseIcon( int index, float flXPos, float flYPos, float flIconSize );
+
+ bool IsFakingCapture( int index = -1, bool *bMult = NULL, float *flFakeTime = NULL )
+ {
+ if ( m_bFakingCapture && m_flFakeCaptureTime < gpGlobals->curtime )
+ {
+ m_iCurrentCP = -1;
+ m_bFakingCapture = false;
+ m_bFakingCaptureMult = false;
+ }
+
+ if ( bMult) *bMult = m_bFakingCaptureMult;
+ if ( flFakeTime ) *flFakeTime = m_flFakeCaptureTime;
+ return (m_bFakingCapture && (index == -1 || index == m_iCurrentCP));
+ }
+
+private:
+ int m_iCPTextures[CP_TEXTURE_COUNT];
+ int m_iCPCappingTextures[CP_TEXTURE_COUNT];
+ int m_iTeamBaseTextures[MAX_TEAMS];
+
+ int m_iBackgroundTexture;
+ Color m_clrBackground;
+ Color m_clrBorder;
+
+ int m_iCurrentCP; // the index of the control point the local is currently in
+ int m_iLastCP; // the index of the control point the local player was last in
+
+ // Capture faking for Intros
+ float m_flPulseTime;
+ bool m_bFakingCapture;
+ bool m_bFakingCaptureMult;
+ float m_flFakeCaptureTime;
+
+ CPanelAnimationVar( vgui::HFont, m_hTextFont, "ChatFont", "Default" );
+
+ CPanelAnimationVarAliasType( int, m_nCornerCutSize, "CornerCutSize", "5", "proportional_int" );
+ CPanelAnimationVarAliasType( int, m_nBackgroundOverlap, "BackgroundOverlap", "5", "proportional_int" );
+
+ CPanelAnimationVarAliasType( int, m_iIconStartX, "icon_start_x", "10", "proportional_int" );
+ CPanelAnimationVarAliasType( int, m_iIconStartY, "icon_start_y", "10", "proportional_int" );
+ CPanelAnimationVarAliasType( float, m_flIconExpand, "icon_expand", "0", "proportional_float" );
+ CPanelAnimationVarAliasType( int, m_iIconSize, "iconsize", "24", "proportional_int" );
+
+
+ CPanelAnimationVarAliasType( int, m_iIconGapWidth, "separator_width", "7", "proportional_int" );
+ CPanelAnimationVarAliasType( int, m_iIconGapHeight, "separator_height", "9", "proportional_int" );
+ CPanelAnimationVarAliasType( int, m_nHeightOffset, "height_offset", "0", "proportional_int" );
+
+ CUtlVector<CControlPointIcon *> m_Icons;
+};
+
+#endif // HUD_CONTROLPOINTICONS_H
|