TAStudio - when creating a power-on movie make a savestate on frame 0, if starting from savestate, use the savestate from the movie as frame 0 in the greenzone

This commit is contained in:
adelikat 2014-07-17 18:21:12 +00:00
parent c571d07069
commit 103de3d34f
3 changed files with 31 additions and 5 deletions

View File

@ -12,13 +12,14 @@ namespace BizHawk.Client.Common
public sealed partial class TasMovie : Bk2Movie
{
private List<bool> LagLog = new List<bool>();
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;
}
}
/// <summary>
/// Captures the current frame into the greenzone
/// </summary>
public void CaptureCurrentState()
{
StateManager.Capture();
}
}
}

View File

@ -15,8 +15,11 @@ namespace BizHawk.Client.Common
{
private readonly SortedDictionary<int, byte[]> States = new SortedDictionary<int, byte[]>();
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];

View File

@ -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();