diff --git a/BizHawk.Client.Common/movie/MovieService.cs b/BizHawk.Client.Common/movie/MovieService.cs index 981cd68cd4..8cd4cf2b84 100644 --- a/BizHawk.Client.Common/movie/MovieService.cs +++ b/BizHawk.Client.Common/movie/MovieService.cs @@ -19,7 +19,7 @@ namespace BizHawk.Client.Common if (Path.GetExtension(path).EndsWith("bkm")) { var bkm = new BkmMovie(path); - bkm.Load(); + bkm.Load(false); // Hackery to fix how things used to work if (bkm.SystemID == "GBC") diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs index 196fcfedb3..57e8be4bb7 100644 --- a/BizHawk.Client.Common/movie/MovieSession.cs +++ b/BizHawk.Client.Common/movie/MovieSession.cs @@ -182,7 +182,7 @@ namespace BizHawk.Client.Common public bool MovieLoad() { MovieControllerAdapter = Movie.LogGeneratorInstance().MovieControllerAdapter; - return Movie.Load(); + return Movie.Load(false); } public void StopMovie(bool saveChanges = true) @@ -463,7 +463,7 @@ namespace BizHawk.Client.Common { if (!record) // The semantics of record is that we are starting a new movie, and even wiping a pre-existing movie with the same path, but non-record means we are loading an existing movie into playback mode { - movie.Load(); + movie.Load(false); if (movie.SystemID != emulator.SystemId) { throw new MoviePlatformMismatchException( diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs index c70783acde..396f6239f8 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs @@ -32,7 +32,7 @@ namespace BizHawk.Client.Common Write(backupName); } - public virtual bool Load() + public virtual bool Load(bool preload) { var file = new FileInfo(Filename); if (!file.Exists) @@ -158,7 +158,6 @@ namespace BizHawk.Client.Common public bool PreLoadHeaderAndLength(HawkFile hawkFile) { - // For now, preload simply loads everything var file = new FileInfo(Filename); if (!file.Exists) { @@ -166,7 +165,7 @@ namespace BizHawk.Client.Common } Filename = file.FullName; - return Load(); + return Load(true); } protected virtual void Write(string fn) diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs index a8f1be0f29..f104de55de 100644 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs +++ b/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs @@ -58,7 +58,7 @@ namespace BizHawk.Client.Common Write(backupName); } - public bool Load() + public bool Load(bool preload) { var file = new FileInfo(Filename); diff --git a/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs b/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs index efa950ef25..616ce7e57c 100644 --- a/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs +++ b/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs @@ -34,6 +34,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions } var tas = new TasMovie(newFilename, old.StartsFromSavestate); + tas.TasStateManager.MountWriteAccess(); for (var i = 0; i < old.InputLogLength; i++) { diff --git a/BizHawk.Client.Common/movie/import/MovieImport.cs b/BizHawk.Client.Common/movie/import/MovieImport.cs index 97c42ff241..3be588f999 100644 --- a/BizHawk.Client.Common/movie/import/MovieImport.cs +++ b/BizHawk.Client.Common/movie/import/MovieImport.cs @@ -140,7 +140,7 @@ namespace BizHawk.Client.Common break; case ".BKM": m.Filename = path; - m.Load(); + m.Load(false); break; } } diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs index bbe78438c8..d6edda3e0a 100644 --- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ b/BizHawk.Client.Common/movie/interfaces/IMovie.cs @@ -99,7 +99,7 @@ namespace BizHawk.Client.Common /// Tells the movie to load the contents of Filename /// /// Return whether or not the file was successfully loaded - bool Load(); + bool Load(bool preload); /// /// Instructs the movie to save the current contents to Filename diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index b655c02647..fe8dbf7d9b 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -107,7 +107,7 @@ namespace BizHawk.Client.Common Changes = false; } - public override bool Load() + public override bool Load(bool preload) { var file = new FileInfo(Filename); if (!file.Exists) @@ -221,16 +221,20 @@ namespace BizHawk.Client.Common StateManager.Settings.PopulateFromString(tr.ReadToEnd()); }); - if (StateManager.Settings.SaveStateHistory) + if(!preload) { - bl.GetLump(BinaryStateLump.StateHistory, false, delegate(BinaryReader br, long length) + if (StateManager.Settings.SaveStateHistory) { - StateManager.Load(br); - }); + bl.GetLump(BinaryStateLump.StateHistory, false, delegate(BinaryReader br, long length) + { + StateManager.Load(br); + }); + } + + // Movie should always have a state at frame 0. + if (!this.StartsFromSavestate) + StateManager.Capture(); } - // Movie should always have a state at frame 0. - if (!this.StartsFromSavestate) - StateManager.Capture(); bl.GetLump(BinaryStateLump.Markers, false, delegate(TextReader tr) { diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index 2e155a7db4..8b3d29f8d1 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -36,7 +36,7 @@ namespace BizHawk.Client.Common } private Guid guid = Guid.NewGuid(); - private readonly SortedList States = new SortedList(); + private SortedList States = new SortedList(); private string statePath { get @@ -46,6 +46,7 @@ namespace BizHawk.Client.Common } } + private bool _isMountedForWrite; private readonly TasMovie _movie; private ulong _expectedStateSize = 0; @@ -80,6 +81,25 @@ namespace BizHawk.Client.Common Settings = new TasStateManagerSettings(Global.Config.DefaultTasProjSettings); + accessed = new List(); + } + + /// + /// Mounts this instance for write access. Prior to that it's read-only + /// + public void MountWriteAccess() + { + if (_isMountedForWrite) + return; + + _isMountedForWrite = true; + + if (Directory.Exists(statePath)) + { + Directory.Delete(statePath, true); // To delete old files that may still exist. + } + Directory.CreateDirectory(statePath); + int limit = 0; _expectedStateSize = (ulong)Core.SaveStateBinary().Length; @@ -90,20 +110,6 @@ namespace BizHawk.Client.Common } States = new SortedList(limit); - - accessed = new List(); - } - - /// - /// Mounts this instance for write access. Prior to that it's read-only - /// - public void MountWriteAccess() - { - if (Directory.Exists(statePath)) - { - Directory.Delete(statePath, true); // To delete old files that may still exist. - } - Directory.CreateDirectory(statePath); } public TasStateManagerSettings Settings { get; set; } diff --git a/BizHawk.Client.EmuHawk/MainForm.Movie.cs b/BizHawk.Client.EmuHawk/MainForm.Movie.cs index 076dbc1bb2..5843066a6a 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Movie.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Movie.cs @@ -30,6 +30,9 @@ namespace BizHawk.Client.EmuHawk try { + var tasmovie = (movie as TasMovie); + if (tasmovie != null) + tasmovie.TasStateManager.MountWriteAccess(); Global.MovieSession.QueueNewMovie(movie, record, Global.Emulator); } catch (MoviePlatformMismatchException ex) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index bd74a44af8..31b18b964f 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -407,7 +407,7 @@ namespace BizHawk.Client.EmuHawk CurrentTasMovie.Filename = file.FullName; try { - CurrentTasMovie.Load(); + CurrentTasMovie.Load(false); } catch {