From 5486acbbbc586eb5427d3bb317c01d4ede4b45be Mon Sep 17 00:00:00 2001 From: adelikat Date: Sat, 25 Aug 2012 22:18:54 +0000 Subject: [PATCH] Movies - fix a regression that happened at some point where the movie is not truncated on a loadstate that triggers record mode (instead it would keep the entire movie in the savestate and record over each frame, this would leave garbage data that could lead to potential desyncs) --- BizHawk.MultiClient/MainForm.Movie.cs | 25 ++++++++++++++++++++++--- BizHawk.MultiClient/MainForm.cs | 4 ++-- BizHawk.MultiClient/movie/Movie.cs | 3 ++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/BizHawk.MultiClient/MainForm.Movie.cs b/BizHawk.MultiClient/MainForm.Movie.cs index bdf873460f..e8f1c42e66 100644 --- a/BizHawk.MultiClient/MainForm.Movie.cs +++ b/BizHawk.MultiClient/MainForm.Movie.cs @@ -121,16 +121,20 @@ namespace BizHawk.MultiClient { //Note, some of the situations in these IF's may be identical and could be combined but I intentionally separated it out for clarity if (Global.MovieSession.Movie.Mode == MOVIEMODE.INACTIVE) + { return true; + } - if (Global.MovieSession.Movie.Mode == MOVIEMODE.RECORD) + else if (Global.MovieSession.Movie.Mode == MOVIEMODE.RECORD) { if (ReadOnly) { if (!Global.MovieSession.Movie.CheckTimeLines(path, false)) + { return false; //Timeline/GUID error + } else { Global.MovieSession.Movie.WriteMovie(); @@ -141,22 +145,29 @@ namespace BizHawk.MultiClient else { if (!Global.MovieSession.Movie.CheckTimeLines(path, true)) + { return false; //GUID Error + } Global.MovieSession.Movie.LoadLogFromSavestateText(path); } } + else if (Global.MovieSession.Movie.Mode == MOVIEMODE.PLAY) { if (ReadOnly) { if (!Global.MovieSession.Movie.CheckTimeLines(path, false)) + { return false; //Timeline/GUID error + } //Frame loop automatically handles the rewinding effect based on Global.Emulator.Frame so nothing else is needed here } else { if (!Global.MovieSession.Movie.CheckTimeLines(path, true)) + { return false; //GUID Error + } Global.MovieSession.Movie.ResumeRecording(); SetMainformMovieInfo(); Global.MovieSession.Movie.LoadLogFromSavestateText(path); @@ -168,9 +179,13 @@ namespace BizHawk.MultiClient { { if (!Global.MovieSession.Movie.CheckTimeLines(path, false)) + { return false; //Timeline/GUID error - if (Global.MovieSession.Movie.Mode == MOVIEMODE.FINISHED) + } + else if (Global.MovieSession.Movie.Mode == MOVIEMODE.FINISHED) //TimeLine check can change a movie to finished, hence the check here (not a good design) + { Global.MovieSession.LatchInputFromPlayer(Global.MovieInputSourceAdapter); + } else { Global.MovieSession.Movie.StartPlayback(); @@ -182,9 +197,13 @@ namespace BizHawk.MultiClient { { if (!Global.MovieSession.Movie.CheckTimeLines(path, true)) + { return false; //GUID Error - if (Global.MovieSession.Movie.Mode == MOVIEMODE.FINISHED) + } + else if (Global.MovieSession.Movie.Mode == MOVIEMODE.FINISHED) + { Global.MovieSession.LatchInputFromPlayer(Global.MovieInputSourceAdapter); + } else { Global.MovieSession.Movie.StartNewRecording(); diff --git a/BizHawk.MultiClient/MainForm.cs b/BizHawk.MultiClient/MainForm.cs index b79bca675f..36678c0456 100644 --- a/BizHawk.MultiClient/MainForm.cs +++ b/BizHawk.MultiClient/MainForm.cs @@ -1944,7 +1944,7 @@ namespace BizHawk.MultiClient if (-1 != StopOnFrame && StopOnFrame == Global.Emulator.Frame + 1) { - if(StopOnFrame == Global.MovieSession.Movie.LogLength()) + if (StopOnFrame == Global.MovieSession.Movie.LogLength()) { Global.MovieSession.Movie.SetMovieFinished(); } @@ -1953,7 +1953,7 @@ namespace BizHawk.MultiClient PauseEmulator(); StopOnFrame = -1; } - if(true == RestoreReadWriteOnStop) + if (RestoreReadWriteOnStop == true) { Global.MovieSession.Movie.Mode = MOVIEMODE.RECORD; RestoreReadWriteOnStop = false; diff --git a/BizHawk.MultiClient/movie/Movie.cs b/BizHawk.MultiClient/movie/Movie.cs index 716c06c7bd..04b8e91faf 100644 --- a/BizHawk.MultiClient/movie/Movie.cs +++ b/BizHawk.MultiClient/movie/Movie.cs @@ -529,7 +529,8 @@ namespace BizHawk.MultiClient } if (stateFrame > 0 && stateFrame < Log.MovieLength()) { - Log.TruncateStates(Global.Emulator.Frame); + Log.TruncateStates(stateFrame); + Log.TruncateMovie(stateFrame); } IncrementRerecords(); reader.Close();