diff --git a/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs b/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs index df2d2fa716..088de256e1 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2ControllerAdapter.cs @@ -80,18 +80,30 @@ namespace BizHawk.Client.Common if (!string.IsNullOrWhiteSpace(mnemonic)) { var trimmed = mnemonic.Replace("|", ""); - for (int i = 0; i < Type.BoolButtons.Count; i++) - { - MyBoolButtons[Type.BoolButtons[i]] = trimmed[i] == '.' ? false : true; - } + var buttons = Type.ControlsOrdered.SelectMany(x => x).ToList(); + var iterator = 0; + var boolIt = 0; + var floatIt = 0; - var floats = trimmed.Remove(0, Type.BoolButtons.Count); - - for (int i = 0; i < Type.FloatControls.Count; i++) + for (int i = 0; i < buttons.Count; i++) { - var temp = floats.Substring(i * 4, 3); - var val = int.Parse(temp); - MyFloatControls[Type.FloatControls[i]] = val; + if (Type.BoolButtons.Contains(buttons[i])) + { + var boolBtn = Type.BoolButtons.First(x => x == buttons[i]); + MyBoolButtons[boolBtn] = trimmed[iterator] == '.' ? false : true; + iterator++; + boolIt++; + } + else if (Type.FloatControls.Contains(buttons[i])) + { + var temp = trimmed.Substring(iterator, 3); + var val = int.Parse(temp); + var floatBtn = Type.FloatControls.First(x => x == buttons[i]); + + MyFloatControls[floatBtn] = val; + iterator += 4; + floatIt++; + } } } } diff --git a/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs b/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs index 6ae2e6cd3a..3a556b3cc5 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2LogEntryGenerator.cs @@ -66,17 +66,17 @@ namespace BizHawk.Client.Common public string GenerateLogKey() { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); sb.Append("LogKey:"); - foreach (var button in _source.Type.BoolButtons) + foreach (var group in _source.Type.ControlsOrdered) { - sb.Append(button).Append('|'); - } - - foreach (var button in _source.Type.FloatControls) - { - sb.Append(button).Append('|'); + foreach (var button in group) + { + sb + .Append(button) + .Append('|'); + } } return sb.ToString(); @@ -84,49 +84,45 @@ namespace BizHawk.Client.Common private string CreateLogEntry(bool createEmpty = false) { - try + var sb = new StringBuilder(); + sb.Append('|'); + + foreach (var group in _source.Type.ControlsOrdered) { - var sb = new StringBuilder(); - sb.Append('|'); - - foreach (var button in _source.Type.BoolButtons) + if (group.Any()) { - if (createEmpty) + foreach (var button in group) { - sb.Append('.'); - } - else - { - sb.Append(_source.IsPressed(button) ? Mnemonics[button] : '.'); - } - } - - sb.Append('|'); - if (_source.Type.FloatControls.Any()) - { - foreach (var floatBtn in _source.Type.FloatControls) - { - if (createEmpty) + if (_source.Type.FloatControls.Contains(button)) { - sb.Append("000,"); + if (createEmpty) + { + sb.Append("000,"); + } + else + { + var val = (int)_source.GetFloat(button); + sb.Append(val.ToString().PadLeft(3, '0')).Append(','); + } } - else + else if (_source.Type.BoolButtons.Contains(button)) { - var val = (int)_source.GetFloat(floatBtn); - sb.Append(val.ToString().PadLeft(3, '0')).Append(','); + if (createEmpty) + { + sb.Append('.'); + } + else + { + sb.Append(_source.IsPressed(button) ? Mnemonics[button] : '.'); + } } } - sb.Remove(sb.Length - 1, 1); + sb.Append('|'); } + } - sb.Append('|'); - return sb.ToString(); - } - catch (Exception ex) - { - return ex.ToString(); - } + return sb.ToString(); } } } diff --git a/BizHawk.Emulation.Common/Interfaces/IController.cs b/BizHawk.Emulation.Common/Interfaces/IController.cs index ed6d592e7f..61e56d02fb 100644 --- a/BizHawk.Emulation.Common/Interfaces/IController.cs +++ b/BizHawk.Emulation.Common/Interfaces/IController.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace BizHawk.Emulation.Common { @@ -114,6 +115,33 @@ namespace BizHawk.Emulation.Common FloatRanges = new List(); AxisConstraints = new List(); } + + /// + /// Puts the controls in a logical order such as by controller number, + /// This is a default implementation that should work most of the time + /// + public virtual IEnumerable> ControlsOrdered + { + get + { + var list = FloatControls.Union(BoolButtons); + + yield return list + .Where(x => !x.StartsWith("P1 ") && !x.StartsWith("P2 ") && !x.StartsWith("P3 ") && !x.StartsWith("P4 ")); + + yield return list + .Where(x => x.StartsWith("P1 ")); + + yield return list + .Where(x => x.StartsWith("P2 ")); + + yield return list + .Where(x => x.StartsWith("P3 ")); + + yield return list + .Where(x => x.StartsWith("P4 ")); + } + } } public interface IController