gzdoom/code/C_cvars.c

288 lines
5.6 KiB
C
Raw Normal View History

1998-04-07 00:00:00 +00:00
#include <string.h>
#include <stdio.h>
1998-07-14 00:00:00 +00:00
#include "cmdlib.h"
#include "c_consol.h"
1998-04-07 00:00:00 +00:00
#include "m_alloc.h"
1998-07-14 00:00:00 +00:00
#include "doomstat.h"
1998-04-07 00:00:00 +00:00
#include "c_cvars.h"
#include "d_player.h"
1998-07-14 00:00:00 +00:00
#include "d_netinf.h"
#include "dstrings.h"
1998-04-07 00:00:00 +00:00
1998-07-14 00:00:00 +00:00
#include "i_system.h"
static BOOL donoset = false;
1998-04-07 00:00:00 +00:00
cvar_t *CVars = NULL;
cvar_t *FindCVar (char *var_name, cvar_t **prev)
{
cvar_t *var;
var = CVars;
*prev = NULL;
while (var) {
if (stricmp (var->name, var_name) == 0)
break;
*prev = var;
var = var->next;
}
return var;
}
1998-07-14 00:00:00 +00:00
void UnlatchCVars (void)
{
cvar_t *var;
var = CVars;
while (var) {
if ((var->modified) && (var->flags & CVAR_LATCH)) {
unsigned oldflags = var->flags;
var->flags &= ~(CVAR_LATCH|CVAR_SERVERINFO);
var->modified = false;
if (var->u.latched_string) {
SetCVar (var, var->u.latched_string);
free (var->u.latched_string);
}
var->u.latched_string = NULL;
var->flags = oldflags;
}
var = var->next;
}
}
1998-04-07 00:00:00 +00:00
void SetCVar (cvar_t *var, char *value)
{
1998-07-14 00:00:00 +00:00
// TODO: Find a better way to not send serverinfo updates
// when not inside a game.
if (var->flags & CVAR_LATCH) {
1998-04-07 00:00:00 +00:00
var->modified = true;
1998-07-14 00:00:00 +00:00
var->u.latched_string = copystring (value);
} else if (var->flags & CVAR_SERVERINFO && gamestate > -1) {
if (netgame && consoleplayer != 0) {
Printf ("Only player 1 can change %s\n", var->name);
return;
}
D_SendServerInfoChange (var, value);
} else {
var->modified = true;
ReplaceString (&var->string, value);
var->value = (float)atof (value);
if (var->flags & CVAR_USERINFO)
D_UserInfoChanged (var);
if (var->flags & CVAR_CALLBACK && var->u.callback)
var->u.callback (var);
1998-04-07 00:00:00 +00:00
}
}
void SetCVarFloat (cvar_t *var, float value)
{
char string[32];
sprintf (string, "%g", value);
SetCVar (var, string);
}
cvar_t *cvar (char *var_name, char *value, int flags)
{
cvar_t *var, *dummy;
var = FindCVar (var_name, &dummy);
if (!var) {
1998-04-07 00:00:00 +00:00
var = Malloc (sizeof(cvar_t));
var->name = Malloc (strlen (var_name) + 1);
1998-04-07 00:00:00 +00:00
strcpy (var->name, var_name);
var->string = NULL;
1998-07-14 00:00:00 +00:00
var->u.latched_string = NULL;
1998-04-07 00:00:00 +00:00
var->flags = 0;
var->modified = false;
SetCVar (var, value);
var->next = CVars;
CVars = var;
1998-07-14 00:00:00 +00:00
C_AddTabCommand (var_name);
1998-04-07 00:00:00 +00:00
}
1998-07-14 00:00:00 +00:00
var->flags = flags;
1998-04-07 00:00:00 +00:00
return var;
}
cvar_t *cvar_set (char *var_name, char *value)
{
cvar_t *var, *dummy;
1998-07-14 00:00:00 +00:00
if ( (var = FindCVar (var_name, &dummy)) )
1998-04-07 00:00:00 +00:00
if (!(var->flags & CVAR_NOSET) || !donoset)
SetCVar (var, value);
return var;
}
cvar_t *cvar_forceset (char *var_name, char *value)
{
cvar_t *var, *dummy;
1998-07-14 00:00:00 +00:00
if ( (var = FindCVar (var_name, &dummy)) )
1998-04-07 00:00:00 +00:00
SetCVar (var, value);
return var;
}
void Cmd_Set (player_t *plyr, int argc, char **argv)
{
cvar_t *var, *prev;
1998-07-14 00:00:00 +00:00
if (argc != 3) {
Printf ("usage: set <variable> <value>\n");
} else {
1998-04-07 00:00:00 +00:00
if (!cvar_set (argv[1], argv[2]))
cvar (argv[1], argv[2], CVAR_UNSETTABLE);
1998-07-14 00:00:00 +00:00
var = FindCVar (argv[1], &prev);
if (var->flags & CVAR_NOSET)
Printf ("%s is write protected.\n", argv[1]);
else if (var->flags & CVAR_LATCH)
Printf ("%s will be changed for next game.\n", argv[1]);
1998-04-07 00:00:00 +00:00
}
}
void Cmd_Get (player_t *plyr, int argc, char **argv)
{
cvar_t *var, *prev;
if (argc >= 2) {
1998-07-14 00:00:00 +00:00
if ( (var = FindCVar (argv[1], &prev)) ) {
1998-04-07 00:00:00 +00:00
Printf ("\"%s\" is \"%s\"\n", var->name, var->string);
} else {
Printf ("\"%s\" is unset\n", argv[1]);
}
} else {
Printf ("get: need variable name\n");
}
}
void Cmd_Toggle (player_t *plyr, int argc, char **argv)
{
cvar_t *var, *prev;
if (argc > 1) {
1998-07-14 00:00:00 +00:00
if ( (var = FindCVar (argv[1], &prev)) ) {
1998-04-07 00:00:00 +00:00
SetCVarFloat (var, (float)(!var->value));
Printf ("\"%s\" is \"%s\"\n", var->name, var->string);
}
}
}
1998-07-14 00:00:00 +00:00
void Cmd_CvarList (player_t *plyr, int argc, char **argv)
{
cvar_t *var = CVars;
int count = 0;
while (var) {
unsigned flags = var->flags;
count++;
Printf ("%c%c%c%c %s \"%s\"\n",
flags & CVAR_ARCHIVE ? 'A' : ' ',
flags & CVAR_USERINFO ? 'U' : ' ',
flags & CVAR_SERVERINFO ? 'S' : ' ',
flags & CVAR_NOSET ? '-' :
flags & CVAR_LATCH ? 'L' :
flags & CVAR_CALLBACK ? 'C' :
flags & CVAR_UNSETTABLE ? '*' : ' ',
var->name,
var->string);
var = var->next;
}
Printf ("%d cvars\n", count);
}
1998-04-07 00:00:00 +00:00
void C_EnableNoSet (void)
{
donoset = true;
}
1998-07-14 00:00:00 +00:00
void C_WriteCVars (byte **demo_p, int filter)
{
cvar_t *cvar = CVars;
byte *ptr = *demo_p;
while (cvar) {
if (cvar->flags & filter) {
sprintf (ptr, "\\%s\\%s", cvar->name, cvar->string);
ptr += strlen (ptr);
}
cvar = cvar->next;
}
*demo_p = ptr + 1;
}
void C_ReadCVars (byte **demo_p)
{
byte *ptr = *demo_p;
byte *breakpt;
byte *value;
if (*ptr++ != '\\')
return;
while ( (breakpt = strchr (ptr, '\\')) ) {
*breakpt = 0;
value = breakpt + 1;
if ( (breakpt = strchr (value, '\\')) )
*breakpt = 0;
cvar_set (ptr, value);
*(value - 1) = '\\';
if (breakpt) {
*breakpt = '\\';
ptr = breakpt + 1;
} else {
break;
}
}
*demo_p += strlen (*demo_p) + 1;
}
static struct backup_s {
char *name, *string;
} CVarBackups[MAX_DEMOCVARS];
static int numbackedup = 0;
void C_BackupCVars (void)
{
struct backup_s *backup = CVarBackups;
cvar_t *cvar = CVars;
while (cvar) {
if ((cvar->flags & CVAR_SERVERINFO) || (cvar->flags & CVAR_DEMOSAVE)) {
if (backup == &CVarBackups[MAX_DEMOCVARS])
I_Error ("C_BackupDemoCVars: Too many cvars to save (%d)", MAX_DEMOCVARS);
backup->name = copystring (cvar->name);
backup->string = copystring (cvar->string);
backup++;
}
cvar = cvar->next;
}
numbackedup = backup - CVarBackups;
}
void C_RestoreCVars (void)
{
struct backup_s *backup = CVarBackups;
int i;
for (i = numbackedup; i; i--, backup++) {
cvar_set (backup->name, backup->string);
free (backup->name);
free (backup->string);
backup->name = backup->string = NULL;
}
numbackedup = 0;
}