SideMenu.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.CodeAnalysis;
  5. namespace OpenVIII
  6. {
  7. public partial class IGM
  8. {
  9. #region Classes
  10. [SuppressMessage("ReSharper", "NotAccessedField.Local")]
  11. private class SideMenu : IGMData.Base
  12. {
  13. #region Fields
  14. private int _avgHeight;
  15. private int _avgWidth;
  16. private bool _eventSet;
  17. private FF8String[] _helpStr;
  18. private int _largestHeight;
  19. private int _largestWidth;
  20. private int _totalHeight;
  21. private int _totalWidth;
  22. private int[] _widths;
  23. #endregion Fields
  24. #region Methods
  25. public static SideMenu Create(IReadOnlyDictionary<FF8String, FF8String> pairs)
  26. {
  27. var r = new SideMenu
  28. {
  29. _helpStr = new FF8String[pairs.Count],
  30. _widths = new int[pairs.Count]
  31. };
  32. byte pos = 0;
  33. foreach (var pair in pairs)
  34. {
  35. r._helpStr[pos] = pair.Value;
  36. var rectangle = Memory.Font.RenderBasicText(pair.Key, 0, 0, skipdraw: true);
  37. r._widths[pos] = rectangle.Width;
  38. if (rectangle.Width > r._largestWidth) r._largestWidth = rectangle.Width;
  39. if (rectangle.Height > r._largestHeight) r._largestHeight = rectangle.Height;
  40. r._totalWidth += rectangle.Width;
  41. r._totalHeight += rectangle.Height;
  42. r._avgWidth = r._totalWidth / (pos + 1);
  43. r._avgHeight = r._totalHeight / (pos + 1);
  44. pos++;
  45. }
  46. r.Init(pairs.Count, 1, new IGMDataItem.Box { Pos = new Rectangle { Width = 226, Height = 492, X = 843 - 226 } }, 1, pairs.Count);
  47. pos = 0;
  48. foreach (var pair in pairs)
  49. {
  50. r.ITEM[pos, 0] = new IGMDataItem.Text { Data = pair.Key, Pos = new Rectangle(r.SIZE[pos].X, r.SIZE[pos].Y, 0, 0) };
  51. pos++;
  52. }
  53. r.Cursor_Status |= (Cursor_Status.Enabled | Cursor_Status.Vertical | Cursor_Status.Horizontal);
  54. return r;
  55. }
  56. public override bool Inputs()
  57. {
  58. Cursor_Status &= ~Cursor_Status.Blinking;
  59. return base.Inputs();
  60. }
  61. public override bool Inputs_CANCEL()
  62. {
  63. base.Inputs_CANCEL();
  64. FadeIn();
  65. Menu.Module.State = MenuModule.Mode.LoadGameChooseGame;
  66. return true;
  67. }
  68. public override bool Inputs_OKAY()
  69. {
  70. base.Inputs_OKAY();
  71. // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault
  72. switch ((Items)CURSOR_SELECT)
  73. {
  74. case Items.Junction:
  75. case Items.Magic:
  76. case Items.Status:
  77. IGM.SetMode(Mode.ChooseChar);
  78. return true;
  79. case Items.Item:
  80. Menu.Module.State = MenuModule.Mode.IGM_Items;
  81. IGMItems.Refresh();
  82. return true;
  83. case Items.Battle:
  84. BattleMenus.CameFrom();
  85. //Menu.Module.State = MenuModule.MainMenuStates.BattleMenu;
  86. ModuleBattleDebug.ResetState();
  87. Memory.Module = OpenVIII.Module.BattleDebug;
  88. BattleMenus.Refresh();
  89. FadeIn();
  90. return true;
  91. case Items.GF:
  92. break;
  93. case Items.Ability:
  94. break;
  95. case Items.Switch:
  96. break;
  97. case Items.Card:
  98. break;
  99. case Items.Config:
  100. break;
  101. case Items.Tutorial:
  102. break;
  103. case Items.Save:
  104. break;
  105. default:
  106. throw new ArgumentOutOfRangeException();
  107. }
  108. return false;
  109. }
  110. public override void ModeChangeEvent(object sender, Enum e)
  111. {
  112. if (!e.Equals(Mode.ChooseItem))
  113. {
  114. Cursor_Status |= Cursor_Status.Blinking;
  115. }
  116. }
  117. public override void Refresh()
  118. {
  119. if (!_eventSet && IGM != null)
  120. {
  121. IGM.ModeChangeHandler += ModeChangeEvent;
  122. _eventSet = true;
  123. }
  124. IGM?.ChoiceChangeHandler?.Invoke(this, new KeyValuePair<Items, FF8String>((Items)CURSOR_SELECT, _helpStr[CURSOR_SELECT]));
  125. base.Refresh();
  126. }
  127. protected override void InitShift(int i, int col, int row)
  128. {
  129. //SIZE[i].Inflate((SIZE[i].Width - largestWidth) / -2, 0); // center
  130. SIZE[i].Inflate(-20, 0);
  131. SIZE[i].Y += SIZE[i].Height / 2 - _largestHeight / 2 + 5;
  132. //SIZE[i].Width = largestWidth;
  133. SIZE[i].Height = _largestHeight;
  134. }
  135. protected override void SetCursor_select(int value)
  136. {
  137. if (!value.Equals(GetCursor_select()))
  138. {
  139. base.SetCursor_select(value);
  140. IGM?.ChoiceChangeHandler?.Invoke(this, new KeyValuePair<Items, FF8String>((Items)value, _helpStr[value]));
  141. }
  142. }
  143. [SuppressMessage("ReSharper", "UnusedParameter.Local")]
  144. [SuppressMessage("ReSharper", "UnusedMember.Local")]
  145. private void ChoiceChangeEvent(object _, FF8String e) => ((IGMDataItem.Box)CONTAINER).Data = e;
  146. #endregion Methods
  147. }
  148. #endregion Classes
  149. }
  150. }