#include "progdefs.h" // generated by program cdefs
#include "clprogdefs.h" // generated by program cdefs
+#ifndef DP_SMALLMEMORY
+#define PROFILING
+#endif
+
// forward declaration of clgecko_t
struct clgecko_s;
{
int s;
mfunction_t *f;
+ double tprofile_acc;
double profile_acc;
double builtinsprofile_acc;
} prvm_stack_t;
} fields;
} prvm_edict_t;
-#define PRVM_EDICTFIELDVALUE(ed, fieldoffset) (fieldoffset >= 0 ? (prvm_eval_t *)((int *)ed->fields.vp + fieldoffset) : NULL)
-#define PRVM_GLOBALFIELDVALUE(fieldoffset) (fieldoffset >= 0 ? (prvm_eval_t *)((int *)prog->globals.generic + fieldoffset) : NULL)
+extern prvm_eval_t prvm_badvalue;
+
+#if 1
+#define PRVM_EDICTFIELDVALUE(ed, fieldoffset) (fieldoffset < 0 ? Con_Printf("Invalid fieldoffset at %s:%i\n", __FILE__, __LINE__), &prvm_badvalue : (prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))
+#define PRVM_EDICTFIELDFLOAT(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->_float)
+#define PRVM_EDICTFIELDVECTOR(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->vector)
+#define PRVM_EDICTFIELDSTRING(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->string)
+#define PRVM_EDICTFIELDEDICT(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->edict)
+#define PRVM_EDICTFIELDFUNCTION(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->function)
+#define PRVM_GLOBALFIELDVALUE(fieldoffset) (fieldoffset < 0 ? Con_Printf("Invalid fieldoffset at %s:%i\n", __FILE__, __LINE__), &prvm_badvalue : (prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))
+#define PRVM_GLOBALFIELDFLOAT(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->_float)
+#define PRVM_GLOBALFIELDVECTOR(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->vector)
+#define PRVM_GLOBALFIELDSTRING(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->string)
+#define PRVM_GLOBALFIELDEDICT(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->edict)
+#define PRVM_GLOBALFIELDFUNCTION(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->function)
+#else
+#define PRVM_EDICTFIELDVALUE(ed, fieldoffset) ((prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))
+#define PRVM_EDICTFIELDFLOAT(ed, fieldoffset) (((prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))->_float)
+#define PRVM_EDICTFIELDVECTOR(ed, fieldoffset) (((prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))->vector)
+#define PRVM_EDICTFIELDSTRING(ed, fieldoffset) (((prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))->string)
+#define PRVM_EDICTFIELDEDICT(ed, fieldoffset) (((prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))->edict)
+#define PRVM_EDICTFIELDFUNCTION(ed, fieldoffset) (((prvm_eval_t *)((int *)ed->fields.vp + fieldoffset))->function)
+#define PRVM_GLOBALFIELDVALUE(fieldoffset) ((prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))
+#define PRVM_GLOBALFIELDFLOAT(fieldoffset) (((prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))->_float)
+#define PRVM_GLOBALFIELDVECTOR(fieldoffset) (((prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))->vector)
+#define PRVM_GLOBALFIELDSTRING(fieldoffset) (((prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))->string)
+#define PRVM_GLOBALFIELDEDICT(fieldoffset) (((prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))->edict)
+#define PRVM_GLOBALFIELDFUNCTION(fieldoffset) (((prvm_eval_t *)((int *)prog->globals.generic + fieldoffset))->function)
+#endif
//============================================================================
#define PRVM_OP_STATE 1
+#ifdef DP_SMALLMEMORY
+#define PRVM_MAX_STACK_DEPTH 128
+#define PRVM_LOCALSTACK_SIZE 2048
+
+#define PRVM_MAX_OPENFILES 16
+#define PRVM_MAX_OPENSEARCHES 8
+#define PRVM_MAX_GECKOINSTANCES 1
+#else
#define PRVM_MAX_STACK_DEPTH 1024
#define PRVM_LOCALSTACK_SIZE 16384
#define PRVM_MAX_OPENFILES 256
#define PRVM_MAX_OPENSEARCHES 128
#define PRVM_MAX_GECKOINSTANCES 32
+#endif
typedef void (*prvm_builtin_t) (void);
int dimension_hit; // ssqc / csqc
int dimension_solid; // ssqc / csqc
int disableclientprediction; // ssqc
+ int discardabledemo; // ssqc
int dphitcontentsmask; // ssqc / csqc
int drawonlytoclient; // ssqc
- int effects; // ssqc / csqc
int exteriormodeltoclient; // ssqc
int fatness; // ssqc / csqc
int forceshader; // csqc
int nodrawtoclient; // ssqc
int pflags; // ssqc
int ping; // ssqc
+ int ping_packetloss; // ssqc
+ int ping_movementloss; // ssqc
int pitch_speed; // ssqc / csqc
int playermodel; // ssqc
int playerskin; // ssqc
int yaw_speed; // ssqc / csqc
int bouncefactor; // ssqc
int bouncestop; // ssqc
+ int sendcomplexanimation; // ssqc
int solid; // ssqc / csqc (physics)
int movetype; // ssqc / csqc (physics)
int enemy; // ssqc / csqc (physics)
int aiment; // ssqc / csqc (physics)
int movedir; // ssqc / csqc (physics)
+
+ int camera_transform; // csqc (warpzones)
+
+ int userwavefunc_param0; // csqc (userwavefunc)
+ int userwavefunc_param1; // csqc (userwavefunc)
+ int userwavefunc_param2; // csqc (userwavefunc)
+ int userwavefunc_param3; // csqc (userwavefunc)
+
+ int crypto_keyfp; // ssqc (DP_CRYPTO)
+ int crypto_mykeyfp; // ssqc (DP_CRYPTO)
+ int crypto_idfp; // ssqc (DP_CRYPTO)
+ int crypto_encryptmethod; // ssqc (DP_CRYPTO)
+ int crypto_signmethod; // ssqc (DP_CRYPTO)
}
prvm_prog_fieldoffsets_t;
int v_right; // ssqc / csqc
int v_up; // ssqc / csqc
int view_angles; // csqc
+ int view_punchangle; // csqc
+ int view_punchvector; // csqc
int trace_allsolid; // ssqc / csqc
int trace_startsolid; // ssqc / csqc
int trace_fraction; // ssqc / csqc
int dmg_origin; // csqc
int sb_showscores; // csqc
int drawfont; // csqc / menu
+ int drawfontscale; // csqc / menu
int require_spawnfunc_prefix; // ssqc
int worldstatus; // ssqc
int servertime; // csqc
int gettaginfo_right; // ssqc / csqc
int gettaginfo_up; // ssqc / csqc
int transparent_offset; // csqc
+
+ int particles_alphamin; // csqc
+ int particles_alphamax; // csqc
+ int particles_colormin; // csqc
+ int particles_colormax; // csqc
}
prvm_prog_globaloffsets_t;
func_t m_keyup; // mqc
func_t m_shutdown; // mqc
func_t m_toggle; // mqc
+ func_t m_newmap; // mqc
}
prvm_prog_funcoffsets_t;
+// stringbuffer flags
+#define STRINGBUFFER_SAVED 1 // saved in savegames
+
typedef struct prvm_stringbuffer_s
{
int max_strings;
int num_strings;
char **strings;
const char *origin;
+ unsigned char flags;
}
prvm_stringbuffer_t;
{
double starttime;
unsigned int id; // increasing unique id of progs instance
- dprograms_t *progs;
mfunction_t *functions;
char *strings;
int stringssize;
ddef_t *fielddefs;
ddef_t *globaldefs;
- dstatement_t *statements;
+ mstatement_t *statements;
int entityfields; // number of vec_t fields in progs (some variables are 3)
int entityfieldsarea; // LordHavoc: equal to max_edicts * entityfields (for bounds checking)
+ // loaded values from the disk format
+ int progs_version;
+ int progs_crc;
+ int progs_numstatements;
+ int progs_numglobaldefs;
+ int progs_numfielddefs;
+ int progs_numfunctions;
+ int progs_numstrings;
+ int progs_numglobals;
+ int progs_entityfields;
+
+ // real values in memory (some modified by loader)
+ int numstatements;
+ int numglobaldefs;
+ int numfielddefs;
+ int numfunctions;
+ int numstrings;
+ int numglobals;
+
int *statement_linenums; // NULL if not available
double *statement_profile; // only incremented if prvm_statementprofiling is on
qboolean allowworldwrites;
// name of the prog, e.g. "Server", "Client" or "Menu" (used for text output)
- char *name; // [INIT]
+ const char *name; // [INIT]
// flag - used to store general flags like PRVM_GE_SELF, etc.
int flag;
- char *extensionstring; // [INIT]
+ const char *extensionstring; // [INIT]
qboolean loadintoworld; // [INIT]
qboolean loaded;
qboolean leaktest_active;
+ // translation buffer (only needs to be freed on unloading progs, type is private to prvm_edict.c)
+ void *po;
+
// printed together with backtraces
const char *statestring;
extern const int vm_cl_numbuiltins;
extern const int vm_m_numbuiltins;
-extern char * vm_sv_extensions; // client also uses this
-extern char * vm_m_extensions;
+extern const char * vm_sv_extensions; // client also uses this
+extern const char * vm_m_extensions;
void VM_SV_Cmd_Init(void);
void VM_SV_Cmd_Reset(void);
void PRVM_Init (void);
+#ifdef PROFILING
void MVM_ExecuteProgram (func_t fnum, const char *errormessage);
void CLVM_ExecuteProgram (func_t fnum, const char *errormessage);
void SVVM_ExecuteProgram (func_t fnum, const char *errormessage);
+#else
+#define MVM_ExecuteProgram SVVM_ExecuteProgram
+#define CLVM_ExecuteProgram SVVM_ExecuteProgram
+void SVVM_ExecuteProgram (func_t fnum, const char *errormessage);
+#endif
#define PRVM_ExecuteProgram prog->ExecuteProgram
#define PRVM_Alloc(buffersize) _PRVM_Alloc(buffersize, __FILE__, __LINE__)
void _PRVM_Free (void *buffer, const char *filename, int fileline);
void _PRVM_FreeAll (const char *filename, int fileline);
-void PRVM_Profile (int maxfunctions, int mininstructions, int sortby);
+void PRVM_Profile (int maxfunctions, double mintime, int sortby);
void PRVM_Profile_f (void);
void PRVM_ChildProfile_f (void);
void PRVM_CallProfile_f (void);
void PRVM_ED_LoadFromFile (const char *data);
-unsigned int PRVM_EDICT_NUM_ERROR(unsigned int n, char *filename, int fileline);
+unsigned int PRVM_EDICT_NUM_ERROR(unsigned int n, const char *filename, int fileline);
#define PRVM_EDICT(n) (((unsigned)(n) < (unsigned int)prog->max_edicts) ? (unsigned int)(n) : PRVM_EDICT_NUM_ERROR((unsigned int)(n), __FILE__, __LINE__))
#define PRVM_EDICT_NUM(n) (prog->edicts + PRVM_EDICT(n))
*/
void PRVM_InitProg(int prognr);
// LoadProgs expects to be called right after InitProg
-void PRVM_LoadProgs (const char *filename, int numrequiredfunc, char **required_func, int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, char **required_global);
+void PRVM_LoadProgs (const char *filename, int numrequiredfunc, const char **required_func, int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, prvm_required_field_t *required_global);
void PRVM_ResetProg(void);
qboolean PRVM_ProgLoaded(int prognr);