diff --git a/include/QF/progs.h b/include/QF/progs.h index c928c56a8..d6900a737 100644 --- a/include/QF/progs.h +++ b/include/QF/progs.h @@ -140,8 +140,6 @@ int NUM_FOR_EDICT(progs_t *pr, edict_t *e); extern int type_size[8]; typedef void (*builtin_t) (progs_t *pr); -extern builtin_t *pr_builtins; -extern int pr_numbuiltins; ddef_t *PR_FindGlobal (progs_t *pr, const char *name); @@ -169,10 +167,6 @@ eval_t *GetEdictFieldValue(progs_t *pr, edict_t *ed, char *field); char *PR_GetString(progs_t *pr, int num); int PR_SetString(progs_t *pr, char *s); -// externaly supplied functions - -int ED_Parse_Extra_Fields (progs_t *pr, char *key, char *value); -int ED_Prune_Edict (progs_t *pr, edict_t *ent); //============================================================================ @@ -238,6 +232,12 @@ struct progs_s { void (*unlink)(edict_t *ent); void (*flush)(void); + int (*parse_field)(progs_t *pr, char *key, char *value); + int (*prune_edict)(progs_t *pr, edict_t *ent); + + builtin_t *builtins; + int numbuiltins; + // required globals struct { float *time; diff --git a/libs/gamecode/pr_edict.c b/libs/gamecode/pr_edict.c index 26a1e52a9..3a3ee385e 100644 --- a/libs/gamecode/pr_edict.c +++ b/libs/gamecode/pr_edict.c @@ -846,7 +846,7 @@ ED_ParseEdict (progs_t * pr, char *data, edict_t *ent) key = ED_FindField (pr, keyname); if (!key) { - if (!ED_Parse_Extra_Fields (pr, keyname, com_token)) { + if (!pr->parse_field || !pr->parse_field (pr, keyname, com_token)) { Con_Printf ("'%s' is not a field\n", keyname); continue; } @@ -913,7 +913,7 @@ ED_LoadFromFile (progs_t * pr, char *data) data = ED_ParseEdict (pr, data, ent); // remove things from different skill levels or deathmatch - if (ED_Prune_Edict (pr, ent)) { + if (pr->prune_edict && pr->prune_edict (pr, ent)) { ED_Free (pr, ent); inhibit++; continue; diff --git a/libs/gamecode/pr_exec.c b/libs/gamecode/pr_exec.c index 4a464bfab..f0d83a6ca 100644 --- a/libs/gamecode/pr_exec.c +++ b/libs/gamecode/pr_exec.c @@ -661,9 +661,9 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum) // built in functions int i = -newf->first_statement; - if (i >= pr_numbuiltins) + if (i >= pr->numbuiltins) PR_RunError (pr, "Bad builtin call number"); - pr_builtins[i] (pr); + pr->builtins[i] (pr); break; } diff --git a/nq/source/pr_cmds.c b/nq/source/pr_cmds.c index 5b8915dfa..c677381cd 100644 --- a/nq/source/pr_cmds.c +++ b/nq/source/pr_cmds.c @@ -1902,7 +1902,7 @@ PF_checkextension (progs_t *pr) } -builtin_t pr_builtin[] = { +builtin_t sv_builtins[] = { PF_Fixme, PF_makevectors, // void(entity e) makevectors // = #1; @@ -2065,5 +2065,4 @@ builtin_t pr_builtin[] = { PF_checkextension, }; -builtin_t *pr_builtins = pr_builtin; -int pr_numbuiltins = sizeof (pr_builtin) / sizeof (pr_builtin[0]); +int sv_numbuiltins = sizeof (sv_builtins) / sizeof (sv_builtins[0]); diff --git a/nq/source/sv_progs.c b/nq/source/sv_progs.c index 9c66a35c6..f029004d2 100644 --- a/nq/source/sv_progs.c +++ b/nq/source/sv_progs.c @@ -66,8 +66,8 @@ cvar_t *saved2; cvar_t *saved3; cvar_t *saved4; -int -ED_Prune_Edict (progs_t *pr, edict_t *ent) +static int +prune_edict (progs_t *pr, edict_t *ent) { // remove things from different skill levels or deathmatch if (deathmatch->int_val) { @@ -119,8 +119,8 @@ PR_Profile_f (void) PR_Profile (&sv_pr_state); } -int -ED_Parse_Extra_Fields (progs_t * pr, char *key, char *value) +static int +parse_field (progs_t * pr, char *key, char *value) { return 0; } @@ -275,6 +275,9 @@ sv_fields.radsuit_finished = ED_GetFieldIndex (&sv_pr_state, "radsuit_finished") sv_fields.speed = ED_GetFieldIndex (&sv_pr_state, "speed"); } +extern builtin_t sv_builtins[]; +extern int sv_numbuiltins; + void SV_Progs_Init (void) { @@ -283,6 +286,10 @@ SV_Progs_Init (void) sv_pr_state.time = &sv.time; sv_pr_state.reserved_edicts = &svs.maxclients; sv_pr_state.unlink = SV_UnlinkEdict; + sv_pr_state.builtins = sv_builtins; + sv_pr_state.numbuiltins = sv_numbuiltins; + sv_pr_state.parse_field = parse_field; + sv_pr_state.prune_edict = prune_edict; Cmd_AddCommand ("edict", ED_PrintEdict_f, "Report information on a given edict in the game. (edict (edict number))"); diff --git a/qw/source/sv_pr_cmds.c b/qw/source/sv_pr_cmds.c index 96318b5d9..5b686c544 100644 --- a/qw/source/sv_pr_cmds.c +++ b/qw/source/sv_pr_cmds.c @@ -1643,7 +1643,7 @@ PF_Checkextension (progs_t *pr) G_FLOAT(pr, OFS_RETURN) = 0; //FIXME make this function actually useful :P } -builtin_t pr_builtin[] = { +builtin_t sv_builtins[] = { PF_Fixme, PF_makevectors, // void(entity e) makevectors // = #1; @@ -1788,5 +1788,4 @@ builtin_t pr_builtin[] = { PF_Checkextension, }; -builtin_t *pr_builtins = pr_builtin; -int pr_numbuiltins = sizeof (pr_builtin) / sizeof (pr_builtin[0]); +int sv_numbuiltins = sizeof (sv_builtins) / sizeof (sv_builtins[0]); diff --git a/qw/source/sv_progs.c b/qw/source/sv_progs.c index 175529c72..50e5124e6 100644 --- a/qw/source/sv_progs.c +++ b/qw/source/sv_progs.c @@ -59,8 +59,8 @@ func_t SpectatorThink; static int reserved_edicts = MAX_CLIENTS; -int -ED_Prune_Edict (progs_t *pr, edict_t *ent) +static int +prune_edict (progs_t *pr, edict_t *ent) { if (((int) SVFIELD (ent, spawnflags, float) & SPAWNFLAG_NOT_DEATHMATCH)) return 1; @@ -100,8 +100,8 @@ PR_Profile_f (void) PR_Profile (&sv_pr_state); } -int -ED_Parse_Extra_Fields (progs_t *pr, char *key, char *value) +static int +parse_field (progs_t *pr, char *key, char *value) { /* If skyname is set, we want to allow skyboxes and set what the skybox @@ -256,6 +256,9 @@ SV_LoadProgs (void) sv_fields.colormod = ED_GetFieldIndex (&sv_pr_state, "colormod"); } +extern builtin_t sv_builtins[]; +extern int sv_numbuiltins; + void SV_Progs_Init (void) { @@ -265,6 +268,10 @@ SV_Progs_Init (void) sv_pr_state.reserved_edicts = &reserved_edicts; sv_pr_state.unlink = SV_UnlinkEdict; sv_pr_state.flush = SV_FlushSignon; + sv_pr_state.builtins = sv_builtins; + sv_pr_state.numbuiltins = sv_numbuiltins; + sv_pr_state.parse_field = parse_field; + sv_pr_state.prune_edict = prune_edict; Cmd_AddCommand ("edict", ED_PrintEdict_f, "Report information on a given edict in the game. (edict (edict number))"); Cmd_AddCommand ("edicts", ED_PrintEdicts_f, "Display information on all edicts in the game.");