another round of refactoring the Movie object

This commit is contained in:
andres.delikat 2011-07-17 17:52:39 +00:00
parent e6b2c794d4
commit 72699b4ad7
8 changed files with 152 additions and 116 deletions

View File

@ -932,10 +932,10 @@ namespace BizHawk.MultiClient
if (UserMovie.Mode == MOVIEMODE.INACTIVE)
{
InputLog.SetHeaderLine(MovieHeader.PLATFORM, Global.Emulator.SystemId);
InputLog.SetHeaderLine(MovieHeader.GAMENAME, Global.Game.FilesystemSafeName);
InputLog.SetHeaderLine(MovieHeader.GUID, MovieHeader.MakeGUID());
InputLog.SetHeaderLine(MovieHeader.AUTHOR, Global.Config.DefaultAuthor);
InputLog.Header.SetHeaderLine(MovieHeader.PLATFORM, Global.Emulator.SystemId);
InputLog.Header.SetHeaderLine(MovieHeader.GAMENAME, Global.Game.FilesystemSafeName);
InputLog.Header.SetHeaderLine(MovieHeader.GUID, MovieHeader.MakeGUID());
InputLog.Header.SetHeaderLine(MovieHeader.AUTHOR, Global.Config.DefaultAuthor);
CreateNewInputLog(true);
}

View File

@ -129,9 +129,9 @@ namespace BizHawk.MultiClient
Movie m = new Movie(path.CanonicalFullPath, MOVIEMODE.INACTIVE);
m.PreLoadText();
if (path.Extension == ".FM2")
m.SetHeaderLine(MovieHeader.PLATFORM, "NES");
m.Header.SetHeaderLine(MovieHeader.PLATFORM, "NES");
else if (path.Extension == ".MC2")
m.SetHeaderLine(MovieHeader.PLATFORM, "PCE");
m.Header.SetHeaderLine(MovieHeader.PLATFORM, "PCE");
MovieList.Add(m);
}
@ -247,7 +247,7 @@ namespace BizHawk.MultiClient
if (MovieView.SelectedIndices.Count < 1) return;
int x = MovieView.SelectedIndices[0];
Dictionary<string, string> h = MovieList[x].GetHeaderInfo();
Dictionary<string, string> h = MovieList[x].Header.HeaderParams;
foreach (var kvp in h)
{
@ -255,7 +255,7 @@ namespace BizHawk.MultiClient
item.SubItems.Add(kvp.Value);
DetailsView.Items.Add(item);
}
if (MovieList[x].HasComments())
if (MovieList[x].Header.Comments.Count > 0)
button1.Enabled = true;
else
button1.Enabled = false;

View File

@ -53,15 +53,15 @@ namespace BizHawk.MultiClient
MovieToRecord = new Movie(path, MOVIEMODE.RECORD);
//Header
MovieToRecord.SetHeaderLine(MovieHeader.AUTHOR, AuthorBox.Text);
MovieToRecord.SetHeaderLine(MovieHeader.EMULATIONVERSION, MainForm.EMUVERSION);
MovieToRecord.SetHeaderLine(MovieHeader.MOVIEVERSION, MovieHeader.MovieVersion);
MovieToRecord.SetHeaderLine(MovieHeader.GUID, MovieHeader.MakeGUID());
MovieToRecord.SetHeaderLine(MovieHeader.PLATFORM, Global.Emulator.SystemId);
MovieToRecord.Header.SetHeaderLine(MovieHeader.AUTHOR, AuthorBox.Text);
MovieToRecord.Header.SetHeaderLine(MovieHeader.EMULATIONVERSION, MainForm.EMUVERSION);
MovieToRecord.Header.SetHeaderLine(MovieHeader.MOVIEVERSION, MovieHeader.MovieVersion);
MovieToRecord.Header.SetHeaderLine(MovieHeader.GUID, MovieHeader.MakeGUID());
MovieToRecord.Header.SetHeaderLine(MovieHeader.PLATFORM, Global.Emulator.SystemId);
if (Global.Game != null)
MovieToRecord.SetHeaderLine(MovieHeader.GAMENAME, Global.Game.FilesystemSafeName);
MovieToRecord.Header.SetHeaderLine(MovieHeader.GAMENAME, Global.Game.FilesystemSafeName);
else
MovieToRecord.SetHeaderLine(MovieHeader.GAMENAME, "NULL");
MovieToRecord.Header.SetHeaderLine(MovieHeader.GAMENAME, "NULL");
Global.MainForm.StartNewMovie(MovieToRecord, true);

View File

@ -495,7 +495,7 @@ namespace BizHawk.MultiClient
if (Global.MainForm.UserMovie.Mode != MOVIEMODE.INACTIVE)
{
tmp += "Rerecord Count: ";
tmp += Global.MainForm.GetActiveMovie().GetRerecordCount().ToString();
tmp += Global.MainForm.GetActiveMovie().Rerecords.ToString();
}
return tmp;
}

View File

@ -46,11 +46,11 @@ namespace BizHawk.MultiClient
{
if (!ReadOnly)
{
selectedMovie.ClearComments();
selectedMovie.Header.Comments.Clear();
for (int x = 0; x < CommentGrid.Rows.Count - 1; x++)
{
DataGridViewCell c = CommentGrid.Rows[x].Cells[0];
selectedMovie.AddComment("comment " + c.Value.ToString());
selectedMovie.Header.Comments.Add("comment " + c.Value.ToString());
}
selectedMovie.WriteMovie();
}
@ -60,12 +60,11 @@ namespace BizHawk.MultiClient
public void GetMovie(Movie m)
{
selectedMovie = m;
List<string> comments = m.GetComments();
if (comments.Count == 0) return;
if (m.Header.Comments.Count == 0) return;
for (int x = 0; x < comments.Count; x++)
for (int x = 0; x < m.Header.Comments.Count; x++)
{
string str = comments[x];
string str = m.Header.Comments[x];
if (str.Length >= 7 && str.Substring(0, 7) == "comment")
str = str.Remove(0, 7);
CommentGrid.Rows.Add();

View File

@ -10,21 +10,22 @@ namespace BizHawk.MultiClient
public enum MOVIEMODE { INACTIVE, PLAY, RECORD, FINISHED };
public class Movie
{
private MovieHeader Header = new MovieHeader();
private MovieLog Log = new MovieLog();
//TODO: preloaded flag + use it to make checks before doing things that require the movie to be loaded
public MovieHeader Header = new MovieHeader();
public SubtitleList Subtitles = new SubtitleList();
public MultitrackRecording MultiTrack = new MultitrackRecording();
public bool MakeBackup = true; //make backup before altering movie
public bool IsText { get; private set; }
public string Filename { get; private set; }
public MOVIEMODE Mode { get; private set; }
public int Rerecords { get; private set; }
public int Frames { get; private set; } //Only used when a movie is preloaded
public bool MakeBackup = true; //Flag - make backup before altering movie
public int Frames = 0;
public int lastLog;
public int rerecordCount;
private MovieLog Log = new MovieLog();
private int lastLog;
/// <summary>
/// Allows checking if file exists
/// </summary>
@ -46,17 +47,19 @@ namespace BizHawk.MultiClient
}
Mode = m;
lastLog = 0;
rerecordCount = 0;
Rerecords = 0;
IsText = true;
Frames = 0;
}
public Movie(string filename, MOVIEMODE m)
{
Mode = m;
lastLog = 0;
rerecordCount = 0;
Rerecords = 0;
this.Filename = filename;
IsText = true;
Frames = 0;
}
public Movie()
@ -64,6 +67,7 @@ namespace BizHawk.MultiClient
Filename = ""; //Note: note this must be populated before playing movie
Mode = MOVIEMODE.INACTIVE;
IsText = true;
Frames = 0;
}
public string GetSysID()
@ -215,14 +219,6 @@ namespace BizHawk.MultiClient
}
private string ParseHeader(string line, string headerName)
{
string str;
int x = line.LastIndexOf(headerName) + headerName.Length;
str = line.Substring(x + 1, line.Length - x - 1);
return str;
}
private bool LoadText()
{
var file = new FileInfo(Filename);
@ -271,11 +267,11 @@ namespace BizHawk.MultiClient
Header.AddHeaderLine(MovieHeader.RERECORDS, str);
try
{
rerecordCount = int.Parse(str);
Rerecords = int.Parse(str);
}
catch
{
rerecordCount = 0;
Rerecords = 0;
}
}
else if (str.Contains(MovieHeader.AUTHOR))
@ -338,7 +334,7 @@ namespace BizHawk.MultiClient
{
continue;
}
else if (Header.AddHeaderFromLine(str)) continue;
else if (str.Contains(MovieHeader.EMULATIONVERSION))
{
str = ParseHeader(str, MovieHeader.EMULATIONVERSION);
@ -391,9 +387,7 @@ namespace BizHawk.MultiClient
break;
}
else
{
Header.Comments.Add(str);
}
}
sr.Close();
}
@ -466,23 +460,19 @@ namespace BizHawk.MultiClient
{
Log.Truncate(Global.Emulator.Frame);
}
IncrementRerecordCount();
IncrementRerecords();
}
public void IncrementRerecordCount()
public void IncrementRerecords()
{
rerecordCount++;
Header.UpdateRerecordCount(rerecordCount);
Rerecords++;
Header.UpdateRerecordCount(Rerecords);
}
public int GetRerecordCount()
public void SetRerecords(int value)
{
return rerecordCount;
}
public Dictionary<string, string> GetHeaderInfo()
{
return Header.HeaderParams;
Rerecords = value;
Header.SetHeaderLine(MovieHeader.RERECORDS, Rerecords.ToString());
}
public void SetMovieFinished()
@ -491,11 +481,6 @@ namespace BizHawk.MultiClient
Mode = MOVIEMODE.FINISHED;
}
public void SetHeaderLine(string key, string value)
{
Header.SetHeaderLine(key, value);
}
public string GetTime(bool preLoad)
{
string time = "";
@ -517,10 +502,7 @@ namespace BizHawk.MultiClient
private string MakeDigits(decimal num)
{
if (num < 10)
return "0" + num.ToString();
else
return num.ToString();
return MakeDigits((int)num);
}
private string MakeDigits(int num)
@ -728,27 +710,16 @@ namespace BizHawk.MultiClient
return 0;
}
public List<string> GetComments()
{
return Header.Comments;
}
public bool HasComments()
{
if (Header.Comments.Count > 0)
return true;
else
return false;
}
public void AddComment(string comment)
{
Header.Comments.Add(comment);
}
public void ClearComments()
private string ParseHeader(string line, string headerName)
{
Header.Comments.Clear();
string str;
int x = line.LastIndexOf(headerName) + headerName.Length;
str = line.Substring(x + 1, line.Length - x - 1);
return str;
}
}
}

View File

@ -32,7 +32,7 @@ namespace BizHawk.MultiClient
UInt32 version = r.ReadUInt32();
m.SetHeaderLine(MovieHeader.MovieVersion, "FCEU movie version " + version.ToString() + " (.fcm)");
m.Header.SetHeaderLine(MovieHeader.MovieVersion, "FCEU movie version " + version.ToString() + " (.fcm)");
byte[] flags = new byte[4];
for (int x = 0; x < 4; x++)
@ -40,8 +40,7 @@ namespace BizHawk.MultiClient
UInt32 frameCount = r.ReadUInt32();
m.rerecordCount = (int)r.ReadUInt32();
m.SetHeaderLine(MovieHeader.RERECORDS, m.rerecordCount.ToString());
m.SetRerecords((int)r.ReadUInt32());
UInt32 movieDataSize = r.ReadUInt32();
UInt32 savestateOffset = r.ReadUInt32();
@ -51,7 +50,7 @@ namespace BizHawk.MultiClient
//TODO: ROM checksum movie header line (MD5)
UInt32 EmuVersion = r.ReadUInt32();
m.SetHeaderLine(MovieHeader.EMULATIONVERSION, "FCEU " + EmuVersion.ToString());
m.Header.SetHeaderLine(MovieHeader.EMULATIONVERSION, "FCEU " + EmuVersion.ToString());
List<byte> romBytes = new List<byte>();
while (true)
@ -62,7 +61,7 @@ namespace BizHawk.MultiClient
romBytes.Add(r.ReadByte());
}
string rom = System.Text.Encoding.UTF8.GetString(romBytes.ToArray());
m.SetHeaderLine(MovieHeader.GAMENAME, rom);
m.Header.SetHeaderLine(MovieHeader.GAMENAME, rom);
r.ReadByte(); //Advance past null byte
@ -75,7 +74,7 @@ namespace BizHawk.MultiClient
authorBytes.Add(r.ReadByte());
}
string author = System.Text.Encoding.UTF8.GetString(authorBytes.ToArray());
m.SetHeaderLine(MovieHeader.AUTHOR, author);
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
r.ReadByte(); //Advance past null byte
@ -87,8 +86,8 @@ namespace BizHawk.MultiClient
if ((int)(flags[0] & 4) > 0)
pal = true;
m.SetHeaderLine("SyncHack", movieSyncHackOn.ToString());
m.SetHeaderLine("PAL", pal.ToString());
m.Header.SetHeaderLine("SyncHack", movieSyncHackOn.ToString());
m.Header.SetHeaderLine("PAL", pal.ToString());
//Power on vs reset
if ((int)(flags[0] & 8) > 0)
@ -152,12 +151,11 @@ namespace BizHawk.MultiClient
}
UInt32 version = r.ReadUInt32();
m.SetHeaderLine(MovieHeader.MOVIEVERSION, "Dega version " + version.ToString());
m.Header.SetHeaderLine(MovieHeader.MOVIEVERSION, "Dega version " + version.ToString());
UInt32 framecount = r.ReadUInt32();
m.rerecordCount = (int)r.ReadUInt32();
m.SetHeaderLine(MovieHeader.RERECORDS, m.rerecordCount.ToString());
m.SetRerecords((int)r.ReadUInt32());
UInt32 IsFromReset = r.ReadUInt32();
if (IsFromReset == 0)
@ -176,7 +174,7 @@ namespace BizHawk.MultiClient
string author = System.Text.Encoding.UTF8.GetString(authorBytes);
//TODO: remove null characters
m.SetHeaderLine(MovieHeader.AUTHOR, author);
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
//4-byte little endian flags
byte flags = r.ReadByte();
@ -186,25 +184,25 @@ namespace BizHawk.MultiClient
pal = true;
else
pal = false;
m.SetHeaderLine("PAL", pal.ToString());
m.Header.SetHeaderLine("PAL", pal.ToString());
bool japan;
if ((int)(flags & 4) > 0)
japan = true;
else
japan = false;
m.SetHeaderLine("Japan", japan.ToString());
m.Header.SetHeaderLine("Japan", japan.ToString());
bool gamegear;
if ((int)(flags & 8) > 0)
{
gamegear = true;
m.SetHeaderLine(MovieHeader.PLATFORM, "GG");
m.Header.SetHeaderLine(MovieHeader.PLATFORM, "GG");
}
else
{
gamegear = false;
m.SetHeaderLine(MovieHeader.PLATFORM, "SMS");
m.Header.SetHeaderLine(MovieHeader.PLATFORM, "SMS");
}
r.ReadBytes(3); //Unused flags
@ -214,14 +212,14 @@ namespace BizHawk.MultiClient
romnameBytes[x] = r.ReadByte();
string romname = System.Text.Encoding.UTF8.GetString(romnameBytes.ToArray());
//TODO: remove null characters
m.SetHeaderLine(MovieHeader.GAMENAME, romname);
m.Header.SetHeaderLine(MovieHeader.GAMENAME, romname);
byte[] MD5Bytes = new byte[16];
for (int x = 0; x < 16; x++)
MD5Bytes[x] = r.ReadByte();
string MD5 = System.Text.Encoding.UTF8.GetString(MD5Bytes.ToArray());
//TODO: format correctly
m.SetHeaderLine("MD5", MD5);
m.Header.SetHeaderLine("MD5", MD5);
for (int x = 0; x < (framecount); x++)
@ -322,9 +320,8 @@ namespace BizHawk.MultiClient
Movie m = new Movie(Path.ChangeExtension(path, ".tas"), MOVIEMODE.PLAY);
UInt32 GUID = r.ReadUInt32();
m.SetHeaderLine(MovieHeader.GUID, GUID.ToString()); //TODO: format to hex string
m.rerecordCount = (int)r.ReadUInt32();
m.SetHeaderLine(MovieHeader.RERECORDS, m.rerecordCount.ToString());
m.Header.SetHeaderLine(MovieHeader.GUID, GUID.ToString()); //TODO: format to hex string
m.SetRerecords((int)r.ReadUInt32());
UInt32 framecount = r.ReadUInt32();
byte ControllerFlags = r.ReadByte();
@ -349,7 +346,7 @@ namespace BizHawk.MultiClient
if ((int)(MovieFlags & 2) > 0)
{
m.SetHeaderLine("PAL", "True");
m.Header.SetHeaderLine("PAL", "True");
}
byte SyncOptions = r.ReadByte();
@ -405,15 +402,13 @@ namespace BizHawk.MultiClient
UInt32 versionno = r.ReadUInt32(); //always 1
UInt32 uid = r.ReadUInt32(); //time of recording
m.SetHeaderLine(MovieHeader.GUID, uid.ToString());
m.Header.SetHeaderLine(MovieHeader.GUID, uid.ToString());
UInt32 framecount = r.ReadUInt32();
m.Frames = (int)framecount;
//0x10
UInt32 rerecordcount = r.ReadUInt32();
m.rerecordCount = (int)rerecordcount;
m.SetHeaderLine(MovieHeader.RERECORDS, m.rerecordCount.ToString());
m.SetRerecords((int)rerecordcount);
m.Header.SetHeaderLine(MovieHeader.RERECORDS, m.Rerecords.ToString());
Byte moviestartflags = r.ReadByte();
@ -493,20 +488,20 @@ namespace BizHawk.MultiClient
char[] internalgamename = r.ReadChars(0x0C);
string gamename = new String(internalgamename);
m.SetHeaderLine(MovieHeader.GAMENAME, gamename);
m.Header.SetHeaderLine(MovieHeader.GAMENAME, gamename);
//0x30
Byte minorversion = r.ReadByte();
Byte internalcrc = r.ReadByte();
UInt16 internalchacksum = r.ReadUInt16();
UInt32 unitcode = r.ReadUInt32();
UInt32 saveoffset = r.ReadUInt32(); //set to 0 if unused
UInt32 saveoffset = r.ReadUInt32(); //set to 0 if unused
UInt32 controllerdataoffset = r.ReadUInt32();
//0x40 start info.
char[] authorsname = r.ReadChars(0x40); //vbm specification states these strings
string author = new String(authorsname); //are locale dependant.
m.SetHeaderLine(MovieHeader.AUTHOR, author);
char[] authorsname = r.ReadChars(0x40); //vbm specification states these strings
string author = new String(authorsname); //are locale dependant.
m.Header.SetHeaderLine(MovieHeader.AUTHOR, author);
//0x80
char[] moviedescription = r.ReadChars(0x80);

View File

@ -6,14 +6,14 @@ using System.IO;
namespace BizHawk.MultiClient
{
class MovieHeader
public class MovieHeader
{
//Required Header Params
//Emulation - Core version, will be 1.0.0 until there is a versioning system
//Movie - Versioning for the Movie code itself, or perhaps this could be changed client version?
//Platform - Must know what platform we are making a movie on!
//GameName - Which game
//TODO: GUID, checksum of game, other stuff
//TODO: checksum of game, other stuff
public Dictionary<string, string> HeaderParams = new Dictionary<string, string>(); //Platform specific options go here
public List<string> Comments = new List<string>();
@ -107,5 +107,76 @@ namespace BizHawk.MultiClient
sw.WriteLine(Comments[x]);
}
}
private string ParseHeader(string line, string headerName)
{
string str;
int x = line.LastIndexOf(headerName) + headerName.Length;
str = line.Substring(x + 1, line.Length - x - 1);
return str;
}
//TODO: replace Movie Preload & Load functions with this
/// <summary>
/// Receives a line and attempts to add as a header, returns false if not a useable header line
/// </summary>
/// <param name="line"></param>
/// <returns></returns>
public bool AddHeaderFromLine(string line)
{
if (line.Length == 0) return false;
else if (line.Contains(MovieHeader.EMULATIONVERSION))
{
line = ParseHeader(line, MovieHeader.EMULATIONVERSION);
AddHeaderLine(MovieHeader.EMULATIONVERSION, line);
}
else if (line.Contains(MovieHeader.MOVIEVERSION))
{
line = ParseHeader(line, MovieHeader.MOVIEVERSION);
AddHeaderLine(MovieHeader.MOVIEVERSION, line);
}
else if (line.Contains(MovieHeader.PLATFORM))
{
line = ParseHeader(line, MovieHeader.PLATFORM);
AddHeaderLine(MovieHeader.PLATFORM, line);
}
else if (line.Contains(MovieHeader.GAMENAME))
{
line = ParseHeader(line, MovieHeader.GAMENAME);
AddHeaderLine(MovieHeader.GAMENAME, line);
}
else if (line.Contains(MovieHeader.RERECORDS))
{
line = ParseHeader(line, MovieHeader.RERECORDS);
AddHeaderLine(MovieHeader.RERECORDS, line);
}
else if (line.Contains(MovieHeader.AUTHOR))
{
line = ParseHeader(line, MovieHeader.AUTHOR);
AddHeaderLine(MovieHeader.AUTHOR, line);
}
else if (line.ToUpper().Contains(MovieHeader.GUID))
{
line = ParseHeader(line, MovieHeader.GUID);
AddHeaderLine(MovieHeader.GUID, line);
}
else if (line.StartsWith("subtitle") || line.StartsWith("sub"))
{
return false;
}
else if (line.StartsWith("comment"))
{
Comments.Add(line.Substring(8, line.Length - 8));
}
else if (line[0] == '|')
{
return false;
}
else
Comments.Add(line);
return true;
}
}
}