diff --git a/extras/conf/SRB2-22.cfg b/extras/conf/SRB2-22.cfg index 92b072b4d..5dbfbd4e9 100644 --- a/extras/conf/SRB2-22.cfg +++ b/extras/conf/SRB2-22.cfg @@ -2182,6 +2182,12 @@ linedeftypes prefix = "(461)"; flags64text = "[6] Spawn inside a range"; } + + 462 + { + title = "Stop timer/exit stage in Record Attack"; + prefix = "(462)"; + } } linedefexecmisc diff --git a/src/m_menu.c b/src/m_menu.c index 12e3f6b26..6a0a31bc1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3280,12 +3280,14 @@ boolean M_Responder(event_t *ev) || (currentMenu->menuitems[itemOn].status & IT_TYPE)==IT_SUBMENU) && (currentMenu->menuitems[itemOn].status & IT_CALLTYPE)) { +#ifndef DEVELOP if (((currentMenu->menuitems[itemOn].status & IT_CALLTYPE) & IT_CALL_NOTMODIFIED) && modifiedgame && !savemoddata) { S_StartSound(NULL, sfx_skid); M_StartMessage(M_GetText("This cannot be done in a modified game.\n\n(Press a key)\n"), NULL, MM_NOTHING); return true; } +#endif } S_StartSound(NULL, sfx_menu1); switch (currentMenu->menuitems[itemOn].status & IT_TYPE) @@ -4636,10 +4638,12 @@ static boolean M_LevelAvailableOnPlatter(INT32 mapnum) /* FALLTHRU */ case LLM_RECORDATTACK: case LLM_NIGHTSATTACK: +#ifndef DEVELOP if (mapvisited[mapnum] & MV_MAX) return true; if (mapheaderinfo[mapnum]->menuflags & LF2_NOVISITNEEDED) +#endif return true; return false; diff --git a/src/p_enemy.c b/src/p_enemy.c index 27033acbc..afb646297 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3912,10 +3912,16 @@ void A_BossDeath(mobj_t *mo) // victory! P_LinedefExecute(LE_ALLBOSSESDEAD, mo, NULL); + if (stoppedclock && modeattacking) // if you're just time attacking, skip making the capsule appear since you don't need to step on it anyways. + goto bossjustdie; if (mo->flags2 & MF2_BOSSNOTRAP) { for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; P_DoPlayerExit(&players[i]); + } } else { @@ -10557,7 +10563,11 @@ void A_ForceWin(mobj_t *actor) return; for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i]) + continue; P_DoPlayerExit(&players[i]); + } } // Function: A_SpikeRetract diff --git a/src/p_mobj.h b/src/p_mobj.h index 94fcc2987..e560a4a81 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -475,4 +475,5 @@ extern boolean runemeraldmanager; extern UINT16 emeraldspawndelay; extern INT32 numstarposts; extern UINT16 bossdisabled; +extern boolean stoppedclock; #endif diff --git a/src/p_saveg.c b/src/p_saveg.c index fb2365bf0..470d3096e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3981,7 +3981,6 @@ static inline void P_UnArchiveSPGame(INT16 mapoverride) static void P_NetArchiveMisc(void) { - UINT32 pig = 0; INT32 i; WRITEUINT32(save_p, ARCHIVEBLOCK_MISC); @@ -3989,9 +3988,12 @@ static void P_NetArchiveMisc(void) WRITEINT16(save_p, gamemap); WRITEINT16(save_p, gamestate); - for (i = 0; i < MAXPLAYERS; i++) - pig |= (playeringame[i] != 0)<= 4*TICRATE) && --countdowntimer <= 0) + if (countdowntimer && G_PlatformGametype() && (gametype == GT_COOP || leveltime >= 4*TICRATE) && !stoppedclock && --countdowntimer <= 0) { countdowntimer = 0; countdowntimeup = true; diff --git a/src/p_user.c b/src/p_user.c index 6a67e329c..37e3f3568 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9397,7 +9397,7 @@ static void P_DeathThink(player_t *player) if (gametype == GT_RACE || gametype == GT_COMPETITION || (gametype == GT_COOP && (multiplayer || netgame))) { // Keep time rolling in race mode - if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_GAMETYPEOVER)) + if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_GAMETYPEOVER) && !stoppedclock) { if (gametype == GT_RACE || gametype == GT_COMPETITION) { @@ -11389,7 +11389,7 @@ void P_PlayerThink(player_t *player) } // Synchronizes the "real" amount of time spent in the level. - if (!player->exiting) + if (!player->exiting && !stoppedclock) { if (gametype == GT_RACE || gametype == GT_COMPETITION) { diff --git a/src/st_stuff.c b/src/st_stuff.c index 139303fbb..3fbee27e4 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -707,7 +707,7 @@ static void ST_drawTime(void) { if (timelimitintics >= stplyr->realtime) { - tics = (timelimitintics - stplyr->realtime); + tics = (timelimitintics + (TICRATE-1) - stplyr->realtime); if (tics < 3*TICRATE) ST_drawRaceNum(tics); } @@ -740,10 +740,12 @@ static void ST_drawTime(void) if (F_GetPromptHideHud(hudinfo[HUD_TIME].y)) return; - // TIME: - ST_DrawPatchFromHud(HUD_TIME, ((downwards && (tics < 30*TICRATE) && (leveltime/5 & 1)) ? sboredtime : sbotime), V_HUDTRANS); + downwards = (downwards && (tics < 30*TICRATE) && (leveltime/5 & 1) && !stoppedclock); // overtime? - if (!tics && downwards && (leveltime/5 & 1)) // overtime! + // TIME: + ST_DrawPatchFromHud(HUD_TIME, (downwards ? sboredtime : sbotime), V_HUDTRANS); + + if (downwards) // overtime! return; if (cv_timetic.value == 3) // Tics only -- how simple is this?