BizHawk/BizHawk.MultiClient/movie/MovieHeader.cs

201 lines
5.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace BizHawk.MultiClient
{
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: 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>();
public const string EMULATIONVERSION = "emuVersion";
public const string MOVIEVERSION = "MovieVersion";
public const string PLATFORM = "Platform";
public const string GAMENAME = "GameName";
public const string AUTHOR = "Author";
public const string RERECORDS = "rerecordCount";
public const string GUID = "GUID";
public const string STARTSFROMSAVESTATE = "StartsFromSavestate";
public static string MovieVersion = "BizHawk v0.0.1";
public static string MakeGUID()
{
return System.Guid.NewGuid().ToString();
}
public MovieHeader() //All required fields will be set to default values
{
HeaderParams.Add(EMULATIONVERSION, MainForm.EMUVERSION);
HeaderParams.Add(MOVIEVERSION, MovieVersion);
HeaderParams.Add(PLATFORM, "");
HeaderParams.Add(GAMENAME, "");
HeaderParams.Add(AUTHOR, "");
HeaderParams.Add(RERECORDS, "0");
HeaderParams.Add(GUID, MakeGUID());
}
public MovieHeader(string EmulatorVersion, string MovieVersion, string Platform, string GameName, string Author, int rerecords)
{
HeaderParams.Add(EMULATIONVERSION, EmulatorVersion);
HeaderParams.Add(MOVIEVERSION, MovieVersion);
HeaderParams.Add(PLATFORM, Platform);
HeaderParams.Add(GAMENAME, GameName);
HeaderParams.Add(AUTHOR, Author);
HeaderParams.Add(RERECORDS, rerecords.ToString());
HeaderParams.Add(GUID, MakeGUID());
}
/// <summary>
/// Adds the key value pair to header params. If key already exists, value will be updated
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void AddHeaderLine(string key, string value)
{
string temp = value;
if (!HeaderParams.TryGetValue(key, out temp)) //TODO: does a failed attempt mess with value?
HeaderParams.Add(key, value);
}
public void UpdateRerecordCount(int count)
{
HeaderParams[RERECORDS] = count.ToString();
}
public bool RemoveHeaderLine(string key)
{
return HeaderParams.Remove(key);
}
public void Clear()
{
HeaderParams.Clear();
}
public string GetHeaderLine(string key)
{
string value = "";
HeaderParams.TryGetValue(key, out value);
return value;
}
public void SetHeaderLine(string key, string value)
{
HeaderParams[key] = value;
}
public void WriteText(StreamWriter sw)
{
foreach (KeyValuePair<string, string> kvp in HeaderParams)
{
sw.WriteLine(kvp.Key + " " + kvp.Value);
}
for (int x = 0; x < Comments.Count; x++)
{
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.Contains(MovieHeader.STARTSFROMSAVESTATE))
{
line = ParseHeader(line, MovieHeader.STARTSFROMSAVESTATE);
AddHeaderLine(MovieHeader.STARTSFROMSAVESTATE, 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;
}
public void ReadHeader(StreamReader reader)
{
using (reader)
{
string str = "";
while ((str = reader.ReadLine()) != null)
{
AddHeaderFromLine(str);
}
reader.Close();
}
}
}
}