diff --git a/src/BizHawk.Client.Common/movie/tasproj/ZwinderStateManager.cs b/src/BizHawk.Client.Common/movie/tasproj/ZwinderStateManager.cs
index 31cb2ce487..ba12abd5c2 100644
--- a/src/BizHawk.Client.Common/movie/tasproj/ZwinderStateManager.cs
+++ b/src/BizHawk.Client.Common/movie/tasproj/ZwinderStateManager.cs
@@ -251,14 +251,13 @@ namespace BizHawk.Client.Common
}
///
- /// Enumerate all states in reverse order
+ /// Enumerate all states in the following order: current -> recent -> gap -> reserved states
///
internal IEnumerable AllStates()
{
return CurrentAndRecentStates()
.Concat(GapStates())
- .Concat(ReservedStates())
- .OrderByDescending(s => s.Frame);
+ .Concat(ReservedStates());
}
public int Last => StateCache.Max();
@@ -474,8 +473,15 @@ namespace BizHawk.Client.Common
if (frame < 0)
throw new ArgumentOutOfRangeException(nameof(frame));
- var si = AllStates().First(s => s.Frame <= frame);
- return new KeyValuePair(si.Frame, si.Read());
+ StateInfo closestState = null;
+ foreach (var state in AllStates())
+ {
+ if (state.Frame <= frame && (closestState is null || state.Frame > closestState.Frame))
+ {
+ closestState = state;
+ }
+ }
+ return new KeyValuePair(closestState!.Frame, closestState.Read());
}
public bool HasState(int frame)