diff --git a/code/qcommon/cvar.c b/code/qcommon/cvar.c index 278b9909..d4809ae7 100644 --- a/code/qcommon/cvar.c +++ b/code/qcommon/cvar.c @@ -690,21 +690,44 @@ void Cvar_Print_f(void) ============ Cvar_Toggle_f -Toggles a cvar for easy single key binding +Toggles a cvar for easy single key binding, optionally through a list of +given values ============ */ void Cvar_Toggle_f( void ) { - int v; + int i, c = Cmd_Argc(); + char *curval; - if ( Cmd_Argc() != 2 ) { - Com_Printf ("usage: toggle \n"); + if(c < 2) { + Com_Printf("usage: toggle [value1, value2, ...]\n"); return; } - v = Cvar_VariableValue( Cmd_Argv( 1 ) ); - v = !v; + if(c == 2) { + Cvar_Set2(Cmd_Argv(1), va("%d", + !Cvar_VariableValue(Cmd_Argv(1))), + qfalse); + return; + } - Cvar_Set2 (Cmd_Argv(1), va("%i", v), qfalse); + if(c == 3) { + Com_Printf("toggle: nothing to toggle to\n"); + return; + } + + curval = Cvar_VariableString(Cmd_Argv(1)); + + // don't bother checking the last arg for a match since the desired + // behaviour is the same as no match (set to the first argument) + for(i = 2; i + 1 < c; i++) { + if(strcmp(curval, Cmd_Argv(i)) == 0) { + Cvar_Set2(Cmd_Argv(1), Cmd_Argv(i + 1), qfalse); + return; + } + } + + // fallback + Cvar_Set2(Cmd_Argv(1), Cmd_Argv(2), qfalse); } /*