mirror of
https://bitbucket.org/CPMADevs/cnq3
synced 2025-02-08 08:22:06 +00:00
added /unset, /setempty and sequence support to /toggle
This commit is contained in:
parent
2fc0a06ef1
commit
067ae10ab5
3 changed files with 124 additions and 26 deletions
|
@ -1,4 +1,16 @@
|
||||||
|
|
||||||
|
DD Mmm 18 - 1.51
|
||||||
|
|
||||||
|
add: /unset <cvar> to remove a user-created cvar
|
||||||
|
|
||||||
|
add: /setempty <cvar> to set a string cvar to an empty string
|
||||||
|
|
||||||
|
add: /toggle can now accept a value sequence (2 or more entries) to loop through
|
||||||
|
syntax: /toggle <cvar> [<value1> <value2> [value3]..]
|
||||||
|
if the cvar's current value is in the sequence and not in the last spot, the next one is used
|
||||||
|
otherwise, the first value in the sequence is used
|
||||||
|
|
||||||
|
|
||||||
12 Feb 18 - 1.50
|
12 Feb 18 - 1.50
|
||||||
|
|
||||||
add: on Windows, "/crashreport:yes" and "/crashreport:no" command-line arguments
|
add: on Windows, "/crashreport:yes" and "/crashreport:no" command-line arguments
|
||||||
|
|
|
@ -7,7 +7,13 @@
|
||||||
|
|
||||||
#define help_toggle \
|
#define help_toggle \
|
||||||
"toggles the boolean value of a variable\n" \
|
"toggles the boolean value of a variable\n" \
|
||||||
"Non-" S_COLOR_VAL "0 " S_COLOR_HELP "becomes " S_COLOR_VAL "0 " S_COLOR_HELP "and " S_COLOR_VAL "0 " S_COLOR_HELP "becomes " S_COLOR_VAL "1" S_COLOR_HELP "."
|
"Example: " S_COLOR_CMD "toggle " S_COLOR_CVAR "v\n" S_COLOR_HELP \
|
||||||
|
" non-" S_COLOR_VAL "0 " S_COLOR_HELP "=> " S_COLOR_VAL "0 \n" \
|
||||||
|
" 0 " S_COLOR_HELP "=> " S_COLOR_VAL "1\n" S_COLOR_HELP \
|
||||||
|
"Example: " S_COLOR_CMD "toggle " S_COLOR_CVAR "v " S_COLOR_VAL "a b c\n" S_COLOR_HELP \
|
||||||
|
" non-" S_COLOR_VAL "abc " S_COLOR_HELP "=> " S_COLOR_VAL "a\n" \
|
||||||
|
" a " S_COLOR_HELP "=> " S_COLOR_VAL "b " S_COLOR_HELP "| " S_COLOR_VAL "b " S_COLOR_HELP "=> " S_COLOR_VAL "c " \
|
||||||
|
S_COLOR_HELP "| " S_COLOR_VAL "c " S_COLOR_HELP "=> " S_COLOR_VAL "a"
|
||||||
|
|
||||||
#define help_cvarlist \
|
#define help_cvarlist \
|
||||||
"lists and filters all cvars\n" \
|
"lists and filters all cvars\n" \
|
||||||
|
|
|
@ -837,13 +837,111 @@ static void Cvar_CompleteName( int startArg, int compArg )
|
||||||
|
|
||||||
static void Cvar_Toggle_f( void )
|
static void Cvar_Toggle_f( void )
|
||||||
{
|
{
|
||||||
if ( Cmd_Argc() != 2 ) {
|
const int argc = Cmd_Argc();
|
||||||
Com_Printf ("usage: toggle <variable>\n");
|
if ( argc != 2 && argc < 4 ) {
|
||||||
|
Com_Printf( "usage: toggle <variable> [<value1> <value2> [value3]..]\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int v = !Cvar_VariableValue( Cmd_Argv( 1 ) );
|
const char* const name = Cmd_Argv(1);
|
||||||
Cvar_Set2( Cmd_Argv(1), va("%i", v), qfalse );
|
const cvar_t* const cvar = Cvar_FindVar( name );
|
||||||
|
if ( !cvar )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ( argc == 2 ) {
|
||||||
|
const int v = !Cvar_VariableIntegerValue( name );
|
||||||
|
Cvar_Set2( name, va("%i", v), qfalse );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the next value - if none found, set the first value
|
||||||
|
int index = -1;
|
||||||
|
const int valueOffset = 2;
|
||||||
|
const int valueCount = argc - valueOffset;
|
||||||
|
for ( int i = 0; i < valueCount; ++i )
|
||||||
|
{
|
||||||
|
if ( !Q_stricmp(Cmd_Argv(i + valueOffset), cvar->string) ) {
|
||||||
|
index = (i + 1) % valueCount;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( index < 0 )
|
||||||
|
index = 0;
|
||||||
|
|
||||||
|
Cvar_Set2( name, Cmd_Argv(index + valueOffset), qfalse );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// frees resources associated to a cvar, then clears it
|
||||||
|
|
||||||
|
static void Cvar_Nuke( cvar_t* var )
|
||||||
|
{
|
||||||
|
if ( var->name )
|
||||||
|
Z_Free( var->name );
|
||||||
|
|
||||||
|
if ( var->string )
|
||||||
|
Z_Free( var->string );
|
||||||
|
|
||||||
|
if ( var->latchedString )
|
||||||
|
Z_Free( var->latchedString );
|
||||||
|
|
||||||
|
if ( var->resetString )
|
||||||
|
Z_Free( var->resetString );
|
||||||
|
|
||||||
|
if ( var->desc )
|
||||||
|
Z_Free( var->desc );
|
||||||
|
|
||||||
|
if ( var->help )
|
||||||
|
Z_Free( var->help );
|
||||||
|
|
||||||
|
// clear the var completely, since we
|
||||||
|
// can't remove the index from the list
|
||||||
|
Com_Memset( var, 0, sizeof( var ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// removes a user-created cvar
|
||||||
|
|
||||||
|
static void Cvar_Unset_f( void )
|
||||||
|
{
|
||||||
|
if ( Cmd_Argc() != 2 ) {
|
||||||
|
Com_Printf( "usage: unset <variable>\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* const name = Cmd_Argv(1);
|
||||||
|
cvar_t** prev = &cvar_vars;
|
||||||
|
while ( 1 ) {
|
||||||
|
cvar_t* const var = *prev;
|
||||||
|
if ( !var )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ( (var->flags & CVAR_USER_CREATED) != 0 && !Q_stricmp(var->name, name) ) {
|
||||||
|
*prev = var->next;
|
||||||
|
Cvar_Nuke( var );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = &var->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// sets a cvar to an empty string
|
||||||
|
|
||||||
|
static void Cvar_SetEmpty_f( void )
|
||||||
|
{
|
||||||
|
if ( Cmd_Argc() != 2 ) {
|
||||||
|
Com_Printf( "usage: setempty <string_variable>\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* const name = Cmd_Argv(1);
|
||||||
|
const cvar_t* const cvar = Cvar_FindVar( name );
|
||||||
|
if ( !cvar || cvar->type != CVART_STRING )
|
||||||
|
return;
|
||||||
|
|
||||||
|
Cvar_Set( Cmd_Argv(1), "" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -985,27 +1083,7 @@ static void Cvar_Restart( qbool reset )
|
||||||
// throw out any variables the user created
|
// throw out any variables the user created
|
||||||
if ( var->flags & CVAR_USER_CREATED ) {
|
if ( var->flags & CVAR_USER_CREATED ) {
|
||||||
*prev = var->next;
|
*prev = var->next;
|
||||||
if ( var->name ) {
|
Cvar_Nuke( var );
|
||||||
Z_Free( var->name );
|
|
||||||
}
|
|
||||||
if ( var->string ) {
|
|
||||||
Z_Free( var->string );
|
|
||||||
}
|
|
||||||
if ( var->latchedString ) {
|
|
||||||
Z_Free( var->latchedString );
|
|
||||||
}
|
|
||||||
if ( var->resetString ) {
|
|
||||||
Z_Free( var->resetString );
|
|
||||||
}
|
|
||||||
if ( var->desc ) {
|
|
||||||
Z_Free( var->desc );
|
|
||||||
}
|
|
||||||
if ( var->help ) {
|
|
||||||
Z_Free( var->help );
|
|
||||||
}
|
|
||||||
// clear the var completely, since we
|
|
||||||
// can't remove the index from the list
|
|
||||||
Com_Memset( var, 0, sizeof( var ) );
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1154,6 +1232,8 @@ static const cmdTableItem_t cl_cmds[] =
|
||||||
{ "setu", Cvar_SetU_f, Cvar_CompleteName, "like /set with the user info flag" },
|
{ "setu", Cvar_SetU_f, Cvar_CompleteName, "like /set with the user info flag" },
|
||||||
{ "seta", Cvar_SetA_f, Cvar_CompleteName, "like /set with the archive flag" },
|
{ "seta", Cvar_SetA_f, Cvar_CompleteName, "like /set with the archive flag" },
|
||||||
{ "reset", Cvar_Reset_f, Cvar_CompleteName, "sets a cvar back to its default value" },
|
{ "reset", Cvar_Reset_f, Cvar_CompleteName, "sets a cvar back to its default value" },
|
||||||
|
{ "unset", Cvar_Unset_f, Cvar_CompleteName, "removes a user-created cvar" },
|
||||||
|
{ "setempty", Cvar_SetEmpty_f, Cvar_CompleteName, "sets a cvar to an empty string" },
|
||||||
{ "cvarlist", Cvar_List_f, NULL, help_cvarlist },
|
{ "cvarlist", Cvar_List_f, NULL, help_cvarlist },
|
||||||
{ "cvar_restart", Cvar_Restart_f, NULL, "restarts the cvar system" },
|
{ "cvar_restart", Cvar_Restart_f, NULL, "restarts the cvar system" },
|
||||||
{ "cvar_trim", Cvar_Trim_f, NULL, "removes user-created cvars" }
|
{ "cvar_trim", Cvar_Trim_f, NULL, "removes user-created cvars" }
|
||||||
|
|
Loading…
Reference in a new issue