292 lines
7.7 KiB
C
292 lines
7.7 KiB
C
|
// Copyright (C) 2007 Id Software, Inc.
|
||
|
//
|
||
|
|
||
|
|
||
|
#ifndef __COMPILEDSCRIPT_BASE_H__
|
||
|
#define __COMPILEDSCRIPT_BASE_H__
|
||
|
|
||
|
class idEventDef;
|
||
|
|
||
|
const int COMPILED_SCRIPT_INTERFACE_VERSION = 2;
|
||
|
|
||
|
class sdCSTypeInfo {
|
||
|
public:
|
||
|
class sdCSTypeInfoList {
|
||
|
public:
|
||
|
sdCSTypeInfoList( void ) : list( NULL ) { ; }
|
||
|
|
||
|
void Append( sdCSTypeInfo* item ) {
|
||
|
item->SetNext( list );
|
||
|
list = item;
|
||
|
}
|
||
|
|
||
|
int Num( void ) {
|
||
|
int count = 0;
|
||
|
sdCSTypeInfo* p = list;
|
||
|
while ( p != NULL ) {
|
||
|
count++;
|
||
|
p = p->GetNext();
|
||
|
}
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
sdCSTypeInfo* FindRoot( void ) {
|
||
|
sdCSTypeInfo* p = list;
|
||
|
while ( p != NULL ) {
|
||
|
if ( strlen( p->GetSuperName() ) == 0 ) {
|
||
|
return p;
|
||
|
}
|
||
|
p = p->GetNext();
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
sdCSTypeInfo* FindChild( sdCSTypeInfo* root, sdCSTypeInfo* child ) {
|
||
|
if ( child == NULL ) {
|
||
|
child = list;
|
||
|
} else {
|
||
|
child = child->GetNext();
|
||
|
}
|
||
|
while ( child != NULL ) {
|
||
|
if ( *root == child->GetSuperName() ) {
|
||
|
return child;
|
||
|
}
|
||
|
child = child->GetNext();
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
sdCSTypeInfo* list;
|
||
|
};
|
||
|
|
||
|
typedef sdCSTypeInfo* Ptr;
|
||
|
typedef sdCSTypeInfoList typeList_t;
|
||
|
|
||
|
sdCSTypeInfo( const char* name_, const char* superName_ ) : typeBegin( 0 ), typeEnd( 0 ), name( name_ ), superName( superName_ ), next( NULL ) {
|
||
|
GetTypeList().Append( this );
|
||
|
}
|
||
|
~sdCSTypeInfo() {}
|
||
|
|
||
|
bool operator==( const char* rhs ) const {
|
||
|
return strcmp( rhs, name ) == 0;
|
||
|
}
|
||
|
|
||
|
bool IsType( const sdCSTypeInfo& rhs ) const {
|
||
|
return typeBegin >= rhs.typeBegin && typeEnd <= rhs.typeEnd;
|
||
|
}
|
||
|
|
||
|
const char* GetName() const { return name; }
|
||
|
const char* GetSuperName() const { return superName; }
|
||
|
|
||
|
void SetNext( sdCSTypeInfo* _next ) { next = _next; }
|
||
|
sdCSTypeInfo* GetNext( void ) { return next; }
|
||
|
|
||
|
static void Init() {
|
||
|
if ( Initialised( false, false ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
sdCSTypeInfo* root = GetTypeList().FindRoot();
|
||
|
if ( root != NULL ) {
|
||
|
int id = 0;
|
||
|
NumberTypes( root, id );
|
||
|
}
|
||
|
|
||
|
Initialised( true, true );
|
||
|
}
|
||
|
static void Shutdown() {
|
||
|
Initialised( true, false );
|
||
|
}
|
||
|
|
||
|
static int NumTypes() { return GetTypeList().Num(); }
|
||
|
|
||
|
private:
|
||
|
const char* name;
|
||
|
const char* superName;
|
||
|
int typeBegin;
|
||
|
int typeEnd;
|
||
|
sdCSTypeInfo* next;
|
||
|
|
||
|
private:
|
||
|
static void NumberTypes( Ptr root, int& id ) {
|
||
|
root->typeBegin = id++;
|
||
|
|
||
|
sdCSTypeInfo* child = NULL;
|
||
|
while ( child = GetTypeList().FindChild( root, child ) ) {
|
||
|
NumberTypes( child, id );
|
||
|
}
|
||
|
|
||
|
root->typeEnd = id - 1;
|
||
|
}
|
||
|
|
||
|
static bool Initialised( bool set, bool value ) {
|
||
|
static bool initialized = false;
|
||
|
if ( set ) {
|
||
|
initialized = value;
|
||
|
return value;
|
||
|
}
|
||
|
return initialized;
|
||
|
}
|
||
|
|
||
|
static typeList_t& GetTypeList() {
|
||
|
static typeList_t types;
|
||
|
return types;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#define SD_CS_DECLARE_TYPE_INFO \
|
||
|
static sdCSTypeInfo Type; \
|
||
|
virtual bool IsType( const sdCSTypeInfo& rhs ) const { return Type.IsType( rhs ); } \
|
||
|
virtual const sdCSTypeInfo& GetType() const { return Type; } \
|
||
|
|
||
|
#define SD_CS_DECLARE_CLASS( ClassName ) \
|
||
|
public: \
|
||
|
SD_CS_DECLARE_TYPE_INFO
|
||
|
|
||
|
#define SD_CS_IMPLEMENT_TYPE_INFO( ClassName, SuperClassName ) \
|
||
|
sdCSTypeInfo ClassName::Type( #ClassName, #SuperClassName );
|
||
|
|
||
|
#define SD_CS_IMPLEMENT_CLASS( ClassName, SuperClassName ) \
|
||
|
SD_CS_IMPLEMENT_TYPE_INFO( ClassName, SuperClassName )
|
||
|
|
||
|
|
||
|
class sdCompiledScript_ClassBase {
|
||
|
public:
|
||
|
SD_CS_DECLARE_CLASS( sdCompiledScript_ClassBase );
|
||
|
|
||
|
sdCompiledScript_ClassBase( void ) { __s_handle = 0; }
|
||
|
virtual ~sdCompiledScript_ClassBase( void ) { ; }
|
||
|
|
||
|
int __S_GetHandle( void ) const { return __s_handle; }
|
||
|
void __S_SetHandle( int handle ) { __s_handle = handle; }
|
||
|
|
||
|
template< typename T >
|
||
|
T* Cast( void ) {
|
||
|
if ( this == NULL ) {
|
||
|
return NULL;
|
||
|
}
|
||
|
if ( IsType( T::Type ) ) {
|
||
|
return reinterpret_cast< T* >( this );
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
int __s_handle;
|
||
|
};
|
||
|
|
||
|
typedef sdCompiledScript_ClassBase* ( *classAllocator_t )( void );
|
||
|
|
||
|
typedef void ( sdCompiledScript_ClassBase::*classFunctionCallback_t )( void );
|
||
|
typedef void ( *classFunctionWrapper_t )( sdCompiledScript_ClassBase* obj, classFunctionCallback_t callback, const byte* data );
|
||
|
|
||
|
typedef void ( *functionCallback_t )( void );
|
||
|
typedef void ( *functionWrapper_t )( functionCallback_t callback, const byte* data );
|
||
|
|
||
|
typedef byte* ( sdCompiledScript_ClassBase::*variableLookup_t )( void );
|
||
|
|
||
|
struct sdClassFunctionInfo {
|
||
|
const char* name;
|
||
|
classFunctionWrapper_t wrapper;
|
||
|
classFunctionCallback_t function;
|
||
|
int numParms;
|
||
|
int parmSizeTotal;
|
||
|
};
|
||
|
|
||
|
enum variableType_t {
|
||
|
V_FLOAT,
|
||
|
V_BOOLEAN,
|
||
|
V_VECTOR,
|
||
|
V_OBJECT,
|
||
|
V_STRING,
|
||
|
V_WSTRING,
|
||
|
V_NONE,
|
||
|
};
|
||
|
|
||
|
struct sdClassVariableInfo {
|
||
|
const char* name;
|
||
|
variableType_t type;
|
||
|
variableLookup_t variable;
|
||
|
};
|
||
|
|
||
|
struct sdFunctionInfo {
|
||
|
const char* name;
|
||
|
functionWrapper_t wrapper;
|
||
|
functionCallback_t function;
|
||
|
|
||
|
sdFunctionInfo* next;
|
||
|
};
|
||
|
|
||
|
struct sdClassInfo {
|
||
|
const char* name;
|
||
|
sdClassFunctionInfo* functionInfo;
|
||
|
sdClassVariableInfo* variableInfo;
|
||
|
sdClassInfo* superClass;
|
||
|
classAllocator_t allocator;
|
||
|
|
||
|
sdClassInfo* next;
|
||
|
};
|
||
|
|
||
|
class sdProcedureCall {
|
||
|
public:
|
||
|
virtual void Go( void ) = 0;
|
||
|
virtual ~sdProcedureCall() { ; }
|
||
|
};
|
||
|
|
||
|
class idScriptObject;
|
||
|
class idEntity;
|
||
|
|
||
|
class sdCompilerInterface {
|
||
|
public:
|
||
|
virtual const idEventDef* FindEvent( const char* name ) = 0;
|
||
|
virtual int AllocThread( sdProcedureCall* call ) = 0;
|
||
|
virtual int AllocThread( sdCompiledScript_ClassBase* object, const char* name, sdProcedureCall* call ) = 0;
|
||
|
virtual int AllocGuiThread( sdProcedureCall* call ) = 0;
|
||
|
virtual int AllocGuiThread( sdCompiledScript_ClassBase* object, const char* name, sdProcedureCall* call ) = 0;
|
||
|
virtual sdCompiledScript_ClassBase* AllocObject( const char* name ) = 0;
|
||
|
virtual void FreeObject( sdCompiledScript_ClassBase* object ) = 0;
|
||
|
virtual sdCompiledScript_ClassBase* GetObject( int handle ) = 0;
|
||
|
|
||
|
virtual void SysCall( const idEventDef* event, const UINT_PTR* data ) = 0;
|
||
|
virtual void EventCall( const idEventDef* event, sdCompiledScript_ClassBase* obj, const UINT_PTR* data ) = 0;
|
||
|
|
||
|
virtual idScriptObject* GetScriptObject( int handle ) = 0;
|
||
|
virtual idEntity* GetEntity( int handle ) = 0;
|
||
|
|
||
|
virtual void Wait( float time ) = 0;
|
||
|
virtual void WaitFrame( void ) = 0;
|
||
|
|
||
|
virtual float GetReturnedFloat( void ) = 0;
|
||
|
virtual bool GetReturnedBoolean( void ) = 0;
|
||
|
virtual sdCompiledScript_ClassBase* GetReturnedObject( void ) = 0;
|
||
|
virtual const char* GetReturnedString( void ) = 0;
|
||
|
virtual float* GetReturnedVector( void ) = 0;
|
||
|
virtual int GetReturnedInteger( void ) = 0;
|
||
|
virtual const wchar_t* GetReturnedWString( void ) = 0;
|
||
|
|
||
|
virtual void ReturnWString( const wchar_t* value ) = 0;
|
||
|
virtual void ReturnString( const char* value ) = 0;
|
||
|
virtual void ReturnVector( float* value ) = 0;
|
||
|
virtual void ReturnFloat( float value ) = 0;
|
||
|
virtual void ReturnBoolean( bool value ) = 0;
|
||
|
virtual void ReturnObject( sdCompiledScript_ClassBase* obj ) = 0;
|
||
|
};
|
||
|
|
||
|
class sdScriptInterface {
|
||
|
public:
|
||
|
virtual sdClassInfo* GetClassInfo( void ) = 0;
|
||
|
virtual sdFunctionInfo* GetFunctionInfo( void ) = 0;
|
||
|
|
||
|
virtual int GetClassFunctionInfoSize( void ) = 0;
|
||
|
virtual int GetFunctionInfoSize( void ) = 0;
|
||
|
|
||
|
virtual int GetVersion( void ) = 0;
|
||
|
};
|
||
|
|
||
|
typedef sdScriptInterface* ( *scriptInitFunc_t )( sdCompilerInterface* iface );
|
||
|
|
||
|
extern sdCompilerInterface* compilerInterface;
|
||
|
|
||
|
#endif // __COMPILEDSCRIPT_BASE_H__
|