bk2 savestate anchor stuff

This commit is contained in:
goyuken 2014-06-20 00:39:46 +00:00
parent f561528846
commit 71ddbde18d
8 changed files with 69 additions and 50 deletions

View File

@ -9,8 +9,6 @@ namespace BizHawk.Client.Common
{ {
protected readonly Bk2Header Header = new Bk2Header(); protected readonly Bk2Header Header = new Bk2Header();
private string _syncSettingsJson = string.Empty; private string _syncSettingsJson = string.Empty;
private string _savestateBlob = string.Empty;
public IDictionary<string, string> HeaderEntries public IDictionary<string, string> HeaderEntries
{ {
@ -26,19 +24,6 @@ namespace BizHawk.Client.Common
set { _syncSettingsJson = value; } set { _syncSettingsJson = value; }
} }
public string SavestateBinaryBase64Blob
{
get
{
return _savestateBlob;
}
set
{
_savestateBlob = value;
}
}
public ulong Rerecords public ulong Rerecords
{ {
get get
@ -197,5 +182,8 @@ namespace BizHawk.Client.Common
return sb.ToString(); return sb.ToString();
} }
public string TextSavestate { get; set; }
public byte[] BinarySavestate { get; set; }
} }
} }

View File

@ -117,23 +117,19 @@ namespace BizHawk.Client.Common
} }
}); });
// Movies 2.0 TODO: be smart about text or binary state
if (StartsFromSavestate) if (StartsFromSavestate)
{ {
bl.GetLump(BinaryStateLump.CorestateText, true, delegate(TextReader tr) bl.GetCoreState(
delegate(BinaryReader br)
{ {
string line; BinarySavestate = br.ReadBytes((int)br.BaseStream.Length);
while ((line = tr.ReadLine()) != null) },
delegate(TextReader tr)
{ {
if (!string.IsNullOrWhiteSpace(line)) TextSavestate = tr.ReadToEnd();
{
SavestateBinaryBase64Blob = line;
}
}
}); });
} }
} }
return true; return true;
} }
@ -164,7 +160,14 @@ namespace BizHawk.Client.Common
if (StartsFromSavestate) if (StartsFromSavestate)
{ {
bs.PutLump(BinaryStateLump.CorestateText, (tw) => tw.WriteLine(SavestateBinaryBase64Blob)); if (TextSavestate != null)
{
bs.PutLump(BinaryStateLump.CorestateText, (TextWriter tw) => tw.Write(TextSavestate));
}
else
{
bs.PutLump(BinaryStateLump.Corestate, (BinaryWriter bw) => bw.Write(BinarySavestate));
}
} }
} }
@ -178,7 +181,8 @@ namespace BizHawk.Client.Common
Subtitles.Clear(); Subtitles.Clear();
Comments.Clear(); Comments.Clear();
_syncSettingsJson = string.Empty; _syncSettingsJson = string.Empty;
_savestateBlob = string.Empty; TextSavestate = null;
BinarySavestate = null;
} }
} }
} }

View File

@ -28,12 +28,6 @@ namespace BizHawk.Client.Common
set { Header[HeaderKeys.SYNCSETTINGS] = value; } set { Header[HeaderKeys.SYNCSETTINGS] = value; }
} }
public string SavestateBinaryBase64Blob
{
get { return Header.SavestateBinaryBase64Blob; }
set { Header.SavestateBinaryBase64Blob = value; }
}
public ulong Rerecords public ulong Rerecords
{ {
get { return Header.Rerecords; } get { return Header.Rerecords; }
@ -99,5 +93,8 @@ namespace BizHawk.Client.Common
get { return Header[HeaderKeys.FIRMWARESHA1]; } get { return Header[HeaderKeys.FIRMWARESHA1]; }
set { Header[HeaderKeys.FIRMWARESHA1] = value; } set { Header[HeaderKeys.FIRMWARESHA1] = value; }
} }
public string TextSavestate { get; set; }
public byte[] BinarySavestate { get; set; }
} }
} }

View File

@ -107,6 +107,8 @@ namespace BizHawk.Client.Common
} }
} }
} }
if (Header.SavestateBinaryBase64Blob != null)
BinarySavestate = Convert.FromBase64String(Header.SavestateBinaryBase64Blob);
Loaded = true; Loaded = true;
return true; return true;
@ -229,6 +231,11 @@ namespace BizHawk.Client.Common
private void Write(string fn) private void Write(string fn)
{ {
if (BinarySavestate != null)
Header.SavestateBinaryBase64Blob = Convert.ToBase64String(BinarySavestate);
else
Header.SavestateBinaryBase64Blob = null;
using (var fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read)) using (var fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read))
{ {
using (var sw = new StreamWriter(fs)) using (var sw = new StreamWriter(fs))

View File

@ -32,7 +32,8 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
bk2.Subtitles.Add(sub); bk2.Subtitles.Add(sub);
} }
bk2.SavestateBinaryBase64Blob = bkm.SavestateBinaryBase64Blob; bk2.TextSavestate = bkm.TextSavestate;
bk2.BinarySavestate = bkm.BinarySavestate;
for (int i = 0; i < bkm.InputLogLength; i++) for (int i = 0; i < bkm.InputLogLength; i++)
{ {

View File

@ -58,10 +58,9 @@ namespace BizHawk.Client.Common
SubtitleList Subtitles { get; } SubtitleList Subtitles { get; }
IList<string> Comments { get; } IList<string> Comments { get; }
/// <summary> // savestate anchor.
/// For savestate anchored movies, this is the starting savestate string TextSavestate { get; set; }
/// </summary> byte[] BinarySavestate { get; set; }
string SavestateBinaryBase64Blob { get; set; }
ulong Rerecords { get; set; } ulong Rerecords { get; set; }
bool StartsFromSavestate { get; set; } bool StartsFromSavestate { get; set; }

View File

@ -80,9 +80,10 @@ namespace BizHawk.Client.EmuHawk
if (Global.MovieSession.Movie.StartsFromSavestate) if (Global.MovieSession.Movie.StartsFromSavestate)
{ {
var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob); if (Global.MovieSession.Movie.TextSavestate != null)
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state))); Global.Emulator.LoadStateText(new StringReader(Global.MovieSession.Movie.TextSavestate));
Global.Emulator.ResetCounters(); else
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Global.MovieSession.Movie.BinarySavestate, false)));
} }
if (!fromTastudio) if (!fromTastudio)
@ -195,8 +196,19 @@ namespace BizHawk.Client.EmuHawk
LoadRom(CurrentlyOpenRom); LoadRom(CurrentlyOpenRom);
if (Global.MovieSession.Movie.StartsFromSavestate) if (Global.MovieSession.Movie.StartsFromSavestate)
{ {
var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob); // TODO: why does this code exist twice??
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));
if (Global.MovieSession.Movie.TextSavestate != null)
{
Global.Emulator.LoadStateText(new StringReader(Global.MovieSession.Movie.TextSavestate));
}
else
{
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Global.MovieSession.Movie.BinarySavestate, false)));
}
//var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob);
//Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));
Global.Emulator.ResetCounters(); Global.Emulator.ResetCounters();
} }

View File

@ -70,11 +70,22 @@ namespace BizHawk.Client.EmuHawk
movieToRecord.StartsFromSavestate = true; movieToRecord.StartsFromSavestate = true;
// TODO - some emulators (c++ cores) are just returning a hex string already if (Global.Emulator.BinarySaveStatesPreferred)
// theres no sense hexifying those again. we need to record that fact in the IEmulator somehow {
var bytestate = Global.Emulator.SaveStateBinary(); movieToRecord.BinarySavestate = (byte[])Global.Emulator.SaveStateBinary().Clone();
string stringstate = Convert.ToBase64String(bytestate); }
movieToRecord.SavestateBinaryBase64Blob = stringstate; else
{
using (var sw = new StringWriter())
{
Global.Emulator.SaveStateText(sw);
movieToRecord.TextSavestate = sw.ToString();
}
}
//var bytestate = Global.Emulator.SaveStateBinary();
//string stringstate = Convert.ToBase64String(bytestate);
//movieToRecord.SavestateBinaryBase64Blob = stringstate;
} }
// Header // Header