BizHawk/BizHawk.Client.Common/movie/bk2/Bk2Movie.cs

171 lines
3.4 KiB
C#
Raw Normal View History

2014-06-13 00:15:55 +00:00
using System;
using System.Collections.Generic;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public partial class Bk2Movie : IMovie
{
2014-06-13 00:43:55 +00:00
private bool _makeBackup = true;
2014-06-13 00:15:55 +00:00
2014-06-14 20:17:07 +00:00
public Bk2Movie(string filename)
: this()
2014-06-13 00:15:55 +00:00
{
Rerecords = 0;
Filename = filename;
}
2014-06-14 20:17:07 +00:00
public Bk2Movie()
2014-06-13 00:15:55 +00:00
{
Subtitles = new SubtitleList();
Comments = new List<string>();
2014-06-13 00:15:55 +00:00
Filename = string.Empty;
IsCountingRerecords = true;
_mode = Moviemode.Inactive;
2014-06-13 00:43:55 +00:00
_makeBackup = true;
2014-06-14 20:17:07 +00:00
Header[HeaderKeys.MOVIEVERSION] = "BizHawk v2.0.0";
2014-06-13 00:15:55 +00:00
}
2014-06-14 14:04:54 +00:00
public string Filename { get; set; }
2014-06-14 20:17:07 +00:00
public virtual string PreferredExtension { get { return Extension; } }
public const string Extension = "bk2";
2014-06-14 20:17:07 +00:00
2014-07-07 18:03:02 +00:00
public bool Changes { get; protected set; }
2014-06-14 14:04:54 +00:00
public bool IsCountingRerecords { get; set; }
2014-06-13 00:15:55 +00:00
public ILogEntryGenerator LogGeneratorInstance()
{
return new Bk2LogEntryGenerator(_logKey);
}
2014-06-13 00:15:55 +00:00
public double FrameCount
{
2014-06-14 14:04:54 +00:00
get
{
2014-06-14 18:52:00 +00:00
if (LoopOffset.HasValue)
2014-06-14 14:04:54 +00:00
{
return double.PositiveInfinity;
}
return _log.Count;
2014-06-14 14:04:54 +00:00
}
2014-06-13 00:15:55 +00:00
}
public int InputLogLength
{
get { return _log.Count; }
2014-06-13 00:15:55 +00:00
}
2014-06-14 14:04:54 +00:00
#region Log Editing
2014-06-13 00:15:55 +00:00
public void AppendFrame(IController source)
{
var lg = LogGeneratorInstance();
lg.SetSource(source);
_log.Add(lg.GenerateLogEntry());
2014-06-14 14:04:54 +00:00
Changes = true;
2014-06-13 00:15:55 +00:00
}
public virtual void RecordFrame(int frame, IController source)
2014-06-13 00:15:55 +00:00
{
2014-06-14 14:04:54 +00:00
if (Global.Config.VBAStyleMovieLoadState)
{
if (Global.Emulator.Frame < _log.Count)
2014-06-14 14:04:54 +00:00
{
2014-06-15 02:23:28 +00:00
Truncate(Global.Emulator.Frame);
2014-06-14 14:04:54 +00:00
}
}
var lg = LogGeneratorInstance();
lg.SetSource(source);
2014-06-15 02:23:28 +00:00
SetFrameAt(frame, lg.GenerateLogEntry());
2014-06-14 14:04:54 +00:00
Changes = true;
2014-06-13 00:15:55 +00:00
}
public virtual void Truncate(int frame)
2014-06-13 00:15:55 +00:00
{
2014-08-10 02:21:08 +00:00
// This is a bad way to do multitrack logic, pass the info in instead of going to the global
// and it is weird for Truncte to possibly not truncate
if (!Global.MovieSession.MultiTrack.IsActive)
2014-06-15 02:23:28 +00:00
{
2014-08-10 02:21:08 +00:00
if (frame < _log.Count)
{
_log.RemoveRange(frame, _log.Count - frame);
Changes = true;
}
2014-06-15 02:23:28 +00:00
}
2014-06-13 00:15:55 +00:00
}
public IController GetInputState(int frame)
{
if (frame < FrameCount && frame >= 0)
{
int getframe;
if (LoopOffset.HasValue)
{
if (frame < _log.Count)
{
getframe = frame;
}
else
{
getframe = ((frame - LoopOffset.Value) % (_log.Count - LoopOffset.Value)) + LoopOffset.Value;
}
}
else
{
getframe = frame;
}
var adapter = new Bk2ControllerAdapter
{
Type = Global.MovieSession.MovieControllerAdapter.Type
};
adapter.SetControllersAsMnemonic(_log[getframe]);
return adapter;
}
return null;
}
public virtual void PokeFrame(int frame, IController source)
{
2014-07-04 00:24:41 +00:00
var lg = LogGeneratorInstance();
lg.SetSource(source);
Changes = true;
SetFrameAt(frame, lg.GenerateLogEntry());
}
public virtual void ClearFrame(int frame)
{
var lg = LogGeneratorInstance();
lg.SetSource(Global.MovieSession.MovieControllerInstance());
SetFrameAt(frame, lg.EmptyEntry);
Changes = true;
}
2014-06-14 14:04:54 +00:00
#endregion
2014-06-15 02:23:28 +00:00
private void SetFrameAt(int frameNum, string frame)
{
if (_log.Count > frameNum)
{
_log[frameNum] = frame;
}
else
{
_log.Add(frame);
}
}
2014-06-13 00:15:55 +00:00
}
}