diff --git a/BizHawk.Client.Common/movie/HeaderKeys.cs b/BizHawk.Client.Common/movie/HeaderKeys.cs index 25b4486624..e38abe18e5 100644 --- a/BizHawk.Client.Common/movie/HeaderKeys.cs +++ b/BizHawk.Client.Common/movie/HeaderKeys.cs @@ -14,6 +14,7 @@ namespace BizHawk.Client.Common public const string AUTHOR = "Author"; public const string RERECORDS = "rerecordCount"; public const string STARTSFROMSAVESTATE = "StartsFromSavestate"; + public const string SAVESTATEBINARYBASE64BLOB = "SavestateBinaryBase64Blob"; //this string will not contain base64: ; it's implicit (this is to avoid another big string op to dice off the base64: substring) public const string FOURSCORE = "FourScore"; public const string SHA1 = "SHA1"; public const string FIRMWARESHA1 = "FirmwareSHA1"; diff --git a/BizHawk.Client.Common/movie/IMovieHeader.cs b/BizHawk.Client.Common/movie/IMovieHeader.cs index d0672d6459..62c4043dce 100644 --- a/BizHawk.Client.Common/movie/IMovieHeader.cs +++ b/BizHawk.Client.Common/movie/IMovieHeader.cs @@ -10,6 +10,7 @@ namespace BizHawk.Client.Common ulong Rerecords { get; set; } bool StartsFromSavestate { get; set; } + string SavestateBinaryBase64Blob { get; set; } string GameName { get; set; } string SystemID { get; set; } diff --git a/BizHawk.Client.Common/movie/Movie.cs b/BizHawk.Client.Common/movie/Movie.cs index 6845a6a36d..096368fc43 100644 --- a/BizHawk.Client.Common/movie/Movie.cs +++ b/BizHawk.Client.Common/movie/Movie.cs @@ -211,6 +211,7 @@ namespace BizHawk.Client.Common /// /// Load Header information only for displaying file information in dialogs such as play movie + /// TODO - consider not loading the SavestateBinaryBase64Blob key? /// public bool PreLoadText(HawkFile hawkFile) { diff --git a/BizHawk.Client.Common/movie/MovieHeader.cs b/BizHawk.Client.Common/movie/MovieHeader.cs index 4b744e56c4..c0fb905f76 100644 --- a/BizHawk.Client.Common/movie/MovieHeader.cs +++ b/BizHawk.Client.Common/movie/MovieHeader.cs @@ -23,6 +23,18 @@ namespace BizHawk.Client.Common public Dictionary BoardProperties { get; private set; } public SubtitleList Subtitles { get; private set; } + public string SavestateBinaryBase64Blob + { + get { + if (ContainsKey(HeaderKeys.SAVESTATEBINARYBASE64BLOB)) return this[HeaderKeys.SAVESTATEBINARYBASE64BLOB]; + else return null; + } + set { + if (value == null) Remove(HeaderKeys.SAVESTATEBINARYBASE64BLOB); + else Add(HeaderKeys.SAVESTATEBINARYBASE64BLOB, value); + } + } + public ulong Rerecords { get diff --git a/BizHawk.Client.EmuHawk/MainForm.Movie.cs b/BizHawk.Client.EmuHawk/MainForm.Movie.cs index 274706083b..5fb2487cc1 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Movie.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Movie.cs @@ -93,7 +93,8 @@ namespace BizHawk.Client.EmuHawk if (Global.MovieSession.Movie.Header.StartsFromSavestate) { - LoadState(Global.MovieSession.Movie.Filename, Path.GetFileName(Global.MovieSession.Movie.Filename)); + byte[] state = Convert.FromBase64String(Global.MovieSession.Movie.Header.SavestateBinaryBase64Blob); + Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state))); Global.Emulator.ResetCounters(); } diff --git a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs index e96204afd8..3bad987585 100644 --- a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs +++ b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs @@ -81,23 +81,11 @@ namespace BizHawk.Client.EmuHawk } _movieToRecord = new Movie(path, startsFromSavestate: true); - var temppath = path; - var writer = new StreamWriter(temppath); - Global.Emulator.SaveStateText(writer); - writer.Close(); - - var file = new FileInfo(temppath); - using (var sr = file.OpenText()) - { - string str; - while ((str = sr.ReadLine()) != null) - { - if (!String.IsNullOrWhiteSpace(str)) - { - _movieToRecord.Header.Comments.Add(str); - } - } - } + //TODO - some emulators (c++ cores) are just returning a hex string already + //theres no sense hexifying those again. we need to record that fact in the IEmulator somehow + var bytestate = Global.Emulator.SaveStateBinary(); + string stringstate = Convert.ToBase64String(bytestate); + _movieToRecord.Header.SavestateBinaryBase64Blob = stringstate; } else {