This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/public/vprogs_api.h

222 lines
6.2 KiB
C
Raw Normal View History

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