IController - Remove the indexer property and refactor code accordingly, also simplify and cleanup many of the IController implementations
This commit is contained in:
parent
e94de78ebd
commit
2d9213c379
|
@ -341,7 +341,7 @@ namespace BizHawk.Client.ApiHawk
|
||||||
AutoFireStickyXorAdapter joypadAdaptor = Global.AutofireStickyXORAdapter;
|
AutoFireStickyXorAdapter joypadAdaptor = Global.AutofireStickyXORAdapter;
|
||||||
|
|
||||||
IEnumerable<string> pressedButtons = from button in joypadAdaptor.Definition.BoolButtons
|
IEnumerable<string> pressedButtons = from button in joypadAdaptor.Definition.BoolButtons
|
||||||
where joypadAdaptor[button]
|
where joypadAdaptor.IsPressed(button)
|
||||||
select button;
|
select button;
|
||||||
|
|
||||||
foreach (Joypad j in allJoypads)
|
foreach (Joypad j in allJoypads)
|
||||||
|
|
|
@ -9,14 +9,6 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
public class Controller : IController
|
public class Controller : IController
|
||||||
{
|
{
|
||||||
private readonly WorkingDictionary<string, List<string>> _bindings = new WorkingDictionary<string, List<string>>();
|
|
||||||
private readonly WorkingDictionary<string, bool> _buttons = new WorkingDictionary<string, bool>();
|
|
||||||
private readonly WorkingDictionary<string, float> _floatButtons = new WorkingDictionary<string, float>();
|
|
||||||
private readonly Dictionary<string, ControllerDefinition.FloatRange> _floatRanges = new WorkingDictionary<string, ControllerDefinition.FloatRange>();
|
|
||||||
private readonly Dictionary<string, Config.AnalogBind> _floatBinds = new Dictionary<string, Config.AnalogBind>();
|
|
||||||
|
|
||||||
private ControllerDefinition _type;
|
|
||||||
|
|
||||||
public Controller(ControllerDefinition definition)
|
public Controller(ControllerDefinition definition)
|
||||||
{
|
{
|
||||||
_type = definition;
|
_type = definition;
|
||||||
|
@ -27,16 +19,37 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ControllerDefinition Definition { get { return _type; } }
|
public ControllerDefinition Definition
|
||||||
|
{
|
||||||
|
get { return _type; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>don't do this</summary>
|
|
||||||
public void ForceType(ControllerDefinition newtype) { _type = newtype; }
|
|
||||||
public bool this[string button] { get { return IsPressed(button); } }
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return _buttons[button];
|
return _buttons[button];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float GetFloat(string name)
|
||||||
|
{
|
||||||
|
return _floatButtons[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly WorkingDictionary<string, List<string>> _bindings = new WorkingDictionary<string, List<string>>();
|
||||||
|
private readonly WorkingDictionary<string, bool> _buttons = new WorkingDictionary<string, bool>();
|
||||||
|
private readonly WorkingDictionary<string, float> _floatButtons = new WorkingDictionary<string, float>();
|
||||||
|
private readonly Dictionary<string, ControllerDefinition.FloatRange> _floatRanges = new WorkingDictionary<string, ControllerDefinition.FloatRange>();
|
||||||
|
private readonly Dictionary<string, Config.AnalogBind> _floatBinds = new Dictionary<string, Config.AnalogBind>();
|
||||||
|
|
||||||
|
private ControllerDefinition _type;
|
||||||
|
|
||||||
|
/// <summary>don't do this</summary>
|
||||||
|
public void ForceType(ControllerDefinition newtype) { _type = newtype; }
|
||||||
|
|
||||||
|
public bool this[string button]
|
||||||
|
{
|
||||||
|
get { return IsPressed(button); }
|
||||||
|
}
|
||||||
|
|
||||||
public bool AnyPressed
|
public bool AnyPressed
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -50,8 +63,6 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetFloat(string name) { return _floatButtons[name]; }
|
|
||||||
|
|
||||||
// Looks for bindings which are activated by the supplied physical button.
|
// Looks for bindings which are activated by the supplied physical button.
|
||||||
public List<string> SearchBindings(string button)
|
public List<string> SearchBindings(string button)
|
||||||
{
|
{
|
||||||
|
@ -132,7 +143,7 @@ namespace BizHawk.Client.Common
|
||||||
_buttons[kvp.Key] = false;
|
_buttons[kvp.Key] = false;
|
||||||
foreach (var bound_button in kvp.Value)
|
foreach (var bound_button in kvp.Value)
|
||||||
{
|
{
|
||||||
if (controller[bound_button])
|
if (controller.IsPressed(bound_button))
|
||||||
{
|
{
|
||||||
_buttons[kvp.Key] = true;
|
_buttons[kvp.Key] = true;
|
||||||
}
|
}
|
||||||
|
@ -181,7 +192,7 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
foreach (var button in controller.Overrides)
|
foreach (var button in controller.Overrides)
|
||||||
{
|
{
|
||||||
_buttons[button] = controller[button];
|
_buttons[button] = controller.IsPressed(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var button in controller.FloatOverrides)
|
foreach (var button in controller.FloatOverrides)
|
||||||
|
@ -260,7 +271,7 @@ namespace BizHawk.Client.Common
|
||||||
public int Off { get; set; }
|
public int Off { get; set; }
|
||||||
|
|
||||||
public ControllerDefinition Definition { get { return _type; } }
|
public ControllerDefinition Definition { get { return _type; } }
|
||||||
public bool this[string button] { get { return IsPressed(button); } }
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
if (_autofire)
|
if (_autofire)
|
||||||
|
@ -295,7 +306,7 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
foreach (var bound_button in kvp.Value)
|
foreach (var bound_button in kvp.Value)
|
||||||
{
|
{
|
||||||
if (_buttons[kvp.Key] == false && controller[bound_button])
|
if (_buttons[kvp.Key] == false && controller.IsPressed(bound_button))
|
||||||
{
|
{
|
||||||
_buttonStarts[kvp.Key] = _emulator.Frame;
|
_buttonStarts[kvp.Key] = _emulator.Frame;
|
||||||
}
|
}
|
||||||
|
@ -308,7 +319,7 @@ namespace BizHawk.Client.Common
|
||||||
_buttons[kvp.Key] = false;
|
_buttons[kvp.Key] = false;
|
||||||
foreach (var bound_button in kvp.Value)
|
foreach (var bound_button in kvp.Value)
|
||||||
{
|
{
|
||||||
if (controller[bound_button])
|
if (controller.IsPressed(bound_button))
|
||||||
{
|
{
|
||||||
_buttons[kvp.Key] = true;
|
_buttons[kvp.Key] = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,4 @@
|
||||||
using System;
|
namespace BizHawk.Client.Common
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace BizHawk.Client.Common
|
|
||||||
{
|
{
|
||||||
public class AutoPatternBool
|
public class AutoPatternBool
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,74 +1,56 @@
|
||||||
using System;
|
using BizHawk.Emulation.Common;
|
||||||
|
|
||||||
using BizHawk.Emulation.Common;
|
|
||||||
|
|
||||||
namespace BizHawk.Client.Common
|
namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
public class AndAdapter : IController
|
public class AndAdapter : IController
|
||||||
{
|
{
|
||||||
|
public ControllerDefinition Definition
|
||||||
|
{
|
||||||
|
get { return Source.Definition; }
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return this[button];
|
if (Source != null && SourceAnd != null)
|
||||||
|
{
|
||||||
|
return Source.IsPressed(button) & SourceAnd.IsPressed(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pass floats solely from the original source
|
// pass floats solely from the original source
|
||||||
// this works in the code because SourceOr is the autofire controller
|
// this works in the code because SourceOr is the autofire controller
|
||||||
public float GetFloat(string name) { return Source.GetFloat(name); }
|
public float GetFloat(string name)
|
||||||
|
|
||||||
public IController Source { get; set; }
|
|
||||||
public IController SourceAnd { get; set; }
|
|
||||||
public ControllerDefinition Definition { get { return Source.Definition; } set { throw new InvalidOperationException(); } }
|
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
{
|
||||||
get
|
return Source.GetFloat(name);
|
||||||
{
|
|
||||||
if (Source != null && SourceAnd != null)
|
|
||||||
{
|
|
||||||
return Source[button] & SourceAnd[button];
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal IController Source { get; set; }
|
||||||
|
internal IController SourceAnd { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ORAdapter : IController
|
public class ORAdapter : IController
|
||||||
{
|
{
|
||||||
|
public ControllerDefinition Definition
|
||||||
|
{
|
||||||
|
get { return Source.Definition; }
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return this[button];
|
return (Source != null ? Source.IsPressed(button) : false)
|
||||||
|
| (SourceOr != null ? SourceOr.IsPressed(button) : false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pass floats solely from the original source
|
// pass floats solely from the original source
|
||||||
// this works in the code because SourceOr is the autofire controller
|
// this works in the code because SourceOr is the autofire controller
|
||||||
public float GetFloat(string name) { return Source.GetFloat(name); }
|
public float GetFloat(string name)
|
||||||
|
|
||||||
public IController Source { get; set; }
|
|
||||||
public IController SourceOr { get; set; }
|
|
||||||
|
|
||||||
public ControllerDefinition Definition
|
|
||||||
{
|
{
|
||||||
get { return Source.Definition; }
|
return Source.GetFloat(name);
|
||||||
set { throw new InvalidOperationException(); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool this[string button]
|
internal IController Source { get; set; }
|
||||||
{
|
internal IController SourceOr { get; set; }
|
||||||
get
|
|
||||||
{
|
|
||||||
return (Source != null ? Source[button] : false)
|
|
||||||
| (SourceOr != null ? SourceOr[button] : false);
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,11 +12,6 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
public ControllerDefinition Definition { get; set; }
|
public ControllerDefinition Definition { get; set; }
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get { return IsPressed(button); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return _pressed.Contains(button);
|
return _pressed.Contains(button);
|
||||||
|
|
|
@ -7,28 +7,11 @@ namespace BizHawk.Client.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class CopyControllerAdapter : IController
|
public class CopyControllerAdapter : IController
|
||||||
{
|
{
|
||||||
public IController Source { get; set; }
|
|
||||||
|
|
||||||
private IController Curr
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Source == null
|
|
||||||
? NullController.Instance
|
|
||||||
: Source;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ControllerDefinition Definition
|
public ControllerDefinition Definition
|
||||||
{
|
{
|
||||||
get { return Curr.Definition; }
|
get { return Curr.Definition; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get { return Curr[button]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return Curr.IsPressed(button);
|
return Curr.IsPressed(button);
|
||||||
|
@ -38,5 +21,17 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
return Curr.GetFloat(name);
|
return Curr.GetFloat(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IController Source { get; set; }
|
||||||
|
|
||||||
|
private IController Curr
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Source == null
|
||||||
|
? NullController.Instance
|
||||||
|
: Source;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,4 @@
|
||||||
using System;
|
using BizHawk.Emulation.Common;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
using BizHawk.Emulation.Common;
|
|
||||||
using BizHawk.Client.Common;
|
|
||||||
|
|
||||||
namespace BizHawk.Client.Common.InputAdapterExtensions
|
namespace BizHawk.Client.Common.InputAdapterExtensions
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,40 +11,20 @@ namespace BizHawk.Client.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class OverrideAdaptor : IController
|
public class OverrideAdaptor : IController
|
||||||
{
|
{
|
||||||
|
public ControllerDefinition Definition { get; private set; }
|
||||||
|
|
||||||
private readonly Dictionary<string, bool> _overrides = new Dictionary<string, bool>();
|
private readonly Dictionary<string, bool> _overrides = new Dictionary<string, bool>();
|
||||||
private readonly Dictionary<string, float> _floatOverrides = new Dictionary<string, float>();
|
private readonly Dictionary<string, float> _floatOverrides = new Dictionary<string, float>();
|
||||||
private readonly List<string> _inverses = new List<string>();
|
private readonly List<string> _inverses = new List<string>();
|
||||||
|
|
||||||
public ControllerDefinition Definition { get; set; }
|
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (_overrides.ContainsKey(button))
|
|
||||||
{
|
|
||||||
return _overrides[button];
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (_overrides.ContainsKey(button))
|
|
||||||
{
|
|
||||||
_overrides[button] = value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_overrides.Add(button, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return this[button];
|
if (_overrides.ContainsKey(button))
|
||||||
|
{
|
||||||
|
return _overrides[button];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InvalidOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetFloat(string name)
|
public float GetFloat(string name)
|
||||||
|
@ -104,7 +84,15 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
public void SetButton(string button, bool value)
|
public void SetButton(string button, bool value)
|
||||||
{
|
{
|
||||||
this[button] = value;
|
if (_overrides.ContainsKey(button))
|
||||||
|
{
|
||||||
|
_overrides[button] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_overrides.Add(button, value);
|
||||||
|
}
|
||||||
|
|
||||||
_inverses.Remove(button);
|
_inverses.Remove(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
|
@ -18,9 +17,15 @@ namespace BizHawk.Client.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class StickyOrAdapter : IController
|
public class StickyOrAdapter : IController
|
||||||
{
|
{
|
||||||
|
public ControllerDefinition Definition
|
||||||
|
{
|
||||||
|
get { return Source.Definition; }
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return this[button];
|
return Source.StickyIsInEffect(button)
|
||||||
|
|| SourceStickyOr.StickyIsInEffect(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pass floats solely from the original source
|
// pass floats solely from the original source
|
||||||
|
@ -33,56 +38,34 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
public ISticky Source { get; set; }
|
public ISticky Source { get; set; }
|
||||||
public ISticky SourceStickyOr { get; set; }
|
public ISticky SourceStickyOr { get; set; }
|
||||||
public ControllerDefinition Definition { get { return Source.Definition; } set { throw new InvalidOperationException(); } }
|
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Source.StickyIsInEffect(button) ||
|
|
||||||
SourceStickyOr.StickyIsInEffect(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StickyXorAdapter : ISticky, IController
|
public class StickyXorAdapter : ISticky, IController
|
||||||
{
|
{
|
||||||
protected HashSet<string> stickySet = new HashSet<string>();
|
/// <summary>
|
||||||
|
/// Determines if a sticky is current mashing the button itself,
|
||||||
|
/// If sticky is not set then false, if set, it returns true if the Source is not pressed, else false
|
||||||
|
/// </summary>
|
||||||
|
public bool StickyIsInEffect(string button)
|
||||||
|
{
|
||||||
|
if (IsSticky(button))
|
||||||
|
{
|
||||||
|
return !Source.IsPressed(button);
|
||||||
|
}
|
||||||
|
|
||||||
public IController Source { get; set; }
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public ControllerDefinition Definition
|
public ControllerDefinition Definition
|
||||||
{
|
{
|
||||||
get { return Source.Definition; }
|
get { return Source.Definition; }
|
||||||
set { throw new InvalidOperationException(); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Locked { get; set; } // Pretty much a hack,
|
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return this[button];
|
var source = Source.IsPressed(button);
|
||||||
}
|
source ^= stickySet.Contains(button);
|
||||||
|
return source;
|
||||||
// if SetFloat() is called (typically virtual pads), then that float will entirely override the Source input
|
|
||||||
// otherwise, the source is passed thru.
|
|
||||||
protected readonly WorkingDictionary<string, float?> _floatSet = new WorkingDictionary<string, float?>();
|
|
||||||
|
|
||||||
public void SetFloat(string name, float? value)
|
|
||||||
{
|
|
||||||
if (value.HasValue)
|
|
||||||
{
|
|
||||||
_floatSet[name] = value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_floatSet.Remove(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetFloat(string name)
|
public float GetFloat(string name)
|
||||||
|
@ -102,40 +85,35 @@ namespace BizHawk.Client.Common
|
||||||
return Source.GetFloat(name);
|
return Source.GetFloat(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IController Source { get; set; }
|
||||||
|
|
||||||
|
public bool Locked { get; set; } // Pretty much a hack,
|
||||||
|
|
||||||
|
private List<string> _justPressed = new List<string>();
|
||||||
|
|
||||||
|
protected readonly HashSet<string> stickySet = new HashSet<string>();
|
||||||
|
|
||||||
|
// if SetFloat() is called (typically virtual pads), then that float will entirely override the Source input
|
||||||
|
// otherwise, the source is passed thru.
|
||||||
|
protected readonly WorkingDictionary<string, float?> _floatSet = new WorkingDictionary<string, float?>();
|
||||||
|
|
||||||
|
public void SetFloat(string name, float? value)
|
||||||
|
{
|
||||||
|
if (value.HasValue)
|
||||||
|
{
|
||||||
|
_floatSet[name] = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_floatSet.Remove(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void ClearStickyFloats()
|
public void ClearStickyFloats()
|
||||||
{
|
{
|
||||||
_floatSet.Clear();
|
_floatSet.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var source = Source[button];
|
|
||||||
source ^= stickySet.Contains(button);
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
set
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines if a sticky is current mashing the button itself,
|
|
||||||
/// If sticky is not set then false, if set, it returns true if the Source is not pressed, else false
|
|
||||||
/// </summary>
|
|
||||||
public bool StickyIsInEffect(string button)
|
|
||||||
{
|
|
||||||
if (IsSticky(button))
|
|
||||||
{
|
|
||||||
return !Source.IsPressed(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetSticky(string button, bool isSticky)
|
public void SetSticky(string button, bool isSticky)
|
||||||
{
|
{
|
||||||
if (isSticky)
|
if (isSticky)
|
||||||
|
@ -189,16 +167,62 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
_justPressed = buttons;
|
_justPressed = buttons;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<string> _justPressed = new List<string>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AutoFireStickyXorAdapter : ISticky, IController
|
public class AutoFireStickyXorAdapter : ISticky, IController
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if a sticky is current mashing the button itself,
|
||||||
|
/// If sticky is not set then false, if set, it returns true if the Source is not pressed, else false
|
||||||
|
/// </summary>
|
||||||
|
public bool StickyIsInEffect(string button)
|
||||||
|
{
|
||||||
|
if (IsSticky(button))
|
||||||
|
{
|
||||||
|
return !Source.IsPressed(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ControllerDefinition Definition
|
||||||
|
{
|
||||||
|
get { return Source.Definition; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsPressed(string button)
|
||||||
|
{
|
||||||
|
var source = Source.IsPressed(button);
|
||||||
|
bool patternValue = false;
|
||||||
|
if (_boolPatterns.ContainsKey(button))
|
||||||
|
{ // I can't figure a way to determine right here if it should Peek or Get.
|
||||||
|
patternValue = _boolPatterns[button].PeekNextValue();
|
||||||
|
}
|
||||||
|
source ^= patternValue;
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float GetFloat(string name)
|
||||||
|
{
|
||||||
|
if (_floatPatterns.ContainsKey(name))
|
||||||
|
{
|
||||||
|
return _floatPatterns[name].PeekNextValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Source == null)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Source.GetFloat(name);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Change the AutoHold adapter to be one of these, with an 'Off' value of 0?
|
// TODO: Change the AutoHold adapter to be one of these, with an 'Off' value of 0?
|
||||||
// Probably would have slightly lower performance, but it seems weird to have such a similar class that is only used once.
|
// Probably would have slightly lower performance, but it seems weird to have such a similar class that is only used once.
|
||||||
private int On;
|
private int On;
|
||||||
private int Off;
|
private int Off;
|
||||||
|
|
||||||
public void SetOnOffPatternFromConfig()
|
public void SetOnOffPatternFromConfig()
|
||||||
{
|
{
|
||||||
On = Global.Config.AutofireOn < 1 ? 0 : Global.Config.AutofireOn;
|
On = Global.Config.AutofireOn < 1 ? 0 : Global.Config.AutofireOn;
|
||||||
|
@ -215,18 +239,8 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
public IController Source { get; set; }
|
public IController Source { get; set; }
|
||||||
|
|
||||||
public ControllerDefinition Definition
|
|
||||||
{
|
|
||||||
get { return Source.Definition; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Locked { get; set; } // Pretty much a hack,
|
public bool Locked { get; set; } // Pretty much a hack,
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
|
||||||
{
|
|
||||||
return this[button];
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetFloat(string name, float? value, AutoPatternFloat pattern = null)
|
public void SetFloat(string name, float? value, AutoPatternFloat pattern = null)
|
||||||
{
|
{
|
||||||
if (value.HasValue)
|
if (value.HasValue)
|
||||||
|
@ -241,52 +255,11 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetFloat(string name)
|
|
||||||
{
|
|
||||||
if (_floatPatterns.ContainsKey(name))
|
|
||||||
return _floatPatterns[name].PeekNextValue();
|
|
||||||
|
|
||||||
if (Source == null)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return Source.GetFloat(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ClearStickyFloats()
|
public void ClearStickyFloats()
|
||||||
{
|
{
|
||||||
_floatPatterns.Clear();
|
_floatPatterns.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var source = Source[button];
|
|
||||||
bool patternValue = false;
|
|
||||||
if (_boolPatterns.ContainsKey(button))
|
|
||||||
{ // I can't figure a way to determine right here if it should Peek or Get.
|
|
||||||
patternValue = _boolPatterns[button].PeekNextValue();
|
|
||||||
}
|
|
||||||
source ^= patternValue;
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines if a sticky is current mashing the button itself,
|
|
||||||
/// If sticky is not set then false, if set, it returns true if the Source is not pressed, else false
|
|
||||||
/// </summary>
|
|
||||||
public bool StickyIsInEffect(string button)
|
|
||||||
{
|
|
||||||
if (IsSticky(button))
|
|
||||||
{
|
|
||||||
return !Source.IsPressed(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetSticky(string button, bool isSticky, AutoPatternBool pattern = null)
|
public void SetSticky(string button, bool isSticky, AutoPatternBool pattern = null)
|
||||||
{
|
{
|
||||||
if (isSticky)
|
if (isSticky)
|
||||||
|
@ -335,6 +308,7 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<string> _justPressed = new List<string>();
|
private List<string> _justPressed = new List<string>();
|
||||||
|
|
||||||
public void MassToggleStickyState(List<string> buttons)
|
public void MassToggleStickyState(List<string> buttons)
|
||||||
{
|
{
|
||||||
foreach (var button in buttons.Where(button => !_justPressed.Contains(button)))
|
foreach (var button in buttons.Where(button => !_justPressed.Contains(button)))
|
||||||
|
|
|
@ -11,31 +11,15 @@ namespace BizHawk.Client.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UD_LR_ControllerAdapter : IController
|
public class UD_LR_ControllerAdapter : IController
|
||||||
{
|
{
|
||||||
private HashSet<string> Unpresses = new HashSet<string>();
|
|
||||||
|
|
||||||
public ControllerDefinition Definition
|
public ControllerDefinition Definition
|
||||||
{
|
{
|
||||||
get { return Source.Definition; }
|
get { return Source.Definition; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool this[string button]
|
|
||||||
{
|
|
||||||
get { return IsPressed(button); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public IController Source { get; set; }
|
|
||||||
|
|
||||||
// The float format implies no U+D and no L+R no matter what, so just passthru
|
|
||||||
public float GetFloat(string name)
|
|
||||||
{
|
|
||||||
return Source.GetFloat(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
bool PriorityUD_LR = !Global.Config.AllowUD_LR && !Global.Config.ForbidUD_LR; // implied by neither of the others being set (left as non-enum for back-compatibility)
|
bool PriorityUD_LR = !Global.Config.AllowUD_LR && !Global.Config.ForbidUD_LR; // implied by neither of the others being set (left as non-enum for back-compatibility)
|
||||||
|
|
||||||
|
|
||||||
if (Global.Config.AllowUD_LR)
|
if (Global.Config.AllowUD_LR)
|
||||||
{
|
{
|
||||||
return Source.IsPressed(button);
|
return Source.IsPressed(button);
|
||||||
|
@ -165,5 +149,15 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
return Source.IsPressed(button);
|
return Source.IsPressed(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The float format implies no U+D and no L+R no matter what, so just passthru
|
||||||
|
public float GetFloat(string name)
|
||||||
|
{
|
||||||
|
return Source.GetFloat(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly HashSet<string> Unpresses = new HashSet<string>();
|
||||||
|
|
||||||
|
public IController Source { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,11 +25,11 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
if (!controller.HasValue)
|
if (!controller.HasValue)
|
||||||
{
|
{
|
||||||
buttons[button] = adaptor[button];
|
buttons[button] = adaptor.IsPressed(button);
|
||||||
}
|
}
|
||||||
else if (button.Length >= 3 && button.Substring(0, 2) == "P" + controller)
|
else if (button.Length >= 3 && button.Substring(0, 2) == "P" + controller)
|
||||||
{
|
{
|
||||||
buttons[button.Substring(3)] = adaptor["P" + controller + " " + button.Substring(3)];
|
buttons[button.Substring(3)] = adaptor.IsPressed("P" + controller + " " + button.Substring(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ namespace BizHawk.Client.Common
|
||||||
return buttons;
|
return buttons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: what about float controls?
|
||||||
[LuaMethodAttributes(
|
[LuaMethodAttributes(
|
||||||
"getimmediate",
|
"getimmediate",
|
||||||
"returns a lua table of any controller buttons currently pressed by the user"
|
"returns a lua table of any controller buttons currently pressed by the user"
|
||||||
|
@ -61,7 +62,7 @@ namespace BizHawk.Client.Common
|
||||||
var buttons = Lua.NewTable();
|
var buttons = Lua.NewTable();
|
||||||
foreach (var button in Global.ActiveController.Definition.BoolButtons)
|
foreach (var button in Global.ActiveController.Definition.BoolButtons)
|
||||||
{
|
{
|
||||||
buttons[button] = Global.ActiveController[button];
|
buttons[button] = Global.ActiveController.IsPressed(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
return buttons;
|
return buttons;
|
||||||
|
|
|
@ -263,7 +263,7 @@ namespace BizHawk.Client.Common
|
||||||
// Movie may go into finished mode as a result from latching
|
// Movie may go into finished mode as a result from latching
|
||||||
if (!Movie.IsFinished)
|
if (!Movie.IsFinished)
|
||||||
{
|
{
|
||||||
if (Global.ClientControls["Scrub Input"])
|
if (Global.ClientControls.IsPressed("Scrub Input"))
|
||||||
{
|
{
|
||||||
LatchInputFromPlayer(Global.MovieInputSourceAdapter);
|
LatchInputFromPlayer(Global.MovieInputSourceAdapter);
|
||||||
ClearFrame();
|
ClearFrame();
|
||||||
|
|
|
@ -37,8 +37,7 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IController Implementation
|
// TODO: get rid of this, add a SetBool() method or something for the set access, replace get wtih IsPressed
|
||||||
|
|
||||||
public bool this[string button]
|
public bool this[string button]
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -55,6 +54,8 @@ namespace BizHawk.Client.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region IController Implementation
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
return MyBoolButtons[button];
|
return MyBoolButtons[button];
|
||||||
|
|
|
@ -9,10 +9,7 @@ namespace BizHawk.Client.Common
|
||||||
{
|
{
|
||||||
#region IController Implementation
|
#region IController Implementation
|
||||||
|
|
||||||
public bool this[string button]
|
public ControllerDefinition Definition { get; set; }
|
||||||
{
|
|
||||||
get { return MyBoolButtons[button]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsPressed(string button)
|
public bool IsPressed(string button)
|
||||||
{
|
{
|
||||||
|
@ -28,8 +25,6 @@ namespace BizHawk.Client.Common
|
||||||
|
|
||||||
#region IMovieController Implementation
|
#region IMovieController Implementation
|
||||||
|
|
||||||
public ControllerDefinition Definition { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// latches one player from the source
|
/// latches one player from the source
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -371,7 +371,7 @@ namespace BizHawk.Client.Common
|
||||||
Changes = true;
|
Changes = true;
|
||||||
InvalidateAfter(frame);
|
InvalidateAfter(frame);
|
||||||
|
|
||||||
ChangeLog.AddBoolToggle(frame, buttonName, !adapter[buttonName], "Toggle " + buttonName + ": " + frame);
|
ChangeLog.AddBoolToggle(frame, buttonName, !adapter.IsPressed(buttonName), "Toggle " + buttonName + ": " + frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetBoolState(int frame, string buttonName, bool val)
|
public void SetBoolState(int frame, string buttonName, bool val)
|
||||||
|
@ -380,7 +380,7 @@ namespace BizHawk.Client.Common
|
||||||
ExtendMovieForEdit(frame - _log.Count + 1);
|
ExtendMovieForEdit(frame - _log.Count + 1);
|
||||||
|
|
||||||
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
|
var adapter = GetInputState(frame) as Bk2ControllerAdapter;
|
||||||
var old = adapter[buttonName];
|
var old = adapter.IsPressed(buttonName);
|
||||||
adapter[buttonName] = val;
|
adapter[buttonName] = val;
|
||||||
|
|
||||||
var lg = LogGeneratorInstance();
|
var lg = LogGeneratorInstance();
|
||||||
|
@ -406,7 +406,7 @@ namespace BizHawk.Client.Common
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
var adapter = GetInputState(frame + i) as Bk2ControllerAdapter;
|
var adapter = GetInputState(frame + i) as Bk2ControllerAdapter;
|
||||||
bool old = adapter[buttonName];
|
bool old = adapter.IsPressed(buttonName);
|
||||||
adapter[buttonName] = val;
|
adapter[buttonName] = val;
|
||||||
|
|
||||||
var lg = LogGeneratorInstance();
|
var lg = LogGeneratorInstance();
|
||||||
|
|
|
@ -7,12 +7,14 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ControllerDefinition Definition { get; }
|
ControllerDefinition Definition { get; }
|
||||||
|
|
||||||
// TODO - it is obnoxious for this to be here. must be removed.
|
/// <summary>
|
||||||
bool this[string button] { get; }
|
/// Returns the current state of a boolean control
|
||||||
|
/// </summary>
|
||||||
// TODO - this can stay but it needs to be changed to go through the float
|
|
||||||
bool IsPressed(string button);
|
bool IsPressed(string button);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the state of a float control
|
||||||
|
/// </summary>
|
||||||
float GetFloat(string name);
|
float GetFloat(string name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue