TasMovie - more reorg and restore state and lag capturing
This commit is contained in:
parent
c019ec3bf0
commit
6d61db045f
|
@ -166,8 +166,10 @@
|
||||||
<Compile Include="movie\PlatformFrameRates.cs" />
|
<Compile Include="movie\PlatformFrameRates.cs" />
|
||||||
<Compile Include="movie\Subtitle.cs" />
|
<Compile Include="movie\Subtitle.cs" />
|
||||||
<Compile Include="movie\SubtitleList.cs" />
|
<Compile Include="movie\SubtitleList.cs" />
|
||||||
|
<Compile Include="movie\tasproj\TasMovie.Editing.cs" />
|
||||||
<Compile Include="movie\tasproj\TasMovie.IO.cs" />
|
<Compile Include="movie\tasproj\TasMovie.IO.cs" />
|
||||||
<Compile Include="movie\tasproj\TasMovie.cs" />
|
<Compile Include="movie\tasproj\TasMovie.cs" />
|
||||||
|
<Compile Include="movie\tasproj\TasStateManager.cs" />
|
||||||
<Compile Include="movie\tasproj\TasMovieRecord.cs" />
|
<Compile Include="movie\tasproj\TasMovieRecord.cs" />
|
||||||
<Compile Include="NESGameGenieEncoderDecoder.cs" />
|
<Compile Include="NESGameGenieEncoderDecoder.cs" />
|
||||||
<Compile Include="PathManager.cs" />
|
<Compile Include="PathManager.cs" />
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace BizHawk.Client.Common
|
||||||
Changes = true;
|
Changes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RecordFrame(int frame, IController source)
|
public virtual void RecordFrame(int frame, IController source)
|
||||||
{
|
{
|
||||||
if (Global.Config.VBAStyleMovieLoadState)
|
if (Global.Config.VBAStyleMovieLoadState)
|
||||||
{
|
{
|
||||||
|
@ -87,7 +87,7 @@ namespace BizHawk.Client.Common
|
||||||
Changes = true;
|
Changes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Truncate(int frame)
|
public virtual void Truncate(int frame)
|
||||||
{
|
{
|
||||||
if (frame < _log.Count)
|
if (frame < _log.Count)
|
||||||
{
|
{
|
||||||
|
@ -162,7 +162,7 @@ namespace BizHawk.Client.Common
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PokeFrame(int frame, IController source)
|
public virtual void PokeFrame(int frame, IController source)
|
||||||
{
|
{
|
||||||
var lg = LogGeneratorInstance();
|
var lg = LogGeneratorInstance();
|
||||||
lg.SetSource(source);
|
lg.SetSource(source);
|
||||||
|
@ -171,9 +171,10 @@ namespace BizHawk.Client.Common
|
||||||
SetFrameAt(frame, lg.GenerateLogEntry());
|
SetFrameAt(frame, lg.GenerateLogEntry());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearFrame(int frame)
|
public virtual void ClearFrame(int frame)
|
||||||
{
|
{
|
||||||
SetFrameAt(frame, LogGeneratorInstance().EmptyEntry);
|
SetFrameAt(frame, LogGeneratorInstance().EmptyEntry);
|
||||||
|
Changes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
using BizHawk.Common;
|
||||||
|
|
||||||
|
namespace BizHawk.Client.Common
|
||||||
|
{
|
||||||
|
public partial class TasMovie
|
||||||
|
{
|
||||||
|
// TODO: all these
|
||||||
|
public override void RecordFrame(int frame, Emulation.Common.IController source)
|
||||||
|
{
|
||||||
|
base.RecordFrame(frame, source);
|
||||||
|
|
||||||
|
LagLog.RemoveRange(frame, LagLog.Count - frame);
|
||||||
|
LagLog.Add(Global.Emulator.IsLagFrame);
|
||||||
|
|
||||||
|
StateManager.Invalidate(frame);
|
||||||
|
StateManager.Capture();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Truncate(int frame)
|
||||||
|
{
|
||||||
|
base.Truncate(frame);
|
||||||
|
|
||||||
|
LagLog.RemoveRange(frame + 2, LagLog.Count - frame - 1);
|
||||||
|
StateManager.Invalidate(frame + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void PokeFrame(int frame, Emulation.Common.IController source)
|
||||||
|
{
|
||||||
|
base.PokeFrame(frame, source);
|
||||||
|
|
||||||
|
LagLog.RemoveRange(frame, LagLog.Count - frame);
|
||||||
|
StateManager.Invalidate(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ClearFrame(int frame)
|
||||||
|
{
|
||||||
|
base.ClearFrame(frame);
|
||||||
|
|
||||||
|
LagLog.RemoveRange(frame + 1, LagLog.Count - frame - 1);
|
||||||
|
StateManager.Invalidate(frame + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ namespace BizHawk.Client.Common
|
||||||
public sealed partial class TasMovie : Bk2Movie
|
public sealed partial class TasMovie : Bk2Movie
|
||||||
{
|
{
|
||||||
private readonly List<bool> LagLog = new List<bool>();
|
private readonly List<bool> LagLog = new List<bool>();
|
||||||
|
private readonly TasStateManager StateManager = new TasStateManager();
|
||||||
|
|
||||||
public TasMovie(string path) : base(path) { }
|
public TasMovie(string path) : base(path) { }
|
||||||
|
|
||||||
|
@ -32,15 +33,13 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new TasMovieRecord // TODO
|
return new TasMovieRecord
|
||||||
{
|
{
|
||||||
State = null,
|
State = StateManager[index],
|
||||||
LogEntry = "",
|
LogEntry = GetInput(index),
|
||||||
Lagged = false
|
Lagged = LagLog[index]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// _state = (byte[])Global.Emulator.SaveStateBinary().Clone();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace BizHawk.Client.Common
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Captures savestates and manages the logic of adding, retrieving,
|
||||||
|
/// invalidating/clearing of states. Also does memory management and limiting of states
|
||||||
|
/// </summary>
|
||||||
|
public class TasStateManager
|
||||||
|
{
|
||||||
|
private readonly Dictionary<int, byte[]> States = new Dictionary<int, byte[]>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves the savestate for the given frame,
|
||||||
|
/// If this frame does not have a state currently, will return an empty array
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A savestate for the given frame or an empty array if there isn't one</returns>
|
||||||
|
public byte[] this[int frame]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (States.ContainsKey(frame))
|
||||||
|
{
|
||||||
|
return States[frame];
|
||||||
|
}
|
||||||
|
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Requests that the current emulator state be captured
|
||||||
|
/// </summary>
|
||||||
|
public void Capture()
|
||||||
|
{
|
||||||
|
var frame = Global.Emulator.Frame;
|
||||||
|
var state = (byte[])Global.Emulator.SaveStateBinary().Clone();
|
||||||
|
|
||||||
|
if (States.ContainsKey(frame))
|
||||||
|
{
|
||||||
|
States[frame] = state;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
States.Add(frame, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clears out all savestates after the given frame number
|
||||||
|
/// </summary>
|
||||||
|
public void Invalidate(int frame)
|
||||||
|
{
|
||||||
|
// TODO be more efficient, this could get slow
|
||||||
|
var toRemove = States
|
||||||
|
.Where(x => x.Key > frame)
|
||||||
|
.Select(x => x.Key)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var f in toRemove)
|
||||||
|
{
|
||||||
|
States.Remove(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue