Feature: Option for TAStudio to only save states on marker frames.

This commit is contained in:
SuuperW 2025-05-27 21:20:51 -05:00
parent e4bd1f2daf
commit ea52e2ea9f
3 changed files with 48 additions and 0 deletions

View File

@ -622,6 +622,25 @@ namespace BizHawk.Client.Common
toSave.Add(si);
}
bw.Write(toSave.Count);
for (int i = 0; i < toSave.Count; i++)
{
bw.Write(toSave[i].Frame);
bw.Write(toSave[i].Size);
toSave[i].Read().CopyTo(bw.BaseStream);
}
}
else if (Settings.StatesToSave == ZwinderStateManagerSettings.States.MarkersOnly)
{
// Some states that should be reserved via marker might be in a ring buffer but not yet in _reserved.
List<StateInfo> allStates = AllStates().ToList();
List<StateInfo> toSave = new();
for (int i = 0; i < allStates.Count; i++)
{
if (_reserveCallback(allStates[i].Frame))
toSave.Add(allStates[i]);
}
bw.Write(toSave.Count);
for (int i = 0; i < toSave.Count; i++)
{

View File

@ -116,6 +116,8 @@ namespace BizHawk.Client.Common
All,
[Display(Name = "Reserved Only")]
ReservedOnly,
[Display(Name = "Markers Only")]
MarkersOnly,
None,
}

View File

@ -685,6 +685,33 @@ namespace BizHawk.Tests.Client.Common.Movie
}
}
[TestMethod]
public void TestKeepsMarkersOnSave()
{
const int markerFrame = 15;
IStatable ss = CreateStateSource();
ZwinderStateManager manager = new ZwinderStateManager(new(), f => f == markerFrame);
manager.Settings.StatesToSave = ZwinderStateManagerSettings.States.MarkersOnly;
var ms = new MemoryStream();
ss.SaveStateBinary(new BinaryWriter(ms));
manager.Engage(ms.ToArray());
// Simulate playing movie.
int endFrame = markerFrame;
for (int i = 0; i <= endFrame; i++)
manager.Capture(i, ss);
// Simulate save and load
MemoryStream stream = new();
manager.SaveStateHistory(new(stream));
stream.Seek(0, SeekOrigin.Begin);
ZwinderStateManager loadedManager = ZwinderStateManager.Create(new(stream), manager.Settings, (f) => false);
// ASSERT: The only state saved is the maker frame.
Assert.AreEqual(1, loadedManager.AllStates().Count(), "Expected only two states in saved tasproj.");
Assert.IsTrue(loadedManager.HasState(markerFrame));
}
private class StateSource : IStatable
{
public int Frame { get; set; }