GameChoose.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using Microsoft.Xna.Framework;
  2. using OpenVIII.Encoding.Tags;
  3. using System;
  4. namespace OpenVIII
  5. {
  6. namespace IGMData.Pool
  7. {
  8. public class GameChoose : Base<Saves.Data, Saves.Data>
  9. {
  10. #region Fields
  11. private bool _first = true;
  12. #endregion Fields
  13. #region Events
  14. private event EventHandler<PageInfo> PageChangeEventHandler;
  15. #endregion Events
  16. #region Properties
  17. public bool Save { get; private set; }
  18. public byte Slot { get; private set; }
  19. #endregion Properties
  20. #region Methods
  21. public static GameChoose Create(Rectangle pos)
  22. {
  23. var r = Create<GameChoose>(30, 1, new IGMDataItem.Empty { Pos = pos }, 3, 10);
  24. return r;
  25. }
  26. public override bool Inputs()
  27. {
  28. if (Input2.DelayedButton(FF8TextTagKey.RotateLeft) || Input2.DelayedButton(FF8TextTagKey.RotateRight))
  29. {
  30. var mode = (IGMLoadSaveGame.Mode)Menu.IGMLoadSaveGame.GetMode();
  31. AV.Sound.Play(0);
  32. mode ^= IGMLoadSaveGame.Mode.Slot1;
  33. mode ^= IGMLoadSaveGame.Mode.Slot2;
  34. Menu.IGMLoadSaveGame.SetMode(mode);
  35. return true;
  36. }
  37. else
  38. return base.Inputs();
  39. }
  40. public override bool Inputs_CANCEL()
  41. {
  42. base.Inputs_CANCEL();
  43. Menu.IGMLoadSaveGame.SetMode(IGMLoadSaveGame.Mode.Slot |
  44. IGMLoadSaveGame.Mode.Choose |
  45. (Save ? IGMLoadSaveGame.Mode.Save : IGMLoadSaveGame.Mode.Nothing));
  46. return true;
  47. }
  48. public override bool Inputs_OKAY()
  49. {
  50. var save = Contents[CURSOR_SELECT];
  51. if (save?.Characters == null) return false;
  52. base.Inputs_OKAY();
  53. if (!Save)
  54. Memory.State = save.Clone();
  55. //TODO. Save game here.
  56. Menu.IGMLoadSaveGame.SetMode(
  57. IGMLoadSaveGame.Mode.Checking |
  58. IGMLoadSaveGame.Mode.Game |
  59. (Menu.IGMLoadSaveGame.GetMode().HasFlag(IGMLoadSaveGame.Mode.Slot1) ? IGMLoadSaveGame.Mode.Slot1 : IGMLoadSaveGame.Mode.Slot2) |
  60. (Save ? IGMLoadSaveGame.Mode.Save : 0));
  61. return false;
  62. }
  63. public override void ModeChangeEvent(object sender, Enum e)
  64. {
  65. base.ModeChangeEvent(sender, e);
  66. if (e.GetType() != typeof(IGMLoadSaveGame.Mode)) return;
  67. Save = e.HasFlag(IGMLoadSaveGame.Mode.Save);
  68. if (e.HasFlag(IGMLoadSaveGame.Mode.Game) && e.HasFlag(IGMLoadSaveGame.Mode.Choose))
  69. {
  70. Slot = e.HasFlag(IGMLoadSaveGame.Mode.Slot1) ? (byte)0 : (byte)1;
  71. var total = Count - ExtraCount;
  72. var r = 0;
  73. for (byte i = 0; i < total; i++)
  74. {
  75. ((GameBlock)ITEM[i, 0]).Refresh(i, Saves.FileList?[Slot, i]);
  76. if (r < Contents.Length)
  77. Contents[r++] = Saves.FileList?[Slot, i];
  78. }
  79. Show();
  80. Refresh();
  81. if (!_first) return;
  82. PageChangeEventHandler?.Invoke(this, new PageInfo(Page));
  83. ITEM[0, 0].Show();
  84. ITEM[1, 0].Show();
  85. ITEM[2, 0].Show();
  86. _first = false;
  87. }
  88. else
  89. Hide();
  90. }
  91. public override void Refresh()
  92. {
  93. base.Refresh();
  94. var r = 0;
  95. foreach (var i in ITEM)
  96. {
  97. if (i == null || i.GetType() != typeof(GameBlock) ||
  98. ((GameBlock)i).ExpectedPageNumber != Page) continue;
  99. Contents[r++] = ((GameBlock)i).Data;
  100. if (r >= Contents.Length) break;
  101. }
  102. }
  103. protected override void Init()
  104. {
  105. base.Init();
  106. RightArrow.Y = Y + Height / 2 - RightArrow.Height / 2;
  107. LeftArrow.Y = Y + Height / 2 - LeftArrow.Height / 2;
  108. for (var i = 0; i < Count - ExtraCount; i++)
  109. {
  110. ITEM[i, 0] = GameBlock.Create(SIZE[i % Rows]);
  111. ((GameBlock)ITEM[i, 0]).AddPageChangeEvent(ref PageChangeEventHandler);
  112. ((GameBlock)ITEM[i, 0]).ParentRows = Rows;
  113. }
  114. Cursor_Status &= ~Cursor_Status.Horizontal;
  115. }
  116. protected override void InitCursor(int i, int col, int row, bool zero = false) =>
  117. //base.InitCursor(i, zero);
  118. CURSOR[i] = new Point(SIZE[i].X + 20, SIZE[i].Y + SIZE[i].Height / 2 - 4);
  119. protected override void InitShift(int i, int col, int row)
  120. {
  121. base.InitShift(i, col, row);
  122. SIZE[i].Inflate(-20, 0);
  123. }
  124. protected override void PAGE_NEXT()
  125. {
  126. do
  127. {
  128. base.PAGE_NEXT();
  129. Refresh();
  130. }
  131. while (Contents[0] == null && Page != 0);
  132. PageChangeEventHandler?.Invoke(this, new PageInfo(Page));
  133. }
  134. protected override void PAGE_PREV()
  135. {
  136. do
  137. {
  138. base.PAGE_PREV();
  139. Refresh();
  140. }
  141. while (Contents[0] == null && Page != 0);
  142. PageChangeEventHandler?.Invoke(this, new PageInfo(Page, true));
  143. }
  144. #endregion Methods
  145. #region Structs
  146. public struct PageInfo
  147. {
  148. #region Fields
  149. public int PageNumber;
  150. //if false, is next
  151. public bool Previous;
  152. #endregion Fields
  153. #region Constructors
  154. public PageInfo(int pageNumber, bool previous = false)
  155. {
  156. PageNumber = pageNumber;
  157. Previous = previous;
  158. }
  159. #endregion Constructors
  160. }
  161. #endregion Structs
  162. }
  163. }
  164. }