using System.Collections.Generic; using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.Common { /// /// Filters input for things called Up and Down while considering the client's AllowUD_LR option. /// This is a bit gross but it is unclear how to do it more nicely /// public class UD_LR_ControllerAdapter : IController { public ControllerDefinition Definition => Source.Definition; public bool IsPressed(string button) { if (Global.Config.AllowUD_LR) { return Source.IsPressed(button); } string prefix; // " C " is for N64 "P1 C Up" and the like, which should not be subject to mutexing // regarding the unpressing and UDLR logic...... don't think about it. don't question it. don't look at it. if (button.Contains("Down") && !button.Contains(" C ")) { if (!Source.IsPressed(button)) { _unpresses.Remove(button); } prefix = button.GetPrecedingString("Down"); string other = prefix + "Up"; if (Source.IsPressed(other)) { if (_unpresses.Contains(button)) { return false; } if (Global.Config.ForbidUD_LR) { return false; } _unpresses.Add(other); } else { _unpresses.Remove(button); } } if (button.Contains("Up") && !button.Contains(" C ")) { if (!Source.IsPressed(button)) { _unpresses.Remove(button); } prefix = button.GetPrecedingString("Up"); string other = prefix + "Down"; if (Source.IsPressed(other)) { if (_unpresses.Contains(button)) { return false; } if (Global.Config.ForbidUD_LR) { return false; } _unpresses.Add(other); } else { _unpresses.Remove(button); } } if (button.Contains("Right") && !button.Contains(" C ")) { if (!Source.IsPressed(button)) { _unpresses.Remove(button); } prefix = button.GetPrecedingString("Right"); string other = prefix + "Left"; if (Source.IsPressed(other)) { if (_unpresses.Contains(button)) { return false; } if (Global.Config.ForbidUD_LR) { return false; } _unpresses.Add(other); } else { _unpresses.Remove(button); } } if (button.Contains("Left") && !button.Contains(" C ")) { if (!Source.IsPressed(button)) { _unpresses.Remove(button); } prefix = button.GetPrecedingString("Left"); string other = prefix + "Right"; if (Source.IsPressed(other)) { if (_unpresses.Contains(button)) { return false; } if (Global.Config.ForbidUD_LR) { return false; } _unpresses.Add(other); } else { _unpresses.Remove(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 _unpresses = new HashSet(); public IController Source { get; set; } } }