diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 33e9dceaa..73c8ce525 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -7555,66 +7555,6 @@ tic_t GetLag(INT32 node) return gametic - nettics[node]; } -#define REWIND_POINT_INTERVAL 4*TICRATE + 16 -rewind_t *rewindhead; - -void CL_ClearRewinds(void) -{ - rewind_t *head; - while ((head = rewindhead)) - { - rewindhead = rewindhead->next; - free(head); - } -} - -rewind_t *CL_SaveRewindPoint(size_t demopos) -{ - savebuffer_t save = {0}; - rewind_t *rewind; - - if (rewindhead && rewindhead->leveltime + REWIND_POINT_INTERVAL > leveltime) - return NULL; - - rewind = (rewind_t *)malloc(sizeof (rewind_t)); - if (!rewind) - return NULL; - - P_SaveBufferFromExisting(&save, rewind->savebuffer, NETSAVEGAMESIZE); - P_SaveNetGame(&save, false); - - rewind->leveltime = leveltime; - rewind->next = rewindhead; - rewind->demopos = demopos; - rewindhead = rewind; - - return rewind; -} - -rewind_t *CL_RewindToTime(tic_t time) -{ - savebuffer_t save = {0}; - rewind_t *rewind; - - while (rewindhead && rewindhead->leveltime > time) - { - rewind = rewindhead->next; - free(rewindhead); - rewindhead = rewind; - } - - if (!rewindhead) - return NULL; - - P_SaveBufferFromExisting(&save, rewindhead->savebuffer, NETSAVEGAMESIZE); - P_LoadNetGame(&save, false); - - wipegamestate = gamestate; // No fading back in! - timeinmap = leveltime; - - return rewindhead; -} - void D_MD5PasswordPass(const UINT8 *buffer, size_t len, const char *salt, void *dest) { #ifdef NOMD5 diff --git a/src/d_clisrv.h b/src/d_clisrv.h index de606acb6..eb3861c55 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -712,21 +712,6 @@ extern boolean hu_stopped; // SRB2Kart // -struct rewind_t { - UINT8 savebuffer[NETSAVEGAMESIZE]; - tic_t leveltime; - size_t demopos; - - ticcmd_t oldcmd[MAXPLAYERS]; - mobj_t oldghost[MAXPLAYERS]; - - rewind_t *next; -}; - -void CL_ClearRewinds(void); -rewind_t *CL_SaveRewindPoint(size_t demopos); -rewind_t *CL_RewindToTime(tic_t time); - void HandleSigfail(const char *string); void DoSayPacket(SINT8 target, UINT8 flags, UINT8 source, char *message); diff --git a/src/d_main.cpp b/src/d_main.cpp index 7afb32df7..71f5f74d4 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -742,9 +742,6 @@ static bool D_Display(bool world) if (forcerefresh && G_GamestateUsesLevel() == false) V_SetPalette(0); - if (demo.rewinding) - V_DrawFadeScreen(TC_RAINBOW, (leveltime & 0x20) ? SKINCOLOR_PASTEL : SKINCOLOR_MOONSET); - // vid size change is now finished if it was on... vid.recalc = 0; diff --git a/src/g_demo.cpp b/src/g_demo.cpp index 8b5121931..9e6ecf1e2 100644 --- a/src/g_demo.cpp +++ b/src/g_demo.cpp @@ -295,17 +295,6 @@ void G_ReadDemoExtraData(void) INT32 p, extradata, i; char name[64]; static_assert(sizeof name >= std::max({MAXPLAYERNAME+1u, SKINNAMESIZE+1u, MAXCOLORNAME+1u})); - - if (leveltime > starttime) - { - rewind_t *rewind = CL_SaveRewindPoint(demobuf.p - demobuf.buffer); - if (rewind) - { - memcpy(rewind->oldcmd, oldcmd, sizeof (oldcmd)); - memcpy(rewind->oldghost, oldghost, sizeof (oldghost)); - } - } - memset(name, '\0', sizeof name); p = READUINT8(demobuf.p); @@ -1616,203 +1605,6 @@ skippedghosttic: } } -// Demo rewinding functions -typedef struct rewindinfo_s { - tic_t leveltime; - - struct { - boolean ingame; - player_t player; - mobj_t mobj; - } playerinfo[MAXPLAYERS]; - - struct rewindinfo_s *prev; -} rewindinfo_t; - -static tic_t currentrewindnum; -static rewindinfo_t *rewindhead = NULL; // Reverse chronological order - -void G_InitDemoRewind(void) -{ - CL_ClearRewinds(); - - while (rewindhead) - { - rewindinfo_t *p = rewindhead->prev; - Z_Free(rewindhead); - rewindhead = p; - } - - currentrewindnum = 0; -} - -void G_StoreRewindInfo(void) -{ - static UINT8 timetolog = 8; - rewindinfo_t *info; - size_t i; - - if (timetolog-- > 0) - return; - timetolog = 8; - - info = static_cast(Z_Calloc(sizeof(rewindinfo_t), PU_STATIC, NULL)); - - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - { - info->playerinfo[i].ingame = false; - continue; - } - - info->playerinfo[i].ingame = true; - memcpy(&info->playerinfo[i].player, &players[i], sizeof(player_t)); - if (players[i].mo) - memcpy(&info->playerinfo[i].mobj, players[i].mo, sizeof(mobj_t)); - } - - info->leveltime = leveltime; - info->prev = rewindhead; - rewindhead = info; -} - -void G_PreviewRewind(tic_t previewtime) -{ - SINT8 i; - //size_t j; - fixed_t tweenvalue = 0; - rewindinfo_t *info = rewindhead, *next_info = rewindhead; - - if (!info) - return; - - while (info->leveltime > previewtime && info->prev) - { - next_info = info; - info = info->prev; - } - if (info != next_info) - tweenvalue = FixedDiv(previewtime - info->leveltime, next_info->leveltime - info->leveltime); - - - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - { - if (info->playerinfo[i].player.mo) - { - //@TODO spawn temp object to act as a player display - } - - continue; - } - - if (!info->playerinfo[i].ingame || !info->playerinfo[i].player.mo) - { - if (players[i].mo) - players[i].mo->renderflags |= RF_DONTDRAW; - - continue; - } - - if (!players[i].mo) - continue; //@TODO spawn temp object to act as a player display - - players[i].mo->renderflags &= ~RF_DONTDRAW; - - P_UnsetThingPosition(players[i].mo); -#define TWEEN(pr) info->playerinfo[i].mobj.pr + FixedMul((INT32) (next_info->playerinfo[i].mobj.pr - info->playerinfo[i].mobj.pr), tweenvalue) - players[i].mo->x = TWEEN(x); - players[i].mo->y = TWEEN(y); - players[i].mo->z = TWEEN(z); - players[i].mo->angle = TWEEN(angle); -#undef TWEEN - P_SetThingPosition(players[i].mo); - - players[i].drawangle = info->playerinfo[i].player.drawangle + FixedMul((INT32) (next_info->playerinfo[i].player.drawangle - info->playerinfo[i].player.drawangle), tweenvalue); - - players[i].mo->sprite = info->playerinfo[i].mobj.sprite; - players[i].mo->sprite2 = info->playerinfo[i].mobj.sprite2; - players[i].mo->frame = info->playerinfo[i].mobj.frame; - - players[i].mo->hitlag = info->playerinfo[i].mobj.hitlag; - - players[i].realtime = info->playerinfo[i].player.realtime; - // Genuinely CANNOT be fucked. I can redo lua and I can redo netsaves but I draw the line at this abysmal hack. - /*for (j = 0; j < NUMKARTSTUFF; j++) - players[i].kartstuff[j] = info->playerinfo[i].player.kartstuff[j];*/ - } - - for (i = splitscreen; i >= 0; i--) - P_ResetCamera(&players[displayplayers[i]], &camera[i]); -} - -void G_ConfirmRewind(tic_t rewindtime) -{ - SINT8 i; - tic_t j; - boolean oldmenuactive = menuactive, oldsounddisabled = sound_disabled; - - INT32 olddp1 = displayplayers[0], olddp2 = displayplayers[1], olddp3 = displayplayers[2], olddp4 = displayplayers[3]; - UINT8 oldss = splitscreen; - - menuactive = false; // Prevent loops - - CV_StealthSetValue(&cv_renderview, 0); - - if (rewindtime <= starttime) - { - demo.rewinding = true; // this doesn't APPEAR to cause any misery, and it allows us to prevent running all the wipes again - G_DoPlayDemo(NULL); // Restart the current demo - } - else - { - rewind_t *rewind; - sound_disabled = true; // Prevent sound spam - demo.rewinding = true; - - rewind = CL_RewindToTime(rewindtime); - - if (rewind) - { - demobuf.p = demobuf.buffer + rewind->demopos; - memcpy(oldcmd, rewind->oldcmd, sizeof (oldcmd)); - memcpy(oldghost, rewind->oldghost, sizeof (oldghost)); - paused = false; - } - else - { - demo.rewinding = true; - G_DoPlayDemo(NULL); // Restart the current demo - } - } - - for (j = 0; j < rewindtime && leveltime < rewindtime; j++) - { - G_Ticker((j % NEWTICRATERATIO) == 0); - } - - demo.rewinding = false; - menuactive = oldmenuactive; // Bring the menu back up - sound_disabled = oldsounddisabled; // Re-enable SFX - - wipegamestate = gamestate; // No fading back in! - - COM_BufInsertText("renderview on\n"); - - splitscreen = oldss; - displayplayers[0] = olddp1; - displayplayers[1] = olddp2; - displayplayers[2] = olddp3; - displayplayers[3] = olddp4; - R_ExecuteSetViewSize(); - G_ResetViews(); - - for (i = splitscreen; i >= 0; i--) - P_ResetCamera(&players[displayplayers[i]], &camera[i]); -} - // // G_RecordDemo // @@ -2964,8 +2756,6 @@ void G_DoPlayDemoEx(const char *defdemoname, lumpnum_t deflumpnum) boolean skiperrors = true; #endif - G_InitDemoRewind(); - gtname[MAXGAMETYPELENGTH-1] = '\0'; if (deflumpnum != LUMPERROR) diff --git a/src/g_demo.h b/src/g_demo.h index 2a0a0d170..d2e19617f 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -84,7 +84,6 @@ struct demovars_s { boolean recording, playback, timing; UINT16 version; // Current file format of the demo being played UINT8 attract; // Attract demo can be cancelled by any key - boolean rewinding; // Rewind in progress boolean loadfiles, ignorefiles; // Demo file loading options boolean quitafterplaying; // quit after playing a demo from cmdline @@ -188,11 +187,6 @@ void G_ConsAllGhostTics(void); void G_ConsGhostTic(INT32 playernum); void G_GhostTicker(void); -void G_InitDemoRewind(void); -void G_StoreRewindInfo(void); -void G_PreviewRewind(tic_t previewtime); -void G_ConfirmRewind(tic_t rewindtime); - struct DemoBufferSizes { size_t player_name; diff --git a/src/g_game.c b/src/g_game.c index 1dedf3833..f4e2d3feb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1247,7 +1247,7 @@ void G_StartTitleCard(void) // The title card has been disabled for this map. // Oh well. - if (demo.rewinding || !G_IsTitleCardAvailable()) + if (!G_IsTitleCardAvailable()) { WipeStageTitle = false; return; @@ -1439,13 +1439,7 @@ boolean G_Responder(event_t *ev) { paused = !paused; - if (demo.rewinding) - { - G_ConfirmRewind(leveltime); - paused = true; - S_PauseAudio(); - } - else if (paused) + if (paused) S_PauseAudio(); else S_ResumeAudio(); diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 61853ece5..a06a6fec1 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -6485,7 +6485,7 @@ void M_DrawPlaybackMenu(void) else if (currentMenu->menuitems[i].patch && W_CheckNumForName(currentMenu->menuitems[i].patch) != LUMPERROR) icon = W_CachePatchName(currentMenu->menuitems[i].patch, PU_CACHE); - if ((i == playback_fastforward && cv_playbackspeed.value > 1) || (i == playback_rewind && demo.rewinding)) + if ((i == playback_fastforward && cv_playbackspeed.value > 1)) V_DrawMappedPatch(currentMenu->x + currentMenu->menuitems[i].mvar1, currentMenu->y, V_SNAPTOTOP, icon, R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_JAWZ, GTC_MENUCACHE)); else V_DrawMappedPatch(currentMenu->x + currentMenu->menuitems[i].mvar1, currentMenu->y, V_SNAPTOTOP, icon, (i == itemOn) ? activemap : inactivemap); diff --git a/src/menus/transient/pause-replay.c b/src/menus/transient/pause-replay.c index 864344d91..7a63e65d1 100644 --- a/src/menus/transient/pause-replay.c +++ b/src/menus/transient/pause-replay.c @@ -151,7 +151,7 @@ static void M_PlaybackTick(void) playback_last_menu_interaction_leveltime = leveltime - 6*TICRATE; // Toggle items - if (paused && !demo.rewinding) + if (paused) { 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; @@ -204,34 +204,9 @@ void M_SetPlaybackMenuPointer(void) void M_PlaybackRewind(INT32 choice) { -#if 0 - static tic_t lastconfirmtime; - - (void)choice; - - if (!demo.rewinding) - { - if (paused) - { - G_ConfirmRewind(leveltime-1); - paused = true; - S_PauseAudio(); - } - else - demo.rewinding = paused = true; - } - else if (lastconfirmtime + TICRATE/2 < I_GetTime()) - { - lastconfirmtime = I_GetTime(); - G_ConfirmRewind(leveltime); - } - - CV_SetValue(&cv_playbackspeed, 1); -#else (void)choice; G_DoPlayDemo(NULL); // Restart the current demo M_ClearMenus(true); -#endif } void M_PlaybackPause(INT32 choice) @@ -240,13 +215,7 @@ void M_PlaybackPause(INT32 choice) paused = !paused; - if (demo.rewinding) - { - G_ConfirmRewind(leveltime); - paused = true; - S_PauseAudio(); - } - else if (paused) + if (paused) S_PauseAudio(); else S_ResumeAudio(); @@ -258,12 +227,6 @@ void M_PlaybackFastForward(INT32 choice) { (void)choice; - if (demo.rewinding) - { - G_ConfirmRewind(leveltime); - paused = false; - S_ResumeAudio(); - } CV_SetValue(&cv_playbackspeed, cv_playbackspeed.value == 1 ? 4 : 1); } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 3ad9d6a16..d6ceb5c19 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -8474,7 +8474,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) wipegamestate = gamestate; // Don't fade if reloading the gamestate // Encore mode fade to pink to white // This is handled BEFORE sounds are stopped. - else if (encoremode && !prevencoremode && modeattacking == ATTACKING_NONE && !demo.rewinding) + else if (encoremode && !prevencoremode && modeattacking == ATTACKING_NONE) { if (rendermode != render_none) { @@ -8545,7 +8545,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) // Let's fade to white here // But only if we didn't do the encore startup wipe - if (!demo.rewinding && !reloadinggamestate) + if (!reloadinggamestate) { int wipetype = wipe_level_toblack; diff --git a/src/p_tick.c b/src/p_tick.c index a29c01033..206cdaf4c 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -739,15 +739,7 @@ void P_Ticker(boolean run) // Check for pause or menu up in single player if (paused || P_AutoPause()) { - if (demo.rewinding && leveltime > 0) - { - leveltime = (leveltime-1) & ~3; - if (timeinmap > 0) - timeinmap = (timeinmap-1) & ~3; - G_PreviewRewind(leveltime); - } - else - P_RunChaseCameras(); // special case: allow freecam to MOVE during pause! + P_RunChaseCameras(); // special case: allow freecam to MOVE during pause! return; } @@ -1251,9 +1243,6 @@ void P_Ticker(boolean run) P_MapEnd(); - if (demo.playback) - G_StoreRewindInfo(); - for (i = 0; i < MAXPLAYERS; i++) { G_CopyTiccmd(&players[i].oldcmd, &players[i].cmd, 1); diff --git a/src/typedef.h b/src/typedef.h index 03ecea75d..3dfa9b8c0 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -76,7 +76,6 @@ TYPEDEF (plrconfig); TYPEDEF (filesneededconfig_pak); TYPEDEF (doomdata_t); TYPEDEF (serverelem_t); -TYPEDEF (rewind_t); TYPEDEF (clientkey_pak); TYPEDEF (serverchallenge_pak); TYPEDEF (challengeall_pak);