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/engine/uimenu/ui_cmds.c

416 lines
7.5 KiB
C

//=======================================================================
// Copyright XashXT Group 2007 ©
// ui_cmds.c - ui menu builtins
//=======================================================================
#include "uimenu.h"
/*
=========
VM_M_precache_file
string precache_file(string)
=========
*/
void VM_M_precache_file (void)
{
// precache_file is only used to copy files with qcc, it does nothing
VM_SAFEPARMCOUNT(1, VM_precache_file);
PRVM_G_INT(OFS_RETURN) = PRVM_G_INT(OFS_PARM0);
}
/*
=========
VM_M_preache_error
used instead of the other VM_precache_* functions in the builtin list
=========
*/
void VM_M_precache_error (void)
{
PRVM_ERROR("PF_Precache: Precache can only be done in spawn functions");
}
/*
=========
VM_M_precache_sound
string precache_sound (string sample)
=========
*/
void VM_M_precache_sound( void )
{
const char *s;
VM_SAFEPARMCOUNT(1, VM_precache_sound);
s = PRVM_G_STRING(OFS_PARM0);
PRVM_G_INT(OFS_RETURN) = PRVM_G_INT(OFS_PARM0);
VM_CheckEmptyString( s );
// fake precaching
if(!FS_FileExists( va("sound/%s", s )))
{
VM_Warning("VM_precache_sound: Failed to load %s for %s\n", s, PRVM_NAME);
return;
}
}
/*
=========
VM_M_setmousetarget
setmousetarget(float target)
=========
*/
void VM_M_setmousetarget(void)
{
VM_SAFEPARMCOUNT(1, VM_M_setmousetarget);
}
/*
=========
VM_M_getmousetarget
float getmousetarget
=========
*/
void VM_M_getmousetarget(void)
{
VM_SAFEPARMCOUNT(0, VM_M_getmousetarget);
PRVM_G_FLOAT(OFS_RETURN) = 1;
}
/*
=========
VM_M_setkeydest
setkeydest(float dest)
=========
*/
void VM_M_setkeydest(void)
{
VM_SAFEPARMCOUNT(1, VM_M_setkeydest);
switch((int)PRVM_G_FLOAT(OFS_PARM0))
{
case key_game:
// key_game
cls.key_dest = key_game;
break;
case key_menu:
// key_menu
cls.key_dest = key_menu;
break;
case key_message:
// key_message
// cls.key_dest = key_message
// break;
default:
PRVM_ERROR("VM_M_setkeydest: wrong destination %f !", PRVM_G_FLOAT(OFS_PARM0));
}
}
/*
=========
VM_M_getkeydest
float getkeydest
=========
*/
void VM_M_getkeydest(void)
{
VM_SAFEPARMCOUNT(0, VM_M_getkeydest);
// key_game = 0, key_message = 1, key_menu = 2, unknown = 3
switch(cls.key_dest)
{
case key_game:
PRVM_G_FLOAT(OFS_RETURN) = 0;
break;
case key_menu:
PRVM_G_FLOAT(OFS_RETURN) = 2;
break;
case key_message:
// not supported
// PRVM_G_FLOAT(OFS_RETURN) = 1;
// break;
default:
PRVM_G_FLOAT(OFS_RETURN) = 3;
}
}
/*
=========
VM_M_callfunction
callfunction(...,string function_name)
Extension: pass
=========
*/
void VM_M_callfunction( void )
{
mfunction_t *func;
const char *s;
if(prog->argc == 0) PRVM_ERROR("VM_M_callfunction: 1 parameter is required !");
s = PRVM_G_STRING(OFS_PARM0 + (prog->argc - 1));
if(!s) PRVM_ERROR("VM_M_callfunction: null string !");
VM_CheckEmptyString(s);
func = PRVM_ED_FindFunction(s);
if(!func)
{
PRVM_ERROR("VM_M_callfunciton: function %s not found !", 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 - prog->functions > 0)
{
prog->argc--;
PRVM_ExecuteProgram(func - prog->functions,"");
prog->argc++;
}
}
/*
=========
VM_M_isfunction
float isfunction(string function_name)
=========
*/
void VM_M_isfunction(void)
{
mfunction_t *func;
const char *s;
VM_SAFEPARMCOUNT(1, VM_M_isfunction);
s = PRVM_G_STRING(OFS_PARM0);
if(!s) PRVM_ERROR("VM_M_isfunction: null string !");
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)
{
edict_t *ent;
vfile_t *file;
VM_SAFEPARMCOUNT(2, VM_M_writetofile);
file = VM_GetFileHandle( (int)PRVM_G_FLOAT(OFS_PARM0) );
if( !file )
{
VM_Warning("VM_M_writetofile: invalid or closed file handle\n");
return;
}
ent = PRVM_G_EDICT(OFS_PARM1);
if(ent->priv.ed->free)
{
VM_Warning("VM_M_writetofile: %s: entity %i is free !\n", PRVM_NAME, PRVM_EDICT_NUM(OFS_PARM1));
return;
}
PRVM_ED_Write(file, ent);
}
/*
=========
VM_M_findkeysforcommand
string findkeysforcommand(string command)
the returned string is an altstring
=========
*/
void VM_M_findkeysforcommand(void)
{
const char *cmd;
char *ret;
int keys[2];
int i;
VM_SAFEPARMCOUNT(1, VM_M_findkeysforcommand);
cmd = PRVM_G_STRING(OFS_PARM0);
VM_CheckEmptyString(cmd);
(ret = VM_GetTempString())[0] = 0;
M_FindKeysForCommand((char *)cmd, keys);
for(i = 0; i < 2; i++) com.strncat(ret, va(" \'%i\'", keys[i]), VM_STRINGTEMP_LENGTH);
PRVM_G_INT(OFS_RETURN) = PRVM_SetEngineString(ret);
}
prvm_builtin_t vm_ui_builtins[] =
{
0, // to be consistent with the old vm
// common builtings (mostly)
VM_checkextension,
VM_error,
VM_objerror,
VM_print,
VM_bprint,
VM_sprint,
VM_centerprint,
VM_normalize,
VM_veclength,
VM_vectoyaw, // #10
VM_vectoangles,
VM_random_float,
VM_localcmd,
VM_cvar,
VM_cvar_set,
VM_print,
VM_ftoa,
VM_fabs,
VM_vtoa,
VM_etos, // 20
VM_atof,
VM_create,
VM_remove,
VM_find,
VM_findfloat,
VM_findchain,
VM_findchainfloat,
VM_M_precache_file,
VM_M_precache_sound,
VM_coredump, // 30
VM_traceon,
VM_traceoff,
VM_eprint,
VM_rint,
VM_floor,
VM_ceil,
VM_nextent,
VM_sin,
VM_cos,
VM_sqrt, // 40
VM_randomvec,
VM_registercvar,
VM_min,
VM_max,
VM_bound,
VM_pow,
VM_copyentity,
VM_fopen,
VM_fclose,
VM_fgets, // 50
VM_fputs,
VM_strlen,
VM_strcat,
VM_substring,
VM_atov,
VM_allocstring,
VM_freestring,
VM_tokenize,
VM_argv,
VM_isserver, // 60
VM_clientcount,
VM_clientstate,
VM_clientcmd,
VM_changelevel,
VM_localsound,
VM_getmousepos,
VM_gettime,
VM_loadfromdata,
VM_loadfromfile,
VM_modulo, // 70
VM_cvar_string,
VM_crash,
VM_stackdump, // 73
VM_search_begin,
VM_search_end,
VM_search_getsize,
VM_search_getfilename, // 77
VM_chr,
VM_itof,
VM_ftoe, // 80
VM_itof, // isString
VM_altstr_count,
VM_altstr_prepare,
VM_altstr_get,
VM_altstr_set,
VM_altstr_ins,
VM_findflags,
VM_findchainflags,
NULL, // 89
NULL, // 90
e10, // 100
e100, // 200
e100, // 300
e100, // 400
e10, // 410
e10, // 420
e10, // 430
e10, // 440
e10, // 450
// draw functions
VM_iscachedpic,
VM_precache_pic,
NULL,
VM_drawcharacter,
VM_drawstring,
VM_drawpic,
VM_drawfill,
NULL,
NULL,
VM_getimagesize, // 460
VM_cin_open,
VM_cin_close,
NULL,
VM_cin_getstate,
VM_cin_restart, // 465
NULL, // 466
NULL,
NULL,
NULL,
NULL, // 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,
NULL,
VM_keynumtostring,
VM_M_findkeysforcommand, // 610
NULL,
NULL,
VM_parseentitydata,
VM_stringtokeynum, // 614
};
const int vm_ui_numbuiltins = sizeof(vm_ui_builtins) / sizeof(prvm_builtin_t);