Skip to content

Commit ce8b45e

Browse files
committed
make savestates on markers optional, per marker
1 parent 7213734 commit ce8b45e

8 files changed

Lines changed: 76 additions & 11 deletions

File tree

src/BizHawk.Client.Common/movie/tasproj/TasMovie.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ public bool IsReserved(int frame)
326326
// Why the frame before?
327327
// because we always navigate to the frame before and emulate 1 frame so that we ensure a proper frame buffer on the screen
328328
// users want instant navigation to markers, so to do this, we need to reserve the frame before the marker, not the marker itself
329-
return Markers.Exists(m => m.Frame - 1 == frame)
329+
return Markers.Exists(m => m.WantsState && m.Frame - 1 == frame)
330330
|| Branches.Any(b => b.Frame == frame); // Branches should already be in the reserved list, but it doesn't hurt to check
331331
}
332332

src/BizHawk.Client.Common/movie/tasproj/TasMovieMarker.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,17 @@ public TasMovieMarker(string line)
2626
{
2727
var split = line.Split('\t');
2828
Frame = int.Parse(split[0]);
29-
Message = split[1];
29+
WantsState = bool.Parse(split[1]);
30+
Message = split[2];
3031
}
3132

3233
public int Frame { get; private set; }
3334

3435
public string Message { get; set; }
3536

36-
public override string ToString() => Frame.ToString() + '\t' + Message;
37+
public bool WantsState { get; set; } = true;
38+
39+
public override string ToString() => $"{Frame}\t{WantsState}\t{Message}";
3740

3841
public override int GetHashCode() => Frame.GetHashCode();
3942

src/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.Designer.cs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
using System.ComponentModel;
1+
using System.ComponentModel;
22
using System.Drawing;
33
using System.Linq;
44
using System.Windows.Forms;
55

66
using BizHawk.Client.Common;
77
using BizHawk.Client.EmuHawk.Properties;
8+
using BizHawk.Emulation.Common;
89

910
namespace BizHawk.Client.EmuHawk
1011
{
1112
public partial class MarkerControl : UserControl, IDialogParent
1213
{
14+
private static string SAVESTATE_COL_NAME = "Savestate";
15+
1316
public TAStudio Tastudio { get; set; }
1417
public TasMovieMarkerList Markers => Tastudio.CurrentTasMovie.Markers;
1518

@@ -50,6 +53,7 @@ private void SetupColumns()
5053
{
5154
MarkerView.AllColumns.Clear();
5255
MarkerView.AllColumns.Add(new(name: "FrameColumn", widthUnscaled: 52, text: "Frame"));
56+
MarkerView.AllColumns.Add(new(name: SAVESTATE_COL_NAME, widthUnscaled: 24, text: "State"));
5357
MarkerView.AllColumns.Add(new(name: "LabelColumn", widthUnscaled: 125, text: string.Empty));
5458
}
5559

@@ -72,16 +76,16 @@ private void MarkerView_QueryItemBkColor(InputRoll sender, int index, RollColumn
7276
}
7377
else if (Tastudio.CurrentTasMovie.LagLog[marker.Frame + 1] is bool lagged)
7478
{
75-
if (lagged)
79+
if (column.Name == "FrameColumn")
7680
{
77-
color = column.Name == "FrameColumn"
81+
color = lagged
7882
? Tastudio.Palette.LagZone_FrameCol
79-
: Tastudio.Palette.LagZone_InputLog;
83+
: Tastudio.Palette.GreenZone_FrameCol;
8084
}
8185
else
8286
{
83-
color = column.Name == "LabelColumn"
84-
? Tastudio.Palette.GreenZone_FrameCol
87+
color = lagged
88+
? Tastudio.Palette.LagZone_InputLog
8589
: Tastudio.Palette.GreenZone_InputLog;
8690
}
8791
}
@@ -97,13 +101,26 @@ private void MarkerView_QueryItemText(InputRoll sender, int index, RollColumn co
97101
return;
98102
}
99103

104+
TasMovieMarker marker = Markers[index];
100105
if (column.Name == "FrameColumn")
101106
{
102-
text = Markers[index].Frame.ToString();
107+
text = marker.Frame.ToString();
103108
}
104109
else if (column.Name == "LabelColumn")
105110
{
106-
text = Markers[index].Message;
111+
text = marker.Message;
112+
}
113+
else if (column.Name == SAVESTATE_COL_NAME)
114+
{
115+
if (marker.WantsState)
116+
{
117+
bool hasState = marker.Frame == 0 || Tastudio.CurrentTasMovie.TasStateManager.HasState(marker.Frame - 1);
118+
text = hasState ? "✔" : "!";
119+
}
120+
else
121+
{
122+
text = "";
123+
}
107124
}
108125
}
109126

@@ -188,6 +205,7 @@ public void AddMarker(int frame, bool editText = false)
188205
{
189206
marker = new TasMovieMarker(frame);
190207
}
208+
marker.WantsState = Tastudio.Settings.StatesForMarkers;
191209

192210
UpdateValues();
193211
Markers.Add(marker);
@@ -285,5 +303,24 @@ private void MarkerView_MouseDoubleClick(object sender, EventArgs e)
285303
{
286304
if (MarkerView.AnyRowsSelected) Tastudio.GoToFrame(FirstSelectedMarker.Frame);
287305
}
306+
307+
private void MarkerView_MouseDown(object sender, MouseEventArgs e)
308+
{
309+
Cell cell = MarkerView.CurrentCell;
310+
if (cell == null || cell.RowIndex < 0 || cell.RowIndex >= Markers.Count) return;
311+
if (cell.Column.Name != SAVESTATE_COL_NAME) return;
312+
313+
TasMovieMarker marker = Markers[cell.RowIndex.Value];
314+
marker.WantsState = !marker.WantsState;
315+
if (!marker.WantsState)
316+
{
317+
Tastudio.CurrentTasMovie.TasStateManager.Unreserve(marker.Frame - 1);
318+
}
319+
else if (Tastudio.Emulator.Frame == marker.Frame - 1)
320+
{
321+
Tastudio.CurrentTasMovie.TasStateManager.Capture(marker.Frame - 1, Tastudio.Emulator.AsStatable());
322+
}
323+
Tastudio.RefreshDialog();
324+
}
288325
}
289326
}

src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ public TAStudioSettings()
143143
public int RewindStep { get; set; } = 1;
144144
public int RewindStepFast { get; set; } = 4;
145145
public bool ScrollSync { get; set; } = true;
146+
public bool StatesForMarkers { get; set; } = true;
146147
public PatternPaintModeEnum PatternPaintMode { get; set; } = TAStudioSettings.PatternPaintModeEnum.Never;
147148
public PatternSelectionEnum PatternSelection { get; set; } = TAStudioSettings.PatternSelectionEnum.Hold;
148149
public Font TasViewFont { get; set; } = new Font("Arial", 8.25F, FontStyle.Bold, GraphicsUnit.Point, 0);

src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioSettingsForm.Designer.cs

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioSettingsForm.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ private void TAStudioSettingsForm_Load(object sender, EventArgs e)
101101
RewindNum.Value = _settings.GeneralClientSettings.RewindStep;
102102
FastRewindNum.Value = _settings.GeneralClientSettings.RewindStepFast;
103103
ScrollSpeedNum.Value = _settings.GeneralClientSettings.ScrollSpeed;
104+
StatesForMarkersCheckbox.Checked = _settings.GeneralClientSettings.StatesForMarkers;
104105

105106
// patterns
106107
foreach (var button in _controllerDef.BoolButtons)
@@ -502,6 +503,7 @@ private void ApplyButton_Click(object sender, EventArgs e)
502503
_settings.GeneralClientSettings.MaxUndoSteps = (int)UndoCountNum.Value;
503504
_settings.GeneralClientSettings.RewindStep = (int)RewindNum.Value;
504505
_settings.GeneralClientSettings.RewindStepFast = (int)FastRewindNum.Value;
506+
_settings.GeneralClientSettings.StatesForMarkers = StatesForMarkersCheckbox.Checked;
505507

506508
if (ScrollToViewRadio.Checked) _settings.GeneralClientSettings.FollowCursorScrollMethod = "near";
507509
else if (ScrollToTopRadio.Checked) _settings.GeneralClientSettings.FollowCursorScrollMethod = "top";

src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudioSettingsForm.resx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,13 @@ And when "Recording mode" is on, the movie will be truncated at the branch frame
124124
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
125125
<value>17, 17</value>
126126
</metadata>
127+
<data name="StatesForMarkersCheckbox.ToolTip" xml:space="preserve">
128+
<value>TAStudio can automatically keep savestates for each marker.
129+
If this is enabled, new markers will have savestates enabled by default.
130+
Note: The savestate needs to be on the frame before the marker, so TAStudio
131+
can run 1 frame after loading the state to get a video frame. Thus, making a
132+
marker on the current frame will not automatically create a state.</value>
133+
</data>
127134
<data name="EditInvisibleColumnsCheckbox.ToolTip" xml:space="preserve">
128135
<value>When disabled, inputs that are not visible on the active input roll cannot be edited.
129136
This allows you to, for example, insert and delete frames on a roll with player 1's inputs

0 commit comments

Comments
 (0)