From c55849006d0960ce9907620f91ddab0de528ee03 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 29 Jan 2023 00:29:46 +0000 Subject: [PATCH] Repair playback mini-menu - Fix starting the playback mini-menu - Fix playback mini-menu input not being natively horizontal - Fix playback mini-menu having been written before r_splitscreen refactor - Move heinous modifying-menu-data-in-the-drawer behaviour to an actual dedicated ticker --- src/k_menudraw.c | 60 ++----------------------- src/k_menufunc.c | 22 ++++++---- src/menus/transient/pause-replay.c | 70 +++++++++++++++++++++++++++--- 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 7d95c9886..d56804ee7 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -3794,8 +3794,6 @@ void M_DrawPause(void) } } -tic_t playback_last_menu_interaction_leveltime = 0; - void M_DrawPlaybackMenu(void) { INT16 i; @@ -3804,56 +3802,6 @@ void M_DrawPlaybackMenu(void) UINT32 transmap = max(0, (INT32)(leveltime - playback_last_menu_interaction_leveltime - 4*TICRATE)) / 5; transmap = min(8, transmap) << V_ALPHASHIFT; - if (leveltime - playback_last_menu_interaction_leveltime >= 6*TICRATE) - playback_last_menu_interaction_leveltime = leveltime - 6*TICRATE; - - // Toggle items - if (paused && !demo.rewinding) - { - PAUSE_PlaybackMenu[playback_pause].status = PAUSE_PlaybackMenu[playback_fastforward].status = PAUSE_PlaybackMenu[playback_rewind].status = IT_DISABLED; - PAUSE_PlaybackMenu[playback_resume].status = PAUSE_PlaybackMenu[playback_advanceframe].status = PAUSE_PlaybackMenu[playback_backframe].status = IT_CALL|IT_STRING; - - if (itemOn >= playback_rewind && itemOn <= playback_fastforward) - itemOn += playback_backframe - playback_rewind; - } - else - { - PAUSE_PlaybackMenu[playback_pause].status = PAUSE_PlaybackMenu[playback_fastforward].status = PAUSE_PlaybackMenu[playback_rewind].status = IT_CALL|IT_STRING; - PAUSE_PlaybackMenu[playback_resume].status = PAUSE_PlaybackMenu[playback_advanceframe].status = PAUSE_PlaybackMenu[playback_backframe].status = IT_DISABLED; - - if (itemOn >= playback_backframe && itemOn <= playback_advanceframe) - itemOn -= playback_backframe - playback_rewind; - } - - if (modeattacking) - { - for (i = playback_viewcount; i <= playback_view4; i++) - PAUSE_PlaybackMenu[i].status = IT_DISABLED; - - //PAUSE_PlaybackMenu[playback_moreoptions].mvar1 = 72; - //PAUSE_PlaybackMenu[playback_quit].mvar1 = 88; - PAUSE_PlaybackMenu[playback_quit].mvar1 = 72; - - //currentMenu->x = BASEVIDWIDTH/2 - 52; - currentMenu->x = BASEVIDWIDTH/2 - 44; - } - else - { - PAUSE_PlaybackMenu[playback_viewcount].status = IT_ARROWS|IT_STRING; - - for (i = 0; i <= splitscreen; i++) - PAUSE_PlaybackMenu[playback_view1+i].status = IT_ARROWS|IT_STRING; - for (i = splitscreen+1; i < 4; i++) - PAUSE_PlaybackMenu[playback_view1+i].status = IT_DISABLED; - - //PAUSE_PlaybackMenu[playback_moreoptions].mvar1 = 156; - //PAUSE_PlaybackMenu[playback_quit].mvar1 = 172; - PAUSE_PlaybackMenu[playback_quit].mvar1 = 156; - - //currentMenu->x = BASEVIDWIDTH/2 - 94; - currentMenu->x = BASEVIDWIDTH/2 - 88; - } - // wip //M_DrawTextBox(currentMenu->x-68, currentMenu->y-7, 15, 15); //M_DrawCenteredMenu(); @@ -3866,7 +3814,7 @@ void M_DrawPlaybackMenu(void) { if (modeattacking) continue; - if (splitscreen >= i - playback_view1) + if (r_splitscreen >= i - playback_view1) { INT32 ply = displayplayers[i - playback_view1]; @@ -3898,18 +3846,18 @@ void M_DrawPlaybackMenu(void) { char *str; - if (!(i == playback_viewcount && splitscreen == 3)) + if (!(i == playback_viewcount && r_splitscreen == 3)) V_DrawCharacter(BASEVIDWIDTH/2 - 4, currentMenu->y + 28 - (skullAnimCounter/5), '\x1A' | V_SNAPTOTOP|highlightflags, false); // up arrow - if (!(i == playback_viewcount && splitscreen == 0)) + if (!(i == playback_viewcount && r_splitscreen == 0)) V_DrawCharacter(BASEVIDWIDTH/2 - 4, currentMenu->y + 48 + (skullAnimCounter/5), '\x1B' | V_SNAPTOTOP|highlightflags, false); // down arrow switch (i) { case playback_viewcount: - str = va("%d", splitscreen+1); + str = va("%d", r_splitscreen+1); break; case playback_view1: diff --git a/src/k_menufunc.c b/src/k_menufunc.c index cc2d7a9e3..7757a4879 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -400,7 +400,11 @@ void M_StartControlPanel(void) menuactive = true; - if (!Playing()) + if (demo.playback) + { + currentMenu = &PAUSE_PlaybackMenuDef; + } + 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 @@ -432,14 +436,7 @@ void M_StartControlPanel(void) } else { - if (demo.playback) - { - currentMenu = &PAUSE_PlaybackMenuDef; - } - else - { - M_OpenPauseMenu(); - } + M_OpenPauseMenu(); } itemOn = currentMenu->lastOn; @@ -772,6 +769,13 @@ static void M_HandleMenuInput(void) lr = menucmd[pid].dpad_lr; ud = menucmd[pid].dpad_ud; + // If we ever add a second horizontal menu, make it a menu_t property, not an extra check. + if (currentMenu == &PAUSE_PlaybackMenuDef) + { + ud = menucmd[pid].dpad_lr; + lr = -menucmd[pid].dpad_ud; + } + // LR does nothing in the default menu, just remap as dpad. if (menucmd[pid].buttons & MBT_L) { lr--; } if (menucmd[pid].buttons & MBT_R) { lr++; } diff --git a/src/menus/transient/pause-replay.c b/src/menus/transient/pause-replay.c index 80a648879..299e15b8a 100644 --- a/src/menus/transient/pause-replay.c +++ b/src/menus/transient/pause-replay.c @@ -9,6 +9,8 @@ #include "../../p_local.h" // P_InitCameraCmd #include "../../d_main.h" // D_StartTitle +static void M_PlaybackTick(void); + menuitem_t PAUSE_PlaybackMenu[] = { {IT_CALL | IT_STRING, "Hide Menu (Esc)", NULL, "M_PHIDE", {.routine = M_SelectableClearMenus}, 0, 0}, @@ -39,7 +41,7 @@ menu_t PAUSE_PlaybackMenuDef = { 0, 0, 0, 0, M_DrawPlaybackMenu, - NULL, + M_PlaybackTick, NULL, NULL, NULL @@ -66,6 +68,64 @@ void M_EndModeAttackRun(void) } // Replay Playback Menu + +tic_t playback_last_menu_interaction_leveltime = 0; + +static void M_PlaybackTick(void) +{ + INT16 i; + + if (leveltime - playback_last_menu_interaction_leveltime >= 6*TICRATE) + playback_last_menu_interaction_leveltime = leveltime - 6*TICRATE; + + // Toggle items + if (paused && !demo.rewinding) + { + PAUSE_PlaybackMenu[playback_pause].status = PAUSE_PlaybackMenu[playback_fastforward].status = PAUSE_PlaybackMenu[playback_rewind].status = IT_DISABLED; + PAUSE_PlaybackMenu[playback_resume].status = PAUSE_PlaybackMenu[playback_advanceframe].status = PAUSE_PlaybackMenu[playback_backframe].status = IT_CALL|IT_STRING; + + if (itemOn >= playback_rewind && itemOn <= playback_fastforward) + itemOn += playback_backframe - playback_rewind; + } + else + { + PAUSE_PlaybackMenu[playback_pause].status = PAUSE_PlaybackMenu[playback_fastforward].status = PAUSE_PlaybackMenu[playback_rewind].status = IT_CALL|IT_STRING; + PAUSE_PlaybackMenu[playback_resume].status = PAUSE_PlaybackMenu[playback_advanceframe].status = PAUSE_PlaybackMenu[playback_backframe].status = IT_DISABLED; + + if (itemOn >= playback_backframe && itemOn <= playback_advanceframe) + itemOn -= playback_backframe - playback_rewind; + } + + if (modeattacking) + { + for (i = playback_viewcount; i <= playback_view4; i++) + PAUSE_PlaybackMenu[i].status = IT_DISABLED; + + //PAUSE_PlaybackMenu[playback_moreoptions].mvar1 = 72; + //PAUSE_PlaybackMenu[playback_quit].mvar1 = 88; + PAUSE_PlaybackMenu[playback_quit].mvar1 = 72; + + //currentMenu->x = BASEVIDWIDTH/2 - 52; + currentMenu->x = BASEVIDWIDTH/2 - 44; + } + else + { + PAUSE_PlaybackMenu[playback_viewcount].status = IT_ARROWS|IT_STRING; + + for (i = 0; i <= r_splitscreen; i++) + PAUSE_PlaybackMenu[playback_view1+i].status = IT_ARROWS|IT_STRING; + for (i = r_splitscreen+1; i < 4; i++) + PAUSE_PlaybackMenu[playback_view1+i].status = IT_DISABLED; + + //PAUSE_PlaybackMenu[playback_moreoptions].mvar1 = 156; + //PAUSE_PlaybackMenu[playback_quit].mvar1 = 172; + PAUSE_PlaybackMenu[playback_quit].mvar1 = 156; + + //currentMenu->x = BASEVIDWIDTH/2 - 94; + currentMenu->x = BASEVIDWIDTH/2 - 88; + } +} + void M_SetPlaybackMenuPointer(void) { itemOn = playback_pause; @@ -143,12 +203,12 @@ void M_PlaybackSetViews(INT32 choice) { if (choice > 0) { - if (splitscreen < 3) - G_AdjustView(splitscreen + 2, 0, true); + if (r_splitscreen < 3) + G_AdjustView(r_splitscreen + 2, 0, true); } - else if (splitscreen) + else if (r_splitscreen) { - splitscreen--; + r_splitscreen--; R_ExecuteSetViewSize(); } }