Nuke IMovieHeader, put necessary methods into IMovie instead, and some todos on trouble spots for movie 2.0

This commit is contained in:
adelikat 2014-06-11 01:41:41 +00:00
parent 47d5b1e2e2
commit a682c667dd
13 changed files with 222 additions and 248 deletions

View File

@ -141,7 +141,6 @@
<Compile Include="movie\HeaderKeys.cs" />
<Compile Include="movie\InputAdapters.cs" />
<Compile Include="movie\interfaces\IMovie.cs" />
<Compile Include="movie\interfaces\IMovieHeader.cs" />
<Compile Include="movie\MnemonicGenerators\BooleanControllerMnemonicGenerator.cs" />
<Compile Include="movie\MnemonicGenerators\IMnemonicGenerator.cs" />
<Compile Include="movie\MnemonicGenerators\IMnemonicPorts.cs" />

View File

@ -123,7 +123,7 @@ namespace BizHawk.Client.Common
)]
public static string RerecordCount()
{
return Global.MovieSession.Movie.Header.Rerecords.ToString();
return Global.MovieSession.Movie.Rerecords.ToString();
}
[LuaMethodAttributes(

View File

@ -425,7 +425,8 @@ namespace BizHawk.Client.Common
{
rerecordCount = 0;
}
m.Header.Rerecords = (ulong)rerecordCount;
m.Rerecords = (ulong)rerecordCount;
}
else if (line.ToLower().StartsWith("guid"))
{
@ -582,7 +583,7 @@ namespace BizHawk.Client.Common
uint frameCount = r.ReadUInt32();
// 010 4-byte little-endian unsigned int: rerecord count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
/*
018 4-byte little-endian unsigned int: offset to the savestate inside file
The savestate offset is <header_size + length_of_metadata_in_bytes + padding>. The savestate offset should be
@ -828,7 +829,7 @@ namespace BizHawk.Client.Common
loaded, the number is 0. Famtasia however displays "1" in such case. It always adds 1 to the number found in
the file.
*/
m.Header.Rerecords = rerecordCount + 1;
m.Rerecords = rerecordCount + 1;
// 00E 2-byte little-endian unsigned int: unknown, set to 0000
r.ReadInt16();
// 010 64-byte zero-terminated emulator identifier string
@ -933,7 +934,7 @@ namespace BizHawk.Client.Common
m.Comments.Add(EMULATIONORIGIN + " Gens");
// 010 4-byte little-endian unsigned int: rerecord count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
// 014 ASCII-encoded controller config for player 1. '3' or '6'.
string player1Config = r.ReadStringFixedAscii(1);
// 015 ASCII-encoded controller config for player 2. '3' or '6'.
@ -1203,7 +1204,7 @@ namespace BizHawk.Client.Common
{
rerecordCount = 0;
}
m.Header.Rerecords = (ulong)rerecordCount;
m.Rerecords = (ulong)rerecordCount;
hf.Unbind();
}
else if (item.Name.EndsWith(".sha256"))
@ -1298,7 +1299,7 @@ namespace BizHawk.Client.Common
m.Header[HeaderKeys.GAMENAME] = gameName;
// 070 uint32 Re-record Count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = (ulong)rerecordCount;
m.Rerecords = (ulong)rerecordCount;
// 074 5-byte Console indicator (pce, ngp, pcfx, wswan)
string platform = NullTerminated(r.ReadStringFixedAscii(5));
Dictionary<string, Dictionary<string, object>> platforms = new Dictionary<string, Dictionary<string, object>>
@ -1411,7 +1412,7 @@ namespace BizHawk.Client.Common
uint frameCount = r.ReadUInt32();
// 000c: 4-byte little endian unsigned int: rerecord count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
// 0010: 4-byte little endian flag: begin from reset?
uint reset = r.ReadUInt32();
if (reset == 0)
@ -1674,7 +1675,7 @@ namespace BizHawk.Client.Common
m.Header[HeaderKeys.PAL] = pal.ToString();
// 004 4-byte little-endian unsigned int: rerecord count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
/*
008 4-byte little-endian unsigned int: length of movie description
00C (variable) null-terminated UTF-8 text, movie description (currently not implemented)
@ -1774,7 +1775,7 @@ namespace BizHawk.Client.Common
uint uid = r.ReadUInt32();
// 00C 4-byte little-endian unsigned int: rerecord count
m.Header.Rerecords = r.ReadUInt32();
m.Rerecords = r.ReadUInt32();
// 010 4-byte little-endian unsigned int: number of frames
uint frameCount = r.ReadUInt32();
// 014 1-byte flags "controller mask"
@ -2034,7 +2035,7 @@ namespace BizHawk.Client.Common
uint frameCount = r.ReadUInt32();
// 010 4-byte little-endian unsigned int: rerecord count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
// 014 1-byte flags: (movie start flags)
byte flags = r.ReadByte();
// bit 0: if "1", movie starts from an embedded "quicksave" snapshot
@ -2334,7 +2335,7 @@ namespace BizHawk.Client.Common
r.ReadBytes(2);
// 01C 4-byte little-endian integer: rerecord count
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
/*
020 BYTE RenderMethod
0=POST_ALL,1=PRE_ALL
@ -2521,7 +2522,7 @@ namespace BizHawk.Client.Common
uint frameCount = r.ReadUInt32();
// 00D 4-byte little-endian unsigned int: number of rerecords
uint rerecordCount = r.ReadUInt32();
m.Header.Rerecords = rerecordCount;
m.Rerecords = rerecordCount;
// 011 4-byte little-endian unsigned int: number of frames removed by rerecord
r.ReadBytes(4);
// 015 4-byte little-endian unsigned int: number of frames advanced step by step

View File

@ -21,15 +21,14 @@ namespace BizHawk.Client.Common
public Movie2(string filename, bool startsFromSavestate = false)
: this(startsFromSavestate)
{
Header.Rerecords = 0;
Rerecords = 0;
Filename = filename;
}
public Movie2(bool startsFromSavestate = false)
{
Header = new MovieHeader2();
Filename = string.Empty;
Header.StartsFromSavestate = startsFromSavestate;
StartsFromSavestate = startsFromSavestate;
IsCountingRerecords = true;
_mode = Moviemode.Inactive;
@ -39,9 +38,8 @@ namespace BizHawk.Client.Common
#region Implementation
public string PreferredExtension { get { return "bk2"; } }
public bool IsCountingRerecords { get; set; }
public IMovieHeader Header { get; private set; }
public SubtitleList Subtitles
{
get { throw new NotImplementedException(); }
@ -78,6 +76,58 @@ namespace BizHawk.Client.Common
}
}
public ulong Rerecords
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public bool StartsFromSavestate
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string GameName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string SystemID
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public bool IsActive
{
get { return _mode != Moviemode.Inactive; }

View File

@ -5,172 +5,8 @@ using System.Text;
namespace BizHawk.Client.Common
{
public class MovieHeader2 : IMovieHeader
public class MovieHeader2
{
public ulong Rerecords
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public bool StartsFromSavestate
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string SavestateBinaryBase64Blob
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string GameName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public string SystemID
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public bool ParseLineFromFile(string line)
{
throw new NotImplementedException();
}
public void Add(string key, string value)
{
throw new NotImplementedException();
}
public bool ContainsKey(string key)
{
throw new NotImplementedException();
}
public ICollection<string> Keys
{
get { throw new NotImplementedException(); }
}
public bool Remove(string key)
{
throw new NotImplementedException();
}
public bool TryGetValue(string key, out string value)
{
throw new NotImplementedException();
}
public ICollection<string> Values
{
get { throw new NotImplementedException(); }
}
public string this[string key]
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
public void Add(KeyValuePair<string, string> item)
{
throw new NotImplementedException();
}
public void Clear()
{
throw new NotImplementedException();
}
public bool Contains(KeyValuePair<string, string> item)
{
throw new NotImplementedException();
}
public void CopyTo(KeyValuePair<string, string>[] array, int arrayIndex)
{
throw new NotImplementedException();
}
public int Count
{
get { throw new NotImplementedException(); }
}
public bool IsReadOnly
{
get { throw new NotImplementedException(); }
}
public bool Remove(KeyValuePair<string, string> item)
{
throw new NotImplementedException();
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
throw new NotImplementedException();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
#region Won't implement
public SubtitleList Subtitles
{
get { throw new NotImplementedException(); }
}
public List<string> Comments
{
get { throw new NotImplementedException(); }
}
#endregion
}
}

View File

@ -24,7 +24,7 @@ namespace BizHawk.Client.Common
public Movie(string filename, bool startsFromSavestate = false)
: this(startsFromSavestate)
{
Header.Rerecords = 0;
Rerecords = 0;
Filename = filename;
Loaded = !string.IsNullOrWhiteSpace(filename);
}
@ -34,7 +34,7 @@ namespace BizHawk.Client.Common
Header = new MovieHeader();
Filename = string.Empty;
_preloadFramecount = 0;
Header.StartsFromSavestate = startsFromSavestate;
StartsFromSavestate = startsFromSavestate;
IsCountingRerecords = true;
_mode = Moviemode.Inactive;
@ -81,12 +81,64 @@ namespace BizHawk.Client.Common
}
}
public ulong Rerecords
{
get
{
return (Header as MovieHeader).Rerecords;
}
set
{
(Header as MovieHeader).Rerecords = value;
}
}
public bool StartsFromSavestate
{
get
{
return (Header as MovieHeader).StartsFromSavestate;
}
set
{
(Header as MovieHeader).StartsFromSavestate = value;
}
}
public string GameName
{
get
{
return (Header as MovieHeader).GameName;
}
set
{
(Header as MovieHeader).GameName = value;
}
}
public string SystemID
{
get
{
return (Header as MovieHeader).SystemID;
}
set
{
(Header as MovieHeader).SystemID = value;
}
}
public string PreferredExtension { get { return "bkm"; } }
// TODO: delete me
public static string Extension { get { return "bkm"; } }
public IMovieHeader Header { get; private set; }
public MovieHeader Header { get; private set; }
public string Filename { get; set; }
public bool IsCountingRerecords { get; set; }
@ -151,7 +203,7 @@ namespace BizHawk.Client.Common
// If Starting a new recording requires clearing sram it shoudl be done at a higher layer and not rely on all IMovies doing this
// Haven't removed it yet because I coudln't guarantee that power-on movies coudl live without it
// And the immediate fire is that Savestate movies are breaking
if (!Header.StartsFromSavestate) // && Global.Emulator.SystemId != "WSWAN")
if (!StartsFromSavestate)
{
Global.Emulator.ClearSaveRam();
}
@ -169,7 +221,7 @@ namespace BizHawk.Client.Common
public void StartNewPlayback()
{
// See StartNewRecording for details as to why this savestate check is here
if (!Header.StartsFromSavestate) // && Global.Emulator.SystemId != "WSWAN")
if (!StartsFromSavestate)
{
Global.Emulator.ClearSaveRam();
}
@ -688,7 +740,7 @@ namespace BizHawk.Client.Common
if (IsCountingRerecords)
{
Header.Rerecords++;
Rerecords++;
}
return true;

View File

@ -3,7 +3,7 @@ using System.Text;
namespace BizHawk.Client.Common
{
public class MovieHeader : Dictionary<string, string>, IMovieHeader
public class MovieHeader : Dictionary<string, string>
{
public MovieHeader()
{

View File

@ -55,10 +55,14 @@ namespace BizHawk.Client.Common
/// </summary>
string SyncSettingsJson { get; set; }
IMovieHeader Header { get; }
// TODO: document these
SubtitleList Subtitles { get; }
IList<string> Comments { get; }
string SavestateBinaryBase64Blob { get; set; }
ulong Rerecords { get; set; }
bool StartsFromSavestate { get; set; }
string GameName { get; set; }
string SystemID { get; set; }
#endregion

View File

@ -1,23 +0,0 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
public interface IMovieHeader : IDictionary<string, string>
{
ulong Rerecords { get; set; }
bool StartsFromSavestate { get; set; }
string GameName { get; set; }
string SystemID { get; set; }
/// <summary>
/// Receives a line and attempts to add as a header
/// </summary>
/// <param name="line">
/// The line of text loaded from a movie file.
/// </param>
/// <returns>
/// returns false if not a useable header line
/// </returns>
bool ParseLineFromFile(string line);
}
}

View File

@ -122,9 +122,61 @@ namespace BizHawk.Client.Common
}
}
public ulong Rerecords
{
get
{
return (Header as MovieHeader).Rerecords;
}
set
{
(Header as MovieHeader).Rerecords = value;
}
}
public bool StartsFromSavestate
{
get
{
return (Header as MovieHeader).StartsFromSavestate;
}
set
{
(Header as MovieHeader).StartsFromSavestate = value;
}
}
public string GameName
{
get
{
return (Header as MovieHeader).GameName;
}
set
{
(Header as MovieHeader).GameName = value;
}
}
public string SystemID
{
get
{
return (Header as MovieHeader).SystemID;
}
set
{
(Header as MovieHeader).SystemID = value;
}
}
public string Filename { get; set; }
public IMovieHeader Header { get; private set; }
public MovieHeader Header { get; private set; }
public bool IsActive
{
@ -372,7 +424,7 @@ namespace BizHawk.Client.Common
}
});
if (Header.StartsFromSavestate)
if (StartsFromSavestate)
{
// should we raise some sort of error if there's a savestate in the archive but Header.StartsFromSavestate is false?
bl.GetCoreState(
@ -417,7 +469,7 @@ namespace BizHawk.Client.Common
{
bs.PutLump(BinaryStateLump.Movieheader, (tw) => tw.WriteLine(Header.ToString()));
bs.PutLump(BinaryStateLump.Input, (tw) => tw.WriteLine(GetInputLog()));
if (Header.StartsFromSavestate)
if (StartsFromSavestate)
{
#if true
bs.PutLump(BinaryStateLump.CorestateText, (tw) => Global.Emulator.SaveStateText(tw));

View File

@ -319,7 +319,7 @@ namespace BizHawk.Client.EmuHawk
{
if (Global.MovieSession.Movie.IsActive)
{
return "Rerecord Count: " + Global.MovieSession.Movie.Header.Rerecords;
return "Rerecord Count: " + Global.MovieSession.Movie.Rerecords;
}
return string.Empty;

View File

@ -41,11 +41,13 @@ namespace BizHawk.Client.EmuHawk
if (!record && Global.Emulator.SystemId == "NES") // For NES we need special logic since the movie will drive which core to load
{
// If either is specified use that, else use whatever is currently set
if (Global.MovieSession.Movie.Header[HeaderKeys.CORE] == quicknesName)
// Movies 2.0 TODO
if ((Global.MovieSession.Movie as Movie).Header[HeaderKeys.CORE] == quicknesName)
{
Global.Config.NES_InQuickNES = true;
}
else if (Global.MovieSession.Movie.Header[HeaderKeys.CORE] == neshawkName)
// Movies 2.0 TODO
else if ((Global.MovieSession.Movie as Movie).Header[HeaderKeys.CORE] == neshawkName)
{
Global.Config.NES_InQuickNES = false;
}
@ -75,7 +77,7 @@ namespace BizHawk.Client.EmuHawk
Global.Config.RecentMovies.Add(movie.Filename);
}
if (Global.MovieSession.Movie.Header.StartsFromSavestate)
if (Global.MovieSession.Movie.StartsFromSavestate)
{
var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob);
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));
@ -155,7 +157,7 @@ namespace BizHawk.Client.EmuHawk
if (Global.MovieSession.Movie.IsActive)
{
LoadRom(CurrentlyOpenRom);
if (Global.MovieSession.Movie.Header.StartsFromSavestate)
if (Global.MovieSession.Movie.StartsFromSavestate)
{
var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob);
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));

View File

@ -53,12 +53,12 @@ namespace BizHawk.Client.EmuHawk
if (column == 1) // System
{
text = _movieList[index].Header.SystemID;
text = _movieList[index].SystemID;
}
if (column == 2) // Game
{
text = _movieList[index].Header.GameName;
text = _movieList[index].GameName;
}
if (column == 3) // Time
@ -188,7 +188,7 @@ namespace BizHawk.Client.EmuHawk
// Pull out matching names
for (var i = 0; i < _movieList.Count; i++)
{
if (PathManager.FilesystemSafeName(Global.Game) == _movieList[i].Header.GameName)
if (PathManager.FilesystemSafeName(Global.Game) == _movieList[i].GameName)
{
indices.Add(i);
}
@ -340,8 +340,8 @@ namespace BizHawk.Client.EmuHawk
{
copyStr
.Append(_movieList[index].Filename).Append('\t')
.Append(_movieList[index].Header.SystemID).Append('\t')
.Append(_movieList[index].Header.GameName).Append('\t')
.Append(_movieList[index].SystemID).Append('\t')
.Append(_movieList[index].GameName).Append('\t')
.Append(_movieList[index].Time.ToString(@"hh\:mm\:ss\.fff"))
.AppendLine();
@ -372,8 +372,8 @@ namespace BizHawk.Client.EmuHawk
{
_movieList = _movieList
.OrderByDescending(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.SystemID)
.ThenBy(x => x.Header.GameName)
.ThenBy(x => x.SystemID)
.ThenBy(x => x.GameName)
.ThenBy(x => x.FrameCount)
.ToList();
}
@ -381,8 +381,8 @@ namespace BizHawk.Client.EmuHawk
{
_movieList = _movieList
.OrderBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.SystemID)
.ThenBy(x => x.Header.GameName)
.ThenBy(x => x.SystemID)
.ThenBy(x => x.GameName)
.ThenBy(x => x.FrameCount)
.ToList();
}
@ -391,18 +391,18 @@ namespace BizHawk.Client.EmuHawk
if (_sortReverse)
{
_movieList = _movieList
.OrderByDescending(x => x.Header.SystemID)
.OrderByDescending(x => x.SystemID)
.ThenBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.GameName)
.ThenBy(x => x.GameName)
.ThenBy(x => x.FrameCount)
.ToList();
}
else
{
_movieList = _movieList
.OrderBy(x => x.Header.SystemID)
.OrderBy(x => x.SystemID)
.ThenBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.GameName)
.ThenBy(x => x.GameName)
.ThenBy(x => x.FrameCount)
.ToList();
}
@ -411,18 +411,18 @@ namespace BizHawk.Client.EmuHawk
if (_sortReverse)
{
_movieList = _movieList
.OrderByDescending(x => x.Header.GameName)
.OrderByDescending(x => x.GameName)
.ThenBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.SystemID)
.ThenBy(x => x.SystemID)
.ThenBy(x => x.FrameCount)
.ToList();
}
else
{
_movieList = _movieList
.OrderBy(x => x.Header.GameName)
.OrderBy(x => x.GameName)
.ThenBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.SystemID)
.ThenBy(x => x.SystemID)
.ThenBy(x => x.FrameCount)
.ToList();
}
@ -433,7 +433,7 @@ namespace BizHawk.Client.EmuHawk
_movieList = _movieList
.OrderByDescending(x => x.FrameCount)
.ThenBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.SystemID)
.ThenBy(x => x.SystemID)
.ThenBy(x => x.FrameCount)
.ToList();
}
@ -442,8 +442,8 @@ namespace BizHawk.Client.EmuHawk
_movieList = _movieList
.OrderBy(x => x.FrameCount)
.ThenBy(x => Path.GetFileName(x.Filename))
.ThenBy(x => x.Header.SystemID)
.ThenBy(x => x.Header.GameName)
.ThenBy(x => x.SystemID)
.ThenBy(x => x.GameName)
.ToList();
}
break;
@ -469,7 +469,8 @@ namespace BizHawk.Client.EmuHawk
var firstIndex = MovieView.SelectedIndices[0];
MovieView.ensureVisible(firstIndex);
foreach (var kvp in _movieList[firstIndex].Header)
// Movies 2.0 TODO - what responsibility should a mvoie implementation have here?
foreach (var kvp in (_movieList[firstIndex] as Movie).Header)
{
var item = new ListViewItem(kvp.Key);
item.SubItems.Add(kvp.Value);