From 9de31cf2e7ac38d5245419c7618a39c8cff0bc7e Mon Sep 17 00:00:00 2001
From: mazmazz <mar.marcoz@outlook.com>
Date: Mon, 3 Dec 2018 06:59:31 -0500
Subject: [PATCH] Make pause key bring up the menu if it's a joy button

* Add "Pause" entry to multiplayer control panel to give joy users a way to pause in netgames
---
 src/m_menu.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/m_menu.c b/src/m_menu.c
index 838823278d..7a06053f27 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -223,6 +223,7 @@ static void M_SelectableClearMenus(INT32 choice);
 static void M_Retry(INT32 choice);
 static void M_EndGame(INT32 choice);
 static void M_MapChange(INT32 choice);
+static void M_Pause(INT32 choice);
 static void M_ChangeLevel(INT32 choice);
 static void M_ConfirmSpectate(INT32 choice);
 static void M_ConfirmEnterGame(INT32 choice);
@@ -478,6 +479,8 @@ typedef enum
 // ---------------------
 static menuitem_t MPauseMenu[] =
 {
+	{IT_STRING  | IT_CALL,    NULL, "Pause",             M_Pause,                0},
+
 	{IT_STRING  | IT_SUBMENU, NULL, "Scramble Teams...", &MISC_ScrambleTeamDef, 16},
 	{IT_STRING  | IT_CALL,    NULL, "Switch Map..."    , M_MapChange,           24},
 
@@ -497,7 +500,8 @@ static menuitem_t MPauseMenu[] =
 
 typedef enum
 {
-	mpause_scramble = 0,
+	mpause_pause = 0,
+	mpause_scramble,
 	mpause_switchmap,
 
 	mpause_continue,
@@ -2095,6 +2099,11 @@ boolean M_Responder(event_t *ev)
 		{
 			ch = ev->data1;
 
+			// Pause by joystick means you bring up the menu
+			if (ch >= KEY_JOY1 && ch < KEY_JOY1 + JOYBUTTONS + JOYHATS*4 &&
+				(ch == gamecontrol[gc_pause][0] || ch == gamecontrol[gc_pause][1]))
+				ch = KEY_ESCAPE;
+
 			// added 5-2-98 remap virtual keys (mouse & joystick buttons)
 			switch (ch)
 			{
@@ -2190,6 +2199,11 @@ boolean M_Responder(event_t *ev)
 	// F-Keys
 	if (!menuactive)
 	{
+		// Pause by joystick means you bring up the menu
+		if (ch >= KEY_JOY1 && ch < KEY_JOY1 + JOYBUTTONS + JOYHATS*4 &&
+			(ch == gamecontrol[gc_pause][0] || ch == gamecontrol[gc_pause][1]))
+			ch = KEY_ESCAPE;
+
 		noFurtherInput = true;
 		switch (ch)
 		{
@@ -2577,6 +2591,7 @@ void M_StartControlPanel(void)
 	}
 	else // multiplayer
 	{
+		MPauseMenu[mpause_pause].status = IT_DISABLED;
 		MPauseMenu[mpause_switchmap].status = IT_DISABLED;
 		MPauseMenu[mpause_scramble].status = IT_DISABLED;
 		MPauseMenu[mpause_psetupsplit].status = IT_DISABLED;
@@ -2589,8 +2604,15 @@ void M_StartControlPanel(void)
 		if ((server || adminplayer == consoleplayer))
 		{
 			MPauseMenu[mpause_switchmap].status = IT_STRING | IT_CALL;
+			if (!splitscreen)
+				MPauseMenu[mpause_pause].status = IT_STRING | IT_CALL; // server admin only
 			if (G_GametypeHasTeams())
+			{
 				MPauseMenu[mpause_scramble].status = IT_STRING | IT_SUBMENU;
+				MPauseMenu[mpause_pause].alphaKey = MPauseMenu[mpause_scramble].alphaKey - 16; // adjust y
+			}
+			else
+				MPauseMenu[mpause_pause].alphaKey = MPauseMenu[mpause_switchmap].alphaKey - 16; // adjust y
 		}
 
 		if (splitscreen)
@@ -6250,6 +6272,13 @@ static void M_MapChange(INT32 choice)
 	M_SetupNextMenu(&MISC_ChangeLevelDef);
 }
 
+static void M_Pause(INT32 choice)
+{
+	(void)choice;
+
+	COM_ImmedExecute("pause");
+}
+
 static void M_StartSplitServerMenu(INT32 choice)
 {
 	(void)choice;
-- 
GitLab