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.
This commit is contained in:
Mitchell Richters 2020-05-29 10:32:53 +10:00 committed by Christoph Oelckers
parent 65265594e5
commit b86d499e0b
11 changed files with 68 additions and 108 deletions

View file

@ -580,7 +580,7 @@ void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, doub
void GameInterface::MenuOpened() void GameInterface::MenuOpened()
{ {
S_PauseSounds(true); S_PauseSound(true, false);
if ((!g_netServer && ud.multimode < 2)) if ((!g_netServer && ud.multimode < 2))
{ {
ready2send = 0; ready2send = 0;
@ -646,7 +646,7 @@ void GameInterface::MenuClosed()
} }
G_UpdateScreenArea(); G_UpdateScreenArea();
S_PauseSounds(false); S_ResumeSound(false);
} }
} }

View file

@ -120,7 +120,7 @@ static int32_t G_OpenDemoRead(int32_t g_whichDemo) // 0 = mine
gFullMap = false; gFullMap = false;
ud.god = ud.cashman = ud.eog = 0; 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; totalclock = ototalclock = lockclock = 0;
@ -591,7 +591,7 @@ RECHECK:
Demo_FinishProfile(); Demo_FinishProfile();
while (totalclock >= (lockclock+TICSPERFRAME) while (totalclock >= (lockclock+TICSPERFRAME)
// || (ud.reccnt > REALGAMETICSPERSEC*2 && ud.pause_on) // || (ud.reccnt > REALGAMETICSPERSEC*2 && paused)
|| (g_demo_goalCnt>0 && g_demo_cnt<g_demo_goalCnt)) || (g_demo_goalCnt>0 && g_demo_cnt<g_demo_goalCnt))
{ {
if (ud.reccnt<=0) if (ud.reccnt<=0)

View file

@ -849,7 +849,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio)
videoSetCorrectedAspect(); videoSetCorrectedAspect();
} }
if (ud.pause_on || pPlayer->on_crane > -1) if (paused || pPlayer->on_crane > -1)
smoothRatio = 65536; smoothRatio = 65536;
else else
smoothRatio = calc_smoothratio(totalclock, ototalclock); smoothRatio = calc_smoothratio(totalclock, ototalclock);
@ -924,7 +924,7 @@ void G_DrawRooms(int32_t playerNum, int32_t smoothRatio)
if (RRRA && pPlayer->drug_mode > 0) 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; int aspect;
if (pPlayer->drug_stat[0] == 0) if (pPlayer->drug_stat[0] == 0)
@ -5027,7 +5027,7 @@ default_case1:
spritesortcnt++; 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; tspritetype *const playerTyping = t;
@ -7296,7 +7296,9 @@ MAIN_LOOP_RESTART:
char gameUpdate = false; char gameUpdate = false;
double const gameUpdateStartTime = timerGetHiTicks(); double const gameUpdateStartTime = timerGetHiTicks();
if (M_Active() || GUICapture || ud.pause_on != 0) updatePauseStatus();
if (paused)
{ {
ototalclock = totalclock - TICSPERFRAME; ototalclock = totalclock - TICSPERFRAME;
buttonMap.ResetButtonStates(); 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) 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) if (RRRA && g_player[myconnectindex].ps->on_motorcycle)
P_GetInputMotorcycle(myconnectindex); P_GetInputMotorcycle(myconnectindex);
else if (RRRA && g_player[myconnectindex].ps->on_boat) else if (RRRA && g_player[myconnectindex].ps->on_boat)
@ -7330,7 +7330,9 @@ MAIN_LOOP_RESTART:
g_player[myconnectindex].movefifoend++; 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_player[myconnectindex].ps->gm&MODE_GAME))
{ {
G_MoveLoop(); G_MoveLoop();
@ -7528,11 +7530,8 @@ int G_DoMoveThings(void)
everyothertime++; everyothertime++;
if (g_earthquakeTime > 0) g_earthquakeTime--; 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)) 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; sprite[g_player[i].ps->i].pal = g_player[i].pcolor;
if (!DEER) 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); P_CheckSectors(i);
}
} }
if (ud.pause_on == 0) G_MoveWorld();
G_MoveWorld();
Net_CorrectPrediction(); Net_CorrectPrediction();
@ -7578,8 +7573,8 @@ int G_DoMoveThings(void)
} }
else else
{ {
G_AnimateWalls(); G_AnimateWalls();
A_MoveCyclers(); A_MoveCyclers();
} }
//if (g_netServer && (everyothertime % 10) == 0) //if (g_netServer && (everyothertime % 10) == 0)

View file

@ -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)) || if (!(((!g_netServer && ud.multimode < 2) && ((g_player[myconnectindex].ps->gm & MODE_MENU) == 0)) ||
(g_netServer || ud.multimode > 1) || (g_netServer || ud.multimode > 1) ||
ud.recstat == 2) || ud.recstat == 2) ||
ud.pause_on) paused)
{ {
return 65536; return 65536;
} }

View file

@ -2093,7 +2093,7 @@ void P_DisplayWeapon(void)
if (!RR && currentWeapon == KNEE_WEAPON && *weaponFrame == 0) if (!RR && currentWeapon == KNEE_WEAPON && *weaponFrame == 0)
goto enddisplayweapon; 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 halfLookAng = fix16_to_int(pPlayer->q16look_ang) >> 1;
int const weaponPal = P_GetHudPal(pPlayer); int const weaponPal = P_GetHudPal(pPlayer);
@ -3209,7 +3209,15 @@ void P_GetInput(int const playerNum)
auto const pSprite = &sprite[pPlayer->i]; auto const pSprite = &sprite[pPlayer->i];
ControlInfo info; 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)) if (!(pPlayer->gm&MODE_MENU))
CONTROL_GetInput(&info); CONTROL_GetInput(&info);
@ -3272,14 +3280,6 @@ void P_GetInput(int const playerNum)
input.svel -= info.dx * keyMove / analogExtent; input.svel -= info.dx * keyMove / analogExtent;
input.fvel -= info.dz * 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); }; auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); };
if (buttonMap.ButtonDown(gamefunc_Strafe)) if (buttonMap.ButtonDown(gamefunc_Strafe))
@ -3631,7 +3631,15 @@ void P_GetInputMotorcycle(int playerNum)
auto const pSprite = &sprite[pPlayer->i]; auto const pSprite = &sprite[pPlayer->i];
ControlInfo info; 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)) if (!(pPlayer->gm&MODE_MENU))
CONTROL_GetInput(&info); CONTROL_GetInput(&info);
@ -3670,14 +3678,6 @@ void P_GetInputMotorcycle(int playerNum)
input.svel -= info.dx * keyMove / analogExtent; input.svel -= info.dx * keyMove / analogExtent;
input.fvel -= info.dz * 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); }; auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); };
pPlayer->crouch_toggle = 0; pPlayer->crouch_toggle = 0;
@ -3885,7 +3885,15 @@ void P_GetInputBoat(int playerNum)
auto const pSprite = &sprite[pPlayer->i]; auto const pSprite = &sprite[pPlayer->i];
ControlInfo info; 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)) if (!(pPlayer->gm&MODE_MENU))
CONTROL_GetInput(&info); CONTROL_GetInput(&info);
@ -3924,14 +3932,6 @@ void P_GetInputBoat(int playerNum)
input.svel -= info.dx * keyMove / analogExtent; input.svel -= info.dx * keyMove / analogExtent;
input.fvel -= info.dz * 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); }; auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); };
pPlayer->crouch_toggle = 0; pPlayer->crouch_toggle = 0;
@ -4134,7 +4134,15 @@ void P_DHGetInput(int const playerNum)
auto const pSprite = &sprite[pPlayer->i]; auto const pSprite = &sprite[pPlayer->i];
ControlInfo info; 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)) if (!(pPlayer->gm&MODE_MENU))
CONTROL_GetInput(&info); CONTROL_GetInput(&info);
@ -4189,14 +4197,6 @@ void P_DHGetInput(int const playerNum)
input.svel -= info.dx * keyMove / analogExtent; input.svel -= info.dx * keyMove / analogExtent;
input.fvel -= info.dz * 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); }; auto scaleAdjustmentToInterval = [=](double x) { return x * REALGAMETICSPERSEC / (1000.0 / elapsedInputTicks); };
if (buttonMap.ButtonDown(gamefunc_Strafe)) if (buttonMap.ButtonDown(gamefunc_Strafe))

View file

@ -1154,7 +1154,7 @@ static void resetprestat(int playerNum, int gameMode)
g_animateCnt = 0; g_animateCnt = 0;
parallaxtype = 0; parallaxtype = 0;
randomseed = 17; randomseed = 17;
ud.pause_on = 0; paused = 0;
ud.camerasprite = -1; ud.camerasprite = -1;
ud.eog = 0; ud.eog = 0;
tempwallptr = 0; tempwallptr = 0;
@ -2293,7 +2293,7 @@ int G_EnterLevel(int gameMode)
//if (g_networkMode != NET_DEDICATED_SERVER) //if (g_networkMode != NET_DEDICATED_SERVER)
{ {
S_PauseSounds(false); S_ResumeSound(false);
FX_StopAllSounds(); FX_StopAllSounds();
S_ClearSoundLocks(); S_ClearSoundLocks();
FX_SetReverb(0); FX_SetReverb(0);

View file

@ -183,7 +183,7 @@ int32_t G_LoadPlayer(const char *path)
// some setup first // some setup first
ud.multimode = h.numplayers; ud.multimode = h.numplayers;
S_PauseSounds(true); S_PauseSound(true, false);
if (numplayers > 1) if (numplayers > 1)
{ {
@ -834,7 +834,7 @@ static const dataspec_t svgm_udnetw[] =
{ DS_NOCHK, &ud.ffire, sizeof(ud.ffire), 1 }, { DS_NOCHK, &ud.ffire, sizeof(ud.ffire), 1 },
{ DS_NOCHK, &ud.noexits, sizeof(ud.noexits), 1 }, { DS_NOCHK, &ud.noexits, sizeof(ud.noexits), 1 },
{ DS_NOCHK, &ud.playerai, sizeof(ud.playerai), 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, connectpoint2, sizeof(connectpoint2), 1 },
{ 0, &randomseed, sizeof(randomseed), 1 }, { 0, &randomseed, sizeof(randomseed), 1 },
{ 0, &g_globalRandom, sizeof(g_globalRandom), 1 }, { 0, &g_globalRandom, sizeof(g_globalRandom), 1 },

View file

@ -765,7 +765,7 @@ void G_DisplayRest(int32_t smoothratio)
if (ud.scrollmode == 0) if (ud.scrollmode == 0)
{ {
if (pp->newowner == -1 && !ud.pause_on) if (pp->newowner == -1 && !paused)
{ {
if (screenpeek == myconnectindex && numplayers > 1) if (screenpeek == myconnectindex && numplayers > 1)
{ {
@ -789,7 +789,7 @@ void G_DisplayRest(int32_t smoothratio)
} }
else else
{ {
if (!ud.pause_on) if (!paused)
{ {
ud.fola += ud.folavel>>3; ud.fola += ud.folavel>>3;
ud.folx += (ud.folfvel*sintable[(512+2048-ud.fola)&2047])>>14; 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")); 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 // 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) if (ud.overhead_on != 2 && hud_stats) // && VM_OnEvent(EVENT_DISPLAYLEVELSTATS, g_player[screenpeek].ps->i, screenpeek) == 0)

View file

@ -3648,29 +3648,7 @@ void P_HandleSharedKeys(int playerNum)
{ {
pPlayer->interface_toggle_flag = 1; pPlayer->interface_toggle_flag = 1;
if (TEST_SYNC_KEY(playerBits, SK_PAUSE)) if (paused) return;
{
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 (sprite[pPlayer->i].extra <= 0) return; // if dead... if (sprite[pPlayer->i].extra <= 0) return; // if dead...

View file

@ -79,17 +79,6 @@ TArray<uint8_t> DukeSoundEngine::ReadSound(int lumpnum)
// //
//========================================================================== //==========================================================================
void S_PauseSounds(bool paused)
{
soundEngine->SetPaused(paused);
}
//==========================================================================
//
//
//
//==========================================================================
void cacheAllSounds(void) void cacheAllSounds(void)
{ {
auto& sfx = soundEngine->GetSounds(); auto& sfx = soundEngine->GetSounds();

View file

@ -57,8 +57,6 @@ inline int S_CheckSoundPlaying(int sprnum, int soundNum) { return S_CheckSoundPl
inline void S_ClearSoundLocks(void) {} inline void S_ClearSoundLocks(void) {}
void cacheAllSounds(void); void cacheAllSounds(void);
void S_MenuSound(void); void S_MenuSound(void);
void S_PauseMusic(bool paused);
void S_PauseSounds(bool paused);
void S_PlayLevelMusicOrNothing(unsigned int); void S_PlayLevelMusicOrNothing(unsigned int);
int S_TryPlaySpecialMusic(unsigned int); int S_TryPlaySpecialMusic(unsigned int);
void S_PlaySpecialMusicOrNothing(unsigned int); void S_PlaySpecialMusicOrNothing(unsigned int);