Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-// AK new vm
+// AK new vm
#include "quakedef.h"
#include "progsvm.h"
// reserve space for the null entity aka world
// check bound of max_edicts
prog->max_edicts = bound(1, prog->max_edicts, prog->limit_edicts);
- prog->num_edicts = bound(1, prog->num_edicts, prog->max_edicts);
+ prog->num_edicts = bound(1, prog->num_edicts, prog->max_edicts);
// edictprivate_size has to be min as big prvm_edict_private_t
- prog->edictprivate_size = max(prog->edictprivate_size,(int)sizeof(prvm_edict_private_t));
+ prog->edictprivate_size = max(prog->edictprivate_size,(int)sizeof(prvm_edict_private_t));
// alloc edicts
- prog->edicts = Mem_Alloc(prog->edicts_mempool,prog->limit_edicts * sizeof(prvm_edict_t));
-
+ prog->edicts = Mem_Alloc(prog->progs_mempool,prog->limit_edicts * sizeof(prvm_edict_t));
+
// alloc edict private space
- prog->edictprivate = Mem_Alloc(prog->edicts_mempool, prog->max_edicts * prog->edictprivate_size);
-
+ prog->edictprivate = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edictprivate_size);
+
// alloc edict fields
- prog->edictsfields = Mem_Alloc(prog->edicts_mempool, prog->max_edicts * prog->edict_size);
+ prog->edictsfields = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edict_size);
// set edict pointers
for(i = 0; i < prog->max_edicts; i++)
void PRVM_MEM_IncreaseEdicts()
{
int i;
- int oldmaxedicts = prog->max_edicts;
+ int oldmaxedicts = prog->max_edicts;
void *oldedictsfields = prog->edictsfields;
void *oldedictprivate = prog->edictprivate;
-
+
if(prog->max_edicts >= prog->limit_edicts)
return;
-
+
PRVM_GCALL(begin_increase_edicts)();
// increase edicts
prog->max_edicts = min(prog->max_edicts + 256, prog->limit_edicts);
- prog->edictsfields = Mem_Alloc(prog->edicts_mempool, prog->max_edicts * prog->edict_size);
- prog->edictprivate = Mem_Alloc(prog->edicts_mempool, prog->max_edicts * prog->edictprivate_size);
+ prog->edictsfields = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edict_size);
+ prog->edictprivate = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edictprivate_size);
memcpy(prog->edictsfields, oldedictsfields, oldmaxedicts * prog->edict_size);
memcpy(prog->edictprivate, oldedictprivate, oldmaxedicts * prog->edictprivate_size);
void PRVM_SetProg(int prognr)
{
if(prognr && prognr < PRVM_MAXPROGS)
- {
+ {
if(prog_list[prognr].loaded)
prog = &prog_list[prognr];
else
num = PRVM_NUM_FOR_EDICT(e) - 1;
// AK: Let the init_edict function determine if something needs to be initialized
- PRVM_GCALL(init_edict)(num);
+ PRVM_GCALL(init_edict)(num);
}
/*
char *s;
ddef_t *def;
mfunction_t *f;
-
+
type &= ~DEF_SAVEGLOBAL;
-
+
switch (type)
{
case ev_string:
line[i] = '\0';
break;
case ev_entity:
- snprintf (line, sizeof (line), "%i", PRVM_NUM_FOR_EDICT(PRVM_PROG_TO_EDICT(val->edict)));
+ dpsnprintf (line, sizeof (line), "%i", PRVM_NUM_FOR_EDICT(PRVM_PROG_TO_EDICT(val->edict)));
break;
case ev_function:
f = pr_functions + val->function;
break;
case ev_field:
def = PRVM_ED_FieldAtOfs ( val->_int );
- snprintf (line, sizeof (line), ".%s", PRVM_GetString(def->s_name));
+ dpsnprintf (line, sizeof (line), ".%s", PRVM_GetString(def->s_name));
break;
case ev_void:
- snprintf (line, sizeof (line), "void");
+ dpsnprintf (line, sizeof (line), "void");
break;
case ev_float:
- snprintf (line, sizeof (line), "%f", val->_float);
+ dpsnprintf (line, sizeof (line), "%f", val->_float);
break;
case ev_vector:
- snprintf (line, sizeof (line), "%f %f %f", val->vector[0], val->vector[1], val->vector[2]);
+ dpsnprintf (line, sizeof (line), "%f %f %f", val->vector[0], val->vector[1], val->vector[2]);
break;
default:
- snprintf (line, sizeof (line), "bad type %i", type);
+ dpsnprintf (line, sizeof (line), "bad type %i", type);
break;
}
-
+
return line;
}
Con_Print("prvm_edicts <program name>\n");
return;
}
-
+
PRVM_Begin;
if(!PRVM_SetProgFromString(Cmd_Argv(1)))
return;
continue;
active++;
}
-
+
Con_Printf("num_edicts:%3i\n", prog->num_edicts);
Con_Printf("active :%3i\n", active);
}
int i,l;
l = strlen(string) + 1;
- new = Mem_Alloc(prog->edictstring_mempool, l);
+ new = Mem_Alloc(prog->progs_mempool, l);
new_p = new;
for (i=0 ; i< l ; i++)
if (ent)
val = (prvm_eval_t *)((int *)ent->v + key->ofs);
else
- val = (prvm_eval_t *)((int *)pr_globals + key->ofs);
+ val = (prvm_eval_t *)((int *)prog->globals + key->ofs);
switch (key->type & ~DEF_SAVEGLOBAL)
{
case ev_string:
ed = PRVM_EDICT_NUM(atoi(Cmd_Argv(2)));
if((key = PRVM_ED_FindField(Cmd_Argv(3))) == 0)
- {
Con_Printf("Key %s not found !\n", Cmd_Argv(3));
- return;
- }
-
- PRVM_ED_ParseEpair(ed, key, Cmd_Argv(4));
+ else
+ PRVM_ED_ParseEpair(ed, key, Cmd_Argv(4));
PRVM_End;
}
PRVM_ERROR ("PRVM_ED_LoadFromFile: %s: found %s when expecting {", PRVM_NAME, com_token);
// CHANGED: this is not conform to ED_LoadFromFile
- if(!prog->num_edicts)
+ if(!prog->num_edicts)
ent = PRVM_EDICT_NUM(0);
- else
+ else
ent = PRVM_ED_Alloc();
// clear it
PRVM_ED_Free (ent);
continue;
}
-
+
// look for the spawn function
func = PRVM_ED_FindFunction (PRVM_GetString(handle));
-
+
if (!func)
{
if (developer.integer) // don't confuse non-developers with errors
PRVM_ED_Free (ent);
continue;
}
-
+
// self = ent
PRVM_G_INT(prog->self->ofs) = PRVM_EDICT_TO_PROG(ent);
PRVM_ExecuteProgram (func - prog->functions, "");
}
-
+
spawned++;
if (ent->p.e->free)
died++;
}
Con_DPrintf("%s: %i new entities parsed, %i new inhibited, %i (%i new) spawned (whereas %i removed self, %i stayed)\n", PRVM_NAME, parsed, inhibited, prog->num_edicts, spawned, died, spawned - died);
-}
+}
// not used
/*
void PRVM_ResetProg()
{
- /*mempool_t *t1, *t2, *t3;
+ /*mempool_t *t1;
t1 = prog->progs_mempool;
- t2 = prog->edictstring_mempool;
- t3 = prog->edicts_mempool;
-
- Mem_EmptyPool(prog->progs_mempool);
- Mem_EmptyPool(prog->edictstring_mempool);
- Mem_EmptyPool(prog->edicts_mempool);*/
+
+ Mem_EmptyPool(prog->progs_mempool);*/
Mem_FreePool(&prog->progs_mempool);
- Mem_FreePool(&prog->edictstring_mempool);
- Mem_FreePool(&prog->edicts_mempool);
-
+
memset(prog,0,sizeof(prvm_prog_t));
-
+
/*prog->time = &prog->_time;
-
- prog->progs_mempool = t1;
- prog->edictstring_mempool = t2;
- prog->edicts_mempool = t3;*/
+
+ prog->progs_mempool = t1;*/
PRVM_GCALL(reset_cmd)();
}
dfunction_t *dfunctions;
Mem_EmptyPool(prog->progs_mempool);
- Mem_EmptyPool(prog->edictstring_mempool);
prog->progs = (dprograms_t *)FS_LoadFile (filename, prog->progs_mempool, false);
if (prog->progs == NULL)
PRVM_Init_Exec();
prog->loaded = TRUE;
-
+
// set flags & ddef_ts in prog
-
+
prog->flag = 0;
-
+
prog->self = PRVM_ED_FindGlobal("self");
- if( PRVM_ED_FindGlobal("time") && PRVM_ED_FindGlobal("time")->type == ev_float )
+ if( PRVM_ED_FindGlobal("time") && PRVM_ED_FindGlobal("time")->type & ev_float )
prog->time = &PRVM_G_FLOAT(PRVM_ED_FindGlobal("time")->ofs);
if(PRVM_ED_FindField ("chain"))
prog->flag |= PRVM_FE_CHAIN;
if(PRVM_ED_FindField ("classname"))
- prog->flag |= PRVM_FE_CLASSNAME;
+ prog->flag |= PRVM_FE_CLASSNAME;
- if(PRVM_ED_FindField ("nextthink") && PRVM_ED_FindField ("frame") && PRVM_ED_FindField ("think")
- && prog->flag && prog->self)
+ if(PRVM_ED_FindField ("nextthink") && PRVM_ED_FindField ("frame") && PRVM_ED_FindField ("think")
+ && prog->flag && prog->self)
prog->flag |= PRVM_OP_STATE;
-
+
PRVM_GCALL(reset_cmd)();
PRVM_GCALL(init_cmd)();
if( !global )
Con_Printf( "No global '%s' in %s!\n", Cmd_Argv(2), Cmd_Argv(1) );
else
- Con_Printf( "%s: %s\n", Cmd_Argv(2), PRVM_ValueString( global->type, (prvm_eval_t *) &prog->globals[ global->ofs ] ) );
+ Con_Printf( "%s: %s\n", Cmd_Argv(2), PRVM_ValueString( global->type, (prvm_eval_t *) &prog->globals[ global->ofs ] ) );
+ PRVM_End;
+}
+
+/*
+===============
+PRVM_GlobalSet
+===============
+*/
+void PRVM_GlobalSet_f(void)
+{
+ ddef_t *global;
+ if( Cmd_Argc() != 4 ) {
+ Con_Printf( "prvm_globalset <program name> <global name> <value>\n" );
+ return;
+ }
+
+ PRVM_Begin;
+ if( !PRVM_SetProgFromString( Cmd_Argv(1) ) )
+ return;
+
+ global = PRVM_ED_FindGlobal( Cmd_Argv(2) );
+ if( !global )
+ Con_Printf( "No global '%s' in %s!\n", Cmd_Argv(2), Cmd_Argv(1) );
+ else
+ PRVM_ED_ParseEpair( NULL, global, Cmd_Argv(3) );
PRVM_End;
}
Cmd_AddCommand ("prvm_fields", PRVM_Fields_f);
Cmd_AddCommand ("prvm_globals", PRVM_Globals_f);
Cmd_AddCommand ("prvm_global", PRVM_Global_f);
+ Cmd_AddCommand ("prvm_globalset", PRVM_GlobalSet_f);
Cmd_AddCommand ("prvm_edictset", PRVM_ED_EdictSet_f);
// LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others))
Cvar_RegisterVariable (&prvm_boundscheck);