diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
index ae390848dd..3713d95af5 100644
--- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj
+++ b/BizHawk.Client.Common/BizHawk.Client.Common.csproj
@@ -124,6 +124,7 @@
+
diff --git a/BizHawk.Client.Common/movie/IMovie.cs b/BizHawk.Client.Common/movie/IMovie.cs
index ae29626bed..ed653f23d2 100644
--- a/BizHawk.Client.Common/movie/IMovie.cs
+++ b/BizHawk.Client.Common/movie/IMovie.cs
@@ -1,4 +1,5 @@
-using System.IO;
+using System.Collections.Generic;
+using System.IO;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
@@ -97,7 +98,7 @@ namespace BizHawk.Client.Common
void PokeFrame(int frameNum, string input); // Why does this exist as something different than Commit Frame?
LoadStateResult CheckTimeLines(TextReader reader, bool onlyGuid, bool ignoreGuidMismatch, out string errorMessage); // No need to return a status, no reason to have hacky flags, no need to pass a textreader
string GetTime(bool preLoad); // Rename to simply: Time, and make it a Timespan
- void GetInputLog(TextReader reader, bool isMultitracking); // how about the movie know if it is multi-tracking rather than having to pass it in
+ void ExtractInputLog(TextReader reader, bool isMultitracking); // how about the movie know if it is multi-tracking rather than having to pass it in
string GetInput(int frame); // Should be a property of a Record object
diff --git a/BizHawk.Client.Common/movie/IMovieRecord.cs b/BizHawk.Client.Common/movie/IMovieRecord.cs
new file mode 100644
index 0000000000..c59e4272ec
--- /dev/null
+++ b/BizHawk.Client.Common/movie/IMovieRecord.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BizHawk.Client.Common
+{
+ ///
+ /// Represents everything needed for a frame of input
+ ///
+ public interface IMovieRecord
+ {
+ ///
+ /// String representation of the controller input as a series of mnemonics
+ ///
+ string Input { get; }
+
+ ///
+ /// Whether or not this was a lag frame,
+ /// where lag is the act of the core failing to poll for input (input on lag frames have no affect)
+ ///
+ bool Lagged { get; }
+
+ ///
+ /// A savestate for this frame of input
+ ///
+ IEnumerable State { get; }
+
+ }
+}
diff --git a/BizHawk.Client.Common/movie/Movie.cs b/BizHawk.Client.Common/movie/Movie.cs
index a192aaeef0..447027c247 100644
--- a/BizHawk.Client.Common/movie/Movie.cs
+++ b/BizHawk.Client.Common/movie/Movie.cs
@@ -439,7 +439,7 @@ namespace BizHawk.Client.Common
return sb.ToString();
}
- public void GetInputLog(TextReader reader, bool isMultitracking)
+ public void ExtractInputLog(TextReader reader, bool isMultitracking)
{
int? stateFrame = null;
diff --git a/BizHawk.Client.Common/movie/MovieHeader.cs b/BizHawk.Client.Common/movie/MovieHeader.cs
index 927a3152cf..38aa023787 100644
--- a/BizHawk.Client.Common/movie/MovieHeader.cs
+++ b/BizHawk.Client.Common/movie/MovieHeader.cs
@@ -20,7 +20,7 @@ namespace BizHawk.Client.Common
this[HeaderKeys.EMULATIONVERSION] = VersionInfo.GetEmuVersion();
this[HeaderKeys.MOVIEVERSION] = HeaderKeys.MovieVersion;
- this[HeaderKeys.PLATFORM] = Global.Emulator.SystemId;
+ this[HeaderKeys.PLATFORM] = Global.Emulator != null ? Global.Emulator.SystemId : String.Empty;
this[HeaderKeys.GAMENAME] = String.Empty;
this[HeaderKeys.AUTHOR] = String.Empty;
this[HeaderKeys.RERECORDS] = "0";
diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs
index 3ef63bc207..14f6234f24 100644
--- a/BizHawk.Client.Common/movie/MovieSession.cs
+++ b/BizHawk.Client.Common/movie/MovieSession.cs
@@ -254,7 +254,7 @@ namespace BizHawk.Client.Common
{
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
- Movie.GetInputLog(reader, MultiTrack.IsActive);
+ Movie.ExtractInputLog(reader, MultiTrack.IsActive);
}
else
{
@@ -267,7 +267,7 @@ namespace BizHawk.Client.Common
{
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
- Movie.GetInputLog(reader, MultiTrack.IsActive);
+ Movie.ExtractInputLog(reader, MultiTrack.IsActive);
return true;
}
else
@@ -337,7 +337,7 @@ namespace BizHawk.Client.Common
Movie.SwitchToRecord();
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
- Movie.GetInputLog(reader, MultiTrack.IsActive);
+ Movie.ExtractInputLog(reader, MultiTrack.IsActive);
return true;
}
else
@@ -352,7 +352,7 @@ namespace BizHawk.Client.Common
Movie.SwitchToRecord();
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
- Movie.GetInputLog(reader, MultiTrack.IsActive);
+ Movie.ExtractInputLog(reader, MultiTrack.IsActive);
return true;
}
else
@@ -426,7 +426,7 @@ namespace BizHawk.Client.Common
Movie.StartNewRecording();
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
- Movie.GetInputLog(reader, MultiTrack.IsActive);
+ Movie.ExtractInputLog(reader, MultiTrack.IsActive);
return true;
}
else
@@ -442,7 +442,7 @@ namespace BizHawk.Client.Common
Movie.StartNewRecording();
reader.BaseStream.Position = 0;
reader.DiscardBufferedData();
- Movie.GetInputLog(reader, MultiTrack.IsActive);
+ Movie.ExtractInputLog(reader, MultiTrack.IsActive);
return true;
}
else