//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef QUEST_NOTIFICATION_PANEL_H #define QUEST_NOTIFICATION_PANEL_H #ifdef _WIN32 #pragma once #endif #include #include "hudelement.h" #include "vgui_controls/EditablePanel.h" #include <../common/GameUI/cvarslider.h> #include "vgui_controls/CheckButton.h" #include "vgui_controls/ScrollableEditablePanel.h" #include "econ_item_inventory.h" using namespace vgui; #define NEVER_REPEAT -1.f class CQuestNotificationPanel; //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- class CQuestNotification { public: CQuestNotification( CEconItem *pItem ); enum ENotificationType_t { NOTIFICATION_TYPE_NEW_QUEST = 0, NOTIFICATION_TYPE_COMPLETED, NOTIFICATION_TYPE_FULLY_COMPLETED, NUM_NOTIFICATION_TYPES }; virtual ~CQuestNotification() {} virtual float Present( CQuestNotificationPanel* pNotificationPanel ); virtual void Update( CQuestNotificationPanel* pNotificationPanel ) = 0; virtual bool IsDone() const = 0; virtual bool ShouldPresent() const = 0; virtual ENotificationType_t GetType() const = 0; virtual float GetReplayTime() const = 0; CEconItemHandle& GetItemHandle() { return m_hItem; } protected: CEconItemHandle m_hItem; RealTimeCountdownTimer m_timerDialog; RealTimeCountdownTimer m_timerShow; }; //----------------------------------------------------------------------------- // Notifications where we'll speak //----------------------------------------------------------------------------- class CQuestNotification_Speaking : public CQuestNotification { public: CQuestNotification_Speaking( CEconItem *pItem ); virtual ~CQuestNotification_Speaking() {} virtual float Present( CQuestNotificationPanel* pNotificationPanel ) OVERRIDE; virtual void Update( CQuestNotificationPanel* pNotificationPanel ) OVERRIDE; virtual bool IsDone() const OVERRIDE; protected: virtual const char *GetSoundEntry( const CQuestThemeDefinition* pTheme, int nClassIndex ) = 0; const char *m_pszSoundToSpeak; }; //----------------------------------------------------------------------------- // New quest notification //----------------------------------------------------------------------------- class CQuestNotification_NewQuest : public CQuestNotification_Speaking { DECLARE_CLASS_SIMPLE( CQuestNotification_NewQuest, CQuestNotification_Speaking ); public: CQuestNotification_NewQuest( CEconItem *pItem ) : CQuestNotification_Speaking( pItem ) {} virtual ~CQuestNotification_NewQuest() {} virtual bool ShouldPresent() const OVERRIDE; ENotificationType_t GetType() const { return NOTIFICATION_TYPE_NEW_QUEST; } virtual float GetReplayTime() const { return 300.f; } static float k_flReplayTime; protected: virtual const char *GetSoundEntry( const CQuestThemeDefinition* pTheme, int nClassIndex ) OVERRIDE; static CUtlVector< itemid_t > m_vecNotifiedItemIDs; }; //----------------------------------------------------------------------------- // Quest complete notification //----------------------------------------------------------------------------- class CQuestNotification_CompletedQuest : public CQuestNotification_Speaking { DECLARE_CLASS_SIMPLE( CQuestNotification_CompletedQuest, CQuestNotification_Speaking ); public: CQuestNotification_CompletedQuest( CEconItem *pItem ); virtual ~CQuestNotification_CompletedQuest() {} virtual bool ShouldPresent() const; ENotificationType_t GetType() const { return NOTIFICATION_TYPE_COMPLETED; } virtual float GetReplayTime() const { return NEVER_REPEAT; } protected: virtual const char *GetSoundEntry( const CQuestThemeDefinition* pTheme, int nClassIndex ) OVERRIDE; RealTimeCountdownTimer m_PresentTimer; }; class CQuestNotification_FullyCompletedQuest : public CQuestNotification_CompletedQuest { DECLARE_CLASS_SIMPLE( CQuestNotification_FullyCompletedQuest, CQuestNotification_CompletedQuest ); public: CQuestNotification_FullyCompletedQuest( CEconItem *pItem ) : CQuestNotification_CompletedQuest( pItem ) { } virtual ~CQuestNotification_FullyCompletedQuest() {} ENotificationType_t GetType() const { return NOTIFICATION_TYPE_FULLY_COMPLETED; } protected: virtual const char *GetSoundEntry( const CQuestThemeDefinition* pTheme, int nClassIndex ) OVERRIDE; }; //----------------------------------------------------------------------------- // The quest notification panel where a character tells the user about quest state //----------------------------------------------------------------------------- class CQuestNotificationPanel : public CHudElement, public EditablePanel { DECLARE_CLASS_SIMPLE( CQuestNotificationPanel, EditablePanel ); public: CQuestNotificationPanel( const char *pszElementName ); virtual ~CQuestNotificationPanel(); virtual void ApplySchemeSettings( IScheme *pScheme ) OVERRIDE; virtual void PerformLayout() OVERRIDE; virtual void FireGameEvent( IGameEvent * event ) OVERRIDE; virtual void Reset() OVERRIDE; virtual bool ShouldDraw() OVERRIDE; virtual void OnThink() OVERRIDE; private: bool ShouldPresent(); void Update(); void CheckForNotificationOpportunities(); bool AddNotificationForItem( const CEconItemView *pItem, CQuestNotification* pNotification ); void SetCharacterImage( const char *pszImageName ); CUtlVector< CQuestNotification* > m_vecNotifications; float m_flTimeSinceLastShown; bool m_bIsPresenting; RealTimeCountdownTimer m_timerHoldUp; RealTimeCountdownTimer m_timerNotificationCooldown; RealTimeCountdownTimer m_animTimer; EditablePanel *m_pMainContainer; bool m_bInitialized; CUtlMap< itemid_t, CCopyableUtlVector< float > > m_mapNotifiedItemIDs; }; #endif // QUEST_NOTIFICATION_PANEL_H