From 4c9c8e3cb1d3409d12b79d3d546ba282b0857cac Mon Sep 17 00:00:00 2001 From: adelikat Date: Thu, 10 Jul 2014 22:07:50 +0000 Subject: [PATCH] TAStudio - saving/loading of greenzone --- .../movie/tasproj/TasMovie.IO.cs | 43 +++++++++------- .../movie/tasproj/TasStateManager.cs | 49 ++++++++++++++++++- 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index fc9da039ae..bde1fcfcd0 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -28,6 +28,7 @@ namespace BizHawk.Client.Common bs.PutLump(BinaryStateLump.Input, tw => tw.WriteLine(RawInputLog())); + bs.PutLump(BinaryStateLump.Greenzone, (BinaryWriter bw) => bw.Write(StateManager.ToArray())); bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => bw.Write(LagLog.ToByteArray())); bs.PutLump(BinaryStateLump.Markers, tw => tw.WriteLine(Markers.ToString())); @@ -124,24 +125,6 @@ namespace BizHawk.Client.Common ExtractInputLog(tr, out errorMessage); }); - bl.GetLump(BinaryStateLump.LagLog, true, delegate(BinaryReader br) - { - var bytes = br.BaseStream.ReadAllBytes(); - LagLog = bytes.ToBools().ToList(); - }); - - bl.GetLump(BinaryStateLump.Markers, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) - { - if (!string.IsNullOrWhiteSpace(line)) - { - Markers.Add(new TasMovieMarker(line)); - } - } - }); - if (StartsFromSavestate) { bl.GetCoreState( @@ -154,6 +137,30 @@ namespace BizHawk.Client.Common TextSavestate = tr.ReadToEnd(); }); } + + // TasMovie enhanced information + bl.GetLump(BinaryStateLump.LagLog, false, delegate(BinaryReader br) + { + var bytes = br.BaseStream.ReadAllBytes(); + LagLog = bytes.ToBools().ToList(); + }); + + bl.GetLump(BinaryStateLump.Greenzone, false, delegate(BinaryReader br) + { + StateManager.FromArray(br.BaseStream.ReadAllBytes()); + }); + + bl.GetLump(BinaryStateLump.Markers, false, delegate(TextReader tr) + { + string line; + while ((line = tr.ReadLine()) != null) + { + if (!string.IsNullOrWhiteSpace(line)) + { + Markers.Add(new TasMovieMarker(line)); + } + } + }); } return true; } diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index 97ae2b4676..3504c09a7f 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.IO; using System.Linq; namespace BizHawk.Client.Common @@ -76,5 +78,50 @@ namespace BizHawk.Client.Common { States.Clear(); } + + public byte[] ToArray() + { + MemoryStream ms = new MemoryStream(); + var bytes = BitConverter.GetBytes(States.Count); + ms.Write(bytes, 0, bytes.Length); + foreach (var kvp in States.OrderBy(s => s.Key)) + { + var frame = BitConverter.GetBytes(kvp.Key); + ms.Write(frame, 0, frame.Length); + + var stateLen = BitConverter.GetBytes(kvp.Value.Length); + ms.Write(stateLen, 0, stateLen.Length); + ms.Write(kvp.Value, 0, kvp.Value.Length); + } + + return ms.ToArray(); + } + + // Map: + // 4 bytes - total savestate count + //[Foreach state] + // 4 bytes - frame + // 4 bytes - length of savestate + // 0 - n savestate + public void FromArray(byte[] bytes) + { + var position = 0; + var stateCount = BitConverter.ToInt32(bytes, 0); + position += 4; + for (int i = 0; i < stateCount; i++) + { + var frame = BitConverter.ToInt32(bytes, position); + position += 4; + var stateLen = BitConverter.ToInt32(bytes, position); + position += 4; + var state = bytes + .Skip(position) + .Take(stateLen) + .ToArray(); + + position += stateLen; + States.Add(frame, state); + } + } } }