You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
6.6 KiB
223 lines
6.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef CL_DEMOACTION_H |
|
#define CL_DEMOACTION_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
// Forward declarations |
|
#include <KeyValues.h> |
|
|
|
class CUtlBuffer; |
|
class CBaseDemoAction; |
|
class CBaseActionEditDialog; |
|
class CDemoEditorPanel; |
|
/* |
|
namespace vgui |
|
{ |
|
class Panel; |
|
} |
|
*/ |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Types of demo actions we can take |
|
|
|
// Actions all have a name and can have a start time/frame to auto start or can |
|
// be fired in response to other events |
|
//----------------------------------------------------------------------------- |
|
typedef enum |
|
{ |
|
DEMO_ACTION_UNKNOWN = 0, // error |
|
DEMO_ACTION_SKIPAHEAD, // SKip ahead in demo to time/frame |
|
DEMO_ACTION_STOPPLAYBACK, // Terminate playback |
|
DEMO_ACTION_PLAYCOMMANDS, // Type commands into console |
|
DEMO_ACTION_SCREENFADE_START, // Start fade w/ name |
|
DEMO_ACTION_SCREENFADE_STOP, // Cancel fade w/ name |
|
DEMO_ACTION_TEXTMESSAGE_START, // Start text message w/ name |
|
DEMO_ACTION_TEXTMESSAGE_STOP, // Stop text message by name |
|
DEMO_ACTION_PLAYCDTRACK_START, // Start playing cd track |
|
DEMO_ACTION_PLAYCDTRACK_STOP, // Cancel cd track |
|
DEMO_ACTION_PLAYSOUND_START, // Start playing sound |
|
DEMO_ACTION_PLAYSOUND_END, // Cancel sound |
|
|
|
DEMO_ACTION_ONSKIPPEDAHEAD, // Listener for named skip ahead succeeding |
|
DEMO_ACTION_ONSTOPPEDPLAYBACK, // Listener for stop event |
|
DEMO_ACTION_ONSCREENFADE_FINISHED, // Fire when screen fade of specified name finishes |
|
DEMO_ACTION_ONTEXTMESSAGE_FINISHED, // Fire when specified text message finishes |
|
DEMO_ACTION_ONPLAYCDTRACK_FINISHED, // Fire when played cd track finishes |
|
DEMO_ACTION_ONPLAYSOUND_FINISHED, // Fire when played sound finishes |
|
|
|
DEMO_ACTION_PAUSE, // Pause playback for N seconds w/auto resume |
|
DEMO_ACTION_CHANGEPLAYBACKRATE, // Slo-mo, etc |
|
|
|
DEMO_ACTION_ZOOM, // Zoom in/out with hold |
|
|
|
// Must be last |
|
NUM_DEMO_ACTIONS, |
|
} DEMOACTION; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
typedef enum |
|
{ |
|
ACTION_USES_NEITHER = 0, |
|
ACTION_USES_TICK, |
|
ACTION_USES_TIME, |
|
|
|
NUM_TIMING_TYPES, |
|
} DEMOACTIONTIMINGTYPE; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
struct DemoActionTimingContext |
|
{ |
|
int prevtick; |
|
int curtick; |
|
float prevtime; |
|
float curtime; |
|
}; |
|
|
|
typedef CBaseDemoAction * (*DEMOACTIONFACTORY_FUNC)( void ); |
|
typedef CBaseActionEditDialog *(*DEMOACTIONEDIT_FUNC)( CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction ); |
|
|
|
abstract_class CBaseDemoAction |
|
{ |
|
public: |
|
|
|
CBaseDemoAction(); |
|
virtual ~CBaseDemoAction(); |
|
|
|
virtual bool Init( KeyValues *pInitData ); |
|
virtual bool Update( const DemoActionTimingContext& tc ); |
|
|
|
// Do whatever the even is supposed to do |
|
virtual void FireAction( void ) = 0; |
|
|
|
virtual void Reset( void ); |
|
|
|
virtual void SaveKeysToBuffer( int depth, CUtlBuffer& buf ); |
|
|
|
virtual void OnActionFinished( void ); |
|
|
|
// Public methods |
|
public: |
|
|
|
DEMOACTION GetType( void ) const; |
|
void SetType( DEMOACTION actionType ); |
|
|
|
DEMOACTIONTIMINGTYPE GetTimingType( void ) const; |
|
void SetTimingType( DEMOACTIONTIMINGTYPE timingtype ); |
|
|
|
void SetActionFired( bool fired ); |
|
bool GetActionFired( void ) const; |
|
|
|
int GetStartTick( void ) const; |
|
void SetStartTick( int tick ); |
|
float GetStartTime( void ) const; |
|
void SetStartTime( float time ); |
|
|
|
void SetFinishedAction( bool finished ); |
|
bool HasActionFinished( void ) const; |
|
|
|
char const *GetActionName( void ) const; |
|
void SetActionName( char const *name ); |
|
|
|
bool ActionHasTarget( void ) const; |
|
char const *GetActionTarget( void ) const; |
|
void SetActionTarget( char const *name ); |
|
|
|
void SaveToBuffer( int depth, int index, CUtlBuffer& buf ); |
|
|
|
public: |
|
|
|
static void *operator new( size_t sz ); |
|
static void operator delete( void *pMem ); |
|
|
|
static char const *NameForType( DEMOACTION actionType ); |
|
static DEMOACTION TypeForName( char const *name ); |
|
|
|
static char const *NameForTimingType( DEMOACTIONTIMINGTYPE timingType ); |
|
static DEMOACTIONTIMINGTYPE TimingTypeForName( char const *name ); |
|
|
|
static void AddFactory( DEMOACTION actionType, DEMOACTIONFACTORY_FUNC func ); |
|
static CBaseDemoAction *CreateDemoAction( DEMOACTION actionType ); |
|
|
|
static void AddEditorFactory( DEMOACTION actionType, DEMOACTIONEDIT_FUNC func ); |
|
static CBaseActionEditDialog *CreateActionEditor( DEMOACTION actionType, CDemoEditorPanel *parent, CBaseDemoAction *action, bool newaction ); |
|
static bool HasEditorFactory( DEMOACTION actionType ); |
|
|
|
// Serialization helper ( handles indenting ) |
|
static void BufPrintf( int depth, CUtlBuffer& buf, PRINTF_FORMAT_STRING char const *fmt, ... ); |
|
|
|
private: |
|
|
|
enum |
|
{ |
|
MAX_ACTION_NAME = 64, |
|
}; |
|
|
|
DEMOACTION m_Type; |
|
|
|
bool m_bActionFired; |
|
bool m_bActionFinished; |
|
|
|
char m_szActionName[ MAX_ACTION_NAME ]; |
|
|
|
char m_szActionTarget[ MAX_ACTION_NAME ]; |
|
|
|
DEMOACTIONTIMINGTYPE m_Timing; |
|
int m_nStartTick; |
|
float m_flStartTime; |
|
}; |
|
|
|
#define DECLARE_DEMOACTION( type, classname ) \ |
|
static CBaseDemoAction *FnCreate##classname( void ) \ |
|
{ \ |
|
CBaseDemoAction *item = new classname(); \ |
|
if ( item ) item->SetType( type ); \ |
|
return item; \ |
|
} \ |
|
class CFactory##classname \ |
|
{ \ |
|
public: \ |
|
CFactory##classname() \ |
|
{ \ |
|
CBaseDemoAction::AddFactory( \ |
|
type, \ |
|
FnCreate##classname ); \ |
|
} \ |
|
}; \ |
|
static CFactory##classname g_Factory##classname; |
|
|
|
#define DECLARE_DEMOACTIONEDIT( type, classname ) \ |
|
static CBaseActionEditDialog *FnCreateEditor##classname \ |
|
( CDemoEditorPanel *parent, \ |
|
CBaseDemoAction *action, \ |
|
bool newaction ) \ |
|
{ \ |
|
CBaseActionEditDialog *editor = new classname( \ |
|
parent, action, newaction ); \ |
|
if ( editor ) editor->Init(); \ |
|
return editor; \ |
|
} \ |
|
class CFactoryEditor##classname \ |
|
{ \ |
|
public: \ |
|
CFactoryEditor##classname() \ |
|
{ \ |
|
CBaseDemoAction::AddEditorFactory( \ |
|
type, \ |
|
FnCreateEditor##classname ); \ |
|
} \ |
|
}; \ |
|
static CFactoryEditor##classname g_FactoryEditor##classname; |
|
|
|
#endif // CL_DEMOACTION_H
|
|
|