diff --git a/BizHawk.MultiClient/Rewind.cs b/BizHawk.MultiClient/Rewind.cs index e320a84dfb..0563c340d6 100644 --- a/BizHawk.MultiClient/Rewind.cs +++ b/BizHawk.MultiClient/Rewind.cs @@ -164,11 +164,17 @@ namespace BizHawk.MultiClient for (int i = 0; i < frames; i++) { if (RewindBuf.Count == 0 || (true == Global.MovieSession.Movie.Loaded && 0 == Global.MovieSession.Movie.LogLength())) + { return; + } if (LastState.Length < 0x10000) + { Rewind64K(); + } else + { RewindLarge(); + } } } diff --git a/BizHawk.MultiClient/movie/Movie.cs b/BizHawk.MultiClient/movie/Movie.cs index 5484053eaf..85ebd3e53c 100644 --- a/BizHawk.MultiClient/movie/Movie.cs +++ b/BizHawk.MultiClient/movie/Movie.cs @@ -108,6 +108,10 @@ namespace BizHawk.MultiClient public void RewindToFrame(int frame) { + if (Mode == MOVIEMODE.INACTIVE || Mode == MOVIEMODE.FINISHED) + { + return; + } if (frame <= Global.Emulator.Frame) { if (frame <= Log.StateFirstIndex()) @@ -126,15 +130,18 @@ namespace BizHawk.MultiClient } else { - if (0 == frame) + if (frame == 0) { Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Log.GetInitState()))); } else { //frame-1 because we need to go back an extra frame and then run a frame, otherwise the display doesn't get updated. - Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Log.GetState(frame - 1)))); - Global.MainForm.UpdateFrame = true; + if (frame - 1 < Log.StateCount) + { + Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Log.GetState(frame - 1)))); + Global.MainForm.UpdateFrame = true; + } } } } diff --git a/BizHawk.MultiClient/movie/MovieLog.cs b/BizHawk.MultiClient/movie/MovieLog.cs index c2ef5352ff..863ee6e85f 100644 --- a/BizHawk.MultiClient/movie/MovieLog.cs +++ b/BizHawk.MultiClient/movie/MovieLog.cs @@ -30,6 +30,7 @@ namespace BizHawk.MultiClient private byte[] InitState; //TODO: Make this size limit configurable by the user private int MaxStateRecordSize = 1024 * 1024 * 1024; //To limit memory usage. + public int StateCount { get { return StateRecords.Count; } } public MovieLog() { diff --git a/BizHawk.MultiClient/tools/TAStudio.cs b/BizHawk.MultiClient/tools/TAStudio.cs index 48fd0ed9f2..5d037dbb1e 100644 --- a/BizHawk.MultiClient/tools/TAStudio.cs +++ b/BizHawk.MultiClient/tools/TAStudio.cs @@ -357,7 +357,18 @@ namespace BizHawk.MultiClient private void RewindButton_Click(object sender, EventArgs e) { - Global.MovieSession.Movie.RewindToFrame(Global.Emulator.Frame - 1); + if (Global.MovieSession.Movie.Mode == MOVIEMODE.FINISHED || Global.MovieSession.Movie.Mode == MOVIEMODE.INACTIVE) + { + Global.MainForm.Rewind(1); + if (Global.Emulator.Frame <= Global.MovieSession.Movie.LogLength()) + { + Global.MovieSession.Movie.StartPlayback(); + } + } + else + { + Global.MovieSession.Movie.RewindToFrame(Global.Emulator.Frame - 1); + } UpdateValues(); }