2015-07-19 19:57:40 +00:00
|
|
|
|
using System;
|
2015-07-19 02:20:38 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2015-10-04 14:43:36 +00:00
|
|
|
|
using System.Linq;
|
2015-07-19 19:57:40 +00:00
|
|
|
|
using Newtonsoft.Json;
|
2015-07-21 23:17:29 +00:00
|
|
|
|
using BizHawk.Bizware.BizwareGL;
|
2015-07-19 02:20:38 +00:00
|
|
|
|
|
|
|
|
|
namespace BizHawk.Client.Common
|
|
|
|
|
{
|
|
|
|
|
public class TasBranch
|
|
|
|
|
{
|
|
|
|
|
public int Frame { get; set; }
|
|
|
|
|
public byte[] CoreData { get; set; }
|
2015-11-15 08:27:48 +00:00
|
|
|
|
public IStringLog InputLog { get; set; }
|
2015-07-21 23:17:29 +00:00
|
|
|
|
public BitmapBuffer OSDFrameBuffer { get; set; }
|
2015-07-19 14:37:53 +00:00
|
|
|
|
public TasLagLog LagLog { get; set; }
|
2015-07-22 19:31:47 +00:00
|
|
|
|
public TasMovieChangeLog ChangeLog { get; set; }
|
2015-08-05 01:41:31 +00:00
|
|
|
|
public DateTime TimeStamp { get; set; }
|
2015-08-13 18:03:22 +00:00
|
|
|
|
public TasMovieMarkerList Markers { get; set; }
|
2015-09-16 00:42:27 +00:00
|
|
|
|
public Guid UniqueIdentifier { get; set; }
|
2015-11-23 20:26:56 +00:00
|
|
|
|
public string UserText { get; set; }
|
2017-03-15 16:17:47 +00:00
|
|
|
|
|
|
|
|
|
public TasBranch Clone()
|
|
|
|
|
{
|
|
|
|
|
return (TasBranch)MemberwiseClone();
|
|
|
|
|
}
|
2015-07-19 02:20:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class TasBranchCollection : List<TasBranch>
|
|
|
|
|
{
|
2015-10-04 14:43:36 +00:00
|
|
|
|
public new void Add(TasBranch item)
|
|
|
|
|
{
|
2015-10-05 19:11:45 +00:00
|
|
|
|
if (item.UniqueIdentifier == Guid.Empty)
|
|
|
|
|
{
|
|
|
|
|
var currentHashes = this.Select(b => b.UniqueIdentifier.GetHashCode()).ToList();
|
2015-10-04 14:43:36 +00:00
|
|
|
|
|
2017-05-10 19:19:46 +00:00
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
item.UniqueIdentifier = Guid.NewGuid();
|
|
|
|
|
}
|
2015-10-05 19:11:45 +00:00
|
|
|
|
while (currentHashes.Contains(item.UniqueIdentifier.GetHashCode()));
|
|
|
|
|
}
|
2015-10-04 14:43:36 +00:00
|
|
|
|
|
|
|
|
|
base.Add(item);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-19 19:57:40 +00:00
|
|
|
|
public void Save(BinaryStateSaver bs)
|
2015-07-19 02:20:38 +00:00
|
|
|
|
{
|
2015-07-19 19:57:40 +00:00
|
|
|
|
var nheader = new IndexedStateLump(BinaryStateLump.BranchHeader);
|
|
|
|
|
var ncore = new IndexedStateLump(BinaryStateLump.BranchCoreData);
|
|
|
|
|
var ninput = new IndexedStateLump(BinaryStateLump.BranchInputLog);
|
|
|
|
|
var nframebuffer = new IndexedStateLump(BinaryStateLump.BranchFrameBuffer);
|
|
|
|
|
var nlaglog = new IndexedStateLump(BinaryStateLump.BranchLagLog);
|
2015-09-06 14:18:23 +00:00
|
|
|
|
var nmarkers = new IndexedStateLump(BinaryStateLump.BranchMarkers);
|
2015-11-23 20:26:56 +00:00
|
|
|
|
var nusertext = new IndexedStateLump(BinaryStateLump.BranchUserText);
|
2015-07-19 21:08:55 +00:00
|
|
|
|
foreach (var b in this)
|
2015-07-19 19:57:40 +00:00
|
|
|
|
{
|
|
|
|
|
bs.PutLump(nheader, delegate(TextWriter tw)
|
|
|
|
|
{
|
|
|
|
|
// if this header needs more stuff in it, handle it sensibly
|
2015-08-05 01:41:31 +00:00
|
|
|
|
tw.WriteLine(JsonConvert.SerializeObject(new
|
|
|
|
|
{
|
2017-05-10 19:19:46 +00:00
|
|
|
|
b.Frame,
|
|
|
|
|
b.TimeStamp,
|
|
|
|
|
b.UniqueIdentifier
|
2015-08-05 01:41:31 +00:00
|
|
|
|
}));
|
2015-07-19 19:57:40 +00:00
|
|
|
|
});
|
2015-09-13 08:44:15 +00:00
|
|
|
|
|
2015-07-19 19:57:40 +00:00
|
|
|
|
bs.PutLump(ncore, delegate(Stream s)
|
|
|
|
|
{
|
|
|
|
|
s.Write(b.CoreData, 0, b.CoreData.Length);
|
|
|
|
|
});
|
2015-09-13 08:44:15 +00:00
|
|
|
|
|
2015-07-19 19:57:40 +00:00
|
|
|
|
bs.PutLump(ninput, delegate(TextWriter tw)
|
|
|
|
|
{
|
2015-11-15 10:27:00 +00:00
|
|
|
|
int todo = b.InputLog.Count;
|
|
|
|
|
for (int i = 0; i < todo; i++)
|
2017-05-10 19:19:46 +00:00
|
|
|
|
{
|
2015-11-15 08:27:48 +00:00
|
|
|
|
tw.WriteLine(b.InputLog[i]);
|
2017-05-10 19:19:46 +00:00
|
|
|
|
}
|
2015-07-19 19:57:40 +00:00
|
|
|
|
});
|
2015-09-13 08:44:15 +00:00
|
|
|
|
|
2015-07-19 19:57:40 +00:00
|
|
|
|
bs.PutLump(nframebuffer, delegate(Stream s)
|
|
|
|
|
{
|
2015-07-21 23:17:29 +00:00
|
|
|
|
var vp = new BitmapBufferVideoProvider(b.OSDFrameBuffer);
|
2015-07-26 01:31:06 +00:00
|
|
|
|
QuickBmpFile.Save(vp, s, b.OSDFrameBuffer.Width, b.OSDFrameBuffer.Height);
|
2015-07-19 19:57:40 +00:00
|
|
|
|
});
|
2015-09-13 08:44:15 +00:00
|
|
|
|
|
2015-07-19 21:08:55 +00:00
|
|
|
|
bs.PutLump(nlaglog, delegate(BinaryWriter bw)
|
2015-07-19 19:57:40 +00:00
|
|
|
|
{
|
|
|
|
|
b.LagLog.Save(bw);
|
|
|
|
|
});
|
2015-07-19 02:20:38 +00:00
|
|
|
|
|
2017-05-09 18:19:55 +00:00
|
|
|
|
bs.PutLump(nmarkers, delegate(TextWriter tw)
|
2015-09-06 14:18:23 +00:00
|
|
|
|
{
|
|
|
|
|
tw.WriteLine(b.Markers.ToString());
|
|
|
|
|
});
|
|
|
|
|
|
2015-11-23 20:26:56 +00:00
|
|
|
|
bs.PutLump(nusertext, delegate(TextWriter tw)
|
|
|
|
|
{
|
|
|
|
|
tw.WriteLine(b.UserText);
|
|
|
|
|
});
|
|
|
|
|
|
2015-07-19 19:57:40 +00:00
|
|
|
|
nheader.Increment();
|
|
|
|
|
ncore.Increment();
|
|
|
|
|
ninput.Increment();
|
|
|
|
|
nframebuffer.Increment();
|
|
|
|
|
nlaglog.Increment();
|
2015-09-13 08:44:15 +00:00
|
|
|
|
nmarkers.Increment();
|
2015-11-23 20:26:56 +00:00
|
|
|
|
nusertext.Increment();
|
2015-07-19 19:57:40 +00:00
|
|
|
|
}
|
2015-07-19 02:20:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-09-06 14:18:23 +00:00
|
|
|
|
public void Load(BinaryStateLoader bl, TasMovie movie)
|
2015-07-19 02:20:38 +00:00
|
|
|
|
{
|
2015-07-19 19:57:40 +00:00
|
|
|
|
var nheader = new IndexedStateLump(BinaryStateLump.BranchHeader);
|
|
|
|
|
var ncore = new IndexedStateLump(BinaryStateLump.BranchCoreData);
|
|
|
|
|
var ninput = new IndexedStateLump(BinaryStateLump.BranchInputLog);
|
|
|
|
|
var nframebuffer = new IndexedStateLump(BinaryStateLump.BranchFrameBuffer);
|
|
|
|
|
var nlaglog = new IndexedStateLump(BinaryStateLump.BranchLagLog);
|
2015-09-13 08:44:15 +00:00
|
|
|
|
var nmarkers = new IndexedStateLump(BinaryStateLump.BranchMarkers);
|
2015-11-23 20:26:56 +00:00
|
|
|
|
var nusertext = new IndexedStateLump(BinaryStateLump.BranchUserText);
|
2015-07-19 02:20:38 +00:00
|
|
|
|
|
2015-07-19 21:08:55 +00:00
|
|
|
|
Clear();
|
2015-07-19 19:57:40 +00:00
|
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
var b = new TasBranch();
|
|
|
|
|
|
|
|
|
|
if (!bl.GetLump(nheader, false, delegate(TextReader tr)
|
|
|
|
|
{
|
2015-08-05 01:41:31 +00:00
|
|
|
|
var header = (dynamic)JsonConvert.DeserializeObject(tr.ReadLine());
|
|
|
|
|
b.Frame = (int)header.Frame;
|
|
|
|
|
|
2017-05-17 16:16:55 +00:00
|
|
|
|
var timestamp = header.TimeStamp;
|
2015-08-05 01:41:31 +00:00
|
|
|
|
|
|
|
|
|
if (timestamp != null)
|
|
|
|
|
{
|
|
|
|
|
b.TimeStamp = (DateTime)timestamp;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
b.TimeStamp = DateTime.Now;
|
|
|
|
|
}
|
2015-09-16 00:42:27 +00:00
|
|
|
|
|
2017-05-17 16:16:55 +00:00
|
|
|
|
var identifier = header.UniqueIdentifier;
|
2015-09-16 00:42:27 +00:00
|
|
|
|
if (identifier != null)
|
|
|
|
|
{
|
|
|
|
|
b.UniqueIdentifier = (Guid)identifier;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
b.UniqueIdentifier = Guid.NewGuid();
|
|
|
|
|
}
|
2015-07-19 19:57:40 +00:00
|
|
|
|
}))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bl.GetLump(ncore, true, delegate(Stream s, long length)
|
|
|
|
|
{
|
|
|
|
|
b.CoreData = new byte[length];
|
|
|
|
|
s.Read(b.CoreData, 0, b.CoreData.Length);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
bl.GetLump(ninput, true, delegate(TextReader tr)
|
|
|
|
|
{
|
2015-11-15 08:27:48 +00:00
|
|
|
|
b.InputLog = StringLogUtil.MakeStringLog();
|
2015-07-19 19:57:40 +00:00
|
|
|
|
string line;
|
|
|
|
|
while ((line = tr.ReadLine()) != null)
|
2017-05-17 16:16:55 +00:00
|
|
|
|
{
|
2015-07-19 19:57:40 +00:00
|
|
|
|
b.InputLog.Add(line);
|
2017-05-17 16:16:55 +00:00
|
|
|
|
}
|
2015-07-19 19:57:40 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
bl.GetLump(nframebuffer, true, delegate(Stream s, long length)
|
|
|
|
|
{
|
2015-07-22 22:02:38 +00:00
|
|
|
|
var vp = new QuickBmpFile.LoadedBMP();
|
2015-07-21 23:17:29 +00:00
|
|
|
|
QuickBmpFile.Load(vp, s);
|
2015-07-22 22:02:38 +00:00
|
|
|
|
b.OSDFrameBuffer = new BitmapBuffer(vp.BufferWidth, vp.BufferHeight, vp.VideoBuffer);
|
2015-07-19 19:57:40 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
bl.GetLump(nlaglog, true, delegate(BinaryReader br)
|
|
|
|
|
{
|
|
|
|
|
b.LagLog = new TasLagLog();
|
|
|
|
|
b.LagLog.Load(br);
|
|
|
|
|
});
|
|
|
|
|
|
2015-09-06 14:18:23 +00:00
|
|
|
|
b.Markers = new TasMovieMarkerList(movie);
|
2017-05-09 18:19:55 +00:00
|
|
|
|
bl.GetLump(nmarkers, false, delegate(TextReader tr)
|
2015-09-06 14:18:23 +00:00
|
|
|
|
{
|
|
|
|
|
string line;
|
|
|
|
|
while ((line = tr.ReadLine()) != null)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(line))
|
|
|
|
|
{
|
|
|
|
|
b.Markers.Add(new TasMovieMarker(line));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2015-11-23 20:26:56 +00:00
|
|
|
|
bl.GetLump(nusertext, false, delegate(TextReader tr)
|
|
|
|
|
{
|
|
|
|
|
string line;
|
|
|
|
|
if ((line = tr.ReadLine()) != null)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(line))
|
|
|
|
|
{
|
|
|
|
|
b.UserText = line;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2015-07-19 21:08:55 +00:00
|
|
|
|
Add(b);
|
|
|
|
|
|
|
|
|
|
nheader.Increment();
|
|
|
|
|
ncore.Increment();
|
|
|
|
|
ninput.Increment();
|
|
|
|
|
nframebuffer.Increment();
|
|
|
|
|
nlaglog.Increment();
|
2015-09-13 08:44:15 +00:00
|
|
|
|
nmarkers.Increment();
|
2015-11-23 20:26:56 +00:00
|
|
|
|
nusertext.Increment();
|
2015-07-19 19:57:40 +00:00
|
|
|
|
}
|
2015-07-19 02:20:38 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|