|
|
//========= Copyright � 1996-2008, Valve Corporation, All rights reserved. ============//
//
// Purpose: Client handler for instruction players how to play
//
//=============================================================================//
#ifndef _C_BASELESSON_H_
#define _C_BASELESSON_H_
#include "GameEventListener.h"
#include "hud_locator_target.h"
#define DECLARE_LESSON( _lessonClassName, _baseLessonClassName ) \
typedef _baseLessonClassName BaseClass;\ typedef _lessonClassName ThisClass;\ _lessonClassName( const char *pchName, bool bIsDefaultHolder, bool bIsOpenOpportunity, int nSplitScreenSlot )\ : _baseLessonClassName( pchName, bIsDefaultHolder, bIsOpenOpportunity, nSplitScreenSlot )\ {\ Init();\ }
enum LessonInstanceType { LESSON_INSTANCE_MULTIPLE, LESSON_INSTANCE_SINGLE_OPEN, LESSON_INSTANCE_FIXED_REPLACE, LESSON_INSTANCE_SINGLE_ACTIVE,
LESSON_INSTANCE_TYPE_TOTAL };
// This is used to solve a problem where bots can take the place of a player, where on or the other don't have valid entities on the client at the same time
#define MAX_DELAYED_PLAYER_SWAPS 8
struct delayed_player_swap_t { CHandle<C_BaseEntity> *phHandleToChange; int iNewUserID;
delayed_player_swap_t( void ) { phHandleToChange = NULL; iNewUserID = -1; } };
abstract_class CBaseLesson : public CGameEventListener { public:
CBaseLesson( const char *pchName, bool bIsDefaultHolder, bool bIsOpenOpportunity, int nSplitScreenSlot ); virtual ~CBaseLesson( void );
void AddPrerequisite( const char *pchLessonName );
const CGameInstructorSymbol& GetNameSymbol( void ) const { return m_stringName; } const char * GetName( void ) const { return m_stringName.String(); } int GetPriority( void ) const { return m_iPriority; } const char * GetCloseReason( void ) const { return m_stringCloseReason.String(); } void SetCloseReason( const char *pchReason ) { m_stringCloseReason = pchReason; }
CBaseLesson* GetRoot( void ) const { return m_pRoot; } void SetRoot( CBaseLesson *pRoot ); const CUtlVector < CBaseLesson * >* GetChildren( void ) const { return &m_OpenOpportunities; }
float GetInitTime( void ) { return m_fInitTime; } void SetStartTime( void ) { m_fStartTime = gpGlobals->curtime; } void ResetStartTime( void ) { m_fStartTime = 0.0f; m_bHasPlayedSound = false; }
bool ShouldShowSpew( void ); bool NoPriority( void ) const; bool IsDefaultHolder( void ) const { return m_bIsDefaultHolder; } bool IsOpenOpportunity( void ) const { return m_bIsOpenOpportunity; } bool IsLocked( void ) const; bool CanOpenWhenDead( void ) const { return m_bCanOpenWhenDead; } bool CanOpenOnceLearned( void ) const { return !m_bOnceLearnedNeverOpen; } bool IsUsableInMidair( void ) const { return m_bUsableInMidair; } bool IsInstructing( void ) const { return ( m_fStartTime > 0.0f ); } bool IsLearned( void ) const; bool PrerequisitesHaveBeenMet( void ) const; bool IsTimedOut( void );
int InstanceType( void ) const { return m_iInstanceType; } const CGameInstructorSymbol& GetReplaceKeySymbol( void ) const { return m_stringReplaceKey; } const char* GetReplaceKey( void ) const { return m_stringReplaceKey.String(); } int GetFixedInstancesMax( void ) const { return m_iFixedInstancesMax; } bool ShouldReplaceOnlyWhenStopped( void ) const { return m_bReplaceOnlyWhenStopped; } void SetInstanceActive( bool bInstanceActive ) { m_bInstanceActive = bInstanceActive; } bool IsInstanceActive( void ) const { return m_bInstanceActive; }
void ResetDisplaysAndSuccesses( void ); bool IncDisplayCount( void ); bool IncSuccessCount( void ); void SetDisplayCount( int iDisplayCount ) { m_iDisplayCount = iDisplayCount; } void SetSuccessCount( int iSuccessCount ) { m_iSuccessCount = iSuccessCount; } int GetDisplayCount( void ) const { return m_iDisplayCount; } int GetSuccessCount( void ) const { return m_iSuccessCount; } int GetDisplayLimit( void ) const { return m_iDisplayLimit; } int GetSuccessLimit( void ) const { return m_iSuccessLimit; }
void Init( void ); // NOT virtual, each constructor calls their own
virtual void InitPrerequisites( void ) {}; virtual void Start( void ) = 0; virtual void Stop( void ) = 0; virtual void OnOpen( void ) {}; virtual void Update( void ) {}; virtual void UpdateInactive( void ) {};
virtual bool ShouldDisplay( void ) const { return true; } virtual bool IsVisible( void ) const { return true; } virtual bool WasDisplayed( void ) const { return m_bWasDisplayed ? true : false; } virtual void SwapOutPlayers( int iOldUserID, int iNewUserID ) {} virtual void TakePlaceOf( CBaseLesson *pLesson );
int GetSplitScreenSlot() const { return m_nSplitScreenSlot; }
const char *GetGroup() { return m_szLessonGroup.String(); } void SetEnabled( bool bEnabled ) { m_bDisabled = !bEnabled; }
protected:
void MarkSucceeded( void ); void CloseOpportunity( const char *pchReason ); bool DoDelayedPlayerSwaps( void ) const;
private:
CBaseLesson *m_pRoot; CUtlVector < CBaseLesson * > m_OpenOpportunities; CUtlVector < const CBaseLesson * > m_Prerequisites;
CGameInstructorSymbol m_stringCloseReason;
protected:
CGameInstructorSymbol m_stringName;
private:
bool m_bInstanceActive : 1; bool m_bSuccessCounted : 1; bool m_bIsDefaultHolder : 1; bool m_bIsOpenOpportunity : 1;
protected:
LessonInstanceType m_iInstanceType;
int m_iPriority; CGameInstructorSymbol m_stringReplaceKey; int m_iFixedInstancesMax; bool m_bReplaceOnlyWhenStopped; int m_iTeam; bool m_bOnlyKeyboard; bool m_bOnlyGamepad; bool m_bNoSplitscreen;
int m_iDisplayLimit; int m_iDisplayCount; bool m_bWasDisplayed; int m_iSuccessLimit; int m_iSuccessCount; int m_nSplitScreenSlot;
float m_fLockDuration; float m_fTimeout; float m_fInitTime; float m_fStartTime; float m_fLockTime; float m_fUpdateInterval; bool m_bHasPlayedSound;
CGameInstructorSymbol m_szStartSound; CGameInstructorSymbol m_szLessonGroup;
bool m_bCanOpenWhenDead; bool m_bBumpWithTimeoutWhenLearned; bool m_bOnceLearnedNeverOpen; bool m_bCanTimeoutWhileInactive; bool m_bDisabled; bool m_bUsableInMidair;
// Right now we can only queue up 4 swaps...
// this number can be increased if more entity handle scripted variables are added
mutable delayed_player_swap_t m_pDelayedPlayerSwap[ MAX_DELAYED_PLAYER_SWAPS ]; mutable int m_iNumDelayedPlayerSwaps;
public:
// Colors for console spew in verbose mode
static Color m_rgbaVerboseHeader; static Color m_rgbaVerbosePlain; static Color m_rgbaVerboseName; static Color m_rgbaVerboseOpen; static Color m_rgbaVerboseClose; static Color m_rgbaVerboseSuccess; static Color m_rgbaVerboseUpdate; };
class CTextLesson : public CBaseLesson { public: DECLARE_LESSON( CTextLesson, CBaseLesson );
void Init( void ); // NOT virtual, each constructor calls their own
virtual void Start( void ); virtual void Stop( void );
protected:
CGameInstructorSymbol m_szDisplayText; CGameInstructorSymbol m_szDisplayParamText; CGameInstructorSymbol m_szBinding; CGameInstructorSymbol m_szGamepadBinding; };
class CIconLesson : public CTextLesson { public: DECLARE_LESSON( CIconLesson, CTextLesson );
void Init( void ); // NOT virtual, each constructor calls their own
virtual void Start( void ); virtual void Stop( void ); virtual void Update( void ); virtual void UpdateInactive( void );
virtual bool ShouldDisplay( void ) const; virtual bool IsVisible( void ) const; virtual void SwapOutPlayers( int iOldUserID, int iNewUserID ); virtual void TakePlaceOf( CBaseLesson *pLesson );
void SetLocatorBinding( CLocatorTarget * pLocatorTarget );
const char *GetCaptionColorString() { return m_szCaptionColor.String(); }
bool IsPresentComplete( void ); void PresentStart( void ); void PresentEnd( void );
private: virtual void UpdateLocatorTarget( CLocatorTarget *pLocatorTarget, C_BaseEntity *pIconTarget );
protected: CHandle<C_BaseEntity> m_hIconTarget; CGameInstructorSymbol m_szVguiTargetName; CGameInstructorSymbol m_szVguiTargetLookup; int m_nVguiTargetEdge; float m_flUpOffset; float m_flRelativeUpOffset; float m_fFixedPositionX; float m_fFixedPositionY;
int m_hLocatorTarget; int m_iFlags;
float m_fRange; float m_fCurrentDistance; float m_fOnScreenStartTime; float m_fUpdateDistanceTime;
CGameInstructorSymbol m_szOnscreenIcon; CGameInstructorSymbol m_szOffscreenIcon; CGameInstructorSymbol m_szCaptionColor;
bool m_bFixedPosition; bool m_bNoIconTarget; bool m_bAllowNodrawTarget; bool m_bVisible; bool m_bShowWhenOccluded; bool m_bNoOffscreen; bool m_bForceCaption; };
enum LessonAction { LESSON_ACTION_NONE,
LESSON_ACTION_SCOPE_IN, LESSON_ACTION_SCOPE_OUT, LESSON_ACTION_CLOSE, LESSON_ACTION_SUCCESS, LESSON_ACTION_LOCK, LESSON_ACTION_PRESENT_COMPLETE, LESSON_ACTION_PRESENT_START, LESSON_ACTION_PRESENT_END,
LESSON_ACTION_REFERENCE_OPEN,
LESSON_ACTION_IS_MULTIPLAYER,
LESSON_ACTION_SET, LESSON_ACTION_ADD, LESSON_ACTION_SUBTRACT, LESSON_ACTION_MULTIPLY, LESSON_ACTION_IS, LESSON_ACTION_LESS_THAN, LESSON_ACTION_HAS_PREFIX, LESSON_ACTION_HAS_BIT, LESSON_ACTION_BIT_COUNT_IS, LESSON_ACTION_BIT_COUNT_LESS_THAN,
LESSON_ACTION_GET_DISTANCE, LESSON_ACTION_GET_ANGULAR_DISTANCE, LESSON_ACTION_GET_PLAYER_DISPLAY_NAME, LESSON_ACTION_CLASSNAME_IS, LESSON_ACTION_MODELNAME_IS, LESSON_ACTION_TEAM_IS, LESSON_ACTION_HEALTH_LESS_THAN, LESSON_ACTION_HEALTH_PERCENTAGE_LESS_THAN, LESSON_ACTION_GET_ACTIVE_WEAPON, LESSON_ACTION_WEAPON_IS, LESSON_ACTION_WEAPON_HAS, LESSON_ACTION_GET_ACTIVE_WEAPON_SLOT, LESSON_ACTION_GET_WEAPON_SLOT, LESSON_ACTION_GET_WEAPON_IN_SLOT, LESSON_ACTION_CLIP_PERCENTAGE_LESS_THAN, LESSON_ACTION_WEAPON_AMMO_LOW, LESSON_ACTION_WEAPON_AMMO_FULL, LESSON_ACTION_WEAPON_AMMO_EMPTY, LESSON_ACTION_WEAPON_CAN_USE, LESSON_ACTION_USE_TARGET_IS, LESSON_ACTION_GET_USE_TARGET, LESSON_ACTION_GET_POTENTIAL_USE_TARGET,
// Enum continued in Mod_LessonAction
LESSON_ACTION_MOD_START, };
struct LessonElement_t { int iVariable; int iParamVarIndex; int iAction; _fieldtypes paramType; CGameInstructorSymbol szParam; bool bNot : 1; bool bOptionalParam : 1;
LessonElement_t( int p_iVariable, int p_iAction, bool p_bNot, bool p_bOptionalParam, const char *pchParam, int p_iParamVarIndex, _fieldtypes p_paramType ) { iVariable = p_iVariable; iAction = p_iAction; bNot = p_bNot; bOptionalParam = p_bOptionalParam; szParam = pchParam; iParamVarIndex = p_iParamVarIndex; paramType = p_paramType; }
LessonElement_t( const LessonElement_t &p_LessonElement ) { iVariable = p_LessonElement.iVariable; iAction = p_LessonElement.iAction; bNot = p_LessonElement.bNot; bOptionalParam = p_LessonElement.bOptionalParam; szParam = p_LessonElement.szParam; iParamVarIndex = p_LessonElement.iParamVarIndex; paramType = p_LessonElement.paramType; } };
struct LessonEvent_t { CUtlVector< LessonElement_t > elements; CGameInstructorSymbol szEventName; };
class CScriptedIconLesson : public CIconLesson { public: DECLARE_LESSON( CScriptedIconLesson, CIconLesson ) DECLARE_SIMPLE_DATADESC();
virtual ~CScriptedIconLesson( void );
static void PreReadLessonsFromFile( void ); static void Mod_PreReadLessonsFromFile( void );
void Init( void ); // NOT virtual, each constructor calls their own
virtual void InitPrerequisites( void ); virtual void OnOpen( void ); virtual void Update( void );
virtual void SwapOutPlayers( int iOldUserID, int iNewUserID );
virtual void FireGameEvent( IGameEvent *event ); virtual void ProcessOpenGameEvents( const CScriptedIconLesson *pRootLesson, const char *name, IGameEvent *event ); virtual void ProcessCloseGameEvents( const CScriptedIconLesson *pRootLesson, const char *name, IGameEvent *event ); virtual void ProcessSuccessGameEvents( const CScriptedIconLesson *pRootLesson, const char *name, IGameEvent *event );
CUtlVector< LessonEvent_t >& GetOpenEvents( void ) { return m_OpenEvents; } CUtlVector< LessonEvent_t >& GetCloseEvents( void ) { return m_CloseEvents; } CUtlVector< LessonEvent_t >& GetSuccessEvents( void ) { return m_SuccessEvents; } CUtlVector< LessonEvent_t >& GetOnOpenEvents( void ) { return m_OnOpenEvents; } CUtlVector< LessonEvent_t >& GetUpdateEvents( void ) { return m_UpdateEvents; }
bool ProcessElements( IGameEvent *event, const CUtlVector< LessonElement_t > *pElements );
private: void InitElementsFromKeys( CUtlVector< LessonElement_t > *pLessonElements, KeyValues *pKey ); void InitElementsFromElements( CUtlVector< LessonElement_t > *pLessonElements, const CUtlVector< LessonElement_t > *pLessonElements2 );
void InitFromKeys( KeyValues *pKey );
bool ProcessElement( IGameEvent *event, const LessonElement_t *pLessonElement, bool bInFailedScope );
bool ProcessElementAction( int iAction, bool bNot, const char *pchVarName, float &bVar, const CGameInstructorSymbol *pchParamName, float fParam ); bool ProcessElementAction( int iAction, bool bNot, const char *pchVarName, int &bVar, const CGameInstructorSymbol *pchParamName, float fParam ); bool ProcessElementAction( int iAction, bool bNot, const char *pchVarName, bool &bVar, const CGameInstructorSymbol *pchParamName, float fParam ); bool ProcessElementAction( int iAction, bool bNot, const char *pchVarName, EHANDLE &hVar, const CGameInstructorSymbol *pchParamName, float fParam, C_BaseEntity *pParam, const char *pchParam ); bool ProcessElementAction( int iAction, bool bNot, const char *pchVarName, CGameInstructorSymbol *pchVar, const CGameInstructorSymbol *pchParamName, const char *pchParam );
// Implemented per mod so they can have custom actions
bool Mod_ProcessElementAction( int iAction, bool bNot, const char *pchVarName, EHANDLE &hVar, const CGameInstructorSymbol *pchParamName, float fParam, C_BaseEntity *pParam, const char *pchParam, bool &bModHandled );
LessonEvent_t * AddOpenEvent( void ); LessonEvent_t * AddCloseEvent( void ); LessonEvent_t * AddSuccessEvent( void ); LessonEvent_t * AddOnOpenEvent( void ); LessonEvent_t * AddUpdateEvent( void );
private: static CUtlDict< int, int > LessonActionMap;
EHANDLE m_hLocalPlayer; float m_fOutput; CHandle<C_BaseEntity> m_hEntity1; CHandle<C_BaseEntity> m_hEntity2; CGameInstructorSymbol m_szString1; CGameInstructorSymbol m_szString2; int m_iInteger1; int m_iInteger2; float m_fFloat1; float m_fFloat2;
CUtlVector< CGameInstructorSymbol > m_PrerequisiteNames; CUtlVector< LessonEvent_t > m_OpenEvents; CUtlVector< LessonEvent_t > m_CloseEvents; CUtlVector< LessonEvent_t > m_SuccessEvents; CUtlVector< LessonEvent_t > m_OnOpenEvents; CUtlVector< LessonEvent_t > m_UpdateEvents;
float m_fUpdateEventTime; CScriptedIconLesson *m_pDefaultHolder;
int m_iScopeDepth;
// Need this to get offsets to scripted variables
friend class LessonVariableInfo; friend int LessonActionFromString( const char *pchName ); };
#endif // _C_BASELESSON_H_
|