be more careful with using gapFiller, it's important that the state not get out of order
This commit is contained in:
parent
e98a12eaa3
commit
b4d89da5d3
|
@ -356,6 +356,16 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
private void CaptureGap(int frame, IStatable source)
|
private void CaptureGap(int frame, IStatable source)
|
||||||
{
|
{
|
||||||
|
// We need to do this here for the following scenario
|
||||||
|
// We are currently far enough in the game that there is a large "ancient interval" section
|
||||||
|
// The user navigates to a frame after ancient interval 2, replay happens and we start filling gaps
|
||||||
|
// Then the user, still without having made an edit, navigates to a frame before ancient interval 2, but after ancient interval 1
|
||||||
|
// Without this logic, we end up with out of order states
|
||||||
|
if (_gapFiller.Count > 0 && frame < GapStates().First().Frame)
|
||||||
|
{
|
||||||
|
InvalidateGaps(frame);
|
||||||
|
}
|
||||||
|
|
||||||
_gapFiller.Capture(
|
_gapFiller.Capture(
|
||||||
frame, s =>
|
frame, s =>
|
||||||
{
|
{
|
||||||
|
@ -395,8 +405,12 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
for (var i = 0; i < _gapFiller.Count; i++)
|
for (var i = 0; i < _gapFiller.Count; i++)
|
||||||
{
|
{
|
||||||
if (_gapFiller.GetState(i).Frame > frame)
|
var state = _gapFiller.GetState(i);
|
||||||
|
if (state.Frame > frame)
|
||||||
{
|
{
|
||||||
|
var last = GapStates().First();
|
||||||
|
StateCache.RemoveWhere(s => s >= state.Frame && s <= last.Frame); // TODO: be consistent, other invalidate methods do not touch cache and it is addressed in the public InvalidateAfter
|
||||||
|
|
||||||
_gapFiller.InvalidateEnd(i);
|
_gapFiller.InvalidateEnd(i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue