⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvar.c

📁 quake1 dos源代码最新版本
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/*
============
Cvar_FindVar
============
*/
cvar_t *Cvar_FindVar (char *name)
{
	cvar_t	*var;

	for ( var=cvar_list ; var ; var=var->next )
	{
		if (!Q_strcasecmp (name, var->name))
		{
			return var;
		}
	}

	return NULL;
}

/*
============
Cvar_Set
============
*/
void Cvar_Set (cvar_t *var, char *value)
{
	char	*newvalue;

	if (var->rangecheck)
	{
		newvalue = var->rangecheck (var, value, false);
	}
	else
	{
		newvalue = value;
	}

	if (var->string)
	{
		if (!strcmp (newvalue, var->string))
		{
			return;		// do nothing on same value
		}
		Z_Free (mainzone, var->string);	// 2001-09-20 Enhanced zone handling by Maddes
	}

	var->string = Z_Malloc (mainzone, strlen(newvalue) + 1);	// 2001-09-20 Enhanced zone handling by Maddes
	strcpy (var->string, newvalue);

	var->value = Q_atof (var->string);

	// notify clients of change
	if (var->flags & CVAR_NOTIFY)
	{
		if (sv.active)
		{
			SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string);
		}
	}

	if (var->callback)
	{
		var->callback (var);
	}
}

/*
============
Cvar_SetValue

expands value to a string and calls Cvar_Set
============
*/
void Cvar_SetValue (cvar_t *var, float value)
{
	char	valstring[32];

// 1999-09-07 weird cvar zeros fix by Maddes  start
	int	i;

	if (value == (int)value)
	{
		sprintf (valstring, "%i", (int)value);
	}
	else
	{
		sprintf (valstring, "%1f", value);	// no leading spaces
		for (i=strlen(valstring)-1 ; i>0 && valstring[i]=='0' && valstring[i-1]!='.' ; i--)	// no trailing zeroes
		{
			valstring[i] = 0;
		}
	}
// 1999-09-07 weird cvar zeros fix by Maddes  end

	Cvar_Set (var, valstring);
}

/*
============
Cvar_Command

Handles variable inspection and changing from the console
============
*/
qboolean Cvar_Command (void)
{
	cvar_t	*var;

	var = Cvar_FindVar (Cmd_Argv(0));
	if (!var)
	{
		return false;
	}

	if (Cmd_Argc() == 1)	// just display the cvar
	{
		Cvar_Display (var, true);
	}
	else
	{
		if (var->flags & CVAR_ROM)	// check for user-protected cvar
		{
			Con_Printf ("Variable \"%s\" is read-only\n", var->name);
		}
		else
		{
			Cvar_Set (var, Cmd_Argv(1));
		}
	}

	return true;
}

/*
============
Cvar_WriteVariables

Writes lines containing "set variable value" for all variables
with the archive flag set to true.
============
*/
void Cvar_WriteVariables (FILE *f, qboolean new_rc_file)
{
	cvar_t	*var;

	for (var=cvar_list ; var ; var=var->next)
	{
		if (!(var->flags & CVAR_ARCHIVE))	// only cvars that should be archived
		{
			continue;
		}

		if (new_rc_file)
		{
			fprintf (f, "seta %s \"%s\"\n", var->name, var->string);
		}
		else if (var->flags & CVAR_ORIGINAL)		// original id cvars
		{
			fprintf (f, "%s \"%s\"\n", var->name, var->string);
		}
	}
}

/*
============
Cvar_CompleteVariable

attempts to match a partial variable name for command line completion
returns NULL if nothing fits
============
*/
char *Cvar_CompleteVariable (char *partial)
{
	cvar_t	*var;
	int		len;

	len = strlen(partial);

	if (!len)
	{
		return NULL;
	}

	// check variables
	for (var=cvar_list ; var ; var=var->next)
	{
		if (!(Q_strncasecmp (partial,var->name, len)))
		{
			return var->name;
		}
	}

	return NULL;
}

/*
============
Cvar_SetRangecheck
============
*/
void Cvar_SetRangecheck (cvar_t *var, cvar_rangecheck rangecheck, float minvalue, float maxvalue)
{
	var->rangecheck = rangecheck;
	var->minvalue = minvalue;
	var->maxvalue = maxvalue;
}

/*
============
Cvar_SetCallback
============
*/
void Cvar_SetCallback (cvar_t *var, cvar_callback callback)
{
	var->callback = callback;
}

/*
============
Cvar_RangecheckBool
============
*/
char *Cvar_RangecheckBool (cvar_t *var, char *value, qboolean showinfo)
{
	float	newvalue;

	if (showinfo)
	{
		Con_Printf("Range: BOOL 0/1\n");
		return value;
	}

	newvalue = Q_atof (value);

	if (newvalue)
	{
		return "1";
	}

	return "0";
}

/*
============
Cvar_RangecheckInt
============
*/
char *Cvar_RangecheckInt (cvar_t *var, char *value, qboolean showinfo)
{
	float	newvalue;

	if (showinfo)
	{
		Con_Printf("Range: INT %i - %i\n", (int)var->minvalue, (int)var->maxvalue);
		return value;
	}

	newvalue = Q_atof (value);

	if ( (newvalue != (int)newvalue)
	     || (newvalue < var->minvalue)
	     || (newvalue > var->maxvalue) )
	{
		if (newvalue < var->minvalue)
		{
			newvalue = var->minvalue;
		}
		else if (newvalue > var->maxvalue)
		{
			newvalue = var->maxvalue;
		}

		sprintf (new_valstring, "%i", (int)newvalue);

		return new_valstring;
	}

	return value;
}

/*
============
Cvar_RangecheckFloat
============
*/
char *Cvar_RangecheckFloat (cvar_t *var, char *value, qboolean showinfo)
{
	float	newvalue;
	int		i;

	if (showinfo)
	{
		Con_Printf("Range: FLOAT %1f - %1f\n", var->minvalue, var->maxvalue);
		return value;
	}

	newvalue = Q_atof (value);

	// check limits of new value
	if ( (newvalue < var->minvalue)
	     || (newvalue > var->maxvalue) )
	{
		if (newvalue < var->minvalue)
		{
			newvalue = var->minvalue;
		}
		else
		{
			newvalue = var->maxvalue;
		}

		if (newvalue == (int)newvalue)
		{
			sprintf (new_valstring, "%i", (int)newvalue);
		}
		else
		{
			sprintf (new_valstring, "%1f", newvalue);
			for (i=strlen(new_valstring)-1 ; i>0 && new_valstring[i]=='0' && new_valstring[i-1]!='.' ; i--)
			{
				new_valstring[i] = 0;
			}
		}

		return new_valstring;
	}

	return value;
}

/*
============
Cvar_SetDescription
============
*/
void Cvar_SetDescription (cvar_t *var, char *description)
{
	var->description = description;
}

// 2001-12-15 Enhanced console command completion by Fett/Maddes  start
/*
============
Cvar_CompleteCountPossible
============
*/
int Cvar_CompleteCountPossible (char *partial)
{
	cvar_t	*var;
	int	len;
	int	h;

	h=0;

	len = strlen(partial);

	if (!len)
		return 0;

	// Loop through the cvars and count all partial matches
	for (var=cvar_list ; var ; var=var->next)
		if (!Q_strncasecmp (partial,var->name, len))
			h++;

	return h;
}

/*
============
Cvar_CompletePrintPossible
============
*/
void Cvar_CompletePrintPossible (char *partial)
{
	cvar_t	*var;
	int		len;
	int		maxcnt, cnt;
	int		con_linewidth;
	char	*sout;

	len = strlen(partial);

	// Determine the width of the console - 1
	con_linewidth = (vid.width >> 3) - 3;
	maxcnt = con_linewidth / 20;	// entries per line
	cnt = 0;

	// Loop through the cvar list and print all matches
	for (var=cvar_list ; var ; var=var->next)
	{
		if (!Q_strncasecmp (partial,var->name, len))
		{
			sout = Pad_CompletePrint(var->name);
			Con_Printf ("%s", sout);

			cnt++;
			if (cnt >= maxcnt)
			{
				cnt = 0;
				Con_Printf ("\n");
			}
		}
	}
	if (cnt)
	{
		Con_Printf ("\n");
	}
	Con_Printf ("\n");
}
// 2001-12-15 Enhanced console command completion by Fett/Maddes  end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -