BizHawk/BizHawk.Client.Common/movie/tasproj/TasMovie.cs

200 lines
4.5 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
2014-06-11 21:14:13 +00:00
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public sealed partial class TasMovie : Bk2Movie
{
private List<bool> LagLog = new List<bool>();
private readonly TasStateManager StateManager = new TasStateManager();
2014-07-13 14:26:40 +00:00
public TasMovie(string path) : base(path) { }
2014-06-14 20:17:07 +00:00
public TasMovie()
: base()
{
2014-07-13 14:26:40 +00:00
Header[HeaderKeys.MOVIEVERSION] = "BizHawk v2.0 Tasproj v1.0";
Markers = new TasMovieMarkerList();
}
public override string PreferredExtension
{
get { return Extension; }
}
public new const string Extension = "tasproj";
2014-07-13 14:13:20 +00:00
public TasMovieMarkerList Markers { get; set; }
2014-07-07 18:03:02 +00:00
public TasMovieRecord this[int index]
{
get
{
if (index == 9)
{
int zzz = 0;
}
return new TasMovieRecord
{
State = StateManager[index],
LogEntry = GetInput(index),
Lagged = (index < LagLog.Count) ? LagLog[index] : (bool?)null
};
}
}
2014-07-08 13:33:01 +00:00
public void ClearChanges()
{
Changes = false;
}
2014-07-08 13:33:01 +00:00
public override void StartNewRecording()
{
LagLog.Clear();
StateManager.Clear();
Markers.Clear();
2014-07-08 13:33:01 +00:00
base.StartNewRecording();
}
/// <summary>
/// Removes lag log and greenzone after this frame
/// </summary>
private void InvalidateAfter(int frame)
{
if (frame < LagLog.Count)
{
LagLog.RemoveRange(frame + 1, LagLog.Count - frame - 1);
}
StateManager.Invalidate(frame + 1);
Changes = true; // TODO check if this actually removed anyting before flagging changes
}
2014-07-10 02:45:56 +00:00
private readonly Bk2MnemonicConstants Mnemonics = new Bk2MnemonicConstants();
/// <summary>
/// Returns the mnemonic value for boolean buttons, and actual value for floats,
/// for a given frame and button
/// </summary>
public string DisplayValue(int frame, string buttonName)
{
var adapter = GetInputState(frame);
if (adapter.Type.BoolButtons.Contains(buttonName))
{
return adapter.IsPressed(buttonName) ?
Mnemonics[buttonName].ToString() :
string.Empty;
}
if (adapter.Type.FloatControls.Contains(buttonName))
{
2014-07-11 16:26:19 +00:00
return adapter.GetFloat(buttonName).ToString();
2014-07-10 02:45:56 +00:00
}
return "!";
}
public void ToggleBoolState(int frame, string buttonName)
{
if (frame < _log.Count)
{
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
adapter[buttonName] = !adapter.IsPressed(buttonName);
var lg = LogGeneratorInstance();
lg.SetSource(adapter);
_log[frame] = lg.GenerateLogEntry();
Changes = true;
InvalidateAfter(frame);
}
}
public void SetBoolState(int frame, string buttonName, bool val)
{
if (frame < _log.Count)
{
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
var old = adapter[buttonName];
adapter[buttonName] = val;
var lg = LogGeneratorInstance();
lg.SetSource(adapter);
_log[frame] = lg.GenerateLogEntry();
if (old != val)
{
InvalidateAfter(frame);
Changes = true;
}
}
}
2014-07-11 16:26:19 +00:00
public void SetFloatState(int frame, string buttonName, float val)
{
if (frame < _log.Count)
{
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
var old = adapter.GetFloat(buttonName);
adapter.SetFloat(buttonName, val);
var lg = LogGeneratorInstance();
lg.SetSource(adapter);
_log[frame] = lg.GenerateLogEntry();
if (old != val)
{
InvalidateAfter(frame);
2014-07-11 16:26:19 +00:00
Changes = true;
}
}
}
public bool BoolIsPressed(int frame, string buttonName)
{
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
return adapter.IsPressed(buttonName);
}
2014-07-11 16:26:19 +00:00
public float GetFloatValue(int frame, string buttonName)
{
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
return adapter.GetFloat(buttonName);
}
public override string GetInput(int frame)
{
if (Global.Emulator.Frame == frame && !StateManager.HasState(frame))
{
StateManager.Capture();
}
if (Global.Emulator.Frame == frame && frame >= LagLog.Count)
{
LagLog.Add(Global.Emulator.IsLagFrame);
}
return base.GetInput(frame);
}
2014-07-11 15:43:47 +00:00
public TasStateManager.ManagerSettings GreenzoneSettings
{
get { return StateManager.Settings; }
}
2014-07-13 15:26:50 +00:00
public int LastEmulatedFrame
{
get
{
return StateManager.Last.Key;
}
}
}
}