From d450faeaaf816a7130296ef3af11546ba9ec465e Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 18 Jun 2023 14:01:58 +0100 Subject: [PATCH] General Menu Message input cleanup - M_StopMessage is now in charge of setting the answer to a given prompt. - Menu Messages can now be dismissed on the title screen, instead of carried into the top-level menu transition. --- src/d_clisrv.c | 5 ++++- src/f_finale.c | 6 ++++-- src/k_menufunc.c | 17 +++++++++++++++-- src/menus/transient/message-box.c | 21 +++++++++++---------- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 67718cc4b..ddf33f091 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1676,6 +1676,8 @@ static boolean M_ConfirmConnect(void) if (G_PlayerInputDown(0, gc_b, 1) || G_PlayerInputDown(0, gc_x, 1) || G_GetDeviceGameKeyDownArray(0)[KEY_ESCAPE]) { cl_requestmode = CL_ABORTED; + + M_StopMessage(MA_NO); return true; } @@ -1704,6 +1706,7 @@ static boolean M_ConfirmConnect(void) else cl_requestmode = CL_LOADFILES; + M_StopMessage(MA_YES); return true; } @@ -2174,7 +2177,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic I_lock_mutex(&k_menu_mutex); #endif if (M_MenuMessageTick() && M_ConfirmConnect()) - M_StopMessage(0); + ; else if (menumessage.active == false) cl_mode = cl_requestmode; #ifdef HAVE_THREADS diff --git a/src/f_finale.c b/src/f_finale.c index 14011b1c9..a6f4fb900 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2131,8 +2131,10 @@ void F_TitleScreenTicker(boolean run) // Now start the music S_ChangeMusicInternal("_title", looptitle); } - else if (menumessage.fadetimer < 9) - menumessage.fadetimer++; + else if (menumessage.active) + { + M_MenuMessageTick(); + } finalecount++; } diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 2e7800be0..4f3ce4f3d 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -539,6 +539,21 @@ void M_StartControlPanel(void) // (We can change this timer later when extra animation is added.) if (finalecount < 1) return; + + if (menumessage.active) + { + if (!menumessage.closing && menumessage.fadetimer == 9) + { + // The following doesn't work with MM_YESNO. + // However, because there's no guarantee a profile + // is selected or controls set up to our liking, + // we can't call M_HandleMenuMessage. + + M_StopMessage(MA_NONE); + } + + return; + } } menuactive = true; @@ -549,8 +564,6 @@ void M_StartControlPanel(void) } else if (!Playing()) { - M_StopMessage(0); // Doesn't work with MM_YESNO or MM_EVENTHANDLER... but good enough to get the game as it is currently functional again - if (gamestate != GS_MENU) { G_SetGamestate(GS_MENU); diff --git a/src/menus/transient/message-box.c b/src/menus/transient/message-box.c index 5f88dd832..bcb90293d 100644 --- a/src/menus/transient/message-box.c +++ b/src/menus/transient/message-box.c @@ -136,11 +136,14 @@ void M_StartMessage(const char *header, const char *string, void (*routine)(INT3 void M_StopMessage(INT32 choice) { + if (!menumessage.active || menumessage.closing) + return; + const char pid = 0; - (void) choice; menumessage.closing = true; menumessage.timer = 0; + menumessage.answer = choice; M_SetMenuDelay(pid); } @@ -192,20 +195,18 @@ void M_HandleMenuMessage(void) case MM_YESNO: { if (btok) - menumessage.answer = MA_YES; + M_StopMessage(MA_YES); else if (btnok) - menumessage.answer = MA_NO; + M_StopMessage(MA_NO); break; } default: - break; - } + { + if (btok || btnok) + M_StopMessage(MA_NONE); - // if we detect any keypress, don't forget to set the menu delay regardless. - if (btok || btnok) - { - M_StopMessage(0); - M_SetMenuDelay(pid); + break; + } } }