Input2.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. using Microsoft.Xna.Framework.Input;
  2. using OpenVIII.Encoding.Tags;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.Linq;
  7. namespace OpenVIII
  8. {
  9. public class Input2
  10. {
  11. #region Fields
  12. private static readonly TimeSpan msDelayLimit = TimeSpan.FromMilliseconds(100);
  13. private static Input2 main;
  14. #endregion Fields
  15. #region Properties
  16. private static Dictionary<Button_Flags, FF8TextTagKey> Convert_Button { get; set; }
  17. #endregion Properties
  18. #region Methods
  19. private static void CheckInputLimit()
  20. {
  21. //issue here if CheckInputLimit is checked more than once per update cycle this will be wrong.
  22. bLimitInput = (msDelay += Memory.ElapsedGameTime) < msDelayLimit;
  23. }
  24. #endregion Methods
  25. protected static bool bLimitInput;
  26. protected static TimeSpan msDelay;
  27. protected bool ButtonTriggered(FF8TextTagKey key, ButtonTrigger trigger = ButtonTrigger.None)
  28. {
  29. if (Memory.IsActive)
  30. foreach (var list in InputList)
  31. foreach (var kvp in list.Data.Where(y => y.Key.Contains(key)))
  32. foreach (var test in kvp.Value)
  33. if (main.ButtonTriggered(test, trigger))
  34. return true;
  35. return false;
  36. }
  37. protected virtual bool UpdateOnce() => false;
  38. public Input2(bool skip = false)
  39. {
  40. Memory.Log.WriteLine($"{nameof(Input2)} :: {this}");
  41. if (!skip)
  42. {
  43. if (Keyboard == null)
  44. Keyboard = new InputKeyboard();
  45. if (Mouse == null)
  46. Mouse = new InputMouse();
  47. if (GamePad == null)
  48. GamePad = new InputGamePad();
  49. if (InputList == null)
  50. {
  51. InputList = new List<Inputs>
  52. {
  53. new Inputs_FF8PSX(),
  54. new Inputs_OpenVIII(),
  55. new Inputs_FF8Steam(),
  56. new Inputs_FF82000()
  57. };
  58. //remove duplicate inputs.
  59. var j = 1;
  60. foreach (var list in InputList)
  61. {
  62. for (var i = j; i < InputList.Count; i++)
  63. {
  64. foreach (var kvp in InputList[i].Data)
  65. {
  66. foreach (var inputs in kvp.Value.ToArray())
  67. if (
  68. list.Data.Any(
  69. x => x.Value.Any(y => y.Equals(inputs)
  70. //x => x.Value.Any(y=>y.Key == inputs.Key &&
  71. //y.MouseButton == inputs.MouseButton &&
  72. //y.GamePadButton == inputs.GamePadButton &&
  73. ////y.Trigger == inputs.Trigger //&&
  74. //y.Combo == null//inputs.Combo
  75. )))
  76. kvp.Value.Remove(inputs);
  77. }
  78. }
  79. j++;
  80. }
  81. }
  82. if (main == null)
  83. main = new Input2(true);
  84. if (Convert_Button == null)
  85. {
  86. Convert_Button = new Dictionary<Button_Flags, FF8TextTagKey>()
  87. {
  88. //Buttons is
  89. //finisher = 0x0001
  90. //up = 0x0010
  91. //-> = 0x0020
  92. //do = 0x0040
  93. //< - = 0x0080
  94. //L2 = 0x0100
  95. //R2 = 0x0200
  96. //L1 = 0x0400
  97. //R1 = 0x0800
  98. // /\ = 0x1000
  99. //O = 0x2000
  100. //X = 0x4000
  101. //| _ |= 0x8000
  102. //None = 0xFFFF
  103. {Button_Flags.Up, FF8TextTagKey.Up },
  104. {Button_Flags.Right, FF8TextTagKey.Right },
  105. {Button_Flags.Down, FF8TextTagKey.Down },
  106. {Button_Flags.Left, FF8TextTagKey.Left },
  107. {Button_Flags.L2, FF8TextTagKey.EscapeLeft },
  108. {Button_Flags.R2, FF8TextTagKey.EscapeRight },
  109. {Button_Flags.L1, FF8TextTagKey.RotateLeft },
  110. {Button_Flags.R1, FF8TextTagKey.RotateRight },
  111. {Button_Flags.Triangle, FF8TextTagKey.Cancel },
  112. {Button_Flags.Circle, FF8TextTagKey.Menu },
  113. {Button_Flags.Cross, FF8TextTagKey.Confirm },
  114. {Button_Flags.Square, FF8TextTagKey.Cards }
  115. };
  116. }
  117. }
  118. }
  119. public static InputGamePad GamePad { get; private set; }
  120. public static List<Inputs> InputList { get; private set; }
  121. public static InputKeyboard Keyboard { get; private set; }
  122. public static InputMouse Mouse { get; private set; }
  123. public static bool Button(FF8TextTagKey k, ButtonTrigger trigger = ButtonTrigger.None) => main?.ButtonTriggered(k, trigger) ?? false;
  124. public static bool Button(InputButton k, ButtonTrigger trigger = ButtonTrigger.None) => main?.ButtonTriggered(k, trigger) ?? false;
  125. public static bool Button(Keys k, ButtonTrigger trigger = ButtonTrigger.OnPress) => main?.ButtonTriggered(new InputButton() { Key = k, Trigger = trigger }) ?? false;
  126. public static bool Button(GamePadButtons k, ButtonTrigger trigger = ButtonTrigger.OnPress) => main?.ButtonTriggered(new InputButton() { GamePadButton = k, Trigger = trigger }) ?? false;
  127. public static bool Button(MouseButtons k, ButtonTrigger trigger = ButtonTrigger.OnPress) => main?.ButtonTriggered(new InputButton() { MouseButton = k, Trigger = trigger }) ?? false;
  128. public static bool Button(Button_Flags k, ButtonTrigger trigger = ButtonTrigger.OnPress) => Convert_Button.ContainsKey(k) && Button(Convert_Button[k], trigger);
  129. public static bool Button(List<FF8TextTagKey> k, ButtonTrigger trigger = ButtonTrigger.None) => k.Any(x => Button(x, trigger));
  130. public static FF8String ButtonString(FF8TextTagKey key, ButtonTrigger trigger = ButtonTrigger.None)
  131. {
  132. foreach (var list in InputList)
  133. foreach (var kvp in list.Data.Where(y => y.Key.Contains(key)))
  134. foreach (var test in kvp.Value)
  135. if (!list.DrawGamePadButtons)
  136. {
  137. return test.ToString();
  138. }
  139. else if (test.GamePadButton != GamePadButtons.None)
  140. {
  141. return GamePad.ButtonString(test.GamePadButton, key);
  142. }
  143. return "";
  144. }
  145. public static IReadOnlyList<FF8TextTagKey> Convert_Flags(Button_Flags k)
  146. {
  147. var ret = new List<FF8TextTagKey>(1);
  148. foreach (Button_Flags x in Enum.GetValues(typeof(Button_Flags)))
  149. {
  150. if (k.HasFlag(x) && (Convert_Button?.ContainsKey(k) ?? false))
  151. {
  152. Debug.WriteLine("{0} set", x);
  153. ret.Add(Convert_Button[k]);
  154. }
  155. }
  156. return ret;
  157. }
  158. public static bool DelayedButton(List<FF8TextTagKey> k, ButtonTrigger trigger = ButtonTrigger.OnPress) => k.Any(x => DelayedButton(x, trigger));
  159. public static bool DelayedButton(FF8TextTagKey k, ButtonTrigger trigger = ButtonTrigger.OnPress)
  160. {
  161. var ret = Button(k, trigger);
  162. if (ret)
  163. ResetInputLimit();
  164. return ret;
  165. }
  166. public static bool DelayedButton(InputButton k, ButtonTrigger trigger = ButtonTrigger.OnPress)
  167. {
  168. var ret = Button(k, trigger);
  169. if (ret)
  170. ResetInputLimit();
  171. return ret;
  172. }
  173. public static bool DelayedButton(Keys k, ButtonTrigger trigger = ButtonTrigger.OnPress)
  174. {
  175. var ret = Button(k, trigger);
  176. if (ret)
  177. ResetInputLimit();
  178. return ret;
  179. }
  180. public static bool DelayedButton(MouseButtons k, ButtonTrigger trigger = ButtonTrigger.OnPress)
  181. {
  182. var ret = Button(k, trigger);
  183. if (ret)
  184. ResetInputLimit();
  185. return ret;
  186. }
  187. public static bool DelayedButton(GamePadButtons k, ButtonTrigger trigger = ButtonTrigger.OnPress)
  188. {
  189. var ret = Button(k, trigger);
  190. if (ret)
  191. ResetInputLimit();
  192. return ret;
  193. }
  194. public static bool DelayedButton(Button_Flags k, ButtonTrigger trigger = ButtonTrigger.OnPress) => Convert_Button.ContainsKey(k) && Button(Convert_Button[k], trigger);
  195. public static double Distance(float speed) =>
  196. // no input throttle but still take the max speed * time; for non analog controls
  197. speed * Memory.ElapsedGameTime.TotalMilliseconds;
  198. public static void ResetInputLimit()
  199. {
  200. msDelay = TimeSpan.Zero;
  201. bLimitInput = false;
  202. }
  203. public static bool Update()
  204. {
  205. CheckInputLimit();
  206. Keyboard?.UpdateOnce();
  207. GamePad?.UpdateOnce();
  208. Mouse?.UpdateOnce();
  209. return false;
  210. }
  211. public virtual bool ButtonTriggered(InputButton test, ButtonTrigger trigger = ButtonTrigger.None)
  212. {
  213. if (Memory.IsActive)
  214. if (!bLimitInput || (trigger.HasFlag(ButtonTrigger.Force) ? trigger : (test.Trigger | trigger)).HasFlag(ButtonTrigger.IgnoreDelay))
  215. {
  216. if (Keyboard.ButtonTriggered(test, trigger))
  217. return true;
  218. else if (Mouse.ButtonTriggered(test, trigger))
  219. return true;
  220. else if (GamePad.ButtonTriggered(test, trigger))
  221. return true;
  222. }
  223. return false;
  224. }
  225. }
  226. }