string etos(entity)
float stof(...[string])
entity spawn()
-entity remove()
+ remove(entity e)
entity find(entity start, .string field, string match)
-entity findfloat(entity start, .float field, string match)
-entity findentity(entity start, .entity field, string match)
+entity findfloat(entity start, .float field, float match)
+entity findentity(entity start, .entity field, entity match)
entity findchain(.string field, string match)
coredump()
traceon()
traceoff()
- eprint(entity float)
+ eprint(entity e)
float rint(float)
float floor(float)
float ceil(float)
float sin(float)
float cos(float)
float sqrt(float)
- randomvec()
+vector randomvec()
float registercvar (string name, string value)
float min(float a, float b, ...[float])
float max(float a, float b, ...[float])
string fgets(float fhandle)
fputs(float fhandle, string s)
float strlen(string s)
-string strcat(string s1, string s2)
+string strcat(string,string,...[string])
string substring(string s, float start, float length)
vector stov(string s)
string strzone(string s)
- strzone(string s)
+ strunzone(string s)
+float tokenize(string s)
+string argv(float n)
float isserver()
float clientcount()
float clientstate()
clientcommand(float client, string s) (for client and menu)
-float tokenize(string s)
changelevel(string map)
localsound(string sample)
-
+vector getmousepos()
+float gettime()
+ loadfromdata(string data)
+ loadfromfile(string file)
+float mod(float val, float m)
+const string str_cvar (string)
+ crash()
+
perhaps only : Menu : WriteMsg
===============================
float drawstring(vector position, string text, vector scale, vector rgb, float alpha, float flag)
float drawpic(vector position, string pic, vector size, vector rgb, float alpha, float flag)
float drawfill(vector position, vector size, vector rgb, float alpha, float flag)
+ drawsetcliparea(float x, float y, float width, float height)
+ drawresetcliparea()
+vector getimagesize(string pic)
+
+
+==============================================================================
+menu cmd list:
+===============
+ setkeydest(float dest)
+float getkeydest
+ setmousetarget(float target)
+float getmousetarget(void)
+
+ callfunction(...,string function_name)
+ writetofile(float fhandle, entity ent)
*/
#include "quakedef.h"
// nice helper macros
#ifndef VM_NOPARMCHECK
-#define VM_SAFEPARMCOUNT(p,f) if(prog->argc != p) PRVM_ERROR(#f "wrong parameter count (" #p "expected ) !\n")
+#define VM_SAFEPARMCOUNT(p,f) if(prog->argc != p) PRVM_ERROR(#f " wrong parameter count (" #p " expected ) !\n")
#else
#define VM_SAFEPARMCOUNT(p,f)
#endif
// temp string handling
// LordHavoc: added this to semi-fix the problem of using many ftos calls in a print
-#define STRINGTEMP_BUFFERS 16
-#define STRINGTEMP_LENGTH 4096
-static char vm_string_temp[STRINGTEMP_BUFFERS][STRINGTEMP_LENGTH];
+#define VM_STRINGTEMP_BUFFERS 16
+#define VM_STRINGTEMP_LENGTH 4096
+static char vm_string_temp[VM_STRINGTEMP_BUFFERS][VM_STRINGTEMP_LENGTH];
static int vm_string_tempindex = 0;
// qc cvar
{
char *s;
s = vm_string_temp[vm_string_tempindex];
- vm_string_tempindex = (vm_string_tempindex + 1) % STRINGTEMP_BUFFERS;
+ vm_string_tempindex = (vm_string_tempindex + 1) % VM_STRINGTEMP_BUFFERS;
return s;
}
char *outend;
outend = out + outlength - 1;
- for (i = first;i < pr_argc && out < outend;i++)
+ for (i = first;i < prog->argc && out < outend;i++)
{
s = PRVM_G_STRING((OFS_PARM0+i*3));
while (out < outend && *s)
void VM_error (void)
{
prvm_edict_t *ed;
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
VM_VarString(0, string, sizeof(string));
Con_Printf ("======%S ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
void VM_objerror (void)
{
prvm_edict_t *ed;
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
VM_VarString(0, string, sizeof(string));
Con_Printf ("======%s OBJECT ERROR in %s:\n%s\n", PRVM_NAME, PRVM_GetString(prog->xfunction->s_name), string);
*/
void VM_print (void)
{
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
VM_VarString(0, string, sizeof(string));
- Con_Print(string);
+ Con_Printf(string);
}
/*
*/
void VM_bprint (void)
{
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
if(!sv.active)
{
{
client_t *client;
int clientnum;
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
//find client for this entity
clientnum = PRVM_G_FLOAT(OFS_PARM0);
*/
void VM_centerprint (void)
{
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
VM_VarString(0, string, sizeof(string));
SCR_CenterPrint(string);
PRVM_G_FLOAT(OFS_RETURN) = Cvar_VariableValue(PRVM_G_STRING(OFS_PARM0));
}
+/*
+=================
+VM_str_cvar
+
+const string str_cvar (string)
+=================
+*/
+void VM_str_cvar(void)
+{
+ char *out, *name;
+ const char *cvar_string;
+ VM_SAFEPARMCOUNT(1,VM_str_cvar);
+
+ name = PRVM_G_STRING(OFS_PARM0);
+
+ if(!name)
+ PRVM_ERROR("VM_str_cvar: %s: null string\n", PRVM_NAME);
+
+ VM_CheckEmptyString(name);
+
+ out = VM_GetTempString();
+
+ cvar_string = Cvar_VariableString(name);
+
+ strcpy(out, cvar_string);
+
+ PRVM_G_INT(OFS_PARM0) = PRVM_SetString(out);
+}
+
/*
=================
VM_cvar_set
*/
void VM_dprint (void)
{
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
if (developer.integer)
{
VM_VarString(0, string, sizeof(string));
*/
void VM_stof(void)
{
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
VM_VarString(0, string, sizeof(string));
PRVM_G_FLOAT(OFS_RETURN) = atof(string);
}
}
}
- VM_RETURN_EDICT(sv.edicts);
+ VM_RETURN_EDICT(prog->edicts);
}
/*
=========
VM_findfloat
- entity findfloat(entity start, .float field, string match)
- entity findentity(entity start, .entity field, string match)
+ entity findfloat(entity start, .float field, float match)
+ entity findentity(entity start, .entity field, entity match)
=========
*/
// LordHavoc: added this for searching float, int, and entity reference fields
{
VM_SAFEPARMCOUNT(0,VM_coredump);
- PRVM_ED_PrintEdicts_f ();
+ Cbuf_AddText("prvm_edicts ");
+ Cbuf_AddText(PRVM_NAME);
+ Cbuf_AddText("\n");
+}
+
+/*
+=========
+VM_crash
+
+crash()
+=========
+*/
+
+void VM_crash(void)
+{
+ VM_SAFEPARMCOUNT(0, VM_crash);
+
+ PRVM_ERROR("Crash called by %s\n",PRVM_NAME);
}
/*
=========
VM_eprint
-eprint(entity float)
+eprint(entity e)
=========
*/
void VM_eprint (void)
case MSG_ONE:
destclient = (int) PRVM_G_FLOAT(OFS_PARM2);
- if (!sv.active || destclient < 0 || destclient >= svs.maxclients || !svs.clients[destclient].active)
- PRVM_ERROR("VM_clientcommand: %s: invalid client/server is not active !", PRVM_NAME);
+ if (destclient < 0 || destclient >= svs.maxclients || !svs.clients[destclient].active)
+ PRVM_ERROR("VM_clientcommand: %s: invalid client !\n", PRVM_NAME);
return &svs.clients[destclient].message;
Returns a vector of length < 1 and > 0
-randomvec()
+vector randomvec()
=================
*/
void VM_randomvec (void)
void VM_max (void)
{
// LordHavoc: 3+ argument enhancement suggested by FrikaC
- if (pr_argc == 2)
+ if (prog->argc == 2)
PRVM_G_FLOAT(OFS_RETURN) = max(PRVM_G_FLOAT(OFS_PARM0), PRVM_G_FLOAT(OFS_PARM1));
- else if (pr_argc >= 3)
+ else if (prog->argc >= 3)
{
int i;
float f = PRVM_G_FLOAT(OFS_PARM0);
- for (i = 1;i < pr_argc;i++)
+ for (i = 1;i < prog->argc;i++)
if (PRVM_G_FLOAT((OFS_PARM0+i*3)) > f)
f = PRVM_G_FLOAT((OFS_PARM0+i*3));
G_FLOAT(OFS_RETURN) = f;
// \ is a windows-ism (so it's naughty to use it, / works on all platforms)
if ((filename[0] == '.' && filename[1] == '.') || filename[0] == '/' || strrchr(filename, ':') || strrchr(filename, '\\'))
{
- Con_Printf("VM_fopen: dangerous or non-portable filename \"%s\" not allowed. (contains : or \\ or begins with .. or /)\n", filename);
+ Con_Printf("VM_fopen: %s dangerous or non-portable filename \"%s\" not allowed. (contains : or \\ or begins with .. or /)\n", PRVM_NAME, filename);
PRVM_G_FLOAT(OFS_RETURN) = -4;
return;
}
void VM_fgets(void)
{
int c, end;
- static char string[STRINGTEMP_LENGTH];
+ static char string[VM_STRINGTEMP_LENGTH];
int filenum;
VM_SAFEPARMCOUNT(1,VM_fgets);
c = FS_Getc(VM_FILES[filenum]);
if (c == '\r' || c == '\n' || c < 0)
break;
- if (end < STRINGTEMP_LENGTH - 1)
+ if (end < VM_STRINGTEMP_LENGTH - 1)
string[end++] = c;
}
string[end] = 0;
void VM_fputs(void)
{
int stringlength;
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
int filenum;
VM_SAFEPARMCOUNT(2,VM_fputs);
=========
VM_strcat
-string strcat(string s1, string s2)
+string strcat(string,string,...[string])
=========
*/
//string(string s1, string s2) strcat = #115;
{
char *s;
- VM_SAFEPARMCOUNT(2,VM_strcat);
-
+ if(prog->argc < 2)
+ PRVM_ERROR("VM_strcat wrong parameter count (min. 2 expected ) !\n");
+
s = VM_GetTempString();
- VM_VarString(0, s, STRINGTEMP_LENGTH);
+ VM_VarString(0, s, VM_STRINGTEMP_LENGTH);
PRVM_G_INT(OFS_RETURN) = PRVM_SetString(s);
}
if (!s)
s = "";
for (i = 0;i < start && *s;i++, s++);
- for (i = 0;i < STRINGTEMP_LENGTH - 1 && *s && i < length;i++, s++)
+ for (i = 0;i < VM_STRINGTEMP_LENGTH - 1 && *s && i < length;i++, s++)
string[i] = *s;
string[i] = 0;
PRVM_G_INT(OFS_RETURN) = PRVM_SetString(string);
//vector(string s) stov = #117; // returns vector value from a string
void VM_stov(void)
{
- char string[STRINGTEMP_LENGTH];
+ char string[VM_STRINGTEMP_LENGTH];
VM_SAFEPARMCOUNT(1,VM_stov);
=========
VM_strunzone
-strzone(string s)
+strunzone(string s)
=========
*/
//void(string s) strunzone = #119; // removes a copy of a string from the string zone (you can not use that string again or it may crash!!!)
/*
=========
-VM_serverstate
+VM_isserver
float isserver()
=========
PRVM_G_FLOAT(OFS_RETURN) = cls.state;
}
+/*
+=========
+VM_getostype
+
+float getostype(void)
+=========
+*/ // not used at the moment -> not included in the common list
+void VM_getostype(void)
+{
+ VM_SAFEPARMCOUNT(0,VM_getostype);
+
+ /*
+ OS_WINDOWS
+ OS_LINUX
+ OS_MAC - not supported
+ */
+
+#ifdef _WIN32
+ PRVM_G_FLOAT(OFS_RETURN) = 0;
+#elif defined _MAC
+ PRVM_G_FLOAT(OFS_RETURN) = 2;
+#else
+ PRVM_G_FLOAT(OFS_RETURN) = 1;
+#endif
+}
+
+/*
+=========
+VM_getmousepos
+
+vector getmousepos()
+=========
+*/
+void VM_getmousepos(void)
+{
+
+ VM_SAFEPARMCOUNT(0,VM_getmousepos);
+
+ PRVM_G_VECTOR(OFS_RETURN)[0] = in_mouse_x;
+ PRVM_G_VECTOR(OFS_RETURN)[1] = in_mouse_y;
+ PRVM_G_VECTOR(OFS_RETURN)[2] = 0;
+}
+
+/*
+=========
+VM_gettime
+
+float gettime(void)
+=========
+*/
+void VM_gettime(void)
+{
+ VM_SAFEPARMCOUNT(0,VM_gettime);
+
+ PRVM_G_FLOAT(OFS_RETURN) = (float) *prog->time;
+}
+
+/*
+=========
+VM_loadfromdata
+
+loadfromdata(string data)
+=========
+*/
+void VM_loadfromdata(void)
+{
+ VM_SAFEPARMCOUNT(1,VM_loadentsfromfile);
+
+ PRVM_ED_LoadFromFile(PRVM_G_STRING(OFS_PARM0));
+}
+
+/*
+=========
+VM_loadfromfile
+
+loadfromfile(string file)
+=========
+*/
+void VM_loadfromfile(void)
+{
+ char *filename;
+ qbyte *data;
+
+ VM_SAFEPARMCOUNT(1,VM_loadfromfile);
+
+ filename = PRVM_G_STRING(OFS_PARM0);
+ // .. is parent directory on many platforms
+ // / is parent directory on Amiga
+ // : is root of drive on Amiga (also used as a directory separator on Mac, but / works there too, so that's a bad idea)
+ // \ is a windows-ism (so it's naughty to use it, / works on all platforms)
+ if ((filename[0] == '.' && filename[1] == '.') || filename[0] == '/' || strrchr(filename, ':') || strrchr(filename, '\\'))
+ {
+ Con_Printf("VM_loadfromfile: %s dangerous or non-portable filename \"%s\" not allowed. (contains : or \\ or begins with .. or /)\n", PRVM_NAME, filename);
+ PRVM_G_FLOAT(OFS_RETURN) = -4;
+ return;
+ }
+
+ // not conform with VM_fopen
+ data = FS_LoadFile(filename, false);
+ if (data == NULL)
+ PRVM_G_FLOAT(OFS_RETURN) = -1;
+
+ PRVM_ED_LoadFromFile(data);
+
+ if(data)
+ Mem_Free(data);
+}
+
+
+/*
+=========
+VM_modulo
+
+float mod(float val, float m)
+=========
+*/
+void VM_modulo(void)
+{
+ int val, m;
+ VM_SAFEPARMCOUNT(2,VM_module);
+
+ val = (int) PRVM_G_FLOAT(OFS_PARM0);
+ m = (int) PRVM_G_FLOAT(OFS_PARM1);
+
+ PRVM_G_FLOAT(OFS_RETURN) = (float) (val % m);
+}
+
//=============================================================================
// Draw builtins (client & menu)
PRVM_G_INT(OFS_RETURN) = PRVM_G_INT(OFS_PARM0);
if(!s)
- PRVM_ERROR ("VM_precache_pic: %s: NULL\n");
+ PRVM_ERROR ("VM_precache_pic: %s: NULL\n", PRVM_NAME);
VM_CheckEmptyString (s);
- Draw_CachePic(s);
+ if(!Draw_CachePic(s))
+ PRVM_G_INT(OFS_RETURN) = PRVM_SetString("");
}
/*
VM_CheckEmptyString (pic);
- // is pic cached ?
+ // is pic cached ? no function yet for that
if(!1)
{
Con_Printf("VM_drawpic: %s: %s not cached !\n", PRVM_NAME, pic);
PRVM_G_FLOAT(OFS_RETURN) = 1;
}
+/*
+=========
+VM_drawsetcliparea
+
+drawsetcliparea(float x, float y, float width, float height)
+=========
+*/
+void VM_drawsetcliparea(void)
+{
+ float x,y,w,h;
+ VM_SAFEPARMCOUNT(4,VM_drawsetcliparea);
+
+ x = bound(0,PRVM_G_FLOAT(OFS_PARM0),vid.conwidth);
+ y = bound(0,PRVM_G_FLOAT(OFS_PARM1),vid.conheight);
+ w = bound(0,PRVM_G_FLOAT(OFS_PARM2),(vid.conwidth - x));
+ h = bound(0,PRVM_G_FLOAT(OFS_PARM3),(vid.conheight - y));
+
+ DrawQ_SetClipArea(x,y,w,h);
+}
+
+/*
+=========
+VM_drawresetcliparea
+
+drawresetcliparea()
+=========
+*/
+void VM_drawresetcliparea(void)
+{
+ VM_SAFEPARMCOUNT(0,VM_drawresetcliparea);
+
+ DrawQ_ResetClipArea();
+}
+
+/*
+=========
+VM_getimagesize
+
+vector getimagesize(string pic)
+=========
+*/
+void VM_getimagesize(void)
+{
+ char *p;
+ cachepic_t *pic;
+
+ VM_SAFEPARMCOUNT(1,VM_getimagesize);
+
+ p = PRVM_G_STRING(OFS_PARM0);
+
+ if(!p)
+ PRVM_ERROR("VM_getimagepos: %s passed null picture name !\n", PRVM_NAME);
+
+ VM_CheckEmptyString (p);
+
+ pic = Draw_CachePic (p);
+
+ PRVM_G_VECTOR(OFS_RETURN)[0] = pic->width;
+ PRVM_G_VECTOR(OFS_RETURN)[1] = pic->height;
+ PRVM_G_VECTOR(OFS_RETURN)[2] = 0;
+}
+
void VM_Cmd_Init(void)
{
// only init the stuff for the current prog
void VM_Cmd_Reset(void)
{
- Mem_EmptyPool(VM_STRINGS_MEMPOOL);
+ //Mem_EmptyPool(VM_STRINGS_MEMPOOL);
+ Mem_FreePool(&VM_STRINGS_MEMPOOL);
VM_Files_CloseAll();
}
char *vm_m_extensions =
"";
-// void setkeydest(float dest)
+/*
+=========
+VM_M_setmousetarget
+
+setmousetarget(float target)
+=========
+*/
+void VM_M_setmousetarget(void)
+{
+ VM_SAFEPARMCOUNT(1, VM_M_setmousetarget);
+
+ switch((int)PRVM_G_FLOAT(OFS_PARM0))
+ {
+ case 1:
+ in_client_mouse = false;
+ break;
+ case 2:
+ in_client_mouse = true;
+ break;
+ default:
+ PRVM_ERROR("VM_M_setmousetarget: wrong destination %i !\n",PRVM_G_FLOAT(OFS_PARM0));
+ }
+}
+
+/*
+=========
+VM_M_getmousetarget
+
+float getmousetarget
+=========
+*/
+void VM_M_getmousetarget(void)
+{
+ VM_SAFEPARMCOUNT(0,VM_M_getmousetarget);
+
+ if(in_client_mouse)
+ PRVM_G_FLOAT(OFS_RETURN) = 2;
+ else
+ PRVM_G_FLOAT(OFS_RETURN) = 1;
+}
+
+
+
+/*
+=========
+VM_M_setkeydest
+
+setkeydest(float dest)
+=========
+*/
void VM_M_setkeydest(void)
{
- VM_SAFEPARMCOUNT(1,VM_M_SetKeyDest);
+ VM_SAFEPARMCOUNT(1,VM_M_setkeydest);
switch((int)PRVM_G_FLOAT(OFS_PARM0))
{
// key_dest = key_message
// break;
default:
- PRVM_ERROR("VM_M_SetKeyDest: wrong destination %i !\n",prog->globals[OFS_PARM0]);
+ PRVM_ERROR("VM_M_setkeydest: wrong destination %i !\n",prog->globals[OFS_PARM0]);
}
-
- return;
}
-// float getkeydest(void)
+/*
+=========
+VM_M_getkeydest
+
+float getkeydest
+=========
+*/
void VM_M_getkeydest(void)
{
- VM_SAFEPARMCOUNT(0,VM_M_GetKeyDest);
+ VM_SAFEPARMCOUNT(0,VM_M_getkeydest);
// key_game = 0, key_message = 1, key_menu = 2, unknown = 3
switch(key_dest)
}
}
+/*
+=========
+VM_M_callfunction
+
+ callfunction(...,string function_name)
+=========
+*/
+mfunction_t *PRVM_ED_FindFunction (const char *name);
+void VM_M_callfunction(void)
+{
+ mfunction_t *func;
+ char *s;
+
+ if(prog->argc == 0)
+ PRVM_ERROR("VM_M_callfunction: 1 parameter is required !\n");
+
+ s = PRVM_G_STRING(OFS_PARM0 + (prog->argc - 1));
+
+ if(!s)
+ PRVM_ERROR("VM_M_callfunction: null string !\n");
+
+ VM_CheckEmptyString(s);
+
+ func = PRVM_ED_FindFunction(s);
+
+ if(!func)
+ PRVM_ERROR("VM_M_callfunciton: function %s not found !\n", s);
+ else if (func->first_statement < 0)
+ {
+ // negative statements are built in functions
+ int builtinnumber = -func->first_statement;
+ prog->xfunction->builtinsprofile++;
+ if (builtinnumber < prog->numbuiltins && prog->builtins[builtinnumber])
+ prog->builtins[builtinnumber]();
+ else
+ PRVM_ERROR("No such builtin #%i in %s", builtinnumber, PRVM_NAME);
+ }
+ else if(func > 0)
+ {
+ prog->argc--;
+ PRVM_ExecuteProgram(func - prog->functions,"");
+ prog->argc++;
+ }
+}
+
+/*
+=========
+VM_M_isfunction
+
+float isfunction(string function_name)
+=========
+*/
+mfunction_t *PRVM_ED_FindFunction (const char *name);
+void VM_M_isfunction(void)
+{
+ mfunction_t *func;
+ char *s;
+
+ VM_SAFEPARMCOUNT(1, VM_M_isfunction);
+
+ s = PRVM_G_STRING(OFS_PARM0);
+
+ if(!s)
+ PRVM_ERROR("VM_M_isfunction: null string !\n");
+
+ VM_CheckEmptyString(s);
+
+ func = PRVM_ED_FindFunction(s);
+
+ if(!func)
+ PRVM_G_FLOAT(OFS_RETURN) = false;
+ else
+ PRVM_G_FLOAT(OFS_RETURN) = true;
+}
+
+/*
+=========
+VM_M_writetofile
+
+ writetofile(float fhandle, entity ent)
+=========
+*/
+void VM_M_writetofile(void)
+{
+ prvm_edict_t * ent;
+ int filenum;
+
+ VM_SAFEPARMCOUNT(2, VM_M_writetofile);
+
+ filenum = PRVM_G_FLOAT(OFS_PARM0);
+ if (filenum < 0 || filenum >= MAX_VMFILES)
+ {
+ Con_Printf("VM_fputs: invalid file handle %i used in %s\n", filenum, PRVM_NAME);
+ return;
+ }
+ if (VM_FILES[filenum] == NULL)
+ {
+ Con_Printf("VM_fputs: no such file handle %i (or file has been closed) in %s\n", filenum, PRVM_NAME);
+ return;
+ }
+
+ ent = PRVM_G_EDICT(OFS_PARM1);
+ if(ent->e->free)
+ {
+ Con_Printf("VM_M_writetofile: %s: entity %i is free !\n", PRVM_NAME, PRVM_EDICT_NUM(OFS_PARM1));
+ return;
+ }
+
+ PRVM_ED_Write (VM_FILES[filenum], ent);
+}
+
prvm_builtin_t vm_m_builtins[] = {
0, // to be consistent with the old vm
// common builtings (mostly)
VM_stov,
VM_strzone,
VM_strunzone,
- VM_isserver,
- VM_clientcount,
- VM_clientstate, // 60
- VM_clcommand,
VM_tokenize,
+ VM_argv,
+ VM_isserver, // 60
+ VM_clientcount,
+ VM_clientstate,
+ VM_clcommand,
VM_changelevel,
- VM_localsound, // 64
- 0,
- 0,
- 0,
- 0,
- 0,
- 0, // 70
- e10, // 80
+ VM_localsound,
+ VM_getmousepos,
+ VM_gettime,
+ VM_loadfromdata,
+ VM_loadfromfile,
+ VM_modulo, // 70
+ VM_str_cvar,
+ VM_crash, // 72
+ 0,0,0,0,0,0,0,0,// 80
e10, // 90
e10, // 100
e100, // 200
VM_WriteAngle,
VM_WriteCoord,
VM_WriteString,
- VM_WriteEntity,
+ VM_WriteEntity, // 408
0,
0, // 410
e10, // 420
VM_drawcharacter,
VM_drawstring,
VM_drawpic,
- VM_drawfill, // 457
- 0,
- 0,
- 0, // 460
+ VM_drawfill,
+ VM_drawsetcliparea,
+ VM_drawresetcliparea,
+ VM_getimagesize,// 460
e10, // 470
e10, // 480
e10, // 490
e10, // 500
+ e100, // 600
// menu functions
-
+ VM_M_setkeydest,
+ VM_M_getkeydest,
+ VM_M_setmousetarget,
+ VM_M_getmousetarget,
+ VM_M_callfunction,
+ VM_M_writetofile,
+ VM_M_isfunction // 607
};
const int vm_m_numbuiltins = sizeof(vm_m_builtins) / sizeof(prvm_builtin_t);
void VM_M_Cmd_Reset(void)
{
- VM_Cmd_Init();
+ //VM_Cmd_Init();
+ VM_Cmd_Reset();
}