From 3d1e5fa7e8269fd3043e8e20b31e45594a78b05b Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 18 Nov 2018 03:32:19 -0500 Subject: [PATCH] Allow inherited wipes when switching menus without a common ancestor (Multiplayer > Server Settings) --- src/m_menu.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index c516fe69b..3b7c9dbee 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2566,6 +2566,44 @@ static void M_HandleMenuMetaState(menu_t *newMenu) } } + // if no common ancestor (top menu), force a wipe. Look for a specified wipe first. + if (anceslevel < 0 && exitwipe < 0) + { + for (i = NUMMENULEVELS; i >= 0; i--) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + prevtype = (prevMenuId & bitmask) >> (MENUBITS*i); + + if (menumeta[prevtype].exitwipe >= 0) + { + exitwipe = menumeta[prevtype].exitwipe; + break; + } + } + + if (exitwipe < 0) + exitwipe = menumeta[MN_MAIN].exitwipe; + } + + // do the same for enter wipe + if (anceslevel < 0 && enterwipe < 0) + { + for (i = NUMMENULEVELS; i >= 0; i--) + { + bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i); + activetype = (activeMenuId & bitmask) >> (MENUBITS*i); + + if (menumeta[activetype].enterwipe >= 0) + { + exitwipe = menumeta[activetype].enterwipe; + break; + } + } + + if (enterwipe < 0) + enterwipe = menumeta[MN_MAIN].enterwipe; + } + // Change the music M_ChangeMusic("_title", false); @@ -2611,16 +2649,17 @@ static void M_HandleMenuMetaState(menu_t *newMenu) // Set the wipes for next frame if ( (exitwipe >= 0 && enterlevel <= exitlevel) || - (enterwipe >= 0 && enterlevel >= exitlevel) + (enterwipe >= 0 && enterlevel >= exitlevel) || + anceslevel < 0 ) { if (gamestate == GS_TIMEATTACK) - wipetypepre = (exitwipe && enterlevel <= exitlevel) ? exitwipe : -1; // force default + wipetypepre = ((exitwipe && enterlevel <= exitlevel) || anceslevel < 0) ? exitwipe : -1; // force default else // HACK: INT16_MAX signals to not wipe // because 0 is a valid index and -1 means default - wipetypepre = (exitwipe && enterlevel <= exitlevel) ? exitwipe : INT16_MAX; - wipetypepost = (enterwipe && enterlevel >= exitlevel) ? enterwipe : INT16_MAX; + wipetypepre = ((exitwipe && enterlevel <= exitlevel) || anceslevel < 0) ? exitwipe : INT16_MAX; + wipetypepost = ((enterwipe && enterlevel >= exitlevel) || anceslevel < 0) ? enterwipe : INT16_MAX; wipegamestate = FORCEWIPE; // D_Display runs the next step of processing }