diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs index 0b40d86d3f..904be47c83 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs @@ -12,13 +12,14 @@ namespace BizHawk.Client.Common public sealed partial class TasMovie : Bk2Movie { private List LagLog = new List(); - private readonly TasStateManager StateManager = new TasStateManager(); + private readonly TasStateManager StateManager; public TasMovie(string path) : base(path) { } public TasMovie() : base() { + StateManager = new TasStateManager(this); Header[HeaderKeys.MOVIEVERSION] = "BizHawk v2.0 Tasproj v1.0"; Markers = new TasMovieMarkerList(); Markers.Add(0, StartsFromSavestate ? "Savestate" : "Power on"); @@ -229,5 +230,13 @@ namespace BizHawk.Client.Common return 0; } } + + /// + /// Captures the current frame into the greenzone + /// + public void CaptureCurrentState() + { + StateManager.Capture(); + } } } diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index e2285d973d..0fa52ef981 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -15,8 +15,11 @@ namespace BizHawk.Client.Common { private readonly SortedDictionary States = new SortedDictionary(); - public TasStateManager() + private readonly TasMovie _movie; + + public TasStateManager(TasMovie movie) { + _movie = movie; Settings = new ManagerSettings(); } @@ -31,6 +34,11 @@ namespace BizHawk.Client.Common { get { + if (frame == 0 && _movie.StartsFromSavestate) + { + return _movie.BinarySavestate; + } + if (States.ContainsKey(frame)) { return States[frame]; diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 0cfc8b1c18..1ece200f86 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -125,6 +125,7 @@ namespace BizHawk.Client.EmuHawk { NewTasMovie(); GlobalWin.MainForm.StartNewMovie(_tas, record: true); + _tas.CaptureCurrentState(); } EngageTastudio(); @@ -289,11 +290,19 @@ namespace BizHawk.Client.EmuHawk // If in greenzone, loadstate // If near a greenzone item, load and emulate // Do capturing and recording as needed - if (_tas[frame - 1].HasState) // Go back 1 frame and emulate + + var goToFrame = frame == 0 ? 0 : frame - 1; + + if (_tas[goToFrame].HasState) // Go back 1 frame and emulate { _tas.SwitchToPlay(); - Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(_tas[frame].State.ToArray()))); - Global.Emulator.FrameAdvance(true); + Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(_tas[goToFrame].State.ToArray()))); + + if (goToFrame > 0) // We can't emulate up to frame 0! + { + Global.Emulator.FrameAdvance(true); + } + GlobalWin.DisplayManager.NeedsToPaint = true; TasView.ensureVisible(frame); RefreshDialog();