From 72699b4ad7829ed665b22d74fedf285484500514 Mon Sep 17 00:00:00 2001 From: "andres.delikat" Date: Sun, 17 Jul 2011 17:52:39 +0000 Subject: [PATCH] another round of refactoring the Movie object --- BizHawk.MultiClient/MainForm.cs | 8 +- BizHawk.MultiClient/PlayMovie.cs | 8 +- BizHawk.MultiClient/RecordMovie.cs | 14 +-- BizHawk.MultiClient/RenderPanel.cs | 2 +- BizHawk.MultiClient/movie/EditCommentsForm.cs | 11 +-- BizHawk.MultiClient/movie/Movie.cs | 91 +++++++------------ BizHawk.MultiClient/movie/MovieConvert.cs | 59 ++++++------ BizHawk.MultiClient/movie/MovieHeader.cs | 75 ++++++++++++++- 8 files changed, 152 insertions(+), 116 deletions(-) diff --git a/BizHawk.MultiClient/MainForm.cs b/BizHawk.MultiClient/MainForm.cs index 1b550a3838..04ed367332 100644 --- a/BizHawk.MultiClient/MainForm.cs +++ b/BizHawk.MultiClient/MainForm.cs @@ -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); } diff --git a/BizHawk.MultiClient/PlayMovie.cs b/BizHawk.MultiClient/PlayMovie.cs index 3470954473..98d005a26e 100644 --- a/BizHawk.MultiClient/PlayMovie.cs +++ b/BizHawk.MultiClient/PlayMovie.cs @@ -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 h = MovieList[x].GetHeaderInfo(); + Dictionary 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; diff --git a/BizHawk.MultiClient/RecordMovie.cs b/BizHawk.MultiClient/RecordMovie.cs index 2c29f3e096..27be877dc0 100644 --- a/BizHawk.MultiClient/RecordMovie.cs +++ b/BizHawk.MultiClient/RecordMovie.cs @@ -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); diff --git a/BizHawk.MultiClient/RenderPanel.cs b/BizHawk.MultiClient/RenderPanel.cs index b90d98c6e0..c6fee487e2 100644 --- a/BizHawk.MultiClient/RenderPanel.cs +++ b/BizHawk.MultiClient/RenderPanel.cs @@ -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; } diff --git a/BizHawk.MultiClient/movie/EditCommentsForm.cs b/BizHawk.MultiClient/movie/EditCommentsForm.cs index 3d02d527b1..05808f56a8 100644 --- a/BizHawk.MultiClient/movie/EditCommentsForm.cs +++ b/BizHawk.MultiClient/movie/EditCommentsForm.cs @@ -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 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(); diff --git a/BizHawk.MultiClient/movie/Movie.cs b/BizHawk.MultiClient/movie/Movie.cs index 74c3b06683..e18b08b507 100644 --- a/BizHawk.MultiClient/movie/Movie.cs +++ b/BizHawk.MultiClient/movie/Movie.cs @@ -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; + /// /// Allows checking if file exists /// @@ -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 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 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; } } } diff --git a/BizHawk.MultiClient/movie/MovieConvert.cs b/BizHawk.MultiClient/movie/MovieConvert.cs index fcd6823dfc..df90b87fda 100644 --- a/BizHawk.MultiClient/movie/MovieConvert.cs +++ b/BizHawk.MultiClient/movie/MovieConvert.cs @@ -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 romBytes = new List(); 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); diff --git a/BizHawk.MultiClient/movie/MovieHeader.cs b/BizHawk.MultiClient/movie/MovieHeader.cs index 487f05fc5b..47a493320b 100644 --- a/BizHawk.MultiClient/movie/MovieHeader.cs +++ b/BizHawk.MultiClient/movie/MovieHeader.cs @@ -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 HeaderParams = new Dictionary(); //Platform specific options go here public List Comments = new List(); @@ -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 + /// + /// Receives a line and attempts to add as a header, returns false if not a useable header line + /// + /// + /// + 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; + } + } }