Added some extensions to csqc. Added capability for obtaining stats. Fixed a big-endian issue with string stats.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@873 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2005-02-10 00:14:10 +00:00
parent 4576ea829f
commit f4cfc008e1
2 changed files with 188 additions and 11 deletions

View file

@ -119,6 +119,16 @@ void PF_traceon (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_traceoff (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_traceoff (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_eprint (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_eprint (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_strstrofs (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_str2chr (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_chr2str (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_strconv (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_infoadd (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_infoget (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_strncmp (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_strcasecmp (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_strncasecmp (progfuncs_t *prinst, struct globalvars_s *pr_globals);
//these functions are from pr_menu.dat //these functions are from pr_menu.dat
void PF_CL_is_cached_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_CL_is_cached_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_CL_precache_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_CL_precache_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals);
@ -400,6 +410,40 @@ static void PF_R_RenderScene(progfuncs_t *prinst, struct globalvars_s *pr_global
vid.recalc_refdef = 1; vid.recalc_refdef = 1;
} }
static void PF_cs_getstatf(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int stnum = G_FLOAT(OFS_PARM0);
float val = *(float*)&cl.stats[0][stnum]; //copy float into the stat
G_FLOAT(OFS_RETURN) = val;
}
static void PF_cs_getstati(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int stnum = G_FLOAT(OFS_PARM0);
unsigned int val = cl.stats[0][stnum];
if (G_FLOAT(OFS_PARM1))
G_FLOAT(OFS_RETURN) = (val&(((1<<9)-1)<<23))>>23;
else
G_FLOAT(OFS_RETURN) = val&((1<<24)-1);
}
static void PF_cs_getstats(progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int stnum = G_FLOAT(OFS_PARM0);
char *out;
unsigned int val;
out = PF_TempStr();
//the network protocol byteswaps
((unsigned int*)out)[0] = LittleLong(cl.stats[0][stnum+0]);
((unsigned int*)out)[1] = LittleLong(cl.stats[0][stnum+1]);
((unsigned int*)out)[2] = LittleLong(cl.stats[0][stnum+2]);
((unsigned int*)out)[3] = LittleLong(cl.stats[0][stnum+3]);
((unsigned int*)out)[4] = 0; //make sure it's null terminated
RETURN_SSTRING(out);
}
//warning: functions that depend on globals are bad, mkay? //warning: functions that depend on globals are bad, mkay?
builtin_t csqc_builtins[] = { builtin_t csqc_builtins[] = {
@ -533,17 +577,17 @@ PF_Fixme,
PF_Fixme, PF_Fixme,
PF_Fixme, PF_Fixme,
//110 //110
PF_Fixme, PF_fopen,
PF_Fixme, PF_fclose,
PF_Fixme, PF_fgets,
PF_Fixme, PF_fputs,
PF_Fixme, PF_strlen,
PF_Fixme, PF_strcat,
PF_Fixme, PF_substring,
PF_Fixme, PF_stov,
PF_Fixme, PF_dupstring,
PF_Fixme, PF_forgetstring,
//120 //120
@ -584,6 +628,136 @@ PF_CL_drawsetcliparea,//7
PF_CL_drawresetcliparea,//8 PF_CL_drawresetcliparea,//8
PF_CL_drawgetimagesize,//9 PF_CL_drawgetimagesize,//9
//150
PF_cs_getstatf,
PF_cs_getstati,
PF_cs_getstats,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//160
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//170
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//180
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//190
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//200
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//210
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//220
PF_Fixme,
PF_strstrofs,
PF_str2chr,
PF_chr2str,
PF_strconv,
PF_infoadd,
PF_infoget,
PF_strncmp,
PF_strcasecmp,
PF_strncasecmp,
//230
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
//240
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme,
PF_Fixme
}; };
int csqc_numbuiltins = sizeof(csqc_builtins)/sizeof(csqc_builtins[0]); int csqc_numbuiltins = sizeof(csqc_builtins)/sizeof(csqc_builtins[0]);

View file

@ -1117,7 +1117,10 @@ void SV_UpdateQCStats(edict_t *ent, int *stats)
break; break;
case ev_string: case ev_string:
s = PR_GetString(svprogfuncs, eval->string); s = PR_GetString(svprogfuncs, eval->string);
Q_strncpyz((char *)(&stats[qcstats[i].statnum]), s, (4)*sizeof(int)); stats[qcstats[i].statnum+0] = LittleLong(((int*)s)[0]); //so the network is sent out correctly as a string.
stats[qcstats[i].statnum+1] = LittleLong(((int*)s)[1]);
stats[qcstats[i].statnum+2] = LittleLong(((int*)s)[2]);
stats[qcstats[i].statnum+3] = LittleLong(((int*)s)[3]);
break; break;
} }
} }