DebugChoose.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. using Microsoft.Xna.Framework;
  2. using OpenVIII.Movie;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. namespace OpenVIII.IGMData
  8. {
  9. public class DebugChoose : Base
  10. {
  11. #region Fields
  12. /// <summary>
  13. /// Strings
  14. /// </summary>
  15. private static readonly Dictionary<DebugItems, FF8String> StrDebugLobby = new Dictionary<DebugItems, FF8String>()
  16. {
  17. { DebugItems.Reset, new FF8String("Reset Main Menu state") },
  18. { DebugItems.Overture, new FF8String("Play Overture") },
  19. { DebugItems.Battle, new FF8String("Battle encounter") },
  20. { DebugItems.Field, new FF8String("Field debug render") },
  21. { DebugItems.Movie, new FF8String("Movie debug render: ") },
  22. { DebugItems.Music, new FF8String("Play/Stop music: ") },
  23. { DebugItems.Sounds, new FF8String("Play audio.dat: ") },
  24. { DebugItems.World, new FF8String("Jump to World Map") },
  25. { DebugItems.Faces, new FF8String("Test Faces") },
  26. { DebugItems.Icons, new FF8String("Test Icons") },
  27. { DebugItems.Cards, new FF8String("Test Cards") },
  28. { DebugItems.FieldModelTest, new FF8String("Test field models") },
  29. };
  30. private int _debugChosenAudio;
  31. /// <summary>
  32. /// Dynamic String Values
  33. /// </summary>
  34. private Dictionary<DebugItems, Func<FF8String>> _dynamicDebugStrings;
  35. private Dictionary<DebugItems, Func<bool>> _inputsLeft;
  36. private Dictionary<DebugItems, Func<bool>> _inputsOkay;
  37. private Dictionary<DebugItems, Func<bool>> _inputsRight;
  38. #endregion Fields
  39. #region Enums
  40. /// <summary>
  41. /// Identifiers and Ordering of debug menu items
  42. /// </summary>
  43. private enum DebugItems
  44. {
  45. Reset,
  46. Overture,
  47. Battle,
  48. Field,
  49. Movie,
  50. Music,
  51. Sounds,
  52. World,
  53. Faces,
  54. Icons,
  55. Cards,
  56. FieldModelTest,
  57. /// <summary>
  58. /// Number of values. Make sure this is last.
  59. /// </summary>
  60. Count,
  61. BattlePool = Count,
  62. FieldPool = Count + 1,
  63. }
  64. #endregion Enums
  65. #region Methods
  66. public static DebugChoose Create(Rectangle pos) => Create<DebugChoose>((int)DebugItems.Count + 2, 1, new IGMDataItem.Box { Pos = pos, Title = Icons.ID.DEBUG }, 1, (int)DebugItems.Count);
  67. public override bool Inputs()
  68. {
  69. Cursor_Status |= Cursor_Status.Enabled; //Cursor_Status |= Cursor_Status.Horizontal;
  70. if (ITEM[(int)DebugItems.BattlePool, 0].Enabled)
  71. {
  72. Cursor_Status |= Cursor_Status.Blinking;
  73. return ITEM[(int)DebugItems.BattlePool, 0].Inputs();
  74. }
  75. else if (ITEM[(int)DebugItems.FieldPool, 0].Enabled)
  76. {
  77. Cursor_Status |= Cursor_Status.Blinking;
  78. return ITEM[(int)DebugItems.FieldPool, 0].Inputs();
  79. }
  80. else
  81. {
  82. Cursor_Status &= ~Cursor_Status.Blinking;
  83. return base.Inputs();
  84. }
  85. }
  86. public override bool Inputs_CANCEL()
  87. {
  88. base.Inputs_CANCEL();
  89. CURSOR_SELECT = 0;
  90. Menu.Module.State = MenuModule.Mode.MainLobby;
  91. Menu.FadeIn();
  92. return true;
  93. }
  94. public override void Inputs_Left()
  95. {
  96. if (_inputsLeft.TryGetValue((DebugItems)CURSOR_SELECT, out var f) && f.Invoke())
  97. {
  98. base.Inputs_Left();
  99. Refresh();
  100. }
  101. }
  102. public override bool Inputs_OKAY()
  103. {
  104. if (_inputsOkay.TryGetValue((DebugItems)CURSOR_SELECT, out var f))
  105. {
  106. return f.Invoke() && base.Inputs_OKAY();
  107. }
  108. return false;
  109. }
  110. public override void Inputs_Right()
  111. {
  112. if (_inputsRight.TryGetValue((DebugItems)CURSOR_SELECT, out var f) && f.Invoke())
  113. {
  114. base.Inputs_Right();
  115. Refresh();
  116. }
  117. }
  118. public override void Refresh()
  119. {
  120. base.Refresh();
  121. for (var i = 0; i < Count; i++)
  122. {
  123. if (_dynamicDebugStrings.TryGetValue((DebugItems)i, out var f))
  124. {
  125. ((IGMDataItem.Text)ITEM[i, 0]).Data = f();
  126. }
  127. }
  128. }
  129. protected override void Init()
  130. {
  131. base.Init();
  132. foreach (var i in Enumerable.Range(0, (int)DebugItems.Count))
  133. {
  134. if (StrDebugLobby.TryGetValue((DebugItems)i, out var str))
  135. {
  136. ITEM[i, 0] = new IGMDataItem.Text { Data = str, Pos = SIZE[i] };
  137. }
  138. }
  139. var rect = CONTAINER.Pos;
  140. rect.Inflate(-12, -60);
  141. rect.Offset(12, 60);
  142. ITEM[(int)DebugItems.BattlePool, 0] = DebugSelectPool<Battle.Encounter>.Create(rect, Memory.Encounters, SetEncounterOkayBattle, FilterEncounters);
  143. ITEM[(int)DebugItems.BattlePool, 0].Refresh();
  144. ITEM[(int)DebugItems.FieldPool, 0] = DebugSelectPool<string>.Create(rect, Memory.FieldHolder.Fields, SetFieldsOkayBattle, FilterFields,4);
  145. ITEM[(int)DebugItems.FieldPool, 0].Refresh();
  146. PointerZIndex = Count - 1;
  147. _inputsOkay = new Dictionary<DebugItems, Func<bool>>()
  148. {
  149. { DebugItems.Reset, Inputs_CANCEL },
  150. { DebugItems.Overture, ()=> {
  151. Menu.FadeIn();
  152. Menu.Module.State = MenuModule.Mode.MainLobby;
  153. Module_overture_debug.ResetModule();
  154. Memory.Module = Module.OvertureDebug;
  155. Memory.IsMouseVisible = false;
  156. AV.Music.Stop();
  157. return true;
  158. } },
  159. { DebugItems.Battle, ()=> {
  160. ITEM[(int)DebugItems.BattlePool,0].Show();
  161. return true;
  162. } },
  163. { DebugItems.Field, ()=> {
  164. ITEM[(int)DebugItems.FieldPool,0].Show();
  165. return true;
  166. } },
  167. { DebugItems.Movie, ()=> {
  168. Menu.FadeIn();
  169. Memory.Module = Module.MovieTest;
  170. ModuleMovieTest.Play();
  171. Memory.IsMouseVisible = false;
  172. return true;
  173. } },
  174. { DebugItems.Music, ()=> {
  175. Fields.Module.ResetField();
  176. AV.Music.PlayStop();
  177. return true;
  178. } },
  179. { DebugItems.Sounds, ()=> {
  180. AV.Sound.Play(_debugChosenAudio);
  181. skipsnd = true;
  182. return true;
  183. } },
  184. { DebugItems.World, ()=> {
  185. Menu.FadeIn();
  186. Module_world_debug.playerPosition = new Vector3(-9105f, 30f, -4466); //reset for sake of debugging
  187. Memory.Module = Module.WorldDebug;
  188. Memory.IsMouseVisible = false;
  189. return true;
  190. } },
  191. { DebugItems.Faces, ()=> {
  192. Menu.FadeIn();
  193. Memory.Module = Module.FaceTest;
  194. Module_face_test.Show();
  195. return true;
  196. } },
  197. { DebugItems.Icons, ()=> {
  198. Menu.FadeIn();
  199. Memory.Module = Module.IconTest;
  200. Module_icon_test.Show();
  201. return true;
  202. } },
  203. { DebugItems.Cards, ()=> {
  204. Menu.FadeIn();
  205. Memory.Module = Module.CardTest;
  206. Module_card_test.Show();
  207. return true;
  208. } },
  209. { DebugItems.FieldModelTest, ()=> {
  210. Menu.FadeIn();
  211. Memory.Module = Module.FieldModelTest;
  212. Module_card_test.Show();
  213. return true;
  214. } },
  215. };
  216. var files = Files.Instance;
  217. _inputsLeft = new Dictionary<DebugItems, Func<bool>>()
  218. {
  219. { DebugItems.Movie, ()=> {
  220. if(ModuleMovieTest.Index>0)
  221. ModuleMovieTest.Index--;
  222. else
  223. ModuleMovieTest.Index = files.Count - 1;
  224. return true;
  225. } },
  226. { DebugItems.Music, ()=> {
  227. if(Memory.MusicIndex >0)
  228. Memory.MusicIndex --;
  229. else
  230. Memory.MusicIndex = (ushort)Memory.DicMusic.Keys.Max();
  231. return true;
  232. } },
  233. { DebugItems.Sounds, ()=> {
  234. if (_debugChosenAudio > 0)
  235. _debugChosenAudio--;
  236. else
  237. _debugChosenAudio = AV.Sound.EntriesCount-1;
  238. return true;
  239. } }
  240. };
  241. _inputsRight = new Dictionary<DebugItems, Func<bool>>()
  242. {
  243. { DebugItems.Movie, ()=> {
  244. if(ModuleMovieTest.Index<files.Count - 1)
  245. ModuleMovieTest.Index++;
  246. else
  247. ModuleMovieTest.Index = 0;
  248. return true;
  249. } },
  250. { DebugItems.Music, ()=> {
  251. if(Memory.MusicIndex <(ushort)Memory.DicMusic.Keys.Max())
  252. Memory.MusicIndex ++;
  253. else
  254. Memory.MusicIndex = 0;
  255. return true;
  256. } },
  257. { DebugItems.Sounds, ()=> {
  258. if (_debugChosenAudio < AV.Sound.EntriesCount-1)
  259. _debugChosenAudio++;
  260. else
  261. _debugChosenAudio = 0;
  262. return true;
  263. } }
  264. };
  265. _dynamicDebugStrings = new Dictionary<DebugItems, Func<FF8String>>
  266. {
  267. { DebugItems.Movie, ()=> {
  268. if (files.Count<=ModuleMovieTest.Index)
  269. ModuleMovieTest.Index=0;
  270. if(files.Count ==0)
  271. return "";
  272. if (files.Count <= ModuleMovieTest.Index) return "";
  273. var end=Path.GetFileNameWithoutExtension(files[ModuleMovieTest.Index]);
  274. if(StrDebugLobby[DebugItems.Movie]!=null)
  275. return StrDebugLobby[DebugItems.Movie].Clone().Append(end);
  276. return end;
  277. }},
  278. { DebugItems.Music, ()=> {
  279. if (Memory.DicMusic.Count <= Memory.MusicIndex ||
  280. Memory.DicMusic[(MusicId) Memory.MusicIndex].Count <= 0) return "";
  281. var end=Path.GetFileNameWithoutExtension(Memory.DicMusic[(MusicId)Memory.MusicIndex][0]);
  282. if(StrDebugLobby[DebugItems.Music]!=null)
  283. return StrDebugLobby[DebugItems.Music].Clone().Append(end);
  284. return end;
  285. } },
  286. { DebugItems.Sounds, ()=> StrDebugLobby[DebugItems.Sounds].Clone().Append(_debugChosenAudio.ToString("D4"))}
  287. };
  288. }
  289. protected override void InitShift(int i, int col, int row)
  290. {
  291. base.InitShift(i, col, row);
  292. SIZE[i].Inflate(-22, -8);
  293. SIZE[i].Offset(0, 12 + (-8 * row));
  294. }
  295. private void FilterEncounters(string filter) => ((DebugSelectPool<Battle.Encounter>)ITEM[(int)DebugItems.BattlePool, 0]).Refresh(Memory.Encounters.Where(x => x.ToString().IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0));
  296. private void FilterFields(string filter) => ((DebugSelectPool<string>)ITEM[(int)DebugItems.FieldPool, 0]).Refresh(Memory.FieldHolder.Fields?.Where(x => x.ToString().IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0));
  297. private static bool SetEncounterOkayBattle(Battle.Encounter encounter)
  298. {
  299. Memory.Encounters.ID = encounter.ID;
  300. Menu.FadeIn();
  301. ModuleBattleDebug.ResetState();
  302. Menu.BattleMenus.CameFrom();
  303. Memory.Module = Module.BattleDebug;
  304. Memory.IsMouseVisible = false;
  305. return true;
  306. }
  307. private static bool SetFieldsOkayBattle(string arg)
  308. {
  309. if (Memory.FieldHolder.Fields == null) return true;
  310. Memory.FieldHolder.FieldID = (ushort)Memory.FieldHolder.Fields.ToList().FindIndex(x => x == arg);
  311. Menu.FadeIn();
  312. Fields.Module.ResetField();
  313. Memory.Module = Module.FieldDebug;
  314. Memory.IsMouseVisible = false;
  315. return true;
  316. }
  317. #endregion Methods
  318. }
  319. }