From e1838afc4151f2f78402e29d3bfa5d1eb4dfa395 Mon Sep 17 00:00:00 2001
From: chromaticpipe2 <chromaticpipe@gmail.com>
Date: Fri, 21 Mar 2025 19:55:29 -0500
Subject: [PATCH 1/6] Implement support for tooltips and add tooltips for the
 video options menu

---
 src/m_menu.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/m_menu.h |  11 ++++++
 2 files changed, 120 insertions(+)

diff --git a/src/m_menu.c b/src/m_menu.c
index 227f2c8224..2f9e16e9ca 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -141,6 +141,7 @@ static char *char_notes = NULL;
 boolean menuactive = false;
 boolean fromlevelselect = false;
 
+static INT32 coolalphatimer = 9;
 typedef enum
 {
 	LLM_CREATESERVER,
@@ -1350,6 +1351,58 @@ static menuitem_t OP_VideoOptionsMenu[] =
 	{IT_STRING | IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost,   231},
 };
 
+static const char* OP_VideoTooltips[] =
+{
+	NULL,
+	"Resolution the game runs at",
+	"Toggle between fullscreen and windowed mode",
+	"Sync game framerate to display refresh rate",
+	NULL,
+	#ifdef HWRENDER
+	"Toggle OpenGL and Software renderer",
+	#else
+	"Does nothing on this build",
+	#endif
+	"Adjusts field of view, allowing you to have a wider perspective",
+	"Set the game framerate",
+	#ifdef HWRENDER
+	"Options specific to the OpenGL renderer",
+	#else
+	"Does nothing on this build",
+	#endif
+	NULL,
+	"Gamma (brightness) of the game",
+	"Saturation of the game",
+	"Advanced color settings for the game",
+	NULL,
+	"Toggles the Heads-up display",
+	"Changes the transparency of the Heads-up display",
+	"The appearance of the score, time and rings display",
+	"Show remaining duration of power up items",
+	"Display your ping to the server next to the FPS counter",
+	"Show the names of fellow players when you are near them",
+	NULL,
+	"Change the background color of the console",
+	"Adjust the text size of the console",
+	NULL,
+	"Choose how the game chat is displayed",
+	"Change the width of the chat box",
+	"Change the height of the chat box",
+	"How long chat messages appear on screen before fading out",
+	"Plays a chat notification sound",
+	"Block chat messages from sending too fast",
+	"Background for the chatbox",
+	NULL,
+	"How far to render objects",
+	"How far to render precipitation(rain/snow)",
+	"How far to render hoops in NiGHTS mode",
+	NULL,
+	"Display the game's framerate",
+	"Display the game's ticrate",
+	"Fixes the hall of mirrors bug in the Software renderer",
+	"Display a 'Focus Lost' message when the window is unfocused"
+};
+
 static menuitem_t OP_VideoModeMenu[] =
 {
 	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleVideoMode, 0},     // dummy menuitem for the control func
@@ -3460,11 +3513,13 @@ boolean M_Responder(event_t *ev)
 		case KEY_DOWNARROW:
 			M_NextOpt();
 			S_StartSound(NULL, sfx_menu1);
+			coolalphatimer = 9;
 			return true;
 
 		case KEY_UPARROW:
 			M_PrevOpt();
 			S_StartSound(NULL, sfx_menu1);
+			coolalphatimer = 9;
 			return true;
 
 		case KEY_LEFTARROW:
@@ -4321,6 +4376,58 @@ static void M_DrawMenuTitle(void)
 	}
 }
 
+
+static void M_DrawSplitText(INT32 x, INT32 y, INT32 option, const char* str, INT32 alpha)
+{
+	char* icopy = strdup(str);
+	char** clines = NULL;
+	INT16 num_lines = 0;
+
+	if (icopy == NULL) return;
+
+	char* tok = strtok(icopy, "\n");
+
+	while (tok != NULL)
+	{
+		char* line = strdup(tok);
+
+		if (line == NULL) return;
+
+		clines = realloc(clines, (num_lines + 1) * sizeof(char*));
+		clines[num_lines] = line;
+		num_lines++;
+
+		tok = strtok(NULL, "\n");
+	}
+
+	free(icopy);
+
+	INT16 yoffset;
+	yoffset = (((5*10 - num_lines*10)));
+
+	// Draw BG first,,,
+	for (int i = 0; i < num_lines; i++)
+	{
+		V_DrawFill(0, (y + yoffset - 6)+5, vid.width, 11, 159|V_SNAPTOBOTTOM|V_SNAPTOLEFT);
+		yoffset += 11;
+	}
+
+	yoffset = (((5*10 - num_lines*10)));
+
+	// THEN the text
+	for (int i = 0; i < num_lines; i++)
+	{
+        V_DrawCenteredThinString(x, y + yoffset, option, clines[i]);
+		V_DrawCenteredThinString(x, y + yoffset, option|V_YELLOWMAP|((9 - alpha) << V_ALPHASHIFT), clines[i]);
+		yoffset += 10;
+        // Remember to free the memory for each line when you're done with it.
+        free(clines[i]);
+    }
+
+	free(clines);
+}
+
+
 static void M_DrawGenericMenu(void)
 {
 	INT32 x, y, i, cursory = 0;
@@ -4706,6 +4813,8 @@ static void M_DrawGenericScrollMenu(void)
 	// DRAW THE SKULL CURSOR
 	V_DrawScaledPatch(currentMenu->x - 24, cursory, 0,
 		W_CachePatchName("M_CURSOR", PU_PATCH));
+
+	DoToolTips(OP_VideoOptionsDef, OP_VideoTooltips);
 }
 
 static void M_DrawPauseMenu(void)
diff --git a/src/m_menu.h b/src/m_menu.h
index 01384493a3..45ca6c2f2e 100644
--- a/src/m_menu.h
+++ b/src/m_menu.h
@@ -578,4 +578,15 @@ void M_FreePlayerSetupColors(void);
 	NULL\
 }
 
+#define DoToolTips(menu, tooltip)\
+if (currentMenu == &menu)\
+{\
+	if (!(tooltip[itemOn] == NULL))\
+	{\
+		M_DrawSplitText(BASEVIDWIDTH / 2, BASEVIDHEIGHT-50, V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, tooltip[itemOn], coolalphatimer);\
+		if (coolalphatimer > 0)\
+			coolalphatimer--;\
+	}\
+}
+
 #endif //__X_MENU__
-- 
GitLab


From 427a46fca71dac6b82dcedf41038f0be66dc4a40 Mon Sep 17 00:00:00 2001
From: Hanicef <gustaf@hanicef.me>
Date: Sat, 22 Mar 2025 12:03:14 +0100
Subject: [PATCH 2/6] Change the way tooltips are stored

---
 src/m_menu.c | 1287 +++++++++++++++++++++++++-------------------------
 src/m_menu.h |   12 +-
 2 files changed, 632 insertions(+), 667 deletions(-)

diff --git a/src/m_menu.c b/src/m_menu.c
index 2f9e16e9ca..a42e8f0d29 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -501,12 +501,12 @@ consvar_t cv_dummyloadless = CVAR_INIT ("dummyloadless", "In-game", NULL, CV_HID
 // ---------
 static menuitem_t MainMenu[] =
 {
-	{IT_STRING|IT_CALL,    NULL, "1  Player",   M_SinglePlayerMenu,      76},
-	{IT_STRING|IT_SUBMENU, NULL, "Multiplayer", &MP_MainDef,             84},
-	{IT_STRING|IT_CALL,    NULL, "Extras",      M_SecretsMenu,           92},
-	{IT_CALL   |IT_STRING, NULL, "Addons",      M_Addons,               100},
-	{IT_STRING|IT_CALL,    NULL, "Options",     M_Options,              108},
-	{IT_STRING|IT_CALL,    NULL, "Quit  Game",  M_QuitSRB2,             116},
+	{IT_STRING|IT_CALL,    NULL, "1  Player",   NULL, M_SinglePlayerMenu,      76},
+	{IT_STRING|IT_SUBMENU, NULL, "Multiplayer", NULL, &MP_MainDef,             84},
+	{IT_STRING|IT_CALL,    NULL, "Extras",      NULL, M_SecretsMenu,           92},
+	{IT_CALL   |IT_STRING, NULL, "Addons",      NULL, M_Addons,               100},
+	{IT_STRING|IT_CALL,    NULL, "Options",     NULL, M_Options,              108},
+	{IT_STRING|IT_CALL,    NULL, "Quit  Game",  NULL, M_QuitSRB2,             116},
 };
 
 typedef enum
@@ -521,7 +521,7 @@ typedef enum
 
 static menuitem_t MISC_AddonsMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleAddons, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleAddons, 0},     // dummy menuitem for the control func
 };
 
 // ---------------------------------
@@ -529,11 +529,11 @@ static menuitem_t MISC_AddonsMenu[] =
 // ---------------------------------
 static menuitem_t MAPauseMenu[] =
 {
-	{IT_CALL | IT_STRING,    NULL, "Emblem Hints...",      M_EmblemHints,         32},
+	{IT_CALL | IT_STRING,    NULL, "Emblem Hints...",      NULL, M_EmblemHints,         32},
 
-	{IT_CALL | IT_STRING,    NULL, "Continue",             M_SelectableClearMenus,48},
-	{IT_CALL | IT_STRING,    NULL, "Retry",                M_ModeAttackRetry,     56},
-	{IT_CALL | IT_STRING,    NULL, "Abort",                M_ModeAttackEndGame,   64},
+	{IT_CALL | IT_STRING,    NULL, "Continue",             NULL, M_SelectableClearMenus,48},
+	{IT_CALL | IT_STRING,    NULL, "Retry",                NULL, M_ModeAttackRetry,     56},
+	{IT_CALL | IT_STRING,    NULL, "Abort",                NULL, M_ModeAttackEndGame,   64},
 };
 
 typedef enum
@@ -549,25 +549,25 @@ typedef enum
 // ---------------------
 static menuitem_t MPauseMenu[] =
 {
-	{IT_STRING | IT_CALL,    NULL, "Add-ons...",                M_Addons,               8},
-	{IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...",         &MISC_ScrambleTeamDef, 16},
-	{IT_STRING | IT_CALL,    NULL, "Emblem Hints...",           M_EmblemHints,         24},
-	{IT_STRING | IT_CALL,    NULL, "Switch Gametype/Level...",  M_MapChange,           32},
+	{IT_STRING | IT_CALL,    NULL, "Add-ons...",                NULL, M_Addons,               8},
+	{IT_STRING | IT_SUBMENU, NULL, "Scramble Teams...",         NULL, &MISC_ScrambleTeamDef, 16},
+	{IT_STRING | IT_CALL,    NULL, "Emblem Hints...",           NULL, M_EmblemHints,         24},
+	{IT_STRING | IT_CALL,    NULL, "Switch Gametype/Level...",  NULL, M_MapChange,           32},
 
-	{IT_STRING | IT_CALL,    NULL, "Continue",                  M_SelectableClearMenus,48},
+	{IT_STRING | IT_CALL,    NULL, "Continue",                  NULL, M_SelectableClearMenus,48},
 
-	{IT_STRING | IT_CALL,    NULL, "Player 1 Setup",            M_SetupMultiPlayer,    56}, // splitscreen
-	{IT_STRING | IT_CALL,    NULL, "Player 2 Setup",            M_SetupMultiPlayer2,   64},
+	{IT_STRING | IT_CALL,    NULL, "Player 1 Setup",            NULL, M_SetupMultiPlayer,    56}, // splitscreen
+	{IT_STRING | IT_CALL,    NULL, "Player 2 Setup",            NULL, M_SetupMultiPlayer2,   64},
 
-	{IT_STRING | IT_CALL,    NULL, "Spectate",                  M_ConfirmSpectate,     56}, // alone
-	{IT_STRING | IT_CALL,    NULL, "Enter Game",                M_ConfirmEnterGame,    56},
-	{IT_STRING | IT_SUBMENU, NULL, "Switch Team...",            &MISC_ChangeTeamDef,   56},
-	{IT_STRING | IT_CALL,    NULL, "Player Setup",              M_SetupMultiPlayer,    64},
+	{IT_STRING | IT_CALL,    NULL, "Spectate",                  NULL, M_ConfirmSpectate,     56}, // alone
+	{IT_STRING | IT_CALL,    NULL, "Enter Game",                NULL, M_ConfirmEnterGame,    56},
+	{IT_STRING | IT_SUBMENU, NULL, "Switch Team...",            NULL, &MISC_ChangeTeamDef,   56},
+	{IT_STRING | IT_CALL,    NULL, "Player Setup",              NULL, M_SetupMultiPlayer,    64},
 
-	{IT_STRING | IT_CALL,    NULL, "Options",                   M_Options,             72},
+	{IT_STRING | IT_CALL,    NULL, "Options",                   NULL, M_Options,             72},
 
-	{IT_STRING | IT_CALL,    NULL, "Return to Title",           M_EndGame,             88},
-	{IT_STRING | IT_CALL,    NULL, "Quit Game",                 M_QuitSRB2,            96},
+	{IT_STRING | IT_CALL,    NULL, "Return to Title",           NULL, M_EndGame,             88},
+	{IT_STRING | IT_CALL,    NULL, "Quit Game",                 NULL, M_QuitSRB2,            96},
 };
 
 typedef enum
@@ -596,16 +596,16 @@ typedef enum
 static menuitem_t SPauseMenu[] =
 {
 	// Pandora's Box will be shifted up if both options are available
-	{IT_CALL | IT_STRING,    NULL, "Pandora's Box...",     M_PandorasBox,         16},
-	{IT_CALL | IT_STRING,    NULL, "Emblem Hints...",      M_EmblemHints,         24},
-	{IT_CALL | IT_STRING,    NULL, "Level Select...",      M_PauseLevelSelect,    32},
+	{IT_CALL | IT_STRING,    NULL, "Pandora's Box...",     NULL, M_PandorasBox,         16},
+	{IT_CALL | IT_STRING,    NULL, "Emblem Hints...",      NULL, M_EmblemHints,         24},
+	{IT_CALL | IT_STRING,    NULL, "Level Select...",      NULL, M_PauseLevelSelect,    32},
 
-	{IT_CALL | IT_STRING,    NULL, "Continue",             M_SelectableClearMenus,48},
-	{IT_CALL | IT_STRING,    NULL, "Retry",                M_Retry,               56},
-	{IT_CALL | IT_STRING,    NULL, "Options",              M_Options,             64},
+	{IT_CALL | IT_STRING,    NULL, "Continue",             NULL, M_SelectableClearMenus,48},
+	{IT_CALL | IT_STRING,    NULL, "Retry",                NULL, M_Retry,               56},
+	{IT_CALL | IT_STRING,    NULL, "Options",              NULL, M_Options,             64},
 
-	{IT_CALL | IT_STRING,    NULL, "Return to Title",      M_EndGame,             80},
-	{IT_CALL | IT_STRING,    NULL, "Quit Game",            M_QuitSRB2,            88},
+	{IT_CALL | IT_STRING,    NULL, "Return to Title",      NULL, M_EndGame,             80},
+	{IT_CALL | IT_STRING,    NULL, "Quit Game",            NULL, M_QuitSRB2,            88},
 };
 
 typedef enum
@@ -628,14 +628,14 @@ typedef enum
 // Prefix: MISC_
 static menuitem_t MISC_ScrambleTeamMenu[] =
 {
-	{IT_STRING|IT_CVAR,      NULL, "Scramble Method", &cv_dummyscramble,     30},
-	{IT_WHITESTRING|IT_CALL, NULL, "Confirm",         M_ConfirmTeamScramble, 90},
+	{IT_STRING|IT_CVAR,      NULL, "Scramble Method", NULL, &cv_dummyscramble,     30},
+	{IT_WHITESTRING|IT_CALL, NULL, "Confirm",         NULL, M_ConfirmTeamScramble, 90},
 };
 
 static menuitem_t MISC_ChangeTeamMenu[] =
 {
-	{IT_STRING|IT_CVAR,              NULL, "Select Team",             &cv_dummyteam,    30},
-	{IT_WHITESTRING|IT_CALL,         NULL, "Confirm",           M_ConfirmTeamChange,    90},
+	{IT_STRING|IT_CVAR,      NULL, "Select Team", NULL, &cv_dummyteam,       30},
+	{IT_WHITESTRING|IT_CALL, NULL, "Confirm",     NULL, M_ConfirmTeamChange, 90},
 };
 
 gtdesc_t gametypedesc[NUMGAMETYPES] =
@@ -652,16 +652,16 @@ gtdesc_t gametypedesc[NUMGAMETYPES] =
 
 static menuitem_t MISC_ChangeLevelMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
 };
 
 static menuitem_t MISC_HelpMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPN01", M_HandleImageDef, 0},
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPN02", M_HandleImageDef, 0},
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPN03", M_HandleImageDef, 0},
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPM01", M_HandleImageDef, 0},
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPM02", M_HandleImageDef, 0},
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPN01", NULL, M_HandleImageDef, 0},
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPN02", NULL, M_HandleImageDef, 0},
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPN03", NULL, M_HandleImageDef, 0},
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPM01", NULL, M_HandleImageDef, 0},
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "HELPM02", NULL, M_HandleImageDef, 0},
 };
 
 // --------------------------------
@@ -672,49 +672,49 @@ static menuitem_t MISC_HelpMenu[] =
 // Pause Menu Pandora's Box Options
 static menuitem_t SR_PandorasBox[] =
 {
-	{IT_STRING | IT_CALL, NULL, "Mid-game add-ons...", M_Addons,             0},
+	{IT_STRING | IT_CALL, NULL, "Mid-game add-ons...", NULL, M_Addons,             0},
 
-	{IT_STRING | IT_CVAR, NULL, "Rings",               &cv_dummyrings,      20},
-	{IT_STRING | IT_CVAR, NULL, "Lives",               &cv_dummylives,      30},
-	{IT_STRING | IT_CVAR, NULL, "Continues",           &cv_dummycontinues,  40},
+	{IT_STRING | IT_CVAR, NULL, "Rings",               NULL, &cv_dummyrings,      20},
+	{IT_STRING | IT_CVAR, NULL, "Lives",               NULL, &cv_dummylives,      30},
+	{IT_STRING | IT_CVAR, NULL, "Continues",           NULL, &cv_dummycontinues,  40},
 
-	{IT_STRING | IT_CVAR, NULL, "Gravity",             &cv_gravity,         60},
-	{IT_STRING | IT_CVAR, NULL, "Throw Rings",         &cv_ringslinger,     70},
+	{IT_STRING | IT_CVAR, NULL, "Gravity",             NULL, &cv_gravity,         60},
+	{IT_STRING | IT_CVAR, NULL, "Throw Rings",         NULL, &cv_ringslinger,     70},
 
-	{IT_STRING | IT_CALL, NULL, "Enable Super form",   M_AllowSuper,        90},
-	{IT_STRING | IT_CALL, NULL, "Get All Emeralds",    M_GetAllEmeralds,   100},
-	{IT_STRING | IT_CALL, NULL, "Destroy All Robots",  M_DestroyRobots,    110},
+	{IT_STRING | IT_CALL, NULL, "Enable Super form",   NULL, M_AllowSuper,        90},
+	{IT_STRING | IT_CALL, NULL, "Get All Emeralds",    NULL, M_GetAllEmeralds,   100},
+	{IT_STRING | IT_CALL, NULL, "Destroy All Robots",  NULL, M_DestroyRobots,    110},
 
-	{IT_STRING | IT_CALL, NULL, "Ultimate Cheat",      M_UltimateCheat,    130},
+	{IT_STRING | IT_CALL, NULL, "Ultimate Cheat",      NULL, M_UltimateCheat,    130},
 };
 
 // Sky Room Custom Unlocks
 static menuitem_t SR_MainMenu[MAXUNLOCKABLES+1] =
 {
-	{IT_STRING|IT_SUBMENU,NULL, "Extras Checklist", &SR_UnlockChecklistDef, 0},
+	{IT_STRING|IT_SUBMENU,NULL, "Extras Checklist", NULL, &SR_UnlockChecklistDef, 0},
 	// The remaining (MAXUNLOCKABLES) items are now initialized in M_SecretsMenu
 };
 
 static menuitem_t SR_LevelSelectMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
 };
 
 static menuitem_t SR_UnlockChecklistMenu[] =
 {
-	{IT_KEYHANDLER | IT_STRING, NULL, "", M_HandleChecklist, 0},
+	{IT_KEYHANDLER | IT_STRING, NULL, "", NULL, M_HandleChecklist, 0},
 };
 
 static menuitem_t SR_SoundTestMenu[] =
 {
-	{IT_KEYHANDLER | IT_STRING, NULL, "", M_HandleSoundTest, 0},
+	{IT_KEYHANDLER | IT_STRING, NULL, "", NULL, M_HandleSoundTest, 0},
 };
 
 static menuitem_t SR_EmblemHintMenu[] =
 {
-	{IT_STRING | IT_ARROWS,  NULL, "Page",    M_HandleEmblemHints, 10},
-	{IT_STRING|IT_CVAR,      NULL, "Emblem Radar", &cv_itemfinder, 20},
-	{IT_WHITESTRING|IT_CALL, NULL, "Back",         M_GoBack,       30}
+	{IT_STRING | IT_ARROWS,  NULL, "Page",         NULL, M_HandleEmblemHints, 10},
+	{IT_STRING|IT_CVAR,      NULL, "Emblem Radar", NULL, &cv_itemfinder,      20},
+	{IT_WHITESTRING|IT_CALL, NULL, "Back",         NULL, M_GoBack,            30}
 };
 
 // --------------------------------
@@ -726,12 +726,12 @@ static menuitem_t SR_EmblemHintMenu[] =
 static menuitem_t SP_MainMenu[] =
 {
 	// Note: If changing the positions here, also change them in M_SinglePlayerMenu()
-	{IT_CALL | IT_STRING,	NULL, "Start Game",    M_LoadGame,                 76},
-	{IT_SECRET,				NULL, "Record Attack", M_TimeAttack,               84},
-	{IT_SECRET,				NULL, "NiGHTS Mode",   M_NightsAttack,             92},
-	{IT_SECRET,				NULL, "Marathon Run",  M_Marathon,                100},
-	{IT_CALL | IT_STRING,	NULL, "Tutorial",      M_StartTutorial,           108},
-	{IT_CALL | IT_STRING,	NULL, "Statistics",    M_Statistics,              116}
+	{IT_CALL | IT_STRING,	NULL, "Start Game",    NULL, M_LoadGame,                 76},
+	{IT_SECRET,				NULL, "Record Attack", NULL, M_TimeAttack,               84},
+	{IT_SECRET,				NULL, "NiGHTS Mode",   NULL, M_NightsAttack,             92},
+	{IT_SECRET,				NULL, "Marathon Run",  NULL, M_Marathon,                100},
+	{IT_CALL | IT_STRING,	NULL, "Tutorial",      NULL, M_StartTutorial,           108},
+	{IT_CALL | IT_STRING,	NULL, "Statistics",    NULL, M_Statistics,              116}
 };
 
 enum
@@ -747,31 +747,31 @@ enum
 // Single Player Load Game
 static menuitem_t SP_LoadGameMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLoadSave, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLoadSave, 0},     // dummy menuitem for the control func
 };
 
 // Single Player Level Select
 static menuitem_t SP_LevelSelectMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
 };
 
 // Single Player Time Attack Level Select
 static menuitem_t SP_TimeAttackLevelSelectMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
 };
 
 // Single Player Time Attack
 static menuitem_t SP_TimeAttackMenu[] =
 {
-	{IT_STRING|IT_KEYHANDLER,  NULL, "Level Select...", M_HandleTimeAttackLevelSelect,   62},
-	{IT_STRING|IT_CVAR,        NULL, "Character",       &cv_chooseskin,             72},
+	{IT_STRING|IT_KEYHANDLER,  NULL, "Level Select...", NULL, M_HandleTimeAttackLevelSelect,   62},
+	{IT_STRING|IT_CVAR,        NULL, "Character",       NULL, &cv_chooseskin,             72},
 
-	{IT_DISABLED,              NULL, "Guest Option...", &SP_GuestReplayDef, 100},
-	{IT_DISABLED,              NULL, "Replay...",       &SP_ReplayDef,      110},
-	{IT_DISABLED,              NULL, "Ghosts...",       &SP_GhostDef,       120},
-	{IT_WHITESTRING|IT_CALL|IT_CALL_NOTMODIFIED,   NULL, "Start",         M_ChooseTimeAttack,   130},
+	{IT_DISABLED,              NULL, "Guest Option...", NULL, &SP_GuestReplayDef, 100},
+	{IT_DISABLED,              NULL, "Replay...",       NULL, &SP_ReplayDef,      110},
+	{IT_DISABLED,              NULL, "Ghosts...",       NULL, &SP_GhostDef,       120},
+	{IT_WHITESTRING|IT_CALL|IT_CALL_NOTMODIFIED,   NULL, "Start", NULL, M_ChooseTimeAttack,   130},
 };
 
 enum
@@ -787,90 +787,90 @@ enum
 
 static menuitem_t SP_ReplayMenu[] =
 {
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Score", M_ReplayTimeAttack, 0},
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time",  M_ReplayTimeAttack, 8},
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Rings", M_ReplayTimeAttack,16},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Score", NULL, M_ReplayTimeAttack, 0},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time",  NULL, M_ReplayTimeAttack, 8},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Rings", NULL, M_ReplayTimeAttack,16},
 
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Last",       M_ReplayTimeAttack,29},
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest",      M_ReplayTimeAttack,37},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Last",       NULL, M_ReplayTimeAttack,29},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest",      NULL, M_ReplayTimeAttack,37},
 
-	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",           &SP_TimeAttackDef, 50}
+	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",           NULL, &SP_TimeAttackDef, 50}
 };
 
 static menuitem_t SP_NightsReplayMenu[] =
 {
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Score", M_ReplayTimeAttack, 8},
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time",  M_ReplayTimeAttack,16},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Score", NULL, M_ReplayTimeAttack, 8},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Best Time",  NULL, M_ReplayTimeAttack,16},
 
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Last",       M_ReplayTimeAttack,29},
-	{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest",      M_ReplayTimeAttack,37},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Last",       NULL, M_ReplayTimeAttack,29},
+	{IT_WHITESTRING|IT_CALL, NULL, "Replay Guest",      NULL, M_ReplayTimeAttack,37},
 
-	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",           &SP_NightsAttackDef, 50}
+	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",           NULL, &SP_NightsAttackDef, 50}
 };
 
 static menuitem_t SP_GuestReplayMenu[] =
 {
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Score as Guest", M_SetGuestReplay, 0},
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest",  M_SetGuestReplay, 8},
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Rings as Guest", M_SetGuestReplay,16},
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest",       M_SetGuestReplay,24},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Score as Guest", NULL, M_SetGuestReplay, 0},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest",  NULL, M_SetGuestReplay, 8},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Rings as Guest", NULL, M_SetGuestReplay,16},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest",       NULL, M_SetGuestReplay,24},
 
-	{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay",      M_SetGuestReplay,37},
+	{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay",      NULL, M_SetGuestReplay,37},
 
-	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",                &SP_TimeAttackDef, 50}
+	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",                  NULL, &SP_TimeAttackDef, 50}
 };
 
 static menuitem_t SP_NightsGuestReplayMenu[] =
 {
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Score as Guest", M_SetGuestReplay, 8},
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest",  M_SetGuestReplay,16},
-	{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest",       M_SetGuestReplay,24},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Score as Guest", NULL, M_SetGuestReplay, 8},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Best Time as Guest",  NULL, M_SetGuestReplay,16},
+	{IT_WHITESTRING|IT_CALL, NULL, "Save Last as Guest",       NULL, M_SetGuestReplay,24},
 
-	{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay",      M_SetGuestReplay,37},
+	{IT_WHITESTRING|IT_CALL, NULL, "Delete Guest Replay",      NULL, M_SetGuestReplay,37},
 
-	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",                &SP_NightsAttackDef, 50}
+	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",                  NULL, &SP_NightsAttackDef, 50}
 };
 
 static menuitem_t SP_GhostMenu[] =
 {
-	{IT_STRING|IT_CVAR,         NULL, "Best Score", &cv_ghost_bestscore, 0},
-	{IT_STRING|IT_CVAR,         NULL, "Best Time",  &cv_ghost_besttime,  8},
-	{IT_STRING|IT_CVAR,         NULL, "Best Rings", &cv_ghost_bestrings,16},
-	{IT_STRING|IT_CVAR,         NULL, "Last",       &cv_ghost_last,     24},
+	{IT_STRING|IT_CVAR,         NULL, "Best Score", NULL, &cv_ghost_bestscore, 0},
+	{IT_STRING|IT_CVAR,         NULL, "Best Time",  NULL, &cv_ghost_besttime,  8},
+	{IT_STRING|IT_CVAR,         NULL, "Best Rings", NULL, &cv_ghost_bestrings,16},
+	{IT_STRING|IT_CVAR,         NULL, "Last",       NULL, &cv_ghost_last,     24},
 
-	{IT_STRING|IT_CVAR,         NULL, "Guest",      &cv_ghost_guest,    37},
+	{IT_STRING|IT_CVAR,         NULL, "Guest",      NULL, &cv_ghost_guest,    37},
 
-	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",       &SP_TimeAttackDef,  50}
+	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",       NULL, &SP_TimeAttackDef,  50}
 };
 
 static menuitem_t SP_NightsGhostMenu[] =
 {
-	{IT_STRING|IT_CVAR,         NULL, "Best Score", &cv_ghost_bestscore, 8},
-	{IT_STRING|IT_CVAR,         NULL, "Best Time",  &cv_ghost_besttime, 16},
-	{IT_STRING|IT_CVAR,         NULL, "Last",       &cv_ghost_last,     24},
+	{IT_STRING|IT_CVAR,         NULL, "Best Score", NULL, &cv_ghost_bestscore, 8},
+	{IT_STRING|IT_CVAR,         NULL, "Best Time",  NULL, &cv_ghost_besttime, 16},
+	{IT_STRING|IT_CVAR,         NULL, "Last",       NULL, &cv_ghost_last,     24},
 
-	{IT_STRING|IT_CVAR,         NULL, "Guest",      &cv_ghost_guest,    37},
+	{IT_STRING|IT_CVAR,         NULL, "Guest",      NULL, &cv_ghost_guest,    37},
 
-	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",       &SP_NightsAttackDef,  50}
+	{IT_WHITESTRING|IT_SUBMENU, NULL, "Back",       NULL, &SP_NightsAttackDef,  50}
 };
 
 // Single Player Nights Attack Level Select
 static menuitem_t SP_NightsAttackLevelSelectMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLevelPlatter, 0},     // dummy menuitem for the control func
 };
 
 // Single Player Nights Attack
 static menuitem_t SP_NightsAttackMenu[] =
 {
-	{IT_STRING|IT_KEYHANDLER,        NULL, "Level Select...",  &M_HandleTimeAttackLevelSelect,  52},
-	{IT_STRING|IT_CVAR,        NULL, "Character",       &cv_chooseskin,             62},
-	{IT_STRING|IT_CVAR,        NULL, "Show Records For", &cv_dummymares,              72},
+	{IT_STRING|IT_KEYHANDLER,  NULL, "Level Select...",  NULL, &M_HandleTimeAttackLevelSelect,  52},
+	{IT_STRING|IT_CVAR,        NULL, "Character",        NULL, &cv_chooseskin,             62},
+	{IT_STRING|IT_CVAR,        NULL, "Show Records For", NULL, &cv_dummymares,              72},
 
-	{IT_DISABLED,              NULL, "Guest Option...",  &SP_NightsGuestReplayDef,    100},
-	{IT_DISABLED,              NULL, "Replay...",        &SP_NightsReplayDef,         110},
-	{IT_DISABLED,              NULL, "Ghosts...",        &SP_NightsGhostDef,          120},
-	{IT_WHITESTRING|IT_CALL|IT_CALL_NOTMODIFIED, NULL, "Start", M_ChooseNightsAttack, 130},
+	{IT_DISABLED,              NULL, "Guest Option...",  NULL, &SP_NightsGuestReplayDef,    100},
+	{IT_DISABLED,              NULL, "Replay...",        NULL, &SP_NightsReplayDef,         110},
+	{IT_DISABLED,              NULL, "Ghosts...",        NULL, &SP_NightsGhostDef,          120},
+	{IT_WHITESTRING|IT_CALL|IT_CALL_NOTMODIFIED, NULL, "Start", NULL, M_ChooseNightsAttack, 130},
 };
 
 enum
@@ -888,11 +888,11 @@ enum
 // Marathon
 static menuitem_t SP_MarathonMenu[] =
 {
-	{IT_STRING|IT_KEYHANDLER,  NULL, "Character", M_HandleMarathonChoosePlayer,  90},
-	{IT_STRING|IT_CVAR,        NULL, "Category",  &cv_dummymarathon,            100},
-	{IT_STRING|IT_CVAR,        NULL, "Timer",     &cv_dummyloadless,            110},
-	{IT_STRING|IT_CVAR,        NULL, "Cutscenes", &cv_dummycutscenes,           120},
-	{IT_WHITESTRING|IT_CALL,   NULL, "Start",     M_StartMarathon,              130},
+	{IT_STRING|IT_KEYHANDLER,  NULL, "Character", NULL, M_HandleMarathonChoosePlayer,  90},
+	{IT_STRING|IT_CVAR,        NULL, "Category",  NULL, &cv_dummymarathon,            100},
+	{IT_STRING|IT_CVAR,        NULL, "Timer",     NULL, &cv_dummyloadless,            110},
+	{IT_STRING|IT_CVAR,        NULL, "Cutscenes", NULL, &cv_dummycutscenes,           120},
+	{IT_WHITESTRING|IT_CALL,   NULL, "Start",     NULL, M_StartMarathon,              130},
 };
 
 enum
@@ -907,13 +907,13 @@ enum
 // Statistics
 static menuitem_t SP_LevelStatsMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelStats, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleLevelStats, 0},     // dummy menuitem for the control func
 };
 
 // Player menu dummy
 static menuitem_t SP_PlayerMenu[] =
 {
-	{IT_NOTHING | IT_KEYHANDLER, NULL, "", M_HandleChoosePlayerMenu, 0},     // dummy menuitem for the control func
+	{IT_NOTHING | IT_KEYHANDLER, NULL, "", NULL, M_HandleChoosePlayerMenu, 0},     // dummy menuitem for the control func
 };
 
 // -----------------------------------
@@ -924,33 +924,33 @@ static menuitem_t SP_PlayerMenu[] =
 // Separated splitscreen and normal servers.
 static menuitem_t MP_SplitServerMenu[] =
 {
-	{IT_STRING|IT_CALL,              NULL, "Select Gametype/Level...", M_MapChange,         100},
-	{IT_STRING|IT_CALL,              NULL, "More Options...",          M_ServerOptions,     130},
-	{IT_WHITESTRING|IT_CALL,         NULL, "Start",                    M_StartServer,       140},
+	{IT_STRING|IT_CALL,              NULL, "Select Gametype/Level...", NULL, M_MapChange,         100},
+	{IT_STRING|IT_CALL,              NULL, "More Options...",          NULL, M_ServerOptions,     130},
+	{IT_WHITESTRING|IT_CALL,         NULL, "Start",                    NULL, M_StartServer,       140},
 };
 
 static menuitem_t MP_MainMenu[] =
 {
-	{IT_HEADER, NULL, "Join a game", NULL, 0},
-	{IT_STRING|IT_CALL,       NULL, "Server browser...",     M_ConnectMenuModChecks,          12},
-	{IT_STRING|IT_KEYHANDLER, NULL, "Specify server address:", M_HandleConnectIP,    22},
-	{IT_HEADER, NULL, "Host a game", NULL, 54},
-	{IT_STRING|IT_CALL,       NULL, "Internet/LAN...",       M_StartServerMenu,      66},
-	{IT_STRING|IT_CALL,       NULL, "Splitscreen...",        M_StartSplitServerMenu, 76},
-	{IT_HEADER, NULL, "Player setup", NULL, 94},
-	{IT_STRING|IT_CALL,       NULL, "Player 1...",           M_SetupMultiPlayer,    106},
-	{IT_STRING|IT_CALL,       NULL, "Player 2... ",          M_SetupMultiPlayer2,   116},
+	{IT_HEADER, NULL, "Join a game", NULL, NULL, 0},
+	{IT_STRING|IT_CALL,       NULL, "Server browser...",     NULL, M_ConnectMenuModChecks,          12},
+	{IT_STRING|IT_KEYHANDLER, NULL, "Specify server address:", NULL, M_HandleConnectIP,    22},
+	{IT_HEADER, NULL, "Host a game", NULL, NULL, 54},
+	{IT_STRING|IT_CALL,       NULL, "Internet/LAN...",       NULL, M_StartServerMenu,      66},
+	{IT_STRING|IT_CALL,       NULL, "Splitscreen...",        NULL, M_StartSplitServerMenu, 76},
+	{IT_HEADER, NULL, "Player setup", NULL, NULL, 94},
+	{IT_STRING|IT_CALL,       NULL, "Player 1...",           NULL, M_SetupMultiPlayer,    106},
+	{IT_STRING|IT_CALL,       NULL, "Player 2... ",          NULL, M_SetupMultiPlayer2,   116},
 };
 
 static menuitem_t MP_ServerMenu[] =
 {
-	{IT_STRING|IT_CALL,              NULL, "Room...",                  M_RoomMenu,          10},
-	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Server Name",              &cv_servername,      20},
-	{IT_STRING|IT_CVAR,              NULL, "Max Players",              &cv_maxplayers,      46},
-	{IT_STRING|IT_CVAR,              NULL, "Allow Add-on Downloading", &cv_downloading,     56},
-	{IT_STRING|IT_CALL,              NULL, "Select Gametype/Level...", M_MapChange,        100},
-	{IT_STRING|IT_CALL,              NULL, "More Options...",          M_ServerOptions,    130},
-	{IT_WHITESTRING|IT_CALL,         NULL, "Start",                    M_StartServer,      140},
+	{IT_STRING|IT_CALL,              NULL, "Room...",                  NULL, M_RoomMenu,          10},
+	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Server Name",              NULL, &cv_servername,      20},
+	{IT_STRING|IT_CVAR,              NULL, "Max Players",              NULL, &cv_maxplayers,      46},
+	{IT_STRING|IT_CVAR,              NULL, "Allow Add-on Downloading", NULL, &cv_downloading,     56},
+	{IT_STRING|IT_CALL,              NULL, "Select Gametype/Level...", NULL, M_MapChange,        100},
+	{IT_STRING|IT_CALL,              NULL, "More Options...",          NULL, M_ServerOptions,    130},
+	{IT_WHITESTRING|IT_CALL,         NULL, "Start",                    NULL, M_StartServer,      140},
 };
 
 enum
@@ -966,22 +966,22 @@ enum
 
 static menuitem_t MP_ConnectMenu[] =
 {
-	{IT_STRING | IT_CALL,       NULL, "Room...",  M_RoomMenu,         4},
-	{IT_STRING | IT_CVAR,       NULL, "Sort By",  &cv_serversort,     12},
-	{IT_STRING | IT_KEYHANDLER, NULL, "Page",     M_HandleServerPage, 20},
-	{IT_STRING | IT_CALL,       NULL, "Refresh",  M_Refresh,          28},
-
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,          48-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,          60-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,          72-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,          84-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,          96-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,         108-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,         120-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,         132-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,         144-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,         156-4},
-	{IT_STRING | IT_SPACE, NULL, "",              M_Connect,         168-4},
+	{IT_STRING | IT_CALL,       NULL, "Room...",  NULL, M_RoomMenu,         4},
+	{IT_STRING | IT_CVAR,       NULL, "Sort By",  NULL, &cv_serversort,     12},
+	{IT_STRING | IT_KEYHANDLER, NULL, "Page",     NULL, M_HandleServerPage, 20},
+	{IT_STRING | IT_CALL,       NULL, "Refresh",  NULL, M_Refresh,          28},
+
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,          48-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,          60-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,          72-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,          84-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,          96-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,         108-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,         120-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,         132-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,         144-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,         156-4},
+	{IT_STRING | IT_SPACE, NULL, "",              NULL, M_Connect,         168-4},
 };
 
 enum
@@ -995,32 +995,32 @@ enum
 
 menuitem_t MP_RoomMenu[] =
 {
-	{IT_STRING | IT_CALL, NULL, "<Unlisted Mode>", M_ChooseRoom,   9},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  18},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  27},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  36},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  45},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  54},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  63},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  72},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  81},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  90},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom,  99},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 108},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 117},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 126},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 135},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 144},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 153},
-	{IT_DISABLED,         NULL, "",               M_ChooseRoom, 162},
+	{IT_STRING | IT_CALL, NULL, "<Unlisted Mode>", NULL, M_ChooseRoom,   9},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  18},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  27},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  36},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  45},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  54},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  63},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  72},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  81},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  90},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom,  99},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 108},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 117},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 126},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 135},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 144},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 153},
+	{IT_DISABLED,         NULL, "",               NULL, M_ChooseRoom, 162},
 };
 
 static menuitem_t MP_PlayerSetupMenu[] =
 {
-	{IT_KEYHANDLER, NULL, "", M_HandleSetupMultiPlayer, 0}, // name
-	{IT_KEYHANDLER, NULL, "", M_HandleSetupMultiPlayer, 0}, // skin
-	{IT_KEYHANDLER, NULL, "", M_HandleSetupMultiPlayer, 0}, // colour
-	{IT_KEYHANDLER, NULL, "", M_HandleSetupMultiPlayer, 0}, // default
+	{IT_KEYHANDLER, NULL, "", NULL, M_HandleSetupMultiPlayer, 0}, // name
+	{IT_KEYHANDLER, NULL, "", NULL, M_HandleSetupMultiPlayer, 0}, // skin
+	{IT_KEYHANDLER, NULL, "", NULL, M_HandleSetupMultiPlayer, 0}, // colour
+	{IT_KEYHANDLER, NULL, "", NULL, M_HandleSetupMultiPlayer, 0}, // default
 };
 
 // ------------------------------------
@@ -1029,260 +1029,260 @@ static menuitem_t MP_PlayerSetupMenu[] =
 // Prefix: OP_
 static menuitem_t OP_MainMenu[] =
 {
-	{IT_SUBMENU | IT_STRING, NULL, "Player 1 Controls...", &OP_P1ControlsDef,   10},
-	{IT_SUBMENU | IT_STRING, NULL, "Player 2 Controls...", &OP_P2ControlsDef,   20},
-	{IT_CVAR    | IT_STRING, NULL, "Controls per key",     &cv_controlperkey,   30},
+	{IT_SUBMENU | IT_STRING, NULL, "Player 1 Controls...", NULL, &OP_P1ControlsDef,   10},
+	{IT_SUBMENU | IT_STRING, NULL, "Player 2 Controls...", NULL, &OP_P2ControlsDef,   20},
+	{IT_CVAR    | IT_STRING, NULL, "Controls per key",     NULL, &cv_controlperkey,   30},
 
-	{IT_CALL    | IT_STRING, NULL, "Video Options...",     M_VideoOptions,      50},
-	{IT_SUBMENU | IT_STRING, NULL, "Sound Options...",     &OP_SoundOptionsDef, 60},
+	{IT_CALL    | IT_STRING, NULL, "Video Options...",     NULL, M_VideoOptions,      50},
+	{IT_SUBMENU | IT_STRING, NULL, "Sound Options...",     NULL, &OP_SoundOptionsDef, 60},
 
-	{IT_CALL    | IT_STRING, NULL, "Server Options...",    M_ServerOptions,     80},
+	{IT_CALL    | IT_STRING, NULL, "Server Options...",    NULL, M_ServerOptions,     80},
 
-	{IT_SUBMENU | IT_STRING, NULL, "Data Options...",      &OP_DataOptionsDef, 100},
+	{IT_SUBMENU | IT_STRING, NULL, "Data Options...",      NULL, &OP_DataOptionsDef, 100},
 };
 
 static menuitem_t OP_P1ControlsMenu[] =
 {
-	{IT_CALL    | IT_STRING, NULL, "Control Configuration...", M_Setup1PControlsMenu,   10},
-	{IT_SUBMENU | IT_STRING, NULL, "Mouse Options...", &OP_MouseOptionsDef, 20},
-	{IT_SUBMENU | IT_STRING, NULL, "Gamepad Options...", &OP_Joystick1Def  ,  30},
+	{IT_CALL    | IT_STRING, NULL, "Control Configuration...", "Set keyboard controls", M_Setup1PControlsMenu,   10},
+	{IT_SUBMENU | IT_STRING, NULL, "Mouse Options...", "Set mouse options", &OP_MouseOptionsDef, 20},
+	{IT_SUBMENU | IT_STRING, NULL, "Gamepad Options...", "Set controller options", &OP_Joystick1Def  ,  30},
 
-	{IT_SUBMENU | IT_STRING, NULL, "Camera Options...", &OP_CameraOptionsDef,	50},
+	{IT_SUBMENU | IT_STRING, NULL, "Camera Options...", "Change camera behavior", &OP_CameraOptionsDef,	50},
 
-	{IT_STRING  | IT_CVAR, NULL, "Automatic braking", &cv_autobrake,  70},
-	{IT_CALL    | IT_STRING, NULL, "Play Style...", M_Setup1PPlaystyleMenu, 80},
+	{IT_STRING  | IT_CVAR, NULL, "Automatic braking", NULL, &cv_autobrake,  70},
+	{IT_CALL    | IT_STRING, NULL, "Play Style...", "Change how the game is played", M_Setup1PPlaystyleMenu, 80},
 };
 
 static menuitem_t OP_P2ControlsMenu[] =
 {
-	{IT_CALL    | IT_STRING, NULL, "Control Configuration...", M_Setup2PControlsMenu,   10},
-	{IT_SUBMENU | IT_STRING, NULL, "Second Mouse Options...", &OP_Mouse2OptionsDef, 20},
-	{IT_SUBMENU | IT_STRING, NULL, "Second Gamepad Options...", &OP_Joystick2Def  ,  30},
+	{IT_CALL    | IT_STRING, NULL, "Control Configuration...", "Set keyboard controls", M_Setup2PControlsMenu,   10},
+	{IT_SUBMENU | IT_STRING, NULL, "Second Mouse Options...", "Set mouse options", &OP_Mouse2OptionsDef, 20},
+	{IT_SUBMENU | IT_STRING, NULL, "Second Gamepad Options...", "Set controller options", &OP_Joystick2Def  ,  30},
 
-	{IT_SUBMENU | IT_STRING, NULL, "Camera Options...", &OP_Camera2OptionsDef,	50},
+	{IT_SUBMENU | IT_STRING, NULL, "Camera Options...", "Change camera behavior", &OP_Camera2OptionsDef,	50},
 
-	{IT_STRING  | IT_CVAR, NULL, "Automatic braking", &cv_autobrake2,  70},
-	{IT_CALL    | IT_STRING, NULL, "Play Style...", M_Setup2PPlaystyleMenu, 80},
+	{IT_STRING  | IT_CVAR, NULL, "Automatic braking", NULL, &cv_autobrake2,  70},
+	{IT_CALL    | IT_STRING, NULL, "Play Style...", "Change how the game is played", M_Setup2PPlaystyleMenu, 80},
 };
 
 static menuitem_t OP_ChangeControlsMenu[] =
 {
-	{IT_HEADER, NULL, "Movement", NULL, 0},
-	{IT_SPACE, NULL, NULL, NULL, 0}, // padding
-	{IT_CALL | IT_STRING2, NULL, "Move Forward",     M_ChangeControl, GC_FORWARD     },
-	{IT_CALL | IT_STRING2, NULL, "Move Backward",    M_ChangeControl, GC_BACKWARD    },
-	{IT_CALL | IT_STRING2, NULL, "Move Left",        M_ChangeControl, GC_STRAFELEFT  },
-	{IT_CALL | IT_STRING2, NULL, "Move Right",       M_ChangeControl, GC_STRAFERIGHT },
-	{IT_CALL | IT_STRING2, NULL, "Jump",             M_ChangeControl, GC_JUMP      },
-	{IT_CALL | IT_STRING2, NULL, "Spin",             M_ChangeControl, GC_SPIN     },
-	{IT_HEADER, NULL, "Camera", NULL, 0},
-	{IT_SPACE, NULL, NULL, NULL, 0}, // padding
-	{IT_CALL | IT_STRING2, NULL, "Look Up",        M_ChangeControl, GC_LOOKUP      },
-	{IT_CALL | IT_STRING2, NULL, "Look Down",      M_ChangeControl, GC_LOOKDOWN    },
-	{IT_CALL | IT_STRING2, NULL, "Look Left",      M_ChangeControl, GC_TURNLEFT    },
-	{IT_CALL | IT_STRING2, NULL, "Look Right",     M_ChangeControl, GC_TURNRIGHT   },
-	{IT_CALL | IT_STRING2, NULL, "Center View",      M_ChangeControl, GC_CENTERVIEW  },
-	{IT_CALL | IT_STRING2, NULL, "Toggle Mouselook", M_ChangeControl, GC_MOUSEAIMING },
-	{IT_CALL | IT_STRING2, NULL, "Toggle Third-Person", M_ChangeControl, GC_CAMTOGGLE},
-	{IT_CALL | IT_STRING2, NULL, "Reset Camera",     M_ChangeControl, GC_CAMRESET    },
-	{IT_HEADER, NULL, "Meta", NULL, 0},
-	{IT_SPACE, NULL, NULL, NULL, 0}, // padding
-	{IT_CALL | IT_STRING2, NULL, "Game Status",
+	{IT_HEADER, NULL, "Movement", NULL, NULL, 0},
+	{IT_SPACE, NULL, NULL, NULL, NULL, 0}, // padding
+	{IT_CALL | IT_STRING2, NULL, "Move Forward", NULL,     M_ChangeControl, GC_FORWARD     },
+	{IT_CALL | IT_STRING2, NULL, "Move Backward", NULL,    M_ChangeControl, GC_BACKWARD    },
+	{IT_CALL | IT_STRING2, NULL, "Move Left", NULL,        M_ChangeControl, GC_STRAFELEFT  },
+	{IT_CALL | IT_STRING2, NULL, "Move Right", NULL,       M_ChangeControl, GC_STRAFERIGHT },
+	{IT_CALL | IT_STRING2, NULL, "Jump", NULL,             M_ChangeControl, GC_JUMP      },
+	{IT_CALL | IT_STRING2, NULL, "Spin", NULL,             M_ChangeControl, GC_SPIN     },
+	{IT_HEADER, NULL, "Camera", NULL, NULL, 0},
+	{IT_SPACE, NULL, NULL, NULL, NULL, 0}, // padding
+	{IT_CALL | IT_STRING2, NULL, "Look Up", NULL,        M_ChangeControl, GC_LOOKUP      },
+	{IT_CALL | IT_STRING2, NULL, "Look Down", NULL,      M_ChangeControl, GC_LOOKDOWN    },
+	{IT_CALL | IT_STRING2, NULL, "Look Left", NULL,      M_ChangeControl, GC_TURNLEFT    },
+	{IT_CALL | IT_STRING2, NULL, "Look Right", NULL,     M_ChangeControl, GC_TURNRIGHT   },
+	{IT_CALL | IT_STRING2, NULL, "Center View", NULL,      M_ChangeControl, GC_CENTERVIEW  },
+	{IT_CALL | IT_STRING2, NULL, "Toggle Mouselook", NULL, M_ChangeControl, GC_MOUSEAIMING },
+	{IT_CALL | IT_STRING2, NULL, "Toggle Third-Person", NULL, M_ChangeControl, GC_CAMTOGGLE},
+	{IT_CALL | IT_STRING2, NULL, "Reset Camera", NULL,     M_ChangeControl, GC_CAMRESET    },
+	{IT_HEADER, NULL, "Meta", NULL, NULL, 0},
+	{IT_SPACE, NULL, NULL, NULL, NULL, 0}, // padding
+	{IT_CALL | IT_STRING2, NULL, "Game Status", NULL,
     M_ChangeControl, GC_SCORES      },
-	{IT_CALL | IT_STRING2, NULL, "Pause / Run Retry", M_ChangeControl, GC_PAUSE      },
-	{IT_CALL | IT_STRING2, NULL, "Screenshot",            M_ChangeControl, GC_SCREENSHOT    },
-	{IT_CALL | IT_STRING2, NULL, "Toggle GIF Recording",  M_ChangeControl, GC_RECORDGIF     },
-	{IT_CALL | IT_STRING2, NULL, "Open/Close Menu (ESC)", M_ChangeControl, GC_SYSTEMMENU    },
-	{IT_CALL | IT_STRING2, NULL, "Next Viewpoint",        M_ChangeControl, GC_VIEWPOINTNEXT },
-	{IT_CALL | IT_STRING2, NULL, "Prev Viewpoint",        M_ChangeControl, GC_VIEWPOINTPREV },
-	{IT_CALL | IT_STRING2, NULL, "Console",          M_ChangeControl, GC_CONSOLE     },
-	{IT_HEADER, NULL, "Multiplayer", NULL, 0},
-	{IT_SPACE, NULL, NULL, NULL, 0}, // padding
-	{IT_CALL | IT_STRING2, NULL, "Talk",             M_ChangeControl, GC_TALKKEY     },
-	{IT_CALL | IT_STRING2, NULL, "Talk (Team only)", M_ChangeControl, GC_TEAMKEY     },
-	{IT_HEADER, NULL, "Ringslinger (Match, CTF, Tag, H&S)", NULL, 0},
-	{IT_SPACE, NULL, NULL, NULL, 0}, // padding
-	{IT_CALL | IT_STRING2, NULL, "Fire",             M_ChangeControl, GC_FIRE        },
-	{IT_CALL | IT_STRING2, NULL, "Fire Normal",      M_ChangeControl, GC_FIRENORMAL  },
-	{IT_CALL | IT_STRING2, NULL, "Toss Flag",        M_ChangeControl, GC_TOSSFLAG    },
-	{IT_CALL | IT_STRING2, NULL, "Next Weapon",      M_ChangeControl, GC_WEAPONNEXT  },
-	{IT_CALL | IT_STRING2, NULL, "Prev Weapon",      M_ChangeControl, GC_WEAPONPREV  },
-	{IT_CALL | IT_STRING2, NULL, "Normal / Infinity",   M_ChangeControl, GC_WEPSLOT1    },
-	{IT_CALL | IT_STRING2, NULL, "Automatic",        M_ChangeControl, GC_WEPSLOT2    },
-	{IT_CALL | IT_STRING2, NULL, "Bounce",           M_ChangeControl, GC_WEPSLOT3    },
-	{IT_CALL | IT_STRING2, NULL, "Scatter",          M_ChangeControl, GC_WEPSLOT4    },
-	{IT_CALL | IT_STRING2, NULL, "Grenade",          M_ChangeControl, GC_WEPSLOT5    },
-	{IT_CALL | IT_STRING2, NULL, "Explosion",        M_ChangeControl, GC_WEPSLOT6    },
-	{IT_CALL | IT_STRING2, NULL, "Rail",             M_ChangeControl, GC_WEPSLOT7    },
-	{IT_HEADER, NULL, "Add-ons", NULL, 0},
-	{IT_SPACE, NULL, NULL, NULL, 0}, // padding
-	{IT_CALL | IT_STRING2, NULL, "Custom Action 1",  M_ChangeControl, GC_CUSTOM1     },
-	{IT_CALL | IT_STRING2, NULL, "Custom Action 2",  M_ChangeControl, GC_CUSTOM2     },
-	{IT_CALL | IT_STRING2, NULL, "Custom Action 3",  M_ChangeControl, GC_CUSTOM3     },
+	{IT_CALL | IT_STRING2, NULL, "Pause / Run Retry", NULL, M_ChangeControl, GC_PAUSE      },
+	{IT_CALL | IT_STRING2, NULL, "Screenshot", NULL,            M_ChangeControl, GC_SCREENSHOT    },
+	{IT_CALL | IT_STRING2, NULL, "Toggle GIF Recording", NULL,  M_ChangeControl, GC_RECORDGIF     },
+	{IT_CALL | IT_STRING2, NULL, "Open/Close Menu (ESC)", NULL, M_ChangeControl, GC_SYSTEMMENU    },
+	{IT_CALL | IT_STRING2, NULL, "Next Viewpoint", NULL,        M_ChangeControl, GC_VIEWPOINTNEXT },
+	{IT_CALL | IT_STRING2, NULL, "Prev Viewpoint", NULL,        M_ChangeControl, GC_VIEWPOINTPREV },
+	{IT_CALL | IT_STRING2, NULL, "Console", NULL,          M_ChangeControl, GC_CONSOLE     },
+	{IT_HEADER, NULL, "Multiplayer", NULL, NULL, 0},
+	{IT_SPACE, NULL, NULL, NULL, NULL, 0}, // padding
+	{IT_CALL | IT_STRING2, NULL, "Talk", NULL,             M_ChangeControl, GC_TALKKEY     },
+	{IT_CALL | IT_STRING2, NULL, "Talk (Team only)", NULL, M_ChangeControl, GC_TEAMKEY     },
+	{IT_HEADER, NULL, "Ringslinger (Match, CTF, Tag, H&S)", NULL, NULL, 0},
+	{IT_SPACE, NULL, NULL, NULL, NULL, 0}, // padding
+	{IT_CALL | IT_STRING2, NULL, "Fire", NULL,             M_ChangeControl, GC_FIRE        },
+	{IT_CALL | IT_STRING2, NULL, "Fire Normal", NULL,      M_ChangeControl, GC_FIRENORMAL  },
+	{IT_CALL | IT_STRING2, NULL, "Toss Flag", NULL,        M_ChangeControl, GC_TOSSFLAG    },
+	{IT_CALL | IT_STRING2, NULL, "Next Weapon", NULL,      M_ChangeControl, GC_WEAPONNEXT  },
+	{IT_CALL | IT_STRING2, NULL, "Prev Weapon", NULL,      M_ChangeControl, GC_WEAPONPREV  },
+	{IT_CALL | IT_STRING2, NULL, "Normal / Infinity", NULL,   M_ChangeControl, GC_WEPSLOT1    },
+	{IT_CALL | IT_STRING2, NULL, "Automatic", NULL,        M_ChangeControl, GC_WEPSLOT2    },
+	{IT_CALL | IT_STRING2, NULL, "Bounce", NULL,           M_ChangeControl, GC_WEPSLOT3    },
+	{IT_CALL | IT_STRING2, NULL, "Scatter", NULL,          M_ChangeControl, GC_WEPSLOT4    },
+	{IT_CALL | IT_STRING2, NULL, "Grenade", NULL,          M_ChangeControl, GC_WEPSLOT5    },
+	{IT_CALL | IT_STRING2, NULL, "Explosion", NULL,        M_ChangeControl, GC_WEPSLOT6    },
+	{IT_CALL | IT_STRING2, NULL, "Rail", NULL,             M_ChangeControl, GC_WEPSLOT7    },
+	{IT_HEADER, NULL, "Add-ons", NULL, NULL, 0},
+	{IT_SPACE, NULL, NULL, NULL, NULL, 0}, // padding
+	{IT_CALL | IT_STRING2, NULL, "Custom Action 1", NULL,  M_ChangeControl, GC_CUSTOM1     },
+	{IT_CALL | IT_STRING2, NULL, "Custom Action 2", NULL,  M_ChangeControl, GC_CUSTOM2     },
+	{IT_CALL | IT_STRING2, NULL, "Custom Action 3", NULL,  M_ChangeControl, GC_CUSTOM3     },
 };
 
 static menuitem_t OP_Joystick1Menu[] =
 {
-	{IT_STRING | IT_CALL,  NULL, "Select Gamepad...", M_Setup1PJoystickMenu, 10},
-	{IT_STRING | IT_CVAR,  NULL, "Move \x17 Axis"    , &cv_moveaxis         , 30},
-	{IT_STRING | IT_CVAR,  NULL, "Move \x18 Axis"    , &cv_sideaxis         , 40},
-	{IT_STRING | IT_CVAR,  NULL, "Camera \x17 Axis"  , &cv_lookaxis         , 50},
-	{IT_STRING | IT_CVAR,  NULL, "Camera \x18 Axis"  , &cv_turnaxis         , 60},
-	{IT_STRING | IT_CVAR,  NULL, "Jump Axis"         , &cv_jumpaxis         , 70},
-	{IT_STRING | IT_CVAR,  NULL, "Spin Axis"         , &cv_spinaxis         , 80},
-	{IT_STRING | IT_CVAR,  NULL, "Fire Axis"         , &cv_fireaxis         , 90},
-	{IT_STRING | IT_CVAR,  NULL, "Fire Normal Axis"  , &cv_firenaxis        ,100},
-
-	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", &cv_alwaysfreelook, 120},
-	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", &cv_chasefreelook,  130},
-	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Analog Deadzone", &cv_deadzone, 140},
-	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Digital Deadzone", &cv_digitaldeadzone, 150},
+	{IT_STRING | IT_CALL,  NULL, "Select Gamepad...", "Select which controller to use", M_Setup1PJoystickMenu, 10},
+	{IT_STRING | IT_CVAR,  NULL, "Move \x17 Axis"   , NULL, &cv_moveaxis         , 30},
+	{IT_STRING | IT_CVAR,  NULL, "Move \x18 Axis"   , NULL, &cv_sideaxis         , 40},
+	{IT_STRING | IT_CVAR,  NULL, "Camera \x17 Axis" , NULL, &cv_lookaxis         , 50},
+	{IT_STRING | IT_CVAR,  NULL, "Camera \x18 Axis" , NULL, &cv_turnaxis         , 60},
+	{IT_STRING | IT_CVAR,  NULL, "Jump Axis"        , NULL, &cv_jumpaxis         , 70},
+	{IT_STRING | IT_CVAR,  NULL, "Spin Axis"        , NULL, &cv_spinaxis         , 80},
+	{IT_STRING | IT_CVAR,  NULL, "Fire Axis"        , NULL, &cv_fireaxis         , 90},
+	{IT_STRING | IT_CVAR,  NULL, "Fire Normal Axis" , NULL, &cv_firenaxis        ,100},
+
+	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", NULL, &cv_alwaysfreelook, 120},
+	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", NULL, &cv_chasefreelook,  130},
+	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Analog Deadzone", NULL, &cv_deadzone, 140},
+	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Digital Deadzone", NULL, &cv_digitaldeadzone, 150},
 };
 
 static menuitem_t OP_Joystick2Menu[] =
 {
-	{IT_STRING | IT_CALL,  NULL, "Select Gamepad...", M_Setup2PJoystickMenu, 10},
-	{IT_STRING | IT_CVAR,  NULL, "Move \x17 Axis"    , &cv_moveaxis2        , 30},
-	{IT_STRING | IT_CVAR,  NULL, "Move \x18 Axis"    , &cv_sideaxis2        , 40},
-	{IT_STRING | IT_CVAR,  NULL, "Camera \x17 Axis"  , &cv_lookaxis2        , 50},
-	{IT_STRING | IT_CVAR,  NULL, "Camera \x18 Axis"  , &cv_turnaxis2        , 60},
-	{IT_STRING | IT_CVAR,  NULL, "Jump Axis"         , &cv_jumpaxis2        , 70},
-	{IT_STRING | IT_CVAR,  NULL, "Spin Axis"         , &cv_spinaxis2        , 80},
-	{IT_STRING | IT_CVAR,  NULL, "Fire Axis"         , &cv_fireaxis2        , 90},
-	{IT_STRING | IT_CVAR,  NULL, "Fire Normal Axis"  , &cv_firenaxis2       ,100},
-
-	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", &cv_alwaysfreelook2,120},
-	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", &cv_chasefreelook2, 130},
-	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Analog Deadzone", &cv_deadzone2,140},
-	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Digital Deadzone", &cv_digitaldeadzone2,150},
+	{IT_STRING | IT_CALL,  NULL, "Select Gamepad...", "Select which controller to use", M_Setup2PJoystickMenu, 10},
+	{IT_STRING | IT_CVAR,  NULL, "Move \x17 Axis"    , NULL, &cv_moveaxis2        , 30},
+	{IT_STRING | IT_CVAR,  NULL, "Move \x18 Axis"    , NULL, &cv_sideaxis2        , 40},
+	{IT_STRING | IT_CVAR,  NULL, "Camera \x17 Axis"  , NULL, &cv_lookaxis2        , 50},
+	{IT_STRING | IT_CVAR,  NULL, "Camera \x18 Axis"  , NULL, &cv_turnaxis2        , 60},
+	{IT_STRING | IT_CVAR,  NULL, "Jump Axis"         , NULL, &cv_jumpaxis2        , 70},
+	{IT_STRING | IT_CVAR,  NULL, "Spin Axis"         , NULL, &cv_spinaxis2        , 80},
+	{IT_STRING | IT_CVAR,  NULL, "Fire Axis"         , NULL, &cv_fireaxis2        , 90},
+	{IT_STRING | IT_CVAR,  NULL, "Fire Normal Axis"  , NULL, &cv_firenaxis2       ,100},
+
+	{IT_STRING | IT_CVAR, NULL, "First-Person Vert-Look", NULL, &cv_alwaysfreelook2,120},
+	{IT_STRING | IT_CVAR, NULL, "Third-Person Vert-Look", NULL, &cv_chasefreelook2, 130},
+	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Analog Deadzone", NULL, &cv_deadzone2,140},
+	{IT_STRING | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Digital Deadzone", NULL, &cv_digitaldeadzone2,150},
 };
 
 static menuitem_t OP_JoystickSetMenu[1+MAX_JOYSTICKS];
 
 static menuitem_t OP_MouseOptionsMenu[] =
 {
-	{IT_STRING | IT_CVAR, NULL, "Use Mouse",        &cv_usemouse,         10},
+	{IT_STRING | IT_CVAR, NULL, "Use Mouse", NULL, &cv_usemouse,         10},
 
 
-	{IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", &cv_alwaysfreelook,   30},
-	{IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", &cv_chasefreelook,   40},
-	{IT_STRING | IT_CVAR, NULL, "Mouse Move",       &cv_mousemove,        50},
-	{IT_STRING | IT_CVAR, NULL, "Invert Y Axis",     &cv_invertmouse,      60},
+	{IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", NULL, &cv_alwaysfreelook,   30},
+	{IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", NULL, &cv_chasefreelook,   40},
+	{IT_STRING | IT_CVAR, NULL, "Mouse Move",             NULL, &cv_mousemove,        50},
+	{IT_STRING | IT_CVAR, NULL, "Invert Y Axis",          NULL, &cv_invertmouse,      60},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER,
-	                      NULL, "Mouse X Sensitivity",    &cv_mousesens,        70},
+	                      NULL, "Mouse X Sensitivity",    NULL, &cv_mousesens,        70},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER,
-	                      NULL, "Mouse Y Sensitivity",    &cv_mouseysens,        80},
+	                      NULL, "Mouse Y Sensitivity",    NULL, &cv_mouseysens,        80},
 };
 
 static menuitem_t OP_Mouse2OptionsMenu[] =
 {
-	{IT_STRING | IT_CVAR, NULL, "Use Mouse 2",      &cv_usemouse2,        10},
+	{IT_STRING | IT_CVAR, NULL, "Use Mouse 2",            NULL, &cv_usemouse2,        10},
 	{IT_STRING | IT_CVAR, NULL, "Second Mouse Serial Port",
-	                                                &cv_mouse2port,       20},
-	{IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", &cv_alwaysfreelook2,  30},
-	{IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", &cv_chasefreelook2,  40},
-	{IT_STRING | IT_CVAR, NULL, "Mouse Move",       &cv_mousemove2,       50},
-	{IT_STRING | IT_CVAR, NULL, "Invert Y Axis",     &cv_invertmouse2,     60},
+	                                                      NULL, &cv_mouse2port,       20},
+	{IT_STRING | IT_CVAR, NULL, "First-Person MouseLook", NULL, &cv_alwaysfreelook2,  30},
+	{IT_STRING | IT_CVAR, NULL, "Third-Person MouseLook", NULL, &cv_chasefreelook2,  40},
+	{IT_STRING | IT_CVAR, NULL, "Mouse Move",             NULL, &cv_mousemove2,       50},
+	{IT_STRING | IT_CVAR, NULL, "Invert Y Axis",          NULL, &cv_invertmouse2,     60},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER,
-	                      NULL, "Mouse X Sensitivity",    &cv_mousesens2,       70},
+	                      NULL, "Mouse X Sensitivity",    NULL, &cv_mousesens2,       70},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER,
-	                      NULL, "Mouse Y Sensitivity",    &cv_mouseysens2,      80},
+	                      NULL, "Mouse Y Sensitivity",    NULL, &cv_mouseysens2,      80},
 };
 
 static menuitem_t OP_CameraOptionsMenu[] =
 {
-	{IT_HEADER,            NULL, "General Toggles", NULL, 0},
-	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera"  , &cv_chasecam , 6},
-	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity"  , &cv_flipcam , 11},
-	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking"  , &cv_cam_orbit , 16},
-	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", &cv_cam_adjust, 21},
+	{IT_HEADER,            NULL, "General Toggles", NULL, NULL, 0},
+	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera", NULL, &cv_chasecam , 6},
+	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity", NULL, &cv_flipcam , 11},
+	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking", NULL, &cv_cam_orbit , 16},
+	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", NULL, &cv_cam_adjust, 21},
 
-	{IT_HEADER,                                NULL, "Camera Positioning", NULL, 30},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_savedist[0][0], 36},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_saveheight[0][0], 41},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam_speed, 46},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam_turnmultiplier, 51},
+	{IT_HEADER,                                NULL, "Camera Positioning", NULL, NULL, 30},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", NULL, &cv_cam_savedist[0][0], 36},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", NULL, &cv_cam_saveheight[0][0], 41},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", NULL, &cv_cam_speed, 46},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", NULL, &cv_cam_turnmultiplier, 51},
 
-	{IT_HEADER,            NULL, "Display Options", NULL, 60},
-	{IT_STRING  | IT_CVAR, NULL, "Crosshair", &cv_crosshair, 66},
+	{IT_HEADER,            NULL, "Display Options", NULL, NULL, 60},
+	{IT_STRING  | IT_CVAR, NULL, "Crosshair", NULL, &cv_crosshair, 66},
 };
 
 static menuitem_t OP_Camera2OptionsMenu[] =
 {
-	{IT_HEADER,            NULL, "General Toggles", NULL, 0},
-	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera"  , &cv_chasecam2 , 6},
-	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity"  , &cv_flipcam2 , 11},
-	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking"  , &cv_cam2_orbit , 16},
-	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", &cv_cam2_adjust, 21},
+	{IT_HEADER,            NULL, "General Toggles", NULL, NULL, 0},
+	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera", NULL, &cv_chasecam2 , 6},
+	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity", NULL, &cv_flipcam2 , 11},
+	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking", NULL, &cv_cam2_orbit , 16},
+	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", NULL, &cv_cam2_adjust, 21},
 
-	{IT_HEADER,                                NULL, "Camera Positioning", NULL, 30},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_savedist[0][1], 36},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_saveheight[0][1], 41},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam2_speed, 46},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam2_turnmultiplier, 51},
+	{IT_HEADER,                                NULL, "Camera Positioning", NULL, NULL, 30},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", NULL, &cv_cam_savedist[0][1], 36},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", NULL, &cv_cam_saveheight[0][1], 41},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", NULL, &cv_cam2_speed, 46},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", NULL, &cv_cam2_turnmultiplier, 51},
 
-	{IT_HEADER,            NULL, "Display Options", NULL, 60},
-	{IT_STRING  | IT_CVAR, NULL, "Crosshair", &cv_crosshair2, 66},
+	{IT_HEADER,            NULL, "Display Options", NULL, NULL, 60},
+	{IT_STRING  | IT_CVAR, NULL, "Crosshair", NULL, &cv_crosshair2, 66},
 };
 
 static menuitem_t OP_CameraExtendedOptionsMenu[] =
 {
-	{IT_HEADER,            NULL, "General Toggles", NULL, 0},
-	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera"  , &cv_chasecam , 6},
-	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity"  , &cv_flipcam , 11},
-	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking"  , &cv_cam_orbit , 16},
-	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", &cv_cam_adjust, 21},
-
-	{IT_HEADER,                                NULL, "Camera Positioning", NULL, 30},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_savedist[1][0], 36},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_saveheight[1][0], 41},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam_speed, 46},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam_turnmultiplier, 51},
-
-	{IT_HEADER,                           NULL, "Automatic Camera Options", NULL, 60},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", &cv_cam_shiftfacing[0],  66},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to player angle", &cv_cam_turnfacing[0],  71},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to ability", &cv_cam_turnfacingability[0],  76},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to spindash", &cv_cam_turnfacingspindash[0],  81},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to input", &cv_cam_turnfacinginput[0],  86},
-
-	{IT_HEADER,            NULL, "Locked Camera Options", NULL, 95},
-	{IT_STRING  | IT_CVAR, NULL, "Lock button behavior", &cv_cam_centertoggle[0],  101},
-	{IT_STRING  | IT_CVAR, NULL, "Sideways movement", &cv_cam_lockedinput[0],  106},
-	{IT_STRING  | IT_CVAR, NULL, "Targeting assist", &cv_cam_lockonboss[0],  111},
-
-	{IT_HEADER,            NULL, "Display Options", NULL, 120},
-	{IT_STRING  | IT_CVAR, NULL, "Crosshair", &cv_crosshair, 126},
+	{IT_HEADER,            NULL, "General Toggles", NULL, NULL, 0},
+	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera", NULL, &cv_chasecam , 6},
+	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity", NULL, &cv_flipcam , 11},
+	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking", NULL, &cv_cam_orbit , 16},
+	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", NULL, &cv_cam_adjust, 21},
+
+	{IT_HEADER,                                NULL, "Camera Positioning", NULL, NULL, 30},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", NULL, &cv_cam_savedist[1][0], 36},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", NULL, &cv_cam_saveheight[1][0], 41},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", NULL, &cv_cam_speed, 46},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", NULL, &cv_cam_turnmultiplier, 51},
+
+	{IT_HEADER,                           NULL, "Automatic Camera Options", NULL, NULL, 60},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", NULL, &cv_cam_shiftfacing[0],  66},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to player angle", NULL, &cv_cam_turnfacing[0],  71},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to ability", NULL, &cv_cam_turnfacingability[0],  76},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to spindash", NULL, &cv_cam_turnfacingspindash[0],  81},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to input", NULL, &cv_cam_turnfacinginput[0],  86},
+
+	{IT_HEADER,            NULL, "Locked Camera Options", NULL, NULL, 95},
+	{IT_STRING  | IT_CVAR, NULL, "Lock button behavior", NULL, &cv_cam_centertoggle[0],  101},
+	{IT_STRING  | IT_CVAR, NULL, "Sideways movement", NULL, &cv_cam_lockedinput[0],  106},
+	{IT_STRING  | IT_CVAR, NULL, "Targeting assist", NULL, &cv_cam_lockonboss[0],  111},
+
+	{IT_HEADER,            NULL, "Display Options", NULL, NULL, 120},
+	{IT_STRING  | IT_CVAR, NULL, "Crosshair", NULL, &cv_crosshair, 126},
 };
 
 static menuitem_t OP_Camera2ExtendedOptionsMenu[] =
 {
-	{IT_HEADER,            NULL, "General Toggles", NULL, 0},
-	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera"  , &cv_chasecam2 , 6},
-	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity"  , &cv_flipcam2 , 11},
-	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking"  , &cv_cam2_orbit , 16},
-	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", &cv_cam2_adjust, 21},
-
-	{IT_HEADER,                                NULL, "Camera Positioning", NULL, 30},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", &cv_cam_savedist[1][1], 36},
-	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", &cv_cam_saveheight[1][1], 41},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", &cv_cam2_speed, 46},
-	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", &cv_cam2_turnmultiplier, 51},
-
-	{IT_HEADER,                           NULL, "Automatic Camera Options", NULL, 60},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", &cv_cam_shiftfacing[1],  66},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to player angle", &cv_cam_turnfacing[1],  71},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to ability", &cv_cam_turnfacingability[1],  76},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to spindash", &cv_cam_turnfacingspindash[1],  81},
-	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to input", &cv_cam_turnfacinginput[1],  86},
-
-	{IT_HEADER,            NULL, "Locked Camera Options", NULL, 95},
-	{IT_STRING  | IT_CVAR, NULL, "Lock button behavior", &cv_cam_centertoggle[1],  101},
-	{IT_STRING  | IT_CVAR, NULL, "Sideways movement", &cv_cam_lockedinput[1],  106},
-	{IT_STRING  | IT_CVAR, NULL, "Targeting assist", &cv_cam_lockonboss[1],  111},
-
-	{IT_HEADER,            NULL, "Display Options", NULL, 120},
-	{IT_STRING  | IT_CVAR, NULL, "Crosshair", &cv_crosshair2, 126},
+	{IT_HEADER,            NULL, "General Toggles", NULL, NULL, 0},
+	{IT_STRING  | IT_CVAR, NULL, "Third-person Camera", NULL, &cv_chasecam2 , 6},
+	{IT_STRING  | IT_CVAR, NULL, "Flip Camera with Gravity", NULL, &cv_flipcam2 , 11},
+	{IT_STRING  | IT_CVAR, NULL, "Orbital Looking", NULL, &cv_cam2_orbit , 16},
+	{IT_STRING  | IT_CVAR, NULL, "Downhill Slope Adjustment", NULL, &cv_cam2_adjust, 21},
+
+	{IT_HEADER,                                NULL, "Camera Positioning", NULL, NULL, 30},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Distance", NULL, &cv_cam_savedist[1][1], 36},
+	{IT_STRING  | IT_CVAR | IT_CV_INTEGERSTEP, NULL, "Camera Height", NULL, &cv_cam_saveheight[1][1], 41},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Camera Spacial Speed", NULL, &cv_cam2_speed, 46},
+	{IT_STRING  | IT_CVAR | IT_CV_FLOATSLIDER, NULL, "Rotation Speed", NULL, &cv_cam2_turnmultiplier, 51},
+
+	{IT_HEADER,                           NULL, "Automatic Camera Options", NULL, NULL, 60},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Shift to player angle", NULL, &cv_cam_shiftfacing[1],  66},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to player angle", NULL, &cv_cam_turnfacing[1],  71},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to ability", NULL, &cv_cam_turnfacingability[1],  76},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to spindash", NULL, &cv_cam_turnfacingspindash[1],  81},
+	{IT_STRING  | IT_CVAR | IT_CV_SLIDER, NULL, "Turn to input", NULL, &cv_cam_turnfacinginput[1],  86},
+
+	{IT_HEADER,            NULL, "Locked Camera Options", NULL, NULL, 95},
+	{IT_STRING  | IT_CVAR, NULL, "Lock button behavior", NULL, &cv_cam_centertoggle[1],  101},
+	{IT_STRING  | IT_CVAR, NULL, "Sideways movement", NULL, &cv_cam_lockedinput[1],  106},
+	{IT_STRING  | IT_CVAR, NULL, "Targeting assist", NULL, &cv_cam_lockonboss[1],  111},
+
+	{IT_HEADER,            NULL, "Display Options", NULL, NULL, 120},
+	{IT_STRING  | IT_CVAR, NULL, "Crosshair", NULL, &cv_crosshair2, 126},
 };
 
 enum
@@ -1293,195 +1293,143 @@ enum
 
 static menuitem_t OP_VideoOptionsMenu[] =
 {
-	{IT_HEADER, NULL, "Screen", NULL, 0},
-	{IT_STRING | IT_CALL, NULL, "Set Resolution...",  M_VideoModeMenu,    6},  // op_video_resolution
-	{IT_STRING | IT_CVAR, NULL, "Fullscreen (F11)",   &cv_fullscreen,     11},
-	{IT_STRING | IT_CVAR, NULL, "Vertical Sync",      &cv_vidwait,        16},
+	{IT_HEADER, NULL, "Screen", NULL, NULL, 0},
+	{IT_STRING | IT_CALL, NULL, "Set Resolution...",  "Change game resolution", M_VideoModeMenu,    6},  // op_video_resolution
+	{IT_STRING | IT_CVAR, NULL, "Fullscreen (F11)",   NULL, &cv_fullscreen,     11},
+	{IT_STRING | IT_CVAR, NULL, "Vertical Sync",      NULL, &cv_vidwait,        16},
 
-	{IT_HEADER, NULL, "Renderer", NULL, 25},
+	{IT_HEADER, NULL, "Renderer", NULL, NULL, 25},
 #ifdef HWRENDER
-	{IT_STRING | IT_CVAR, NULL, "Renderer (F10)",    &cv_renderer,        31}, // op_video_renderer
+	{IT_STRING | IT_CVAR, NULL, "Renderer (F10)",    NULL, &cv_renderer,        31}, // op_video_renderer
 #else
-	{IT_TRANSTEXT | IT_PAIR, "Renderer", "Software", &cv_renderer,        31},
+	{IT_TRANSTEXT | IT_PAIR, "Renderer", "Software", NULL, &cv_renderer,        31},
 #endif
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Field of view",     &cv_fov,             36},
-	{IT_STRING | IT_CVAR, NULL, "FPS Cap",           &cv_fpscap,          41},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Field of view", NULL, &cv_fov,             36},
+	{IT_STRING | IT_CVAR, NULL, "FPS Cap",           NULL, &cv_fpscap,          41},
 #ifdef HWRENDER
-	{IT_CALL | IT_STRING, NULL, "OpenGL Options...", M_OpenGLOptionsMenu, 46},
+	{IT_CALL | IT_STRING, NULL, "OpenGL Options...", "Change OpenGL-specific options", M_OpenGLOptionsMenu, 46},
 #else
-	{IT_TRANSTEXT,        NULL, "OpenGL Options...", NULL, 46},
+	{IT_TRANSTEXT,        NULL, "OpenGL Options...", "Change OpenGL-specific options", NULL, 46},
 #endif
 
-	{IT_HEADER, NULL, "Color Profile", NULL, 55},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", &cv_globalgamma,      61},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", &cv_globalsaturation, 66},
-	{IT_SUBMENU|IT_STRING, NULL, "Advanced Settings...",     &OP_ColorOptionsDef,  71},
+	{IT_HEADER, NULL, "Color Profile", NULL, NULL, 55},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_globalgamma,      61},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_globalsaturation, 66},
+	{IT_SUBMENU|IT_STRING, NULL, "Advanced Settings...",     NULL, &OP_ColorOptionsDef,  71},
 
-	{IT_HEADER, NULL, "Heads-Up Display", NULL, 80},
-	{IT_STRING | IT_CVAR, NULL, "Show HUD",           &cv_showhud,        86},
+	{IT_HEADER, NULL, "Heads-Up Display", NULL, NULL, 80},
+	{IT_STRING | IT_CVAR, NULL, "Show HUD",           NULL, &cv_showhud,        86},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER,
-	                      NULL, "HUD Transparency",   &cv_translucenthud, 91},
-	{IT_STRING | IT_CVAR, NULL, "Score/Time/Rings",   &cv_timetic,        96},
-	{IT_STRING | IT_CVAR, NULL, "Show Powerups",      &cv_powerupdisplay, 101},
-	{IT_STRING | IT_CVAR, NULL, "Local ping display", &cv_showping,       106}, // shows ping next to framerate if we want to.
-	{IT_STRING | IT_CVAR, NULL, "Show player names",  &cv_seenames,       111},
-
-	{IT_HEADER, NULL, "Console", NULL, 120},
-	{IT_STRING | IT_CVAR, NULL, "Background color", &cons_backcolor,  126},
-	{IT_STRING | IT_CVAR, NULL, "Text Size",        &cv_constextsize, 131},
-
-	{IT_HEADER, NULL, "Chat", NULL, 140},
-	{IT_STRING | IT_CVAR, NULL, "Chat Mode",                      &cv_consolechat,        146},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Chat Box Width",  &cv_chatwidth,          151},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Chat Box Height", &cv_chatheight,         156},
-	{IT_STRING | IT_CVAR, NULL, "Message Fadeout Time",           &cv_chattime,           161},
-	{IT_STRING | IT_CVAR, NULL, "Chat Notifications",             &cv_chatnotifications,  166},
-	{IT_STRING | IT_CVAR, NULL, "Spam Protection",                &cv_chatspamprotection, 171},
-	{IT_STRING | IT_CVAR, NULL, "Chat background tint",           &cv_chatbacktint,       176},
-
-	{IT_HEADER, NULL, "Level", NULL, 185},
-	{IT_STRING | IT_CVAR, NULL, "Draw Distance",          &cv_drawdist,        191},
-	{IT_STRING | IT_CVAR, NULL, "Weather Draw Dist.",     &cv_drawdist_precip, 196},
-	{IT_STRING | IT_CVAR, NULL, "NiGHTS Hoop Draw Dist.", &cv_drawdist_nights, 201},
-
-	{IT_HEADER, NULL, "Diagnostic", NULL, 210},
-	{IT_STRING | IT_CVAR, NULL, "Show FPS",            &cv_fpscounter,      216},
-	{IT_STRING | IT_CVAR, NULL, "Show TPS",            &cv_tpscounter,      221},
-	{IT_STRING | IT_CVAR, NULL, "Clear Before Redraw", &cv_homremoval,      226},
-	{IT_STRING | IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost,   231},
-};
-
-static const char* OP_VideoTooltips[] =
-{
-	NULL,
-	"Resolution the game runs at",
-	"Toggle between fullscreen and windowed mode",
-	"Sync game framerate to display refresh rate",
-	NULL,
-	#ifdef HWRENDER
-	"Toggle OpenGL and Software renderer",
-	#else
-	"Does nothing on this build",
-	#endif
-	"Adjusts field of view, allowing you to have a wider perspective",
-	"Set the game framerate",
-	#ifdef HWRENDER
-	"Options specific to the OpenGL renderer",
-	#else
-	"Does nothing on this build",
-	#endif
-	NULL,
-	"Gamma (brightness) of the game",
-	"Saturation of the game",
-	"Advanced color settings for the game",
-	NULL,
-	"Toggles the Heads-up display",
-	"Changes the transparency of the Heads-up display",
-	"The appearance of the score, time and rings display",
-	"Show remaining duration of power up items",
-	"Display your ping to the server next to the FPS counter",
-	"Show the names of fellow players when you are near them",
-	NULL,
-	"Change the background color of the console",
-	"Adjust the text size of the console",
-	NULL,
-	"Choose how the game chat is displayed",
-	"Change the width of the chat box",
-	"Change the height of the chat box",
-	"How long chat messages appear on screen before fading out",
-	"Plays a chat notification sound",
-	"Block chat messages from sending too fast",
-	"Background for the chatbox",
-	NULL,
-	"How far to render objects",
-	"How far to render precipitation(rain/snow)",
-	"How far to render hoops in NiGHTS mode",
-	NULL,
-	"Display the game's framerate",
-	"Display the game's ticrate",
-	"Fixes the hall of mirrors bug in the Software renderer",
-	"Display a 'Focus Lost' message when the window is unfocused"
+	                      NULL, "HUD Transparency",   NULL, &cv_translucenthud, 91},
+	{IT_STRING | IT_CVAR, NULL, "Score/Time/Rings",   NULL, &cv_timetic,        96},
+	{IT_STRING | IT_CVAR, NULL, "Show Powerups",      NULL, &cv_powerupdisplay, 101},
+	{IT_STRING | IT_CVAR, NULL, "Local ping display", NULL, &cv_showping,       106}, // shows ping next to framerate if we want to.
+	{IT_STRING | IT_CVAR, NULL, "Show player names",  NULL, &cv_seenames,       111},
+
+	{IT_HEADER, NULL, "Console", NULL, NULL, 120},
+	{IT_STRING | IT_CVAR, NULL, "Background color", NULL, &cons_backcolor,  126},
+	{IT_STRING | IT_CVAR, NULL, "Text Size",        NULL, &cv_constextsize, 131},
+
+	{IT_HEADER, NULL, "Chat", NULL, NULL, 140},
+	{IT_STRING | IT_CVAR, NULL, "Chat Mode",                      NULL, &cv_consolechat,        146},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Chat Box Width",  NULL, &cv_chatwidth,          151},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Chat Box Height", NULL, &cv_chatheight,         156},
+	{IT_STRING | IT_CVAR, NULL, "Message Fadeout Time",           NULL, &cv_chattime,           161},
+	{IT_STRING | IT_CVAR, NULL, "Chat Notifications",             NULL, &cv_chatnotifications,  166},
+	{IT_STRING | IT_CVAR, NULL, "Spam Protection",                NULL, &cv_chatspamprotection, 171},
+	{IT_STRING | IT_CVAR, NULL, "Chat background tint",           NULL, &cv_chatbacktint,       176},
+
+	{IT_HEADER, NULL, "Level", NULL, NULL, 185},
+	{IT_STRING | IT_CVAR, NULL, "Draw Distance",          NULL, &cv_drawdist,        191},
+	{IT_STRING | IT_CVAR, NULL, "Weather Draw Dist.",     NULL, &cv_drawdist_precip, 196},
+	{IT_STRING | IT_CVAR, NULL, "NiGHTS Hoop Draw Dist.", NULL, &cv_drawdist_nights, 201},
+
+	{IT_HEADER, NULL, "Diagnostic", NULL, NULL, 210},
+	{IT_STRING | IT_CVAR, NULL, "Show FPS",            NULL, &cv_fpscounter,      216},
+	{IT_STRING | IT_CVAR, NULL, "Show TPS",            NULL, &cv_tpscounter,      221},
+	{IT_STRING | IT_CVAR, NULL, "Clear Before Redraw", NULL, &cv_homremoval,      226},
+	{IT_STRING | IT_CVAR, NULL, "Show \"FOCUS LOST\"", NULL, &cv_showfocuslost,   231},
 };
 
 static menuitem_t OP_VideoModeMenu[] =
 {
-	{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleVideoMode, 0},     // dummy menuitem for the control func
+	{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandleVideoMode, 0},     // dummy menuitem for the control func
 };
 
 static menuitem_t OP_ColorOptionsMenu[] =
 {
-	{IT_STRING | IT_CALL, NULL, "Reset to defaults", M_ResetCvars, 0},
-
-	{IT_HEADER, NULL, "Red", NULL, 9},
-	{IT_DISABLED, NULL, NULL, NULL, 35},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",          &cv_rhue,         15},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation",   &cv_rsaturation,  20},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness",   &cv_rgamma,       25},
-
-	{IT_HEADER, NULL, "Yellow", NULL, 34},
-	{IT_DISABLED, NULL, NULL, NULL, 73},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",          &cv_yhue,         40},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation",   &cv_ysaturation,  45},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness",   &cv_ygamma,       50},
-
-	{IT_HEADER, NULL, "Green", NULL, 59},
-	{IT_DISABLED, NULL, NULL, NULL, 112},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",          &cv_ghue,         65},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation",   &cv_gsaturation,  70},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness",   &cv_ggamma,       75},
-
-	{IT_HEADER, NULL, "Cyan", NULL, 84},
-	{IT_DISABLED, NULL, NULL, NULL, 255},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",          &cv_chue,         90},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation",   &cv_csaturation,  95},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness",   &cv_cgamma,      100},
-
-	{IT_HEADER, NULL, "Blue", NULL, 109},
-	{IT_DISABLED, NULL, NULL, NULL, 152},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",          &cv_bhue,        115},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation",   &cv_bsaturation, 120},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness",   &cv_bgamma,      125},
-
-	{IT_HEADER, NULL, "Magenta", NULL, 134},
-	{IT_DISABLED, NULL, NULL, NULL, 181},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",          &cv_mhue,        140},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation",   &cv_msaturation, 145},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness",   &cv_mgamma,      150},
+	{IT_STRING | IT_CALL, NULL, "Reset to defaults", "Reset color values to their defaults", M_ResetCvars, 0},
+
+	{IT_HEADER, NULL, "Red", NULL, NULL, 9},
+	{IT_DISABLED, NULL, NULL, NULL, NULL, 35},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",        NULL, &cv_rhue,         15},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_rsaturation,  20},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_rgamma,       25},
+
+	{IT_HEADER, NULL, "Yellow", NULL, NULL, 34},
+	{IT_DISABLED, NULL, NULL, NULL, NULL, 73},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",        NULL, &cv_yhue,         40},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_ysaturation,  45},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_ygamma,       50},
+
+	{IT_HEADER, NULL, "Green", NULL, NULL, 59},
+	{IT_DISABLED, NULL, NULL, NULL, NULL, 112},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",        NULL, &cv_ghue,         65},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_gsaturation,  70},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_ggamma,       75},
+
+	{IT_HEADER, NULL, "Cyan", NULL, NULL, 84},
+	{IT_DISABLED, NULL, NULL, NULL, NULL, 255},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",        NULL, &cv_chue,         90},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_csaturation,  95},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_cgamma,      100},
+
+	{IT_HEADER, NULL, "Blue", NULL, NULL, 109},
+	{IT_DISABLED, NULL, NULL, NULL, NULL, 152},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",        NULL, &cv_bhue,        115},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_bsaturation, 120},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_bgamma,      125},
+
+	{IT_HEADER, NULL, "Magenta", NULL, NULL, 134},
+	{IT_DISABLED, NULL, NULL, NULL, NULL, 181},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Hue",        NULL, &cv_mhue,        140},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_msaturation, 145},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_mgamma,      150},
 };
 
 #ifdef HWRENDER
 static menuitem_t OP_OpenGLOptionsMenu[] =
 {
-	{IT_HEADER, NULL, "3D Models", NULL, 0},
-	{IT_STRING|IT_CVAR,         NULL, "Models",              &cv_glmodels,             12},
-	{IT_STRING|IT_CVAR,         NULL, "Frame interpolation", &cv_glmodelinterpolation, 22},
-	{IT_STRING|IT_CVAR,         NULL, "Ambient lighting",    &cv_glmodellighting,      32},
-
-	{IT_HEADER, NULL, "General", NULL, 51},
-	{IT_STRING|IT_CVAR,         NULL, "Shaders",             &cv_glshaders,            63},
-	{IT_STRING|IT_CVAR,         NULL, "Palette rendering",   &cv_glpaletterendering,   73},
-	{IT_STRING|IT_CVAR,         NULL, "Lack of perspective", &cv_glshearing,           83},
-	{IT_STRING | IT_CVAR, 	NULL, "Min Shader Brightness", 		&cv_glsecbright,	   93},
-
-	{IT_HEADER, NULL, "Miscellaneous", NULL, 112},
-	{IT_STRING|IT_CVAR,         NULL, "Bit depth",           &cv_scr_depth,           124},
-	{IT_STRING|IT_CVAR,         NULL, "Texture filter",      &cv_glfiltermode,        134},
-	{IT_STRING|IT_CVAR,         NULL, "Anisotropic",         &cv_glanisotropicmode,   144},
+	{IT_HEADER, NULL, "3D Models", NULL, NULL, 0},
+	{IT_STRING|IT_CVAR,         NULL, "Models",              NULL, &cv_glmodels,             12},
+	{IT_STRING|IT_CVAR,         NULL, "Frame interpolation", NULL, &cv_glmodelinterpolation, 22},
+	{IT_STRING|IT_CVAR,         NULL, "Ambient lighting",    NULL, &cv_glmodellighting,      32},
+
+	{IT_HEADER, NULL, "General", NULL, NULL, 51},
+	{IT_STRING|IT_CVAR,         NULL, "Shaders",             NULL, &cv_glshaders,            63},
+	{IT_STRING|IT_CVAR,         NULL, "Palette rendering",   NULL, &cv_glpaletterendering,   73},
+	{IT_STRING|IT_CVAR,         NULL, "Lack of perspective", NULL, &cv_glshearing,           83},
+	{IT_STRING | IT_CVAR, 	NULL, "Min Shader Brightness",   NULL, &cv_glsecbright,	   93},
+
+	{IT_HEADER, NULL, "Miscellaneous", NULL, NULL, 112},
+	{IT_STRING|IT_CVAR,         NULL, "Bit depth",           NULL, &cv_scr_depth,           124},
+	{IT_STRING|IT_CVAR,         NULL, "Texture filter",      NULL, &cv_glfiltermode,        134},
+	{IT_STRING|IT_CVAR,         NULL, "Anisotropic",         NULL, &cv_glanisotropicmode,   144},
 #ifdef ALAM_LIGHTING
-	{IT_SUBMENU|IT_STRING,      NULL, "Lighting...",         &OP_OpenGLLightingDef,   154},
+	{IT_SUBMENU|IT_STRING,      NULL, "Lighting...",         NULL, &OP_OpenGLLightingDef,   154},
 #endif
 #if defined (_WINDOWS) && (!(defined (__unix__) || defined (UNIXCOMMON) || defined (HAVE_SDL)))
-	{IT_STRING|IT_CVAR,         NULL, "Fullscreen",          &cv_fullscreen,          164},
+	{IT_STRING|IT_CVAR,         NULL, "Fullscreen",          NULL, &cv_fullscreen,          164},
 #endif
 };
 
 #ifdef ALAM_LIGHTING
 static menuitem_t OP_OpenGLLightingMenu[] =
 {
-	{IT_STRING|IT_CVAR, NULL, "Coronas",          &cv_glcoronas,          0},
-	{IT_STRING|IT_CVAR, NULL, "Coronas size",     &cv_glcoronasize,      10},
-	{IT_STRING|IT_CVAR, NULL, "Dynamic lighting", &cv_gldynamiclighting, 20},
-	{IT_STRING|IT_CVAR, NULL, "Static lighting",  &cv_glstaticlighting,  30},
+	{IT_STRING|IT_CVAR, NULL, "Coronas",          NULL, &cv_glcoronas,          0},
+	{IT_STRING|IT_CVAR, NULL, "Coronas size",     NULL, &cv_glcoronasize,      10},
+	{IT_STRING|IT_CVAR, NULL, "Dynamic lighting", NULL, &cv_gldynamiclighting, 20},
+	{IT_STRING|IT_CVAR, NULL, "Static lighting",  NULL, &cv_glstaticlighting,  30},
 };
 #endif // ALAM_LIGHTING
 
@@ -1489,24 +1437,24 @@ static menuitem_t OP_OpenGLLightingMenu[] =
 
 static menuitem_t OP_SoundOptionsMenu[] =
 {
-	{IT_HEADER, NULL, "Game Audio", NULL, 0},
-	{IT_STRING | IT_CVAR,  NULL,  "Sound Effects", &cv_gamesounds, 6},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Sound Volume", &cv_soundvolume, 11},
+	{IT_HEADER, NULL, "Game Audio", NULL, NULL, 0},
+	{IT_STRING | IT_CVAR,  NULL,  "Sound Effects", NULL, &cv_gamesounds, 6},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Sound Volume", NULL, &cv_soundvolume, 11},
 
-	{IT_STRING | IT_CVAR,  NULL,  "Digital Music", &cv_gamedigimusic, 21},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Digital Music Volume", &cv_digmusicvolume,  26},
+	{IT_STRING | IT_CVAR,  NULL,  "Digital Music", NULL, &cv_gamedigimusic, 21},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Digital Music Volume", NULL, &cv_digmusicvolume,  26},
 
-	{IT_STRING | IT_CVAR,  NULL,  "MIDI Music", &cv_gamemidimusic, 36},
-	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "MIDI Music Volume", &cv_midimusicvolume, 41},
+	{IT_STRING | IT_CVAR,  NULL,  "MIDI Music", NULL, &cv_gamemidimusic, 36},
+	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "MIDI Music Volume", NULL, &cv_midimusicvolume, 41},
 
-	{IT_STRING | IT_CVAR,  NULL,  "Music Preference", &cv_musicpref, 51},
+	{IT_STRING | IT_CVAR,  NULL,  "Music Preference", NULL, &cv_musicpref, 51},
 
-	{IT_HEADER, NULL, "Miscellaneous", NULL, 61},
-	{IT_STRING | IT_CVAR, NULL, "Closed Captioning", &cv_closedcaptioning, 67},
-	{IT_STRING | IT_CVAR, NULL, "Reset Music Upon Dying", &cv_resetmusic, 72},
-	{IT_STRING | IT_CVAR, NULL, "Default 1-Up sound", &cv_1upsound, 77},
+	{IT_HEADER, NULL, "Miscellaneous", NULL, NULL, 61},
+	{IT_STRING | IT_CVAR, NULL, "Closed Captioning", NULL, &cv_closedcaptioning, 67},
+	{IT_STRING | IT_CVAR, NULL, "Reset Music Upon Dying", NULL, &cv_resetmusic, 72},
+	{IT_STRING | IT_CVAR, NULL, "Default 1-Up sound", NULL, &cv_1upsound, 77},
 
-	{IT_STRING | IT_SUBMENU, NULL, "Advanced Settings...", &OP_SoundAdvancedDef, 87},
+	{IT_STRING | IT_SUBMENU, NULL, "Advanced Settings...", NULL, &OP_SoundAdvancedDef, 87},
 };
 
 #ifdef HAVE_OPENMPT
@@ -1524,21 +1472,21 @@ static menuitem_t OP_SoundOptionsMenu[] =
 static menuitem_t OP_SoundAdvancedMenu[] =
 {
 #ifdef HAVE_OPENMPT
-	{IT_HEADER, NULL, "OpenMPT Settings", NULL, 0},
-	{IT_STRING | IT_CVAR, NULL, "Instrument Filter", &cv_modfilter, 12},
+	{IT_HEADER, NULL, "OpenMPT Settings", NULL, NULL, 0},
+	{IT_STRING | IT_CVAR, NULL, "Instrument Filter", NULL, &cv_modfilter, 12},
 #endif
 
 #ifdef HAVE_MIXERX
-	{IT_HEADER, NULL, "MIDI Settings", NULL, OPENMPT_MENUOFFSET},
-	{IT_STRING | IT_CVAR, NULL, "MIDI Player", &cv_midiplayer, OPENMPT_MENUOFFSET+12},
-	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "FluidSynth Sound Font File", &cv_midisoundfontpath, OPENMPT_MENUOFFSET+24},
-	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "TiMidity++ Config Folder", &cv_miditimiditypath, OPENMPT_MENUOFFSET+51},
+	{IT_HEADER, NULL, "MIDI Settings", NULL, NULL, OPENMPT_MENUOFFSET},
+	{IT_STRING | IT_CVAR, NULL, "MIDI Player", NULL, &cv_midiplayer, OPENMPT_MENUOFFSET+12},
+	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "FluidSynth Sound Font File", NULL, &cv_midisoundfontpath, OPENMPT_MENUOFFSET+24},
+	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "TiMidity++ Config Folder", NULL, &cv_miditimiditypath, OPENMPT_MENUOFFSET+51},
 #endif
 
-	{IT_HEADER, NULL, "Miscellaneous", NULL, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET},
-	{IT_STRING | IT_CVAR, NULL, "Play Sound Effects if Unfocused", &cv_playsoundsifunfocused, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET+12},
-	{IT_STRING | IT_CVAR, NULL, "Play Music if Unfocused", &cv_playmusicifunfocused, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET+22},
-	{IT_STRING | IT_CVAR, NULL, "Let Levels Force Reset Music", &cv_resetmusicbyheader, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET+32},
+	{IT_HEADER, NULL, "Miscellaneous", NULL, NULL, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET},
+	{IT_STRING | IT_CVAR, NULL, "Play Sound Effects if Unfocused", NULL, &cv_playsoundsifunfocused, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET+12},
+	{IT_STRING | IT_CVAR, NULL, "Play Music if Unfocused", NULL, &cv_playmusicifunfocused, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET+22},
+	{IT_STRING | IT_CVAR, NULL, "Let Levels Force Reset Music", NULL, &cv_resetmusicbyheader, OPENMPT_MENUOFFSET+MIXERX_MENUOFFSET+32},
 };
 
 #undef OPENMPT_MENUOFFSET
@@ -1546,39 +1494,39 @@ static menuitem_t OP_SoundAdvancedMenu[] =
 
 static menuitem_t OP_DataOptionsMenu[] =
 {
-	{IT_STRING | IT_CALL,    NULL, "Add-on Options...",     M_AddonsOptions,     10},
-	{IT_STRING | IT_CALL,    NULL, "Screenshot Options...", M_ScreenshotOptions, 20},
+	{IT_STRING | IT_CALL,    NULL, "Add-on Options...",     NULL, M_AddonsOptions,     10},
+	{IT_STRING | IT_CALL,    NULL, "Screenshot Options...", NULL, M_ScreenshotOptions, 20},
 
-	{IT_STRING | IT_SUBMENU, NULL, "\x85" "Erase Data...",  &OP_EraseDataDef,    40},
+	{IT_STRING | IT_SUBMENU, NULL, "\x85" "Erase Data...",  "Erase game data", &OP_EraseDataDef,    40},
 };
 
 static menuitem_t OP_ScreenshotOptionsMenu[] =
 {
-	{IT_HEADER, NULL, "General", NULL, 0},
-	{IT_STRING|IT_CVAR, NULL, "Use color profile", &cv_screenshot_colorprofile,     6},
-
-	{IT_HEADER, NULL, "Screenshots (F8)", NULL, 16},
-	{IT_STRING|IT_CVAR, NULL, "Storage Location",  &cv_screenshot_option,          22},
-	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_screenshot_folder, 27},
-	{IT_STRING|IT_CVAR, NULL, "Memory Level",      &cv_zlib_memory,                42},
-	{IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_level,                 47},
-	{IT_STRING|IT_CVAR, NULL, "Strategy",          &cv_zlib_strategy,              52},
-	{IT_STRING|IT_CVAR, NULL, "Window Size",       &cv_zlib_window_bits,           57},
-
-	{IT_HEADER, NULL, "Movie Mode (F9)", NULL, 64},
-	{IT_STRING|IT_CVAR, NULL, "Storage Location",  &cv_movie_option,               70},
-	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", &cv_movie_folder, 	   75},
-	{IT_STRING|IT_CVAR, NULL, "Capture Mode",      &cv_moviemode,                  90},
-
-	{IT_STRING|IT_CVAR, NULL, "Downscaling",       &cv_gif_downscale,              95},
-	{IT_STRING|IT_CVAR, NULL, "Region Optimizing", &cv_gif_optimize,              100},
-	{IT_STRING|IT_CVAR, NULL, "Local Color Table", &cv_gif_localcolortable,       105},
-
-	{IT_STRING|IT_CVAR, NULL, "Downscaling",       &cv_apng_downscale,             95},
-	{IT_STRING|IT_CVAR, NULL, "Memory Level",      &cv_zlib_memorya,              100},
-	{IT_STRING|IT_CVAR, NULL, "Compression Level", &cv_zlib_levela,               105},
-	{IT_STRING|IT_CVAR, NULL, "Strategy",          &cv_zlib_strategya,            110},
-	{IT_STRING|IT_CVAR, NULL, "Window Size",       &cv_zlib_window_bitsa,         115},
+	{IT_HEADER, NULL, "General", NULL, NULL, 0},
+	{IT_STRING|IT_CVAR, NULL, "Use color profile", NULL, &cv_screenshot_colorprofile,     6},
+
+	{IT_HEADER, NULL, "Screenshots (F8)", NULL, NULL, 16},
+	{IT_STRING|IT_CVAR, NULL, "Storage Location",  NULL, &cv_screenshot_option,          22},
+	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", NULL, &cv_screenshot_folder, 27},
+	{IT_STRING|IT_CVAR, NULL, "Memory Level",      NULL, &cv_zlib_memory,                42},
+	{IT_STRING|IT_CVAR, NULL, "Compression Level", NULL, &cv_zlib_level,                 47},
+	{IT_STRING|IT_CVAR, NULL, "Strategy",          NULL, &cv_zlib_strategy,              52},
+	{IT_STRING|IT_CVAR, NULL, "Window Size",       NULL, &cv_zlib_window_bits,           57},
+
+	{IT_HEADER, NULL, "Movie Mode (F9)", NULL, NULL, 64},
+	{IT_STRING|IT_CVAR, NULL, "Storage Location",  NULL, &cv_movie_option,               70},
+	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder", NULL, &cv_movie_folder, 	   75},
+	{IT_STRING|IT_CVAR, NULL, "Capture Mode",      NULL, &cv_moviemode,                  90},
+
+	{IT_STRING|IT_CVAR, NULL, "Downscaling",       NULL, &cv_gif_downscale,              95},
+	{IT_STRING|IT_CVAR, NULL, "Region Optimizing", NULL, &cv_gif_optimize,              100},
+	{IT_STRING|IT_CVAR, NULL, "Local Color Table", NULL, &cv_gif_localcolortable,       105},
+
+	{IT_STRING|IT_CVAR, NULL, "Downscaling",       NULL, &cv_apng_downscale,             95},
+	{IT_STRING|IT_CVAR, NULL, "Memory Level",      NULL, &cv_zlib_memorya,              100},
+	{IT_STRING|IT_CVAR, NULL, "Compression Level", NULL, &cv_zlib_levela,               105},
+	{IT_STRING|IT_CVAR, NULL, "Strategy",          NULL, &cv_zlib_strategya,            110},
+	{IT_STRING|IT_CVAR, NULL, "Window Size",       NULL, &cv_zlib_window_bitsa,         115},
 };
 
 enum
@@ -1596,23 +1544,23 @@ enum
 
 static menuitem_t OP_EraseDataMenu[] =
 {
-	{IT_STRING | IT_CALL, NULL, "Erase Record Data", M_EraseData, 10},
-	{IT_STRING | IT_CALL, NULL, "Erase Extras Data", M_EraseData, 20},
+	{IT_STRING | IT_CALL, NULL, "Erase Record Data", "Erase all record attack records and demos", M_EraseData, 10},
+	{IT_STRING | IT_CALL, NULL, "Erase Extras Data", "Erase all extra unlockable progress", M_EraseData, 20},
 
-	{IT_STRING | IT_CALL, NULL, "\x85" "Erase ALL Data", M_EraseData, 40},
+	{IT_STRING | IT_CALL, NULL, "\x85" "Erase ALL Data", "Erase ALL settings and factory reset the game", M_EraseData, 40},
 };
 
 static menuitem_t OP_AddonsOptionsMenu[] =
 {
-	{IT_HEADER,                      NULL, "Menu",                        NULL,                     0},
-	{IT_STRING|IT_CVAR,              NULL, "Location",                    &cv_addons_option,       12},
-	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder",               &cv_addons_folder,       22},
-	{IT_STRING|IT_CVAR,              NULL, "Identify add-ons via",        &cv_addons_md5,          50},
-	{IT_STRING|IT_CVAR,              NULL, "Show unsupported file types", &cv_addons_showall,      60},
+	{IT_HEADER,                      NULL, "Menu",                        NULL, NULL,                     0},
+	{IT_STRING|IT_CVAR,              NULL, "Location",                    NULL, &cv_addons_option,       12},
+	{IT_STRING|IT_CVAR|IT_CV_STRING, NULL, "Custom Folder",               NULL, &cv_addons_folder,       22},
+	{IT_STRING|IT_CVAR,              NULL, "Identify add-ons via",        NULL, &cv_addons_md5,          50},
+	{IT_STRING|IT_CVAR,              NULL, "Show unsupported file types", NULL, &cv_addons_showall,      60},
 
-	{IT_HEADER,                      NULL, "Search",                      NULL,                    78},
-	{IT_STRING|IT_CVAR,              NULL, "Matching",                    &cv_addons_search_type,  90},
-	{IT_STRING|IT_CVAR,              NULL, "Case-sensitive",              &cv_addons_search_case, 100},
+	{IT_HEADER,                      NULL, "Search",                      NULL, NULL,                    78},
+	{IT_STRING|IT_CVAR,              NULL, "Matching",                    NULL, &cv_addons_search_type,  90},
+	{IT_STRING|IT_CVAR,              NULL, "Case-sensitive",              NULL, &cv_addons_search_case, 100},
 };
 
 enum
@@ -1622,76 +1570,76 @@ enum
 
 static menuitem_t OP_ServerOptionsMenu[] =
 {
-	{IT_HEADER, NULL, "General", NULL, 0},
+	{IT_HEADER, NULL, "General", NULL, NULL, 0},
 	{IT_STRING | IT_CVAR | IT_CV_STRING,
-	                         NULL, "Server name",                      &cv_servername,           7},
-	{IT_STRING | IT_CVAR,    NULL, "Max Players",                      &cv_maxplayers,          21},
-	{IT_STRING | IT_CVAR,    NULL, "Allow Add-on Downloading",         &cv_downloading,         26},
-	{IT_STRING | IT_CVAR,    NULL, "Allow players to join",            &cv_allownewplayer,      31},
-	{IT_STRING | IT_CVAR,    NULL, "Minutes for reconnecting",         &cv_rejointimeout,       36},
-	{IT_STRING | IT_CVAR,    NULL, "Map progression",                  &cv_advancemap,          41},
-	{IT_STRING | IT_CVAR,    NULL, "Intermission Timer",               &cv_inttime,             46},
-
-	{IT_HEADER, NULL, "Characters", NULL, 55},
-	{IT_STRING | IT_CVAR,    NULL, "Force a character",                &cv_forceskin,           61},
-	{IT_STRING | IT_CVAR,    NULL, "Restrict character changes",       &cv_restrictskinchange,  66},
-
-	{IT_HEADER, NULL, "Items", NULL, 75},
-	{IT_STRING | IT_CVAR,    NULL, "Item respawn delay",               &cv_itemrespawntime,     81},
-	{IT_STRING | IT_SUBMENU, NULL, "Mystery Item Monitor Toggles...",  &OP_MonitorToggleDef,    86},
-
-	{IT_HEADER, NULL, "Cooperative", NULL, 95},
-	{IT_STRING | IT_CVAR,    NULL, "Players required for exit",        &cv_playersforexit,     101},
-	{IT_STRING | IT_CVAR,    NULL, "Starposts",                        &cv_coopstarposts,      106},
-	{IT_STRING | IT_CVAR,    NULL, "Life sharing",                     &cv_cooplives,          111},
-	{IT_STRING | IT_CVAR,    NULL, "Post-goal free roaming",           &cv_exitmove,           116},
-
-	{IT_HEADER, NULL, "Race, Competition", NULL, 125},
-	{IT_STRING | IT_CVAR,    NULL, "Level completion countdown",       &cv_countdowntime,      131},
-	{IT_STRING | IT_CVAR,    NULL, "Item Monitors",                    &cv_competitionboxes,   136},
-
-	{IT_HEADER, NULL, "Ringslinger (Match, CTF, Tag, H&S)", NULL, 145},
-	{IT_STRING | IT_CVAR,    NULL, "Time Limit",                       &cv_timelimit,          151},
-	{IT_STRING | IT_CVAR,    NULL, "Score Limit",                      &cv_pointlimit,         156},
-	{IT_STRING | IT_CVAR,    NULL, "Overtime on Tie",                  &cv_overtime,           161},
-	{IT_STRING | IT_CVAR,    NULL, "Player respawn delay",             &cv_respawntime,        166},
-
-	{IT_STRING | IT_CVAR,    NULL, "Item Monitors",                    &cv_matchboxes,         176},
-	{IT_STRING | IT_CVAR,    NULL, "Weapon Rings",                     &cv_specialrings,       181},
-	{IT_STRING | IT_CVAR,    NULL, "Power Stones",                     &cv_powerstones,        186},
-
-	{IT_STRING | IT_CVAR,    NULL, "Flag respawn delay",               &cv_flagtime,           196},
-	{IT_STRING | IT_CVAR,    NULL, "Hiding time",                      &cv_hidetime,           201},
-
-	{IT_HEADER, NULL, "Teams", NULL, 210},
-	{IT_STRING | IT_CVAR,    NULL, "Autobalance sizes",                &cv_autobalance,        216},
-	{IT_STRING | IT_CVAR,    NULL, "Scramble on Map Change",           &cv_scrambleonchange,   221},
-
-	{IT_HEADER, NULL, "Advanced", NULL, 230},
-	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Master server",        &cv_masterserver,       236},
-
-	{IT_STRING | IT_CVAR,    NULL, "Join delay",                       &cv_joindelay,          251},
-	{IT_STRING | IT_CVAR,    NULL, "Attempts to resynchronise",        &cv_resynchattempts,    256},
-
-	{IT_STRING | IT_CVAR,    NULL, "Show IP Address of Joiners",       &cv_showjoinaddress,    261},
+	                         NULL, "Server name",                      NULL, &cv_servername,           7},
+	{IT_STRING | IT_CVAR,    NULL, "Max Players",                      NULL, &cv_maxplayers,          21},
+	{IT_STRING | IT_CVAR,    NULL, "Allow Add-on Downloading",         NULL, &cv_downloading,         26},
+	{IT_STRING | IT_CVAR,    NULL, "Allow players to join",            NULL, &cv_allownewplayer,      31},
+	{IT_STRING | IT_CVAR,    NULL, "Minutes for reconnecting",         NULL, &cv_rejointimeout,       36},
+	{IT_STRING | IT_CVAR,    NULL, "Map progression",                  NULL, &cv_advancemap,          41},
+	{IT_STRING | IT_CVAR,    NULL, "Intermission Timer",               NULL, &cv_inttime,             46},
+
+	{IT_HEADER, NULL, "Characters", NULL, NULL, 55},
+	{IT_STRING | IT_CVAR,    NULL, "Force a character",                NULL, &cv_forceskin,           61},
+	{IT_STRING | IT_CVAR,    NULL, "Restrict character changes",       NULL, &cv_restrictskinchange,  66},
+
+	{IT_HEADER, NULL, "Items", NULL, NULL, 75},
+	{IT_STRING | IT_CVAR,    NULL, "Item respawn delay",               NULL, &cv_itemrespawntime,     81},
+	{IT_STRING | IT_SUBMENU, NULL, "Mystery Item Monitor Toggles...",  "Edit spawn frequency of mystery items", &OP_MonitorToggleDef,    86},
+
+	{IT_HEADER, NULL, "Cooperative", NULL, NULL, 95},
+	{IT_STRING | IT_CVAR,    NULL, "Players required for exit",        NULL, &cv_playersforexit,     101},
+	{IT_STRING | IT_CVAR,    NULL, "Starposts",                        NULL, &cv_coopstarposts,      106},
+	{IT_STRING | IT_CVAR,    NULL, "Life sharing",                     NULL, &cv_cooplives,          111},
+	{IT_STRING | IT_CVAR,    NULL, "Post-goal free roaming",           NULL, &cv_exitmove,           116},
+
+	{IT_HEADER, NULL, "Race, Competition", NULL, NULL, 125},
+	{IT_STRING | IT_CVAR,    NULL, "Level completion countdown",       NULL, &cv_countdowntime,      131},
+	{IT_STRING | IT_CVAR,    NULL, "Item Monitors",                    NULL, &cv_competitionboxes,   136},
+
+	{IT_HEADER, NULL, "Ringslinger (Match, CTF, Tag, H&S)", NULL, NULL, 145},
+	{IT_STRING | IT_CVAR,    NULL, "Time Limit",                       NULL, &cv_timelimit,          151},
+	{IT_STRING | IT_CVAR,    NULL, "Score Limit",                      NULL, &cv_pointlimit,         156},
+	{IT_STRING | IT_CVAR,    NULL, "Overtime on Tie",                  NULL, &cv_overtime,           161},
+	{IT_STRING | IT_CVAR,    NULL, "Player respawn delay",             NULL, &cv_respawntime,        166},
+
+	{IT_STRING | IT_CVAR,    NULL, "Item Monitors",                    NULL, &cv_matchboxes,         176},
+	{IT_STRING | IT_CVAR,    NULL, "Weapon Rings",                     NULL, &cv_specialrings,       181},
+	{IT_STRING | IT_CVAR,    NULL, "Power Stones",                     NULL, &cv_powerstones,        186},
+
+	{IT_STRING | IT_CVAR,    NULL, "Flag respawn delay",               NULL, &cv_flagtime,           196},
+	{IT_STRING | IT_CVAR,    NULL, "Hiding time",                      NULL, &cv_hidetime,           201},
+
+	{IT_HEADER, NULL, "Teams", NULL, NULL, 210},
+	{IT_STRING | IT_CVAR,    NULL, "Autobalance sizes",                NULL, &cv_autobalance,        216},
+	{IT_STRING | IT_CVAR,    NULL, "Scramble on Map Change",           NULL, &cv_scrambleonchange,   221},
+
+	{IT_HEADER, NULL, "Advanced", NULL, NULL, 230},
+	{IT_STRING | IT_CVAR | IT_CV_STRING, NULL, "Master server",        NULL, &cv_masterserver,       236},
+
+	{IT_STRING | IT_CVAR,    NULL, "Join delay",                       NULL, &cv_joindelay,          251},
+	{IT_STRING | IT_CVAR,    NULL, "Attempts to resynchronise",        NULL, &cv_resynchattempts,    256},
+
+	{IT_STRING | IT_CVAR,    NULL, "Show IP Address of Joiners",       NULL, &cv_showjoinaddress,    261},
 };
 
 static menuitem_t OP_MonitorToggleMenu[] =
 {
 	// Printing handled by drawing function
-	{IT_STRING|IT_CALL, NULL, "Reset to defaults", M_ResetCvars, 15},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Recycler",          &cv_recycler,      30},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Teleport",          &cv_teleporters,   40},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Super Ring",        &cv_superring,     50},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Super Sneakers",    &cv_supersneakers, 60},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Invincibility",     &cv_invincibility, 70},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Whirlwind Shield",  &cv_jumpshield,    80},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Elemental Shield",  &cv_watershield,   90},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Attraction Shield", &cv_ringshield,   100},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Force Shield",      &cv_forceshield,  110},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Armageddon Shield", &cv_bombshield,   120},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "1 Up",              &cv_1up,          130},
-	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Eggman Box",        &cv_eggmanbox,    140},
+	{IT_STRING|IT_CALL, NULL, "Reset to defaults", "Reset settings to their default values", M_ResetCvars, 15},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Recycler",          NULL, &cv_recycler,      30},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Teleport",          NULL, &cv_teleporters,   40},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Super Ring",        NULL, &cv_superring,     50},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Super Sneakers",    NULL, &cv_supersneakers, 60},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Invincibility",     NULL, &cv_invincibility, 70},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Whirlwind Shield",  NULL, &cv_jumpshield,    80},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Elemental Shield",  NULL, &cv_watershield,   90},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Attraction Shield", NULL, &cv_ringshield,   100},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Force Shield",      NULL, &cv_forceshield,  110},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Armageddon Shield", NULL, &cv_bombshield,   120},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "1 Up",              NULL, &cv_1up,          130},
+	{IT_STRING|IT_CVAR|IT_CV_INVISSLIDER, NULL, "Eggman Box",        NULL, &cv_eggmanbox,    140},
 };
 
 // ==========================================================================
@@ -2136,7 +2084,7 @@ menu_t OP_Camera2OptionsDef = {
 	NULL
 };
 
-static menuitem_t OP_PlaystyleMenu[] = {{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandlePlaystyleMenu, 0}};
+static menuitem_t OP_PlaystyleMenu[] = {{IT_KEYHANDLER | IT_NOTHING, NULL, "", NULL, M_HandlePlaystyleMenu, 0}};
 
 menu_t OP_PlaystyleDef = {
 	MTREE3(MN_OP_MAIN, MN_OP_P1CONTROLS, MN_OP_PLAYSTYLE), ///@TODO the second level should be set in runtime
@@ -4427,6 +4375,31 @@ static void M_DrawSplitText(INT32 x, INT32 y, INT32 option, const char* str, INT
 	free(clines);
 }
 
+static void M_DoToolTips(menu_t *menu)
+{
+	char *desc = NULL;
+	if (menu->menuitems[itemOn].desc != NULL)
+	{
+		desc = V_FontWordWrap(0, BASEVIDWIDTH, V_ALLOWLOWERCASE, FRACUNIT, menu->menuitems[itemOn].desc, tny_font);
+	}
+	else if (menu->menuitems[itemOn].status & IT_CVAR)
+	{
+		consvar_t *cvar = menu->menuitems[itemOn].itemaction;
+		if (cvar != NULL && cvar->desc != NULL)
+		{
+			desc = V_FontWordWrap(0, BASEVIDWIDTH, V_ALLOWLOWERCASE, FRACUNIT, cvar->desc, tny_font);
+		}
+	}
+
+	if (desc != NULL)
+	{
+		M_DrawSplitText(BASEVIDWIDTH / 2, BASEVIDHEIGHT-50, V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, desc, coolalphatimer);
+		Z_Free(desc);
+		if (coolalphatimer > 0)
+			coolalphatimer--;
+	}
+}
+
 
 static void M_DrawGenericMenu(void)
 {
@@ -4568,6 +4541,8 @@ static void M_DrawGenericMenu(void)
 			W_CachePatchName("M_CURSOR", PU_PATCH));
 		V_DrawString(currentMenu->x, cursory, V_YELLOWMAP, currentMenu->menuitems[itemOn].text);
 	}
+
+	M_DoToolTips(currentMenu);
 }
 
 const char *PlaystyleNames[4] = {"\x86Strafe\x80", "Manual", "Automatic", "Old Analog??"};
@@ -4814,7 +4789,7 @@ static void M_DrawGenericScrollMenu(void)
 	V_DrawScaledPatch(currentMenu->x - 24, cursory, 0,
 		W_CachePatchName("M_CURSOR", PU_PATCH));
 
-	DoToolTips(OP_VideoOptionsDef, OP_VideoTooltips);
+	M_DoToolTips(currentMenu);
 }
 
 static void M_DrawPauseMenu(void)
@@ -6189,7 +6164,7 @@ static void M_DrawMessageMenu(void);
 static menuitem_t MessageMenu[] =
 {
 	// TO HACK
-	{0,NULL, NULL, NULL,0}
+	{0,NULL, NULL, NULL, NULL,0}
 };
 
 menu_t MessageDef =
@@ -8099,7 +8074,7 @@ static void M_SecretsMenu(INT32 choice)
 	(void)choice;
 
 	// Initialize array with placeholder entries
-	menuitem_t placeholder = {IT_DISABLED, NULL, "", NULL, 0};
+	menuitem_t placeholder = {IT_DISABLED, NULL, "", NULL, NULL, 0};
 	for (i = 1; i <= MAXUNLOCKABLES; ++i)
 		SR_MainMenu[i] = placeholder;
 
diff --git a/src/m_menu.h b/src/m_menu.h
index 45ca6c2f2e..5b884aea69 100644
--- a/src/m_menu.h
+++ b/src/m_menu.h
@@ -322,6 +322,7 @@ typedef struct menuitem_s
 
 	const char *patch;
 	const char *text; // used when FONTBxx lump is found
+	const char *desc;
 
 // FIXME: should be itemaction_t
 	void *itemaction;
@@ -578,15 +579,4 @@ void M_FreePlayerSetupColors(void);
 	NULL\
 }
 
-#define DoToolTips(menu, tooltip)\
-if (currentMenu == &menu)\
-{\
-	if (!(tooltip[itemOn] == NULL))\
-	{\
-		M_DrawSplitText(BASEVIDWIDTH / 2, BASEVIDHEIGHT-50, V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, tooltip[itemOn], coolalphatimer);\
-		if (coolalphatimer > 0)\
-			coolalphatimer--;\
-	}\
-}
-
 #endif //__X_MENU__
-- 
GitLab


From fa74a3b6c11a74a9124878fab4f47792a9d051b8 Mon Sep 17 00:00:00 2001
From: Hanicef <gustaf@hanicef.me>
Date: Sat, 22 Mar 2025 14:12:17 +0100
Subject: [PATCH 3/6] Tweak console descriptions

---
 src/g_input.c          |  2 +-
 src/hardware/hw_main.c |  6 +++---
 src/r_fps.c            |  2 +-
 src/r_main.c           | 20 ++++++++++----------
 src/sdl/i_video.c      |  2 +-
 5 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/g_input.c b/src/g_input.c
index 9b9257a12f..69eebffbfa 100644
--- a/src/g_input.c
+++ b/src/g_input.c
@@ -31,7 +31,7 @@ consvar_t cv_mousesens = CVAR_INIT ("mousesens", "20", "Mouse X sensitivity", CV
 consvar_t cv_mousesens2 = CVAR_INIT ("mousesens2", "20", "Mouse X sensitivity for player 2", CV_SAVE, mousesens_cons_t, NULL);
 consvar_t cv_mouseysens = CVAR_INIT ("mouseysens", "20", "Mouse Y sensitivity", CV_SAVE, mousesens_cons_t, NULL);
 consvar_t cv_mouseysens2 = CVAR_INIT ("mouseysens2", "20", "Mouse Y sensitivity for player 2", CV_SAVE, mousesens_cons_t, NULL);
-consvar_t cv_controlperkey = CVAR_INIT ("controlperkey", "One", "If set to Multiple, overlapping binds are allowed", CV_SAVE, onecontrolperkey_cons_t, NULL);
+consvar_t cv_controlperkey = CVAR_INIT ("controlperkey", "One", "If set to Several, overlapping keybinds are allowed", CV_SAVE, onecontrolperkey_cons_t, NULL);
 
 mouse_t mouse;
 mouse_t mouse2;
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 8f06538b88..9b93001777 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -5757,7 +5757,7 @@ static CV_PossibleValue_t glfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSA
 CV_PossibleValue_t glanisotropicmode_cons_t[] = {{1, "MIN"}, {16, "MAX"}, {0, NULL}};
 static CV_PossibleValue_t glsecbright_cons_t[] = {{0, "MIN"}, {255, "MAX"}, {0, NULL}};
 
-consvar_t cv_glshaders = CVAR_INIT ("gr_shaders", "On", "Enables OpenGL shaders", CV_SAVE|CV_CALL, glshaders_cons_t, CV_glshaders_OnChange);
+consvar_t cv_glshaders = CVAR_INIT ("gr_shaders", "On", "Enables additional visual effects in OpenGL", CV_SAVE|CV_CALL, glshaders_cons_t, CV_glshaders_OnChange);
 
 consvar_t cv_glsecbright = CVAR_INIT("gr_secbright", "0", "Sets minimum sector brightness, useful for dark areas", CV_SAVE, glsecbright_cons_t, NULL);
 
@@ -5772,7 +5772,7 @@ consvar_t cv_glmodels = CVAR_INIT ("gr_models", "Off", "If on, will use 3D model
 consvar_t cv_glmodelinterpolation = CVAR_INIT ("gr_modelinterpolation", "On", "If on, 3D models will interpolate on between frames", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_glmodellighting = CVAR_INIT ("gr_modellighting", "Off", NULL, CV_SAVE|CV_CALL, CV_OnOff, CV_glmodellighting_OnChange);
 
-consvar_t cv_glshearing = CVAR_INIT ("gr_shearing", "Off", "Emulates Software's vertical look", CV_SAVE, glshearing_cons_t, NULL);
+consvar_t cv_glshearing = CVAR_INIT ("gr_shearing", "Off", "Emulates Software's vertical camera view (requires shaders)", CV_SAVE, glshearing_cons_t, NULL);
 consvar_t cv_glspritebillboarding = CVAR_INIT ("gr_spritebillboarding", "Off", "Causes sprites to always face the camera", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_glskydome = CVAR_INIT ("gr_skydome", "On", "Bend skybox around the map, giving a higher skybox quality", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_glfakecontrast = CVAR_INIT ("gr_fakecontrast", "Smooth", NULL, CV_SAVE, glfakecontrast_cons_t, NULL);
@@ -5787,7 +5787,7 @@ consvar_t cv_glbatching = CVAR_INIT ("gr_batching", "On", "Whetever to send poly
 
 static CV_PossibleValue_t glpalettedepth_cons_t[] = {{16, "16 bits"}, {24, "24 bits"}, {0, NULL}};
 
-consvar_t cv_glpaletterendering = CVAR_INIT ("gr_paletterendering", "On", "Emulate Software's color paletting", CV_SAVE|CV_CALL, CV_OnOff, CV_glpaletterendering_OnChange);
+consvar_t cv_glpaletterendering = CVAR_INIT ("gr_paletterendering", "On", "Emulate Software's coloring graphics (requires shaders)", CV_SAVE|CV_CALL, CV_OnOff, CV_glpaletterendering_OnChange);
 consvar_t cv_glpalettedepth = CVAR_INIT ("gr_palettedepth", "16 bits", NULL, CV_SAVE|CV_CALL, glpalettedepth_cons_t, CV_glpalettedepth_OnChange);
 
 #define ONLY_IF_GL_LOADED if (vid.glstate != VID_GL_LIBRARY_LOADED) return;
diff --git a/src/r_fps.c b/src/r_fps.c
index fc814db4a8..5edce1db3a 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -39,7 +39,7 @@ static CV_PossibleValue_t fpscap_cons_t[] = {
 	{0, "Match refresh rate"},
 	{0, NULL}
 };
-consvar_t cv_fpscap = CVAR_INIT ("fpscap", "Match refresh rate", "Maximum allowed framerate", CV_SAVE, fpscap_cons_t, NULL);
+consvar_t cv_fpscap = CVAR_INIT ("fpscap", "Match refresh rate", "Limits the framerate to this value, useful for saving battery power", CV_SAVE, fpscap_cons_t, NULL);
 
 ps_metric_t ps_interp_frac = {0};
 ps_metric_t ps_interp_lag = {0};
diff --git a/src/r_main.c b/src/r_main.c
index 819dcce761..ebffd3c1dd 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -147,22 +147,22 @@ void SendWeaponPref(void);
 void SendWeaponPref2(void);
 
 consvar_t cv_tailspickup = CVAR_INIT ("tailspickup", "On", "If off, players will collide with each other (this does prevent tails from picking up players but it's the worst possible solution to the problem)", CV_NETVAR|CV_ALLOWLUA, CV_OnOff, NULL);
-consvar_t cv_chasecam = CVAR_INIT ("chasecam", "On", NULL, CV_CALL, CV_OnOff, ChaseCam_OnChange);
-consvar_t cv_chasecam2 = CVAR_INIT ("chasecam2", "On", NULL, CV_CALL, CV_OnOff, ChaseCam2_OnChange);
-consvar_t cv_flipcam = CVAR_INIT ("flipcam", "No", NULL, CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam_OnChange);
-consvar_t cv_flipcam2 = CVAR_INIT ("flipcam2", "No", NULL, CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam2_OnChange);
+consvar_t cv_chasecam = CVAR_INIT ("chasecam", "On", "Place the camera behind the player character rather than from the character's eyes", CV_CALL, CV_OnOff, ChaseCam_OnChange);
+consvar_t cv_chasecam2 = CVAR_INIT ("chasecam2", "On", "Place the camera behind the player character rather than from the character's eyes", CV_CALL, CV_OnOff, ChaseCam2_OnChange);
+consvar_t cv_flipcam = CVAR_INIT ("flipcam", "No", "Causes the camera to orient itself with the player character", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam_OnChange);
+consvar_t cv_flipcam2 = CVAR_INIT ("flipcam2", "No", "Causes the camera to orient itself with the player character", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam2_OnChange);
 
-consvar_t cv_shadow = CVAR_INIT ("shadow", "Drop", NULL, CV_SAVE, shadow_cons_t, NULL);
-consvar_t cv_skybox = CVAR_INIT ("skybox", "On", NULL, CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_shadow = CVAR_INIT ("shadow", "Drop", "Changes how shadows are rendered", CV_SAVE, shadow_cons_t, NULL);
+consvar_t cv_skybox = CVAR_INIT ("skybox", "On", "If on, the skybox view will be rendered if the map has one", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_allowmlook = CVAR_INIT ("allowmlook", "Yes", NULL, CV_NETVAR|CV_ALLOWLUA, CV_YesNo, NULL);
-consvar_t cv_showhud = CVAR_INIT ("showhud", "Yes", NULL, CV_CALL|CV_ALLOWLUA,  CV_YesNo, R_SetViewSize);
-consvar_t cv_translucenthud = CVAR_INIT ("translucenthud", "10", NULL, CV_SAVE, translucenthud_cons_t, NULL);
+consvar_t cv_showhud = CVAR_INIT ("showhud", "Yes", "If the HUD should be shown or not", CV_CALL|CV_ALLOWLUA,  CV_YesNo, R_SetViewSize);
+consvar_t cv_translucenthud = CVAR_INIT ("translucenthud", "10", "Opacity of the game's HUD elements", CV_SAVE, translucenthud_cons_t, NULL);
 
-consvar_t cv_translucency = CVAR_INIT ("translucency", "On", NULL, CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_translucency = CVAR_INIT ("translucency", "On", "If off, all objects will be fully opaque", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_drawdist = CVAR_INIT ("drawdist", "Infinite", NULL, CV_SAVE, drawdist_cons_t, NULL);
 consvar_t cv_drawdist_nights = CVAR_INIT ("drawdist_nights", "2048", NULL, CV_SAVE, drawdist_cons_t, NULL);
 consvar_t cv_drawdist_precip = CVAR_INIT ("drawdist_precip", "1024", NULL, CV_SAVE, drawdist_precip_cons_t, NULL);
-consvar_t cv_fov = CVAR_INIT ("fov", "90", NULL, CV_SAVE|CV_CALL, fov_cons_t, Fov_OnChange);
+consvar_t cv_fov = CVAR_INIT ("fov", "90", "Sets the view range, higher effectively means larger camera lens", CV_SAVE|CV_CALL, fov_cons_t, Fov_OnChange);
 consvar_t cv_fovadjust = CVAR_INIT ("fovadjust", "On", NULL, CV_SAVE|CV_CALL, CV_OnOff, Fov_OnChange);
 consvar_t cv_fovchange = CVAR_INIT ("fovchange", "Off", NULL, CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_maxportals = CVAR_INIT ("maxportals", "2", NULL, CV_SAVE, maxportals_cons_t, NULL);
diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index 684962a332..d745eec8d3 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -93,7 +93,7 @@ rendermode_t chosenrendermode = render_none; // set by command line arguments
 static void VidWaitChanged(void);
 
 // synchronize page flipping with screen refresh
-consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "On", NULL, CV_SAVE | CV_CALL, CV_OnOff, VidWaitChanged);
+consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "On", "Synchronize framerate with refresh rate, eliminating screen tearing", CV_SAVE | CV_CALL, CV_OnOff, VidWaitChanged);
 static consvar_t cv_stretch = CVAR_INIT ("stretch", "Off", NULL, CV_SAVE|CV_NOSHOWHELP, CV_OnOff, NULL);
 static consvar_t cv_alwaysgrabmouse = CVAR_INIT ("alwaysgrabmouse", "Off", "If on, the game will never let go of the mouse, even when unused", CV_SAVE, CV_OnOff, NULL);
 
-- 
GitLab


From 7cc5a81f97678e63b1bb6e1379900afbf1dc38ab Mon Sep 17 00:00:00 2001
From: chromaticpipe2 <chromaticpipe@gmail.com>
Date: Sat, 22 Mar 2025 09:24:28 -0500
Subject: [PATCH 4/6] Add note to secbright, and add descriptions for wall and
 slope contrast

Add note to secbright, and add descriptions for wall and slope contrast
---
 src/hardware/hw_main.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 9b93001777..421bd79c53 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -5759,7 +5759,7 @@ static CV_PossibleValue_t glsecbright_cons_t[] = {{0, "MIN"}, {255, "MAX"}, {0,
 
 consvar_t cv_glshaders = CVAR_INIT ("gr_shaders", "On", "Enables additional visual effects in OpenGL", CV_SAVE|CV_CALL, glshaders_cons_t, CV_glshaders_OnChange);
 
-consvar_t cv_glsecbright = CVAR_INIT("gr_secbright", "0", "Sets minimum sector brightness, useful for dark areas", CV_SAVE, glsecbright_cons_t, NULL);
+consvar_t cv_glsecbright = CVAR_INIT("gr_secbright", "0", "Sets minimum sector brightness, useful for dark areas (requires shaders)", CV_SAVE, glsecbright_cons_t, NULL);
 
 #ifdef ALAM_LIGHTING
 consvar_t cv_gldynamiclighting = CVAR_INIT ("gr_dynamiclighting", "On", NULL, CV_SAVE, CV_OnOff, NULL);
@@ -5770,13 +5770,13 @@ consvar_t cv_glcoronasize = CVAR_INIT ("gr_coronasize", "1", NULL, CV_SAVE|CV_FL
 
 consvar_t cv_glmodels = CVAR_INIT ("gr_models", "Off", "If on, will use 3D models instead of sprites if available", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_glmodelinterpolation = CVAR_INIT ("gr_modelinterpolation", "On", "If on, 3D models will interpolate on between frames", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_glmodellighting = CVAR_INIT ("gr_modellighting", "Off", NULL, CV_SAVE|CV_CALL, CV_OnOff, CV_glmodellighting_OnChange);
+consvar_t cv_glmodellighting = CVAR_INIT ("gr_modellighting", "Off", "If on, 3d models will have ambient light effects", CV_SAVE|CV_CALL, CV_OnOff, CV_glmodellighting_OnChange);
 
 consvar_t cv_glshearing = CVAR_INIT ("gr_shearing", "Off", "Emulates Software's vertical camera view (requires shaders)", CV_SAVE, glshearing_cons_t, NULL);
 consvar_t cv_glspritebillboarding = CVAR_INIT ("gr_spritebillboarding", "Off", "Causes sprites to always face the camera", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_glskydome = CVAR_INIT ("gr_skydome", "On", "Bend skybox around the map, giving a higher skybox quality", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_glfakecontrast = CVAR_INIT ("gr_fakecontrast", "Smooth", NULL, CV_SAVE, glfakecontrast_cons_t, NULL);
-consvar_t cv_glslopecontrast = CVAR_INIT ("gr_slopecontrast", "Off", NULL, CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_glfakecontrast = CVAR_INIT ("gr_fakecontrast", "Smooth", "Adjust the contrast of walls to make them stand out more", CV_SAVE, glfakecontrast_cons_t, NULL);
+consvar_t cv_glslopecontrast = CVAR_INIT ("gr_slopecontrast", "Off", "Adjust the contrast of sloped surfaces to make them stand out more", CV_SAVE, CV_OnOff, NULL);
 
 consvar_t cv_glfiltermode = CVAR_INIT ("gr_filtermode", "Nearest", "Texture filter to use when scaling", CV_SAVE|CV_CALL, glfiltermode_cons_t, CV_glfiltermode_OnChange);
 consvar_t cv_glanisotropicmode = CVAR_INIT ("gr_anisotropicmode", "1", NULL, CV_SAVE|CV_CALL, glanisotropicmode_cons_t, CV_glanisotropic_OnChange);
-- 
GitLab


From 51dae46fb95ea258d9c9e5f09dba7c7c1ee443a1 Mon Sep 17 00:00:00 2001
From: chromaticpipe2 <chromaticpipe@gmail.com>
Date: Sat, 22 Mar 2025 11:35:03 -0500
Subject: [PATCH 5/6] Add tooltips to a bunch of stuff that didn't have them

---
 src/console.c          | 2 +-
 src/hardware/hw_main.c | 2 +-
 src/m_menu.c           | 2 +-
 src/netcode/d_netcmd.c | 4 ++--
 src/r_main.c           | 8 ++++----
 src/screen.c           | 2 +-
 src/v_video.c          | 2 +-
 7 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/console.c b/src/console.c
index fa3da64c95..c0ca3217d6 100644
--- a/src/console.c
+++ b/src/console.c
@@ -151,7 +151,7 @@ static CV_PossibleValue_t backcolor_cons_t[] = {{0, "White"}, 		{1, "Black"},		{
 												{0, NULL}};
 
 
-consvar_t cons_backcolor = CVAR_INIT ("con_backcolor", "Green", NULL, CV_CALL|CV_SAVE, backcolor_cons_t, CONS_backcolor_Change);
+consvar_t cons_backcolor = CVAR_INIT ("con_backcolor", "Green", "Color of the console background", CV_CALL|CV_SAVE, backcolor_cons_t, CONS_backcolor_Change);
 
 static void CON_Print(char *msg);
 
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 421bd79c53..708b3cdf44 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -5779,7 +5779,7 @@ consvar_t cv_glfakecontrast = CVAR_INIT ("gr_fakecontrast", "Smooth", "Adjust th
 consvar_t cv_glslopecontrast = CVAR_INIT ("gr_slopecontrast", "Off", "Adjust the contrast of sloped surfaces to make them stand out more", CV_SAVE, CV_OnOff, NULL);
 
 consvar_t cv_glfiltermode = CVAR_INIT ("gr_filtermode", "Nearest", "Texture filter to use when scaling", CV_SAVE|CV_CALL, glfiltermode_cons_t, CV_glfiltermode_OnChange);
-consvar_t cv_glanisotropicmode = CVAR_INIT ("gr_anisotropicmode", "1", NULL, CV_SAVE|CV_CALL, glanisotropicmode_cons_t, CV_glanisotropic_OnChange);
+consvar_t cv_glanisotropicmode = CVAR_INIT ("gr_anisotropicmode", "1", "The intensity of anistropic texture filtering", CV_SAVE|CV_CALL, glanisotropicmode_cons_t, CV_glanisotropic_OnChange);
 
 consvar_t cv_glsolvetjoin = CVAR_INIT ("gr_solvetjoin", "On", NULL, 0, CV_OnOff, NULL);
 
diff --git a/src/m_menu.c b/src/m_menu.c
index a42e8f0d29..9b99457bc7 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1315,7 +1315,7 @@ static menuitem_t OP_VideoOptionsMenu[] =
 	{IT_HEADER, NULL, "Color Profile", NULL, NULL, 55},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Brightness", NULL, &cv_globalgamma,      61},
 	{IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Saturation", NULL, &cv_globalsaturation, 66},
-	{IT_SUBMENU|IT_STRING, NULL, "Advanced Settings...",     NULL, &OP_ColorOptionsDef,  71},
+	{IT_SUBMENU|IT_STRING, NULL, "Advanced Settings...", "Advanced color settings for the game", &OP_ColorOptionsDef,  71},
 
 	{IT_HEADER, NULL, "Heads-Up Display", NULL, NULL, 80},
 	{IT_STRING | IT_CVAR, NULL, "Show HUD",           NULL, &cv_showhud,        86},
diff --git a/src/netcode/d_netcmd.c b/src/netcode/d_netcmd.c
index 6ba7ea2127..da869084ee 100644
--- a/src/netcode/d_netcmd.c
+++ b/src/netcode/d_netcmd.c
@@ -320,10 +320,10 @@ consvar_t cv_overtime = CVAR_INIT ("overtime", "Yes", NULL, CV_SAVE|CV_NETVAR|CV
 consvar_t cv_rollingdemos = CVAR_INIT ("rollingdemos", "On", NULL, CV_SAVE, CV_OnOff, NULL);
 
 static CV_PossibleValue_t timetic_cons_t[] = {{0, "Classic"}, {1, "Centiseconds"}, {2, "Mania"}, {3, "Tics"}, {0, NULL}};
-consvar_t cv_timetic = CVAR_INIT ("timerres", "Mania", NULL, CV_SAVE, timetic_cons_t, NULL);
+consvar_t cv_timetic = CVAR_INIT ("timerres", "Mania", "Style of the score, time, and rings display", CV_SAVE, timetic_cons_t, NULL);
 
 static CV_PossibleValue_t powerupdisplay_cons_t[] = {{0, "Never"}, {1, "First-person only"}, {2, "Always"}, {0, NULL}};
-consvar_t cv_powerupdisplay = CVAR_INIT ("powerupdisplay", "First-person only", NULL, CV_SAVE, powerupdisplay_cons_t, NULL);
+consvar_t cv_powerupdisplay = CVAR_INIT ("powerupdisplay", "First-person only", "When to display remaining duration of power-up items", CV_SAVE, powerupdisplay_cons_t, NULL);
 
 static CV_PossibleValue_t pointlimit_cons_t[] = {{1, "MIN"}, {MAXSCORE, "MAX"}, {0, "None"}, {0, NULL}};
 consvar_t cv_pointlimit = CVAR_INIT ("pointlimit", "None", NULL, CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, pointlimit_cons_t, PointLimit_OnChange);
diff --git a/src/r_main.c b/src/r_main.c
index ebffd3c1dd..52fc16e643 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -159,9 +159,9 @@ consvar_t cv_showhud = CVAR_INIT ("showhud", "Yes", "If the HUD should be shown
 consvar_t cv_translucenthud = CVAR_INIT ("translucenthud", "10", "Opacity of the game's HUD elements", CV_SAVE, translucenthud_cons_t, NULL);
 
 consvar_t cv_translucency = CVAR_INIT ("translucency", "On", "If off, all objects will be fully opaque", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_drawdist = CVAR_INIT ("drawdist", "Infinite", NULL, CV_SAVE, drawdist_cons_t, NULL);
-consvar_t cv_drawdist_nights = CVAR_INIT ("drawdist_nights", "2048", NULL, CV_SAVE, drawdist_cons_t, NULL);
-consvar_t cv_drawdist_precip = CVAR_INIT ("drawdist_precip", "1024", NULL, CV_SAVE, drawdist_precip_cons_t, NULL);
+consvar_t cv_drawdist = CVAR_INIT ("drawdist", "Infinite", "Draw distance for map objects", CV_SAVE, drawdist_cons_t, NULL);
+consvar_t cv_drawdist_nights = CVAR_INIT ("drawdist_nights", "2048", "Draw distance for hoops in NiGHTS modec", CV_SAVE, drawdist_cons_t, NULL);
+consvar_t cv_drawdist_precip = CVAR_INIT ("drawdist_precip", "1024", "Draw distance for rain and snow", CV_SAVE, drawdist_precip_cons_t, NULL);
 consvar_t cv_fov = CVAR_INIT ("fov", "90", "Sets the view range, higher effectively means larger camera lens", CV_SAVE|CV_CALL, fov_cons_t, Fov_OnChange);
 consvar_t cv_fovadjust = CVAR_INIT ("fovadjust", "On", NULL, CV_SAVE|CV_CALL, CV_OnOff, Fov_OnChange);
 consvar_t cv_fovchange = CVAR_INIT ("fovchange", "Off", NULL, CV_SAVE, CV_OnOff, NULL);
@@ -174,7 +174,7 @@ consvar_t cv_renderthings = CVAR_INIT ("r_renderthings", "On", NULL, 0, CV_OnOff
 consvar_t cv_ffloorclip = CVAR_INIT ("r_ffloorclip", "On", NULL, 0, CV_OnOff, NULL);
 consvar_t cv_spriteclip = CVAR_INIT ("r_spriteclip", "On", NULL, 0, CV_OnOff, NULL);
 
-consvar_t cv_homremoval = CVAR_INIT ("homremoval", "No", NULL, CV_SAVE, homremoval_cons_t, NULL);
+consvar_t cv_homremoval = CVAR_INIT ("homremoval", "No", "Fixes the hall of mirrors bug in the Software renderer", CV_SAVE, homremoval_cons_t, NULL);
 
 consvar_t cv_renderstats = CVAR_INIT ("renderstats", "Off", NULL, 0, CV_OnOff, NULL);
 
diff --git a/src/screen.c b/src/screen.c
index b996c93a8a..f19c8171bc 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -91,7 +91,7 @@ consvar_t cv_scr_width = CVAR_INIT ("scr_width", "1280", NULL, CV_SAVE, CV_Unsig
 consvar_t cv_scr_height = CVAR_INIT ("scr_height", "800", NULL, CV_SAVE, CV_Unsigned, NULL);
 consvar_t cv_scr_width_w = CVAR_INIT ("scr_width_w", "640", NULL, CV_SAVE, CV_Unsigned, NULL);
 consvar_t cv_scr_height_w = CVAR_INIT ("scr_height_w", "400", NULL, CV_SAVE, CV_Unsigned, NULL);
-consvar_t cv_scr_depth = CVAR_INIT ("scr_depth", "16 bits", NULL, CV_SAVE, scr_depth_cons_t, NULL);
+consvar_t cv_scr_depth = CVAR_INIT ("scr_depth", "16 bits", "Bit depth of textures", CV_SAVE, scr_depth_cons_t, NULL);
 
 CV_PossibleValue_t cv_renderer_t[] = {
 	{1, "Software"},
diff --git a/src/v_video.c b/src/v_video.c
index 3e2a59a3a7..53791eb0df 100644
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -52,7 +52,7 @@ static CV_PossibleValue_t gamma_cons_t[] = {{-15, "MIN"}, {5, "MAX"}, {0, NULL}}
 consvar_t cv_globalgamma = CVAR_INIT ("gamma", "0", "Sets the game brightness", CV_SAVE|CV_CALL, gamma_cons_t, CV_palette_OnChange);
 
 static CV_PossibleValue_t saturation_cons_t[] = {{0, "MIN"}, {10, "MAX"}, {0, NULL}};
-consvar_t cv_globalsaturation = CVAR_INIT ("saturation", "10", NULL, CV_SAVE|CV_CALL, saturation_cons_t, CV_palette_OnChange);
+consvar_t cv_globalsaturation = CVAR_INIT ("saturation", "10", "Sets the game saturation, or how bright the colors are", CV_SAVE|CV_CALL, saturation_cons_t, CV_palette_OnChange);
 
 #define huecoloursteps 4
 
-- 
GitLab


From 16bf5b99285333aa485adf4de186cf07471312d2 Mon Sep 17 00:00:00 2001
From: Hanicef <gustaf@hanicef.me>
Date: Sat, 22 Mar 2025 18:09:02 +0100
Subject: [PATCH 6/6] Add remaining descriptions for player settings

---
 src/g_game.c | 18 +++++++++---------
 src/m_menu.c |  2 +-
 src/p_user.c | 28 ++++++++++++++--------------
 3 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/g_game.c b/src/g_game.c
index aada65f484..bbe6e7374c 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -315,14 +315,14 @@ consvar_t cv_instantretry = CVAR_INIT ("instantretry", "No", NULL, CV_SAVE, CV_Y
 
 consvar_t cv_crosshair = CVAR_INIT ("crosshair", "Cross", "What crosshair to use in first-person", CV_SAVE, crosshair_cons_t, NULL);
 consvar_t cv_crosshair2 = CVAR_INIT ("crosshair2", "Cross", "What crosshair to use in first-person for player 2", CV_SAVE, crosshair_cons_t, NULL);
-consvar_t cv_invertmouse = CVAR_INIT ("invertmouse", "Off", "If mouse input should be inverted", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_invertmouse2 = CVAR_INIT ("invertmouse2", "Off", "If mouse input should be inverted for player 2", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_alwaysfreelook = CVAR_INIT ("alwaysmlook", "On", "Allow looking vertically with the mouse", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_alwaysfreelook2 = CVAR_INIT ("alwaysmlook2", "On", "Allow looking vertically with the mouse for player 2", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_chasefreelook = CVAR_INIT ("chasemlook", "Off", NULL, CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_chasefreelook2 = CVAR_INIT ("chasemlook2", "Off", NULL, CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_invertmouse = CVAR_INIT ("invertmouse", "Off", "If vertical mouse input should be inverted", CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_invertmouse2 = CVAR_INIT ("invertmouse2", "Off", "If vertical mouse input should be inverted", CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_alwaysfreelook = CVAR_INIT ("alwaysmlook", "On", "Allow looking up and down in first-person", CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_alwaysfreelook2 = CVAR_INIT ("alwaysmlook2", "On", "Allow looking up and down in first-person", CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_chasefreelook = CVAR_INIT ("chasemlook", "Off", "Allow looking up and down in third-person", CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_chasefreelook2 = CVAR_INIT ("chasemlook2", "Off", "Allow looking up and down in third-person", CV_SAVE, CV_OnOff, NULL);
 consvar_t cv_mousemove = CVAR_INIT ("mousemove", "Off", "If enabled, vertical mouse movement will move the character", CV_SAVE, CV_OnOff, NULL);
-consvar_t cv_mousemove2 = CVAR_INIT ("mousemove2", "Off", "If enabled, vertical mouse movement will move the character for player 2", CV_SAVE, CV_OnOff, NULL);
+consvar_t cv_mousemove2 = CVAR_INIT ("mousemove2", "Off", "If enabled, vertical mouse movement will move the character", CV_SAVE, CV_OnOff, NULL);
 
 // previously "analog", "analog2", "useranalog", and "useranalog2", invalidating 2.1-era copies of config.cfg
 // changed because it'd be nice to see people try out our actually good controls with gamepads now autobrake exists
@@ -400,7 +400,7 @@ consvar_t cv_jumpaxis = CVAR_INIT ("joyaxis_jump", "None", NULL, CV_SAVE, joyaxi
 consvar_t cv_spinaxis = CVAR_INIT ("joyaxis_spin", "None", NULL, CV_SAVE, joyaxis_cons_t, NULL);
 consvar_t cv_fireaxis = CVAR_INIT ("joyaxis_fire", "Z-Rudder", NULL, CV_SAVE, joyaxis_cons_t, NULL);
 consvar_t cv_firenaxis = CVAR_INIT ("joyaxis_firenormal", "Z-Axis", NULL, CV_SAVE, joyaxis_cons_t, NULL);
-consvar_t cv_deadzone = CVAR_INIT ("joy_deadzone", "0.125", NULL, CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
+consvar_t cv_deadzone = CVAR_INIT ("joy_deadzone", "0.125", "How far a joystick have to be pushed before it registers any input", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
 consvar_t cv_digitaldeadzone = CVAR_INIT ("joy_digdeadzone", "0.25", NULL, CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
 
 consvar_t cv_moveaxis2 = CVAR_INIT ("joyaxis2_move", "Y-Axis", NULL, CV_SAVE, joyaxis_cons_t, NULL);
@@ -411,7 +411,7 @@ consvar_t cv_jumpaxis2 = CVAR_INIT ("joyaxis2_jump", "None", NULL, CV_SAVE, joya
 consvar_t cv_spinaxis2 = CVAR_INIT ("joyaxis2_spin", "None", NULL, CV_SAVE, joyaxis_cons_t, NULL);
 consvar_t cv_fireaxis2 = CVAR_INIT ("joyaxis2_fire", "Z-Rudder", NULL, CV_SAVE, joyaxis_cons_t, NULL);
 consvar_t cv_firenaxis2 = CVAR_INIT ("joyaxis2_firenormal", "Z-Axis", NULL, CV_SAVE, joyaxis_cons_t, NULL);
-consvar_t cv_deadzone2 = CVAR_INIT ("joy_deadzone2", "0.125", NULL, CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
+consvar_t cv_deadzone2 = CVAR_INIT ("joy_deadzone2", "0.125", "How far a joystick have to be pushed before it registers any input", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
 consvar_t cv_digitaldeadzone2 = CVAR_INIT ("joy_digdeadzone2", "0.25", NULL, CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
 
 player_t *seenplayer; // player we're aiming at right now
diff --git a/src/m_menu.c b/src/m_menu.c
index 9b99457bc7..60a5205298 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1497,7 +1497,7 @@ static menuitem_t OP_DataOptionsMenu[] =
 	{IT_STRING | IT_CALL,    NULL, "Add-on Options...",     NULL, M_AddonsOptions,     10},
 	{IT_STRING | IT_CALL,    NULL, "Screenshot Options...", NULL, M_ScreenshotOptions, 20},
 
-	{IT_STRING | IT_SUBMENU, NULL, "\x85" "Erase Data...",  "Erase game data", &OP_EraseDataDef,    40},
+	{IT_STRING | IT_SUBMENU, NULL, "\x85" "Erase Data...",  NULL, &OP_EraseDataDef,    40},
 };
 
 static menuitem_t OP_ScreenshotOptionsMenu[] =
diff --git a/src/p_user.c b/src/p_user.c
index b48134c9c8..893b3ac11d 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -9833,12 +9833,12 @@ static CV_PossibleValue_t campos_cons_t[] = { {INT32_MIN, "MIN"}, {INT32_MAX, "M
 consvar_t cv_cam_dist = CVAR_INIT ("cam_curdist", "160", NULL, CV_FLOAT|CV_ALLOWLUA, campos_cons_t, NULL);
 consvar_t cv_cam_height = CVAR_INIT ("cam_curheight", "25", NULL, CV_FLOAT|CV_ALLOWLUA, campos_cons_t, NULL);
 consvar_t cv_cam_still = CVAR_INIT ("cam_still", "Off", NULL, CV_ALLOWLUA, CV_OnOff, NULL);
-consvar_t cv_cam_speed = CVAR_INIT ("cam_speed", "0.4", NULL, CV_FLOAT|CV_SAVE|CV_ALLOWLUA, CV_CamSpeed, NULL);
+consvar_t cv_cam_speed = CVAR_INIT ("cam_speed", "0.4", "Camera movement relative to the player character; higher value makes the camera more \"stiff\"", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, CV_CamSpeed, NULL);
 consvar_t cv_cam_rotate = CVAR_INIT ("cam_rotate", "0", NULL, CV_CALL|CV_NOINIT|CV_ALLOWLUA, CV_CamRotate, CV_CamRotate_OnChange);
 consvar_t cv_cam_rotspeed = CVAR_INIT ("cam_rotspeed", "10", NULL, CV_SAVE|CV_ALLOWLUA, rotation_cons_t, NULL);
-consvar_t cv_cam_turnmultiplier = CVAR_INIT ("cam_turnmultiplier", "0.75", NULL, CV_FLOAT|CV_SAVE|CV_ALLOWLUA, multiplier_cons_t, NULL);
-consvar_t cv_cam_orbit = CVAR_INIT ("cam_orbit", "Off", NULL, CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
-consvar_t cv_cam_adjust = CVAR_INIT ("cam_adjust", "On", NULL, CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
+consvar_t cv_cam_turnmultiplier = CVAR_INIT ("cam_turnmultiplier", "0.75", "Camera rotation speed when using keyboard controls (has no effect on mouse or controller)", CV_FLOAT|CV_SAVE|CV_ALLOWLUA, multiplier_cons_t, NULL);
+consvar_t cv_cam_orbit = CVAR_INIT ("cam_orbit", "Off", "If enabled, vertical camera movement will rotate around the player character rather than staying in place", CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
+consvar_t cv_cam_adjust = CVAR_INIT ("cam_adjust", "On", "Adjust camera angle relative to the slope the player is on", CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
 consvar_t cv_cam2_dist = CVAR_INIT ("cam2_curdist", "160", NULL, CV_FLOAT|CV_ALLOWLUA, campos_cons_t, NULL);
 consvar_t cv_cam2_height = CVAR_INIT ("cam2_curheight", "25", NULL, CV_FLOAT|CV_ALLOWLUA, campos_cons_t, NULL);
 consvar_t cv_cam2_still = CVAR_INIT ("cam2_still", "Off", NULL, CV_ALLOWLUA, CV_OnOff, NULL);
@@ -9846,29 +9846,29 @@ consvar_t cv_cam2_speed = CVAR_INIT ("cam2_speed", "0.4", NULL, CV_FLOAT|CV_SAVE
 consvar_t cv_cam2_rotate = CVAR_INIT ("cam2_rotate", "0", NULL, CV_CALL|CV_NOINIT|CV_ALLOWLUA, CV_CamRotate, CV_CamRotate2_OnChange);
 consvar_t cv_cam2_rotspeed = CVAR_INIT ("cam2_rotspeed", "10", NULL, CV_SAVE|CV_ALLOWLUA, rotation_cons_t, NULL);
 consvar_t cv_cam2_turnmultiplier = CVAR_INIT ("cam2_turnmultiplier", "0.75", NULL, CV_FLOAT|CV_SAVE|CV_ALLOWLUA, multiplier_cons_t, NULL);
-consvar_t cv_cam2_orbit = CVAR_INIT ("cam2_orbit", "Off", NULL, CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
-consvar_t cv_cam2_adjust = CVAR_INIT ("cam2_adjust", "On", NULL, CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
+consvar_t cv_cam2_orbit = CVAR_INIT ("cam2_orbit", "Off", "If enabled, vertical camera movement will rotate around the player character rather than staying in place", CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
+consvar_t cv_cam2_adjust = CVAR_INIT ("cam2_adjust", "On", "Adjust camera angle relative to the slope the player is on", CV_SAVE|CV_ALLOWLUA, CV_OnOff, NULL);
 
 // [standard vs simple][p1 or p2]
 consvar_t cv_cam_savedist[2][2] = {
 	{ // standard
-		CVAR_INIT ("cam_dist", "192", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
-		CVAR_INIT ("cam2_dist", "192", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
+		CVAR_INIT ("cam_dist", "192", "Automatic camera distance from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
+		CVAR_INIT ("cam2_dist", "192", "Automatic camera distance from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
 	},
 	{ // simple
-		CVAR_INIT ("cam_simpledist", "256", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
-		CVAR_INIT ("cam2_simpledist", "256", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
+		CVAR_INIT ("cam_simpledist", "256", "Manual camera distance from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
+		CVAR_INIT ("cam2_simpledist", "256", "Manual camera distance from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
 
 	}
 };
 consvar_t cv_cam_saveheight[2][2] = {
 	{ // standard
-		CVAR_INIT ("cam_height", "40", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
-		CVAR_INIT ("cam2_height", "40", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
+		CVAR_INIT ("cam_height", "40", "Automatic camera elevation from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
+		CVAR_INIT ("cam2_height", "40", "Automatic camera elevation from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
 	},
 	{ // simple
-		CVAR_INIT ("cam_simpleheight", "60", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
-		CVAR_INIT ("cam2_simpleheight", "60", NULL, CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
+		CVAR_INIT ("cam_simpleheight", "60", "Manual camera elevation from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCamDist),
+		CVAR_INIT ("cam2_simpleheight", "60", "Manual camera elevation from the player", CV_FLOAT|CV_SAVE|CV_CALL|CV_ALLOWLUA, campos_cons_t, CV_UpdateCam2Dist),
 
 	}
 };
-- 
GitLab