2008-10-22 22:00:00 +02:00
|
|
|
|
//=======================================================================
|
|
|
|
|
// Copyright XashXT Group 2008 <20>
|
|
|
|
|
// vprogs_api.h - xash virtual machine
|
|
|
|
|
//=======================================================================
|
|
|
|
|
#ifndef VPROGS_API_H
|
|
|
|
|
#define VPROGS_API_H
|
|
|
|
|
|
2008-11-25 22:00:00 +01:00
|
|
|
|
/*
|
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
|
|
VPROGS.DLL INTERFACE
|
|
|
|
|
==============================================================================
|
|
|
|
|
*/
|
|
|
|
|
#define PRVM_MAX_STACK_DEPTH 1024
|
|
|
|
|
#define PRVM_LOCALSTACK_SIZE 16384
|
|
|
|
|
#define PRVM_MAX_OPENFILES 256
|
|
|
|
|
#define PRVM_MAX_OPENSEARCHES 128
|
|
|
|
|
|
|
|
|
|
// prog flags
|
|
|
|
|
#define PRVM_OP_STATE 1
|
|
|
|
|
#define PRVM_FE_CHAIN 4
|
|
|
|
|
#define PRVM_FE_CLASSNAME 8
|
|
|
|
|
#define PRVM_OP_THINKTIME 16
|
|
|
|
|
|
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
PRVM_SERVERPROG = 0,
|
|
|
|
|
PRVM_CLIENTPROG,
|
|
|
|
|
PRVM_MENUPROG,
|
|
|
|
|
PRVM_DECOMPILED,
|
|
|
|
|
PRVM_MAXPROGS // must be last
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef void (*prvm_builtin_t)( void );
|
2008-12-15 22:00:00 +01:00
|
|
|
|
typedef struct vm_edict_s
|
2008-11-25 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
bool free;
|
|
|
|
|
float freetime;
|
|
|
|
|
} vm_edict_t;
|
|
|
|
|
|
2008-12-15 22:00:00 +01:00
|
|
|
|
struct pr_edict_s
|
2008-11-25 22:00:00 +01:00
|
|
|
|
{
|
|
|
|
|
// engine-private fields (stored in dynamically resized array)
|
|
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
void *vp; // generic edict
|
|
|
|
|
vm_edict_t *ed; // vm edict state
|
|
|
|
|
cl_edict_t *cl; // cl edict state
|
|
|
|
|
vm_edict_t *ui; // ui edict state
|
|
|
|
|
} priv;
|
|
|
|
|
|
|
|
|
|
// QuakeC prog fields (stored in dynamically resized array)
|
|
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
void *vp; // generic entvars
|
|
|
|
|
cl_entvars_t *cl; // client entvars
|
|
|
|
|
ui_entvars_t *ui; // uimenu entvars
|
|
|
|
|
} progs;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct mfunction_s
|
|
|
|
|
{
|
|
|
|
|
int first_statement; // negative numbers are builtins
|
|
|
|
|
int parm_start;
|
|
|
|
|
int locals; // total ints of parms + locals
|
|
|
|
|
|
|
|
|
|
// these are doubles so that they can count up to 54bits or so rather than 32bit
|
|
|
|
|
double profile; // runtime
|
|
|
|
|
double builtinsprofile; // cost of builtin functions called by this function
|
|
|
|
|
double callcount; // times the functions has been called since the last profile call
|
|
|
|
|
|
|
|
|
|
int s_name;
|
|
|
|
|
int s_file; // source file defined in
|
|
|
|
|
int numparms;
|
|
|
|
|
byte parm_size[MAX_PARMS];
|
|
|
|
|
} mfunction_t;
|
|
|
|
|
|
|
|
|
|
typedef struct prvm_stack_s
|
|
|
|
|
{
|
|
|
|
|
int s;
|
|
|
|
|
mfunction_t *f;
|
|
|
|
|
} prvm_stack_t;
|
|
|
|
|
|
|
|
|
|
typedef struct prvm_prog_s
|
|
|
|
|
{
|
|
|
|
|
dprograms_t *progs;
|
|
|
|
|
mfunction_t *functions;
|
|
|
|
|
char *strings;
|
|
|
|
|
int stringssize;
|
|
|
|
|
ddef_t *fielddefs;
|
|
|
|
|
ddef_t *globaldefs;
|
|
|
|
|
dstatement_t *statements;
|
|
|
|
|
dsource_t *sources; // debug version include packed source files
|
|
|
|
|
int *linenums; // debug versions only
|
|
|
|
|
void *types; // (type_t *)
|
|
|
|
|
int edict_size; // in bytes
|
|
|
|
|
int edictareasize; // in bytes (for bound checking)
|
|
|
|
|
int pev_save; // used by PRVM_PUSH_GLOBALS\PRVM_POP_GLOBALS
|
|
|
|
|
int other_save; // used by PRVM_PUSH_GLOBALS\PRVM_POP_GLOBALS
|
|
|
|
|
int *statement_linenums;// NULL if not available
|
|
|
|
|
double *statement_profile; // only incremented if prvm_statementprofiling is on
|
|
|
|
|
|
|
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
float *gp;
|
|
|
|
|
cl_globalvars_t *cl;
|
|
|
|
|
ui_globalvars_t *ui;
|
|
|
|
|
} globals;
|
|
|
|
|
|
|
|
|
|
int maxknownstrings;
|
|
|
|
|
int numknownstrings;
|
|
|
|
|
int firstfreeknownstring;
|
|
|
|
|
const char **knownstrings;
|
|
|
|
|
byte *knownstrings_freeable;
|
|
|
|
|
const char ***stringshash;
|
|
|
|
|
byte *progs_mempool;
|
|
|
|
|
prvm_builtin_t *builtins;
|
|
|
|
|
int numbuiltins;
|
|
|
|
|
int argc;
|
|
|
|
|
int trace;
|
|
|
|
|
mfunction_t *xfunction;
|
|
|
|
|
int xstatement;
|
|
|
|
|
prvm_stack_t stack[PRVM_MAX_STACK_DEPTH + 1];
|
|
|
|
|
int depth;
|
|
|
|
|
int localstack[PRVM_LOCALSTACK_SIZE];
|
|
|
|
|
int localstack_used;
|
|
|
|
|
word filecrc;
|
|
|
|
|
int intsize;
|
|
|
|
|
vfile_t *file[PRVM_MAX_OPENFILES];
|
|
|
|
|
script_t *script;
|
|
|
|
|
search_t *search;
|
|
|
|
|
int num_edicts;
|
|
|
|
|
int max_edicts;
|
|
|
|
|
int limit_edicts;
|
|
|
|
|
int reserved_edicts;
|
2008-12-15 22:00:00 +01:00
|
|
|
|
pr_edict_t *edicts;
|
2008-11-25 22:00:00 +01:00
|
|
|
|
void *edictsfields;
|
|
|
|
|
void *edictprivate;
|
|
|
|
|
int edictprivate_size;
|
|
|
|
|
float *time;
|
|
|
|
|
float _time;
|
|
|
|
|
bool protect_world;
|
|
|
|
|
bool loadintoworld;
|
|
|
|
|
bool loaded;
|
|
|
|
|
char *name;
|
|
|
|
|
int flag;
|
|
|
|
|
ddef_t *pev; // if pev != 0 then there is a global pev
|
|
|
|
|
|
|
|
|
|
// function pointers
|
|
|
|
|
void (*begin_increase_edicts)(void);
|
|
|
|
|
void (*end_increase_edicts)(void);
|
2008-12-15 22:00:00 +01:00
|
|
|
|
void (*init_edict)(pr_edict_t *edict);
|
|
|
|
|
void (*free_edict)(pr_edict_t *ed);
|
2008-11-25 22:00:00 +01:00
|
|
|
|
void (*count_edicts)(void);
|
2008-12-15 22:00:00 +01:00
|
|
|
|
bool (*load_edict)(pr_edict_t *ent); // initialize edict for first loading
|
|
|
|
|
void (*restore_edict)(pr_edict_t *ent); // restore edict from savegame or changelevel
|
|
|
|
|
void (*keyvalue_edict)(pr_edict_t *ent, const char *key, const char *value );
|
2008-11-25 22:00:00 +01:00
|
|
|
|
void (*init_cmd)(void);
|
|
|
|
|
void (*reset_cmd)(void);
|
|
|
|
|
void (*error_cmd)(const char *format, ...);
|
|
|
|
|
|
|
|
|
|
} prvm_prog_t;
|
|
|
|
|
|
|
|
|
|
typedef struct vprogs_exp_s
|
|
|
|
|
{
|
|
|
|
|
// interface validator
|
|
|
|
|
size_t api_size; // must matched with sizeof(vprogs_api_t)
|
|
|
|
|
|
|
|
|
|
void ( *Init ) ( int argc, char **argv ); // init host
|
|
|
|
|
void ( *Free ) ( void ); // close host
|
|
|
|
|
|
|
|
|
|
// compiler functions
|
|
|
|
|
void ( *PrepareDAT )( const char *dir, const char *name );
|
|
|
|
|
void ( *CompileDAT )( void );
|
2009-06-24 22:00:00 +02:00
|
|
|
|
void ( *Update )( double time ); // refreshing compile, exec some programs e.t.c
|
2008-11-25 22:00:00 +01:00
|
|
|
|
|
|
|
|
|
// edict operations
|
2008-12-15 22:00:00 +01:00
|
|
|
|
pr_edict_t *(*AllocEdict)( void );
|
|
|
|
|
void (*FreeEdict)( pr_edict_t *ed );
|
|
|
|
|
void (*PrintEdict)( pr_edict_t *ed );
|
2008-11-25 22:00:00 +01:00
|
|
|
|
|
|
|
|
|
// savegame stuff
|
|
|
|
|
void (*WriteGlobals)( void *buffer, void *ptr, setpair_t callback );
|
|
|
|
|
void (*ReadGlobals)( int s_table, dkeyvalue_t *globals, int count );
|
2008-12-15 22:00:00 +01:00
|
|
|
|
void (*WriteEdict)( pr_edict_t *ed, void *buffer, void *ptr, setpair_t callback );
|
2008-11-25 22:00:00 +01:00
|
|
|
|
void (*ReadEdict)( int s_table, int ednum, dkeyvalue_t *fields, int numpairs );
|
|
|
|
|
|
|
|
|
|
// load ents description
|
|
|
|
|
void (*LoadFromFile)( const char *data );
|
|
|
|
|
|
|
|
|
|
// string manipulations
|
|
|
|
|
const char *(*GetString)( int num );
|
|
|
|
|
int (*SetEngineString)( const char *s );
|
|
|
|
|
int (*SetTempString)( const char *s );
|
|
|
|
|
|
|
|
|
|
void (*InitProg)( int prognr );
|
|
|
|
|
void (*SetProg)( int prognr );
|
|
|
|
|
bool (*ProgLoaded)( int prognr );
|
|
|
|
|
void (*LoadProgs)( const char *filename );
|
|
|
|
|
void (*ResetProg)( void );
|
|
|
|
|
|
|
|
|
|
// abstract layer for searching globals and locals
|
|
|
|
|
func_t (*FindFunctionOffset)( const char *function );
|
|
|
|
|
int (*FindGlobalOffset)( const char *global );
|
|
|
|
|
int (*FindFieldOffset)( const char *field );
|
|
|
|
|
mfunction_t *(*FindFunction)( const char *name );
|
|
|
|
|
ddef_t *(*FindGlobal)( const char *name );
|
|
|
|
|
ddef_t *(*FindField)( const char *name );
|
|
|
|
|
|
|
|
|
|
void (*StackTrace)( void );
|
|
|
|
|
void (*Warning)( const char *fmt, ... );
|
|
|
|
|
void (*Error)( const char *fmt, ... );
|
|
|
|
|
|
|
|
|
|
void (*ExecuteProgram)( func_t fnum, const char *name, const char *file, const int line );
|
|
|
|
|
void (*Crash)( void ); // crash virtual machine
|
|
|
|
|
|
|
|
|
|
prvm_prog_t *prog; // virtual machine current state
|
|
|
|
|
|
|
|
|
|
} vprogs_exp_t;
|
|
|
|
|
|
2008-10-22 22:00:00 +02:00
|
|
|
|
#endif//VPROGS_API_H
|