//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef SCENEENTITY_CLASS_H #define SCENEENTITY_CLASS_H #ifdef _WIN32 #pragma once #endif #include "ichoreoeventcallback.h" class CSceneListManager; //----------------------------------------------------------------------------- // Purpose: FIXME, need to deal with save/restore //----------------------------------------------------------------------------- class CSceneEntity : public CPointEntity, public IChoreoEventCallback { friend class CInstancedSceneEntity; public: enum { SCENE_ACTION_UNKNOWN = 0, SCENE_ACTION_CANCEL, SCENE_ACTION_RESUME, }; enum { SCENE_BUSYACTOR_DEFAULT = 0, SCENE_BUSYACTOR_WAIT, SCENE_BUSYACTOR_INTERRUPT, SCENE_BUSYACTOR_INTERRUPT_CANCEL, }; DECLARE_CLASS( CSceneEntity, CPointEntity ); DECLARE_SERVERCLASS(); CSceneEntity( void ); ~CSceneEntity( void ); // From IChoreoEventCallback virtual void StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual void EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual void ProcessEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual bool CheckEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ); virtual int UpdateTransmitState(); virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo ); void SetRecipientFilter( IRecipientFilter *filter ); virtual void Activate(); virtual void Precache( void ); virtual void Spawn( void ); virtual void UpdateOnRemove( void ); virtual void OnRestore(); virtual void OnLoaded(); virtual int DrawDebugTextOverlays(); DECLARE_DATADESC(); virtual void OnSceneFinished( bool canceled, bool fireoutput ); virtual void DoThink( float frametime ); virtual void PauseThink( void ); bool IsPlayingBack() const { return m_bIsPlayingBack; } bool IsPaused() const { return m_bPaused; } bool IsMultiplayer() const { return m_bMultiplayer; } bool IsInterruptable(); virtual void ClearInterrupt(); virtual void CheckInterruptCompletion(); virtual bool InterruptThisScene( CSceneEntity *otherScene ); void RequestCompletionNotification( CSceneEntity *otherScene ); virtual void NotifyOfCompletion( CSceneEntity *interruptor ); void AddListManager( CSceneListManager *pManager ); void ClearActivatorTargets( void ); void SetBreakOnNonIdle( bool bBreakOnNonIdle ) { m_bBreakOnNonIdle = bBreakOnNonIdle; } bool ShouldBreakOnNonIdle( void ) { return m_bBreakOnNonIdle; } // Inputs void InputStartPlayback( inputdata_t &inputdata ); void InputPausePlayback( inputdata_t &inputdata ); void InputResumePlayback( inputdata_t &inputdata ); void InputCancelPlayback( inputdata_t &inputdata ); void InputCancelAtNextInterrupt( inputdata_t &inputdata ); void InputPitchShiftPlayback( inputdata_t &inputdata ); void InputTriggerEvent( inputdata_t &inputdata ); // If the scene is playing, finds an actor in the scene who can respond to the specified concept token void InputInterjectResponse( inputdata_t &inputdata ); // If this scene is waiting on an actor, give up and quit trying. void InputStopWaitingForActor( inputdata_t &inputdata ); virtual void StartPlayback( void ); virtual void PausePlayback( void ); virtual void ResumePlayback( void ); virtual void CancelPlayback( void ); virtual void PitchShiftPlayback( float fPitch ); virtual void QueueResumePlayback( void ); bool ValidScene() const; // Scene load/unload static CChoreoScene *LoadScene( const char *filename, IChoreoEventCallback *pCallback ); void UnloadScene( void ); struct SpeakEventSound_t { CUtlSymbol m_Symbol; float m_flStartTime; }; static bool SpeakEventSoundLessFunc( const SpeakEventSound_t& lhs, const SpeakEventSound_t& rhs ); bool GetSoundNameForPlayer( CChoreoEvent *event, CBasePlayer *player, char *buf, size_t buflen ); void BuildSortedSpeakEventSoundsPrefetchList( CChoreoScene *scene, CUtlSymbolTable& table, CUtlRBTree< SpeakEventSound_t >& soundnames, float timeOffset ); void PrefetchSpeakEventSounds( CUtlSymbolTable& table, CUtlRBTree< SpeakEventSound_t >& soundnames ); // Event handlers virtual void DispatchStartExpression( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndExpression( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartFlexAnimation( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndFlexAnimation( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartGesture( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndGesture( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartLookAt( CChoreoScene *scene, CBaseFlex *actor, CBaseEntity *actor2, CChoreoEvent *event ); virtual void DispatchEndLookAt( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartMoveTo( CChoreoScene *scene, CBaseFlex *actor, CBaseEntity *actor2, CChoreoEvent *event ); virtual void DispatchEndMoveTo( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartSpeak( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event, soundlevel_t iSoundlevel ); virtual void DispatchEndSpeak( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartFace( CChoreoScene *scene, CBaseFlex *actor, CBaseEntity *actor2, CChoreoEvent *event ); virtual void DispatchEndFace( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartSequence( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndSequence( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartSubScene( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchStartInterrupt( CChoreoScene *scene, CChoreoEvent *event ); virtual void DispatchEndInterrupt( CChoreoScene *scene, CChoreoEvent *event ); virtual void DispatchStartGeneric( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndGeneric( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); // NPC can play interstitial vcds (such as responding to the player doing something during a scene) virtual void DispatchStartPermitResponses( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); virtual void DispatchEndPermitResponses( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event ); // Global events virtual void DispatchProcessLoop( CChoreoScene *scene, CChoreoEvent *event ); virtual void DispatchPauseScene( CChoreoScene *scene, const char *parameters ); virtual void DispatchStopPoint( CChoreoScene *scene, const char *parameters ); virtual float EstimateLength( void ); void CancelIfSceneInvolvesActor( CBaseEntity *pActor ); bool InvolvesActor( CBaseEntity *pActor ); // NOTE: returns false if scene hasn't loaded yet void GenerateSoundScene( CBaseFlex *pActor, const char *soundname ); virtual float GetPostSpeakDelay() { return 1.0; } bool HasUnplayedSpeech( void ); bool HasFlexAnimation( void ); void SetCurrentTime( float t, bool forceClientSync ); void InputScriptPlayerDeath( inputdata_t &inputdata ); // Data public: string_t m_iszSceneFile; string_t m_iszResumeSceneFile; EHANDLE m_hWaitingForThisResumeScene; bool m_bWaitingForResumeScene; string_t m_iszTarget1; string_t m_iszTarget2; string_t m_iszTarget3; string_t m_iszTarget4; string_t m_iszTarget5; string_t m_iszTarget6; string_t m_iszTarget7; string_t m_iszTarget8; EHANDLE m_hTarget1; EHANDLE m_hTarget2; EHANDLE m_hTarget3; EHANDLE m_hTarget4; EHANDLE m_hTarget5; EHANDLE m_hTarget6; EHANDLE m_hTarget7; EHANDLE m_hTarget8; CNetworkVar( bool, m_bIsPlayingBack ); CNetworkVar( bool, m_bPaused ); CNetworkVar( bool, m_bMultiplayer ); CNetworkVar( float, m_flForceClientTime ); float m_flCurrentTime; float m_flFrameTime; bool m_bCancelAtNextInterrupt; float m_fPitch; bool m_bAutomated; int m_nAutomatedAction; float m_flAutomationDelay; float m_flAutomationTime; // A pause from an input requires another input to unpause (it's a hard pause) bool m_bPausedViaInput; // Waiting for the actor to be able to speak. bool m_bWaitingForActor; // Waiting for a point at which we can interrupt our actors bool m_bWaitingForInterrupt; bool m_bInterruptedActorsScenes; bool m_bBreakOnNonIdle; public: virtual CBaseFlex *FindNamedActor( int index ); virtual CBaseFlex *FindNamedActor( CChoreoActor *pChoreoActor ); virtual CBaseFlex *FindNamedActor( const char *name ); virtual CBaseEntity *FindNamedEntity( const char *name, CBaseEntity *pActor = NULL, bool bBaseFlexOnly = false, bool bUseClear = false ); virtual CBaseEntity *FindNamedEntityFallback( const char *name, CBaseEntity *pActor = NULL, bool bBaseFlexOnly = false, bool bUseClear = false ); CBaseEntity *FindNamedTarget( string_t iszTarget, bool bBaseFlexOnly = false ); virtual CBaseEntity *FindNamedEntityClosest( const char *name, CBaseEntity *pActor = NULL, bool bBaseFlexOnly = false, bool bUseClear = false, const char *pszSecondary = NULL ); EOZ_Hacks::ResponseFollowup m_followup; private: CUtlVector< CHandle< CBaseFlex > > m_hActorList; CUtlVector< CHandle< CBaseEntity > > m_hRemoveActorList; private: inline void SetRestoring( bool bRestoring ); // Prevent derived classed from using this! virtual void Think( void ) {}; void ClearSceneEvents( CChoreoScene *scene, bool canceled ); void ClearSchedules( CChoreoScene *scene ); float GetSoundSystemLatency( void ); void PrecacheScene( CChoreoScene *scene ); CChoreoScene *GenerateSceneForSound( CBaseFlex *pFlexActor, const char *soundname ); bool CheckActors(); void PrefetchAnimBlocks( CChoreoScene *scene ); bool ShouldNetwork() const; // Set if we tried to async the scene but the FS returned that the data was not loadable bool m_bSceneMissing; CChoreoScene *m_pScene; CNetworkVar( int, m_nSceneStringIndex ); const ConVar *m_pcvSndMixahead; COutputEvent m_OnStart; COutputEvent m_OnCompletion; COutputEvent m_OnCanceled; COutputEvent m_OnTrigger1; COutputEvent m_OnTrigger2; COutputEvent m_OnTrigger3; COutputEvent m_OnTrigger4; COutputEvent m_OnTrigger5; COutputEvent m_OnTrigger6; COutputEvent m_OnTrigger7; COutputEvent m_OnTrigger8; COutputEvent m_OnTrigger9; COutputEvent m_OnTrigger10; COutputEvent m_OnTrigger11; COutputEvent m_OnTrigger12; COutputEvent m_OnTrigger13; COutputEvent m_OnTrigger14; COutputEvent m_OnTrigger15; COutputEvent m_OnTrigger16; int m_nInterruptCount; bool m_bInterrupted; CHandle< CSceneEntity > m_hInterruptScene; bool m_bCompletedEarly; bool m_bInterruptSceneFinished; CUtlVector< CHandle< CSceneEntity > > m_hNotifySceneCompletion; CUtlVector< CHandle< CSceneListManager > > m_hListManagers; bool m_bRestoring; bool m_bGenerated; string_t m_iszSoundName; CHandle< CBaseFlex > m_hActor; EHANDLE m_hActivator; int m_BusyActor; int m_iPlayerDeathBehavior; CRecipientFilter *m_pRecipientFilter; public: void SetBackground( bool bIsBackground ); bool IsBackground( void ); }; #endif // SCENEENTITY_CLASS_H