From 65265594e5b273c8dd849b725bb2a234c0487dc7 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Fri, 29 May 2020 09:33:11 +1000 Subject: [PATCH] Duke3D: 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/duke3d/src/d_menu.cpp | 4 +- source/duke3d/src/demo.cpp | 4 +- source/duke3d/src/game.cpp | 66 ++++++++++++++-------------- source/duke3d/src/game.h | 2 +- source/duke3d/src/gamestructures.cpp | 4 +- source/duke3d/src/network.cpp | 4 +- source/duke3d/src/player.cpp | 21 +++++---- source/duke3d/src/premap.cpp | 4 +- source/duke3d/src/savegame.cpp | 2 +- source/duke3d/src/screens.cpp | 8 ++-- source/duke3d/src/sector.cpp | 23 +--------- source/duke3d/src/sounds.cpp | 11 ----- source/duke3d/src/sounds.h | 1 - 13 files changed, 59 insertions(+), 95 deletions(-) diff --git a/source/duke3d/src/d_menu.cpp b/source/duke3d/src/d_menu.cpp index bdb7e0959..5181db32d 100644 --- a/source/duke3d/src/d_menu.cpp +++ b/source/duke3d/src/d_menu.cpp @@ -425,7 +425,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; @@ -491,7 +491,7 @@ void GameInterface::MenuClosed() } G_UpdateScreenArea(); - S_PauseSounds(false); + S_ResumeSound(false); } } diff --git a/source/duke3d/src/demo.cpp b/source/duke3d/src/demo.cpp index 785271fd7..94c9f7d77 100644 --- a/source/duke3d/src/demo.cpp +++ b/source/duke3d/src/demo.cpp @@ -117,7 +117,7 @@ static int32_t G_OpenDemoRead(int32_t g_whichDemo) // 0 = mine ud.reccnt = 0; ud.god = ud.cashman = ud.eog = gFullMap = 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; @@ -588,7 +588,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_cntextbits & (1 << 7) && !ud.pause_on && spritesortcnt < maxspritesonscreen) + if (g_player[playerNum].input->extbits & (1 << 7) && !paused && spritesortcnt < maxspritesonscreen) { auto const playerTyping = &tsprite[spritesortcnt]; @@ -5913,7 +5913,9 @@ MAIN_LOOP_RESTART: bool gameUpdate = false; double gameUpdateStartTime = timerGetHiTicks(); - if (M_Active() || GUICapture || ud.pause_on != 0) + updatePauseStatus(); + + if (paused) { ototalclock = totalclock - TICSPERFRAME; buttonMap.ResetButtonStates(); @@ -5922,30 +5924,33 @@ MAIN_LOOP_RESTART: { while (((g_netClient || g_netServer) || (myplayer.gm & (MODE_MENU | MODE_DEMO)) == 0) && (int)(totalclock - ototalclock) >= TICSPERFRAME) { - ototalclock += TICSPERFRAME; - - P_GetInput(myconnectindex); - - // this is where we fill the input_t struct that is actually processed by P_ProcessInput() - auto const pPlayer = g_player[myconnectindex].ps; - auto const q16ang = fix16_to_int(pPlayer->q16ang); - auto & input = inputfifo[0][myconnectindex]; - - input = localInput; - input.fvel = mulscale9(localInput.fvel, sintable[(q16ang + 2560) & 2047]) + - mulscale9(localInput.svel, sintable[(q16ang + 2048) & 2047]); - input.svel = mulscale9(localInput.fvel, sintable[(q16ang + 2048) & 2047]) + - mulscale9(localInput.svel, sintable[(q16ang + 1536) & 2047]); - - if (!FURY) + if (g_networkMode != NET_DEDICATED_SERVER) { - input.fvel += pPlayer->fric.x; - input.svel += pPlayer->fric.y; + P_GetInput(myconnectindex); + + // this is where we fill the input_t struct that is actually processed by P_ProcessInput() + auto const pPlayer = g_player[myconnectindex].ps; + auto const q16ang = fix16_to_int(pPlayer->q16ang); + auto & input = inputfifo[0][myconnectindex]; + + input = localInput; + input.fvel = mulscale9(localInput.fvel, sintable[(q16ang + 2560) & 2047]) + + mulscale9(localInput.svel, sintable[(q16ang + 2048) & 2047]); + input.svel = mulscale9(localInput.fvel, sintable[(q16ang + 2048) & 2047]) + + mulscale9(localInput.svel, sintable[(q16ang + 1536) & 2047]); + + if (!FURY) + { + input.fvel += pPlayer->fric.x; + input.svel += pPlayer->fric.y; + } + + localInput = {}; } - localInput = {}; + ototalclock += TICSPERFRAME; - if (((myplayer.gm & MODE_MENU) != MODE_MENU || ud.recstat == 2 || (g_netServer || ud.multimode > 1)) + if (paused == 0 && ((myplayer.gm & MODE_MENU) != MODE_MENU || ud.recstat == 2 || (g_netServer || ud.multimode > 1)) && (myplayer.gm & MODE_GAME)) { Net_GetPackets(); @@ -6121,11 +6126,8 @@ int G_DoMoveThings(void) everyothertime++; if (g_earthquakeTime > 0) g_earthquakeTime--; - if (ud.pause_on == 0) - { - g_globalRandom = krand(); - A_MoveDummyPlayers();//ST 13 - } + g_globalRandom = krand(); + A_MoveDummyPlayers();//ST 13 for (bssize_t TRAVERSE_CONNECT(i)) { @@ -6144,15 +6146,11 @@ int G_DoMoveThings(void) P_HandleSharedKeys(i); - if (ud.pause_on == 0) - { - P_ProcessInput(i); - P_CheckSectors(i); - } + P_ProcessInput(i); + P_CheckSectors(i); } - if (ud.pause_on == 0) - G_MoveWorld(); + G_MoveWorld(); // Net_CorrectPrediction(); diff --git a/source/duke3d/src/game.h b/source/duke3d/src/game.h index 6fd0f39fe..004024d5e 100644 --- a/source/duke3d/src/game.h +++ b/source/duke3d/src/game.h @@ -317,7 +317,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/duke3d/src/gamestructures.cpp b/source/duke3d/src/gamestructures.cpp index a033bc191..2f10b27e7 100644 --- a/source/duke3d/src/gamestructures.cpp +++ b/source/duke3d/src/gamestructures.cpp @@ -1394,7 +1394,7 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum, int const lParm2) case USERDEFS_OVERHEAD_ON: labelNum = ud.overhead_on; break; case USERDEFS_LAST_OVERHEAD: labelNum = ud.last_overhead; break; case USERDEFS_SHOWWEAPONS: labelNum = ud.showweapons; break; - case USERDEFS_PAUSE_ON: labelNum = ud.pause_on; break; + case USERDEFS_PAUSE_ON: labelNum = paused; break; case USERDEFS_FROM_BONUS: labelNum = ud.from_bonus; break; case USERDEFS_CAMERASPRITE: labelNum = ud.camerasprite; break; case USERDEFS_LAST_CAMSPRITE: labelNum = ud.last_camsprite; break; @@ -1582,7 +1582,7 @@ void __fastcall VM_SetUserdef(int const labelNum, int const lParm2, int32_t cons case USERDEFS_OVERHEAD_ON: ud.overhead_on = iSet; break; case USERDEFS_LAST_OVERHEAD: ud.last_overhead = iSet; break; case USERDEFS_SHOWWEAPONS: ud.showweapons = iSet; break; - case USERDEFS_PAUSE_ON: ud.pause_on = iSet; break; + case USERDEFS_PAUSE_ON: paused = iSet; break; case USERDEFS_FROM_BONUS: ud.from_bonus = iSet; break; case USERDEFS_CAMERASPRITE: ud.camerasprite = iSet; break; case USERDEFS_LAST_CAMSPRITE: ud.last_camsprite = iSet; break; diff --git a/source/duke3d/src/network.cpp b/source/duke3d/src/network.cpp index cc5ba2174..80bb54825 100644 --- a/source/duke3d/src/network.cpp +++ b/source/duke3d/src/network.cpp @@ -2275,7 +2275,7 @@ static void Net_ReceiveServerUpdate(ENetEvent *event) Bmemcpy(&serverupdate, updatebuf, sizeof(serverupdate_t)); updatebuf += sizeof(serverupdate_t); inputfifo[0][0] = serverupdate.nsyn; - ud.pause_on = serverupdate.pause_on; + paused = serverupdate.pause_on; ticrandomseed = serverupdate.seed; @@ -4945,7 +4945,7 @@ void Net_SendServerUpdates(void) serverupdate.header = PACKET_MASTER_TO_SLAVE; serverupdate.seed = ticrandomseed; serverupdate.nsyn = *nsyn; - serverupdate.pause_on = ud.pause_on; + serverupdate.pause_on = paused; serverupdate.numplayers = 0; updatebuf = tempnetbuf.Data() + sizeof(serverupdate_t); diff --git a/source/duke3d/src/player.cpp b/source/duke3d/src/player.cpp index 9f90fc518..798c3088d 100644 --- a/source/duke3d/src/player.cpp +++ b/source/duke3d/src/player.cpp @@ -2364,7 +2364,7 @@ void P_DisplayWeapon(void) goto enddisplayweapon; #ifndef EDUKE32_STANDALONE - 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); @@ -3073,7 +3073,15 @@ void P_GetInput(int const playerNum) auto const pSprite = &sprite[pPlayer->i]; ControlInfo info; - if (g_cheatBufLen > 1 || (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 (g_cheatBufLen > 1 || (pPlayer->gm & (MODE_MENU|MODE_TYPE)) || paused) { if (!(pPlayer->gm&MODE_MENU)) CONTROL_GetInput(&info); @@ -3134,14 +3142,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)) @@ -3274,7 +3274,6 @@ void P_GetInput(int const playerNum) localInput.bits |= (mouseaim << SK_AIMMODE); localInput.bits |= (g_gameQuit << SK_GAMEQUIT); - localInput.bits |= inputState.GetKeyStatus(sc_Pause) << SK_PAUSE; //localInput.bits |= ((uint32_t)inputState.GetKeyStatus(sc_Escape)) << SK_ESCAPE; fixme.This needs to be done differently if (buttonMap.ButtonDown(gamefunc_Dpad_Select)) diff --git a/source/duke3d/src/premap.cpp b/source/duke3d/src/premap.cpp index d44583fe5..144e5ccd4 100644 --- a/source/duke3d/src/premap.cpp +++ b/source/duke3d/src/premap.cpp @@ -871,7 +871,7 @@ static void P_PrepForNewLevel(int playerNum, int gameMode) ud.camerasprite = -1; ud.eog = 0; - ud.pause_on = 0; + paused = 0; if (((gameMode & MODE_EOL) != MODE_EOL && numplayers < 2 && !g_netServer) || (!(g_gametypeFlags[ud.coop] & GAMETYPE_PRESERVEINVENTORYDEATH) && numplayers > 1)) @@ -1728,7 +1728,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/duke3d/src/savegame.cpp b/source/duke3d/src/savegame.cpp index b5664de4d..e7a9102b4 100644 --- a/source/duke3d/src/savegame.cpp +++ b/source/duke3d/src/savegame.cpp @@ -1093,7 +1093,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/duke3d/src/screens.cpp b/source/duke3d/src/screens.cpp index df2227324..2dd993790 100644 --- a/source/duke3d/src/screens.cpp +++ b/source/duke3d/src/screens.cpp @@ -784,7 +784,7 @@ void G_DisplayRest(int32_t smoothratio) if (ud.scrollmode == 0) { - if (pp->newowner == -1 && !ud.pause_on) + if (pp->newowner == -1 && !paused) { cposx = pp->opos.x + mulscale16(pp->pos.x-pp->opos.x, smoothratio); cposy = pp->opos.y + mulscale16(pp->pos.y-pp->opos.y, smoothratio); @@ -799,7 +799,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; @@ -898,10 +898,10 @@ void G_DisplayRest(int32_t smoothratio) renderSetAspect(vr, asp); } - 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/duke3d/src/sector.cpp b/source/duke3d/src/sector.cpp index 3f291f67d..79d17c5f5 100644 --- a/source/duke3d/src/sector.cpp +++ b/source/duke3d/src/sector.cpp @@ -2628,28 +2628,7 @@ void P_HandleSharedKeys(int playerNum) if (playerBits && TEST_SYNC_KEY(playerBits, SK_MULTIFLAG) == 0) { - 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/duke3d/src/sounds.cpp b/source/duke3d/src/sounds.cpp index c436f7e47..ca4cef856 100644 --- a/source/duke3d/src/sounds.cpp +++ b/source/duke3d/src/sounds.cpp @@ -80,17 +80,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/duke3d/src/sounds.h b/source/duke3d/src/sounds.h index 030e537a0..6180fb80b 100644 --- a/source/duke3d/src/sounds.h +++ b/source/duke3d/src/sounds.h @@ -58,7 +58,6 @@ 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);