From 27f141a7a55be114314913d94800119ea4232c8f Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Mon, 14 Jul 2025 08:09:25 -0700 Subject: [PATCH] fix some bugs with replays and rewinding - rewinding past the start clobbers part of the header - during recording & rewind, should not push input events - during recording or playback, getting to the end of the rewind buffer should not halt the movie --- input/input_driver.c | 10 ++++++++-- state_manager.c | 12 +++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 8c912961d5..7a910fb22b 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -5985,8 +5985,8 @@ void bsv_movie_frame_rewind(void) /* If recording, we simply reset * the starting point. Nice and easy. */ - intfstream_seek(handle->file, 4 * sizeof(uint32_t), SEEK_SET); - intfstream_truncate(handle->file, 4 * sizeof(uint32_t)); + intfstream_seek(handle->file, 6 * sizeof(uint32_t), SEEK_SET); + intfstream_truncate(handle->file, 6 * sizeof(uint32_t)); serial_info.data = handle->state; serial_info.size = handle->state_size; @@ -6878,6 +6878,9 @@ int16_t input_driver_state_wrapper(unsigned port, unsigned device, #ifdef HAVE_BSV_MOVIE /* Save input to BSV record, if enabled */ if (BSV_MOVIE_IS_RECORDING()) +#ifdef HAVE_REWIND + if (!state_manager_frame_is_reversed()) +#endif bsv_movie_handle_push_input_event( input_st->bsv_movie_state_handle, port, @@ -7701,6 +7704,9 @@ void input_keyboard_event(bool down, unsigned code, #ifdef HAVE_BSV_MOVIE /* Save input to BSV record, if recording */ if (BSV_MOVIE_IS_RECORDING()) +#ifdef HAVE_REWIND + if (!state_manager_frame_is_reversed()) +#endif bsv_movie_handle_push_key_event( input_st->bsv_movie_state_handle, down, mod, code, character); diff --git a/state_manager.c b/state_manager.c index 54c3746141..b85411c4b0 100644 --- a/state_manager.c +++ b/state_manager.c @@ -776,7 +776,17 @@ bool state_manager_check_rewind( } else { - content_deserialize_state(buf, rewind_st->size); + input_driver_state_t *input_st = input_state_get_ptr(); +#ifdef HAVE_BSV_MOVIE + /* Don't end reversing during playback or recording */ + if(BSV_MOVIE_IS_PLAYBACK_ON() || BSV_MOVIE_IS_RECORDING()) + { + rewind_st->flags |= STATE_MGR_REWIND_ST_FLAG_FRAME_IS_REVERSED; + bsv_movie_frame_rewind(); + } + else +#endif + content_deserialize_state(buf, rewind_st->size); #ifdef HAVE_NETWORKING /* Tell netplay we're done */