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();
private string _syncSettingsJson = string.Empty;
private string _savestateBlob = string.Empty;
public IDictionary<string, string> HeaderEntries
{
@ -26,19 +24,6 @@ namespace BizHawk.Client.Common
set { _syncSettingsJson = value; }
}
public string SavestateBinaryBase64Blob
{
get
{
return _savestateBlob;
}
set
{
_savestateBlob = value;
}
}
public ulong Rerecords
{
get
@ -197,5 +182,8 @@ namespace BizHawk.Client.Common
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)
{
bl.GetLump(BinaryStateLump.CorestateText, true, delegate(TextReader tr)
{
string line;
while ((line = tr.ReadLine()) != null)
bl.GetCoreState(
delegate(BinaryReader br)
{
if (!string.IsNullOrWhiteSpace(line))
{
SavestateBinaryBase64Blob = line;
}
}
});
BinarySavestate = br.ReadBytes((int)br.BaseStream.Length);
},
delegate(TextReader tr)
{
TextSavestate = tr.ReadToEnd();
});
}
}
return true;
}
@ -164,7 +160,14 @@ namespace BizHawk.Client.Common
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();
Comments.Clear();
_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; }
}
public string SavestateBinaryBase64Blob
{
get { return Header.SavestateBinaryBase64Blob; }
set { Header.SavestateBinaryBase64Blob = value; }
}
public ulong Rerecords
{
get { return Header.Rerecords; }
@ -99,5 +93,8 @@ namespace BizHawk.Client.Common
get { return Header[HeaderKeys.FIRMWARESHA1]; }
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;
return true;
@ -229,6 +231,11 @@ namespace BizHawk.Client.Common
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 sw = new StreamWriter(fs))

View File

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

View File

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

View File

@ -80,9 +80,10 @@ namespace BizHawk.Client.EmuHawk
if (Global.MovieSession.Movie.StartsFromSavestate)
{
var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob);
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));
Global.Emulator.ResetCounters();
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)));
}
if (!fromTastudio)
@ -195,8 +196,19 @@ namespace BizHawk.Client.EmuHawk
LoadRom(CurrentlyOpenRom);
if (Global.MovieSession.Movie.StartsFromSavestate)
{
var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob);
Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state)));
// TODO: why does this code exist twice??
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();
}

View File

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