From b86d499e0bcb252474fd564472217bc25229f841 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Fri, 29 May 2020 10:32:53 +1000 Subject: [PATCH] RR: Amend how game pauses. - M_Active or GUICapture properly pause game using game's pause mechanisms. - Pausing game with Pause key now works again. - Pausing game with Pause key now properly stops all sounds as per upstream. --- source/rr/src/d_menu.cpp | 4 +-- source/rr/src/demo.cpp | 4 +-- source/rr/src/game.cpp | 39 +++++++++----------- source/rr/src/game.h | 2 +- source/rr/src/player.cpp | 74 +++++++++++++++++++------------------- source/rr/src/premap.cpp | 4 +-- source/rr/src/savegame.cpp | 4 +-- source/rr/src/screens.cpp | 8 ++--- source/rr/src/sector.cpp | 24 +------------ source/rr/src/sounds.cpp | 11 ------ source/rr/src/sounds.h | 2 -- 11 files changed, 68 insertions(+), 108 deletions(-) diff --git a/source/rr/src/d_menu.cpp b/source/rr/src/d_menu.cpp index 50bb444de..27c02b8ed 100644 --- a/source/rr/src/d_menu.cpp +++ b/source/rr/src/d_menu.cpp @@ -580,7 +580,7 @@ void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, doub void GameInterface::MenuOpened() { - S_PauseSounds(true); + S_PauseSound(true, false); if ((!g_netServer && ud.multimode < 2)) { ready2send = 0; @@ -646,7 +646,7 @@ void GameInterface::MenuClosed() } G_UpdateScreenArea(); - S_PauseSounds(false); + S_ResumeSound(false); } } diff --git a/source/rr/src/demo.cpp b/source/rr/src/demo.cpp index 8f52b4bef..d5adcd585 100644 --- a/source/rr/src/demo.cpp +++ b/source/rr/src/demo.cpp @@ -120,7 +120,7 @@ static int32_t G_OpenDemoRead(int32_t g_whichDemo) // 0 = mine gFullMap = false; ud.god = ud.cashman = ud.eog = 0; - ud.noclip = ud.scrollmode = ud.overhead_on = 0; //= ud.pause_on = 0; + ud.noclip = ud.scrollmode = ud.overhead_on = 0; //= paused = 0; totalclock = ototalclock = lockclock = 0; @@ -591,7 +591,7 @@ RECHECK: Demo_FinishProfile(); while (totalclock >= (lockclock+TICSPERFRAME) - // || (ud.reccnt > REALGAMETICSPERSEC*2 && ud.pause_on) + // || (ud.reccnt > REALGAMETICSPERSEC*2 && paused) || (g_demo_goalCnt>0 && g_demo_cnton_crane > -1) + if (paused || pPlayer->on_crane > -1) smoothRatio = 65536; else smoothRatio = calc_smoothratio(totalclock, ototalclock); @@ -924,7 +924,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio) if (RRRA && pPlayer->drug_mode > 0) { - while (pPlayer->drug_timer < totalclock && !(pPlayer->gm & MODE_MENU) && !ud.pause_on && !GUICapture) + while (pPlayer->drug_timer < totalclock && !(pPlayer->gm & MODE_MENU) && !paused && !GUICapture) { int aspect; if (pPlayer->drug_stat[0] == 0) @@ -5027,7 +5027,7 @@ default_case1: spritesortcnt++; } - if (g_player[playerNum].input->extbits & (1 << 7) && !ud.pause_on && spritesortcnt < maxspritesonscreen) + if (g_player[playerNum].input->extbits & (1 << 7) && !paused && spritesortcnt < maxspritesonscreen) { tspritetype *const playerTyping = t; @@ -7296,7 +7296,9 @@ MAIN_LOOP_RESTART: char gameUpdate = false; double const gameUpdateStartTime = timerGetHiTicks(); - if (M_Active() || GUICapture || ud.pause_on != 0) + updatePauseStatus(); + + if (paused) { ototalclock = totalclock - TICSPERFRAME; buttonMap.ResetButtonStates(); @@ -7305,8 +7307,6 @@ MAIN_LOOP_RESTART: { while (((g_netClient || g_netServer) || !(g_player[myconnectindex].ps->gm & (MODE_MENU|MODE_DEMO))) && (int)(totalclock - ototalclock) >= TICSPERFRAME) { - ototalclock += TICSPERFRAME; - if (RRRA && g_player[myconnectindex].ps->on_motorcycle) P_GetInputMotorcycle(myconnectindex); else if (RRRA && g_player[myconnectindex].ps->on_boat) @@ -7330,7 +7330,9 @@ MAIN_LOOP_RESTART: g_player[myconnectindex].movefifoend++; - if (((g_player[myconnectindex].ps->gm&MODE_MENU) != MODE_MENU || ud.recstat == 2 || (g_netServer || ud.multimode > 1)) && + ototalclock += TICSPERFRAME; + + if (paused == 0 && ((g_player[myconnectindex].ps->gm&MODE_MENU) != MODE_MENU || ud.recstat == 2 || (g_netServer || ud.multimode > 1)) && (g_player[myconnectindex].ps->gm&MODE_GAME)) { G_MoveLoop(); @@ -7528,11 +7530,8 @@ int G_DoMoveThings(void) everyothertime++; if (g_earthquakeTime > 0) g_earthquakeTime--; - if (ud.pause_on == 0) - { - g_globalRandom = krand2(); - A_MoveDummyPlayers();//ST 13 - } + g_globalRandom = krand2(); + A_MoveDummyPlayers();//ST 13 for (bssize_t TRAVERSE_CONNECT(i)) { @@ -7552,18 +7551,14 @@ int G_DoMoveThings(void) sprite[g_player[i].ps->i].pal = g_player[i].pcolor; if (!DEER) - P_HandleSharedKeys(i); + P_HandleSharedKeys(i); - if (ud.pause_on == 0) - { - P_ProcessInput(i); - if (!DEER) + P_ProcessInput(i); + if (!DEER) P_CheckSectors(i); - } } - if (ud.pause_on == 0) - G_MoveWorld(); + G_MoveWorld(); Net_CorrectPrediction(); @@ -7578,8 +7573,8 @@ int G_DoMoveThings(void) } else { - G_AnimateWalls(); - A_MoveCyclers(); + G_AnimateWalls(); + A_MoveCyclers(); } //if (g_netServer && (everyothertime % 10) == 0) diff --git a/source/rr/src/game.h b/source/rr/src/game.h index 017fa63ed..82d90ab9e 100644 --- a/source/rr/src/game.h +++ b/source/rr/src/game.h @@ -314,7 +314,7 @@ static inline int32_t calc_smoothratio(ClockTicks totalclk, ClockTicks ototalclk if (!(((!g_netServer && ud.multimode < 2) && ((g_player[myconnectindex].ps->gm & MODE_MENU) == 0)) || (g_netServer || ud.multimode > 1) || ud.recstat == 2) || - ud.pause_on) + paused) { return 65536; } diff --git a/source/rr/src/player.cpp b/source/rr/src/player.cpp index 6194e7989..dd502f404 100644 --- a/source/rr/src/player.cpp +++ b/source/rr/src/player.cpp @@ -2093,7 +2093,7 @@ void P_DisplayWeapon(void) if (!RR && currentWeapon == KNEE_WEAPON && *weaponFrame == 0) goto enddisplayweapon; - int const doAnim = !(sprite[pPlayer->i].pal == 1 || ud.pause_on || g_player[myconnectindex].ps->gm & MODE_MENU); + int const doAnim = !(sprite[pPlayer->i].pal == 1 || paused || g_player[myconnectindex].ps->gm & MODE_MENU); int const halfLookAng = fix16_to_int(pPlayer->q16look_ang) >> 1; int const weaponPal = P_GetHudPal(pPlayer); @@ -3209,7 +3209,15 @@ void P_GetInput(int const playerNum) auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || (ud.pause_on && !inputState.GetKeyStatus(sc_Pause))) + auto const currentHiTicks = timerGetHiTicks(); + double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; + + thisPlayer.lastInputTicks = currentHiTicks; + + if (elapsedInputTicks == currentHiTicks) + return; + + if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || paused) { if (!(pPlayer->gm&MODE_MENU)) CONTROL_GetInput(&info); @@ -3272,14 +3280,6 @@ void P_GetInput(int const playerNum) input.svel -= info.dx * keyMove / analogExtent; input.fvel -= info.dz * keyMove / analogExtent; - auto const currentHiTicks = timerGetHiTicks(); - double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - - thisPlayer.lastInputTicks = currentHiTicks; - - if (elapsedInputTicks == currentHiTicks) - return; - auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); }; if (buttonMap.ButtonDown(gamefunc_Strafe)) @@ -3631,7 +3631,15 @@ void P_GetInputMotorcycle(int playerNum) auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || (ud.pause_on && !inputState.GetKeyStatus(sc_Pause))) + auto const currentHiTicks = timerGetHiTicks(); + double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; + + thisPlayer.lastInputTicks = currentHiTicks; + + if (elapsedInputTicks == currentHiTicks) + return; + + if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || paused) { if (!(pPlayer->gm&MODE_MENU)) CONTROL_GetInput(&info); @@ -3670,14 +3678,6 @@ void P_GetInputMotorcycle(int playerNum) input.svel -= info.dx * keyMove / analogExtent; input.fvel -= info.dz * keyMove / analogExtent; - auto const currentHiTicks = timerGetHiTicks(); - double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - - thisPlayer.lastInputTicks = currentHiTicks; - - if (elapsedInputTicks == currentHiTicks) - return; - auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); }; pPlayer->crouch_toggle = 0; @@ -3885,7 +3885,15 @@ void P_GetInputBoat(int playerNum) auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || (ud.pause_on && !inputState.GetKeyStatus(sc_Pause))) + auto const currentHiTicks = timerGetHiTicks(); + double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; + + thisPlayer.lastInputTicks = currentHiTicks; + + if (elapsedInputTicks == currentHiTicks) + return; + + if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || paused) { if (!(pPlayer->gm&MODE_MENU)) CONTROL_GetInput(&info); @@ -3924,14 +3932,6 @@ void P_GetInputBoat(int playerNum) input.svel -= info.dx * keyMove / analogExtent; input.fvel -= info.dz * keyMove / analogExtent; - auto const currentHiTicks = timerGetHiTicks(); - double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - - thisPlayer.lastInputTicks = currentHiTicks; - - if (elapsedInputTicks == currentHiTicks) - return; - auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); }; pPlayer->crouch_toggle = 0; @@ -4134,7 +4134,15 @@ void P_DHGetInput(int const playerNum) auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || (ud.pause_on && !inputState.GetKeyStatus(sc_Pause))) + auto const currentHiTicks = timerGetHiTicks(); + double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; + + thisPlayer.lastInputTicks = currentHiTicks; + + if (elapsedInputTicks == currentHiTicks) + return; + + if ((pPlayer->gm & (MODE_MENU|MODE_TYPE)) || paused) { if (!(pPlayer->gm&MODE_MENU)) CONTROL_GetInput(&info); @@ -4189,14 +4197,6 @@ void P_DHGetInput(int const playerNum) input.svel -= info.dx * keyMove / analogExtent; input.fvel -= info.dz * keyMove / analogExtent; - auto const currentHiTicks = timerGetHiTicks(); - double const elapsedInputTicks = currentHiTicks - thisPlayer.lastInputTicks; - - thisPlayer.lastInputTicks = currentHiTicks; - - if (elapsedInputTicks == currentHiTicks) - return; - auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); }; if (buttonMap.ButtonDown(gamefunc_Strafe)) diff --git a/source/rr/src/premap.cpp b/source/rr/src/premap.cpp index acb0b825e..cf1fd3c93 100644 --- a/source/rr/src/premap.cpp +++ b/source/rr/src/premap.cpp @@ -1154,7 +1154,7 @@ static void resetprestat(int playerNum, int gameMode) g_animateCnt = 0; parallaxtype = 0; randomseed = 17; - ud.pause_on = 0; + paused = 0; ud.camerasprite = -1; ud.eog = 0; tempwallptr = 0; @@ -2293,7 +2293,7 @@ int G_EnterLevel(int gameMode) //if (g_networkMode != NET_DEDICATED_SERVER) { - S_PauseSounds(false); + S_ResumeSound(false); FX_StopAllSounds(); S_ClearSoundLocks(); FX_SetReverb(0); diff --git a/source/rr/src/savegame.cpp b/source/rr/src/savegame.cpp index 0009521bd..4d9168a12 100644 --- a/source/rr/src/savegame.cpp +++ b/source/rr/src/savegame.cpp @@ -183,7 +183,7 @@ int32_t G_LoadPlayer(const char *path) // some setup first ud.multimode = h.numplayers; - S_PauseSounds(true); + S_PauseSound(true, false); if (numplayers > 1) { @@ -834,7 +834,7 @@ static const dataspec_t svgm_udnetw[] = { DS_NOCHK, &ud.ffire, sizeof(ud.ffire), 1 }, { DS_NOCHK, &ud.noexits, sizeof(ud.noexits), 1 }, { DS_NOCHK, &ud.playerai, sizeof(ud.playerai), 1 }, - { 0, &ud.pause_on, sizeof(ud.pause_on), 1 }, + { 0, &paused, sizeof(paused), 1 }, { 0, connectpoint2, sizeof(connectpoint2), 1 }, { 0, &randomseed, sizeof(randomseed), 1 }, { 0, &g_globalRandom, sizeof(g_globalRandom), 1 }, diff --git a/source/rr/src/screens.cpp b/source/rr/src/screens.cpp index 3dc9bf31f..6ac4988c4 100644 --- a/source/rr/src/screens.cpp +++ b/source/rr/src/screens.cpp @@ -765,7 +765,7 @@ void G_DisplayRest(int32_t smoothratio) if (ud.scrollmode == 0) { - if (pp->newowner == -1 && !ud.pause_on) + if (pp->newowner == -1 && !paused) { if (screenpeek == myconnectindex && numplayers > 1) { @@ -789,7 +789,7 @@ void G_DisplayRest(int32_t smoothratio) } else { - if (!ud.pause_on) + if (!paused) { ud.fola += ud.folavel>>3; ud.folx += (ud.folfvel*sintable[(512+2048-ud.fola)&2047])>>14; @@ -869,10 +869,10 @@ void G_DisplayRest(int32_t smoothratio) } */ - if (ud.pause_on==1 && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0) + if (paused==1 && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0) menutext_center(100, GStrings("Game Paused")); - mdpause = (ud.pause_on || (ud.recstat==2 && (g_demo_paused && g_demo_goalCnt==0)) || (g_player[myconnectindex].ps->gm&MODE_MENU && numplayers < 2)); + mdpause = (paused || (ud.recstat==2 && (g_demo_paused && g_demo_goalCnt==0)) || (g_player[myconnectindex].ps->gm&MODE_MENU && numplayers < 2)); // JBF 20040124: display level stats in screen corner if (ud.overhead_on != 2 && hud_stats) // && VM_OnEvent(EVENT_DISPLAYLEVELSTATS, g_player[screenpeek].ps->i, screenpeek) == 0) diff --git a/source/rr/src/sector.cpp b/source/rr/src/sector.cpp index 806a080b3..f20f6938b 100644 --- a/source/rr/src/sector.cpp +++ b/source/rr/src/sector.cpp @@ -3648,29 +3648,7 @@ void P_HandleSharedKeys(int playerNum) { pPlayer->interface_toggle_flag = 1; - if (TEST_SYNC_KEY(playerBits, SK_PAUSE)) - { - inputState.ClearKeyStatus(sc_Pause); - if (ud.pause_on) - ud.pause_on = 0; - else ud.pause_on = 1+SHIFTS_IS_PRESSED; - if (ud.pause_on) - { - Mus_SetPaused(true); - S_PauseSounds(true); - } - else - { - Mus_SetPaused(false); - - S_PauseSounds(false); - - pub = NUMPAGES; - pus = NUMPAGES; - } - } - - if (ud.pause_on) return; + if (paused) return; if (sprite[pPlayer->i].extra <= 0) return; // if dead... diff --git a/source/rr/src/sounds.cpp b/source/rr/src/sounds.cpp index 562e18f3a..147e3778f 100644 --- a/source/rr/src/sounds.cpp +++ b/source/rr/src/sounds.cpp @@ -79,17 +79,6 @@ TArray DukeSoundEngine::ReadSound(int lumpnum) // //========================================================================== -void S_PauseSounds(bool paused) -{ - soundEngine->SetPaused(paused); -} - -//========================================================================== -// -// -// -//========================================================================== - void cacheAllSounds(void) { auto& sfx = soundEngine->GetSounds(); diff --git a/source/rr/src/sounds.h b/source/rr/src/sounds.h index 04d672b87..987818fe0 100644 --- a/source/rr/src/sounds.h +++ b/source/rr/src/sounds.h @@ -57,8 +57,6 @@ inline int S_CheckSoundPlaying(int sprnum, int soundNum) { return S_CheckSoundPl inline void S_ClearSoundLocks(void) {} void cacheAllSounds(void); void S_MenuSound(void); -void S_PauseMusic(bool paused); -void S_PauseSounds(bool paused); void S_PlayLevelMusicOrNothing(unsigned int); int S_TryPlaySpecialMusic(unsigned int); void S_PlaySpecialMusicOrNothing(unsigned int);