pokemon_move.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include <gui/modules/submenu.h>
  2. #include <gui/scene_manager.h>
  3. #include <stdio.h>
  4. #include "../pokemon_app.h"
  5. #include "pokemon_menu.h"
  6. static void select_move_selected_callback(void* context, uint32_t index) {
  7. PokemonFap* pokemon_fap = (PokemonFap*)context;
  8. uint32_t move = scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveScene);
  9. if(index == UINT32_MAX) {
  10. pokemon_fap->trade_block->party[0].move[move] =
  11. pokemon_fap->pokemon_table[pokemon_fap->curr_pokemon].move[move];
  12. } else {
  13. pokemon_fap->trade_block->party[0].move[move] = (uint8_t)index;
  14. }
  15. /* Move back to move menu */
  16. scene_manager_search_and_switch_to_previous_scene(pokemon_fap->scene_manager, SelectMoveScene);
  17. }
  18. static void select_move_index_callback(void* context, uint32_t index) {
  19. PokemonFap* pokemon_fap = (PokemonFap*)context;
  20. /* Move to next scene */
  21. scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene, index);
  22. scene_manager_next_scene(pokemon_fap->scene_manager, SelectMoveSetScene);
  23. }
  24. static void select_move_number_callback(void* context, uint32_t index) {
  25. PokemonFap* pokemon_fap = (PokemonFap*)context;
  26. /* Move to move index scene, save which move number we're selecting,
  27. * This doubles as the move slot we're going to write to later.
  28. */
  29. scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveScene, index);
  30. scene_manager_next_scene(pokemon_fap->scene_manager, SelectMoveIndexScene);
  31. }
  32. void select_move_scene_on_enter(void* context) {
  33. PokemonFap* pokemon_fap = (PokemonFap*)context;
  34. uint8_t* pkmn_move = pokemon_fap->trade_block->party[0].move;
  35. char buf[64];
  36. submenu_reset(pokemon_fap->submenu);
  37. snprintf(
  38. buf,
  39. sizeof(buf),
  40. "Move 1: %s",
  41. pokemon_named_list_get_name_from_index(pokemon_fap->move_list, pkmn_move[0]));
  42. submenu_add_item(pokemon_fap->submenu, buf, 0, select_move_number_callback, pokemon_fap);
  43. snprintf(
  44. buf,
  45. sizeof(buf),
  46. "Move 2: %s",
  47. pokemon_named_list_get_name_from_index(pokemon_fap->move_list, pkmn_move[1]));
  48. submenu_add_item(pokemon_fap->submenu, buf, 1, select_move_number_callback, pokemon_fap);
  49. snprintf(
  50. buf,
  51. sizeof(buf),
  52. "Move 3: %s",
  53. pokemon_named_list_get_name_from_index(pokemon_fap->move_list, pkmn_move[2]));
  54. submenu_add_item(pokemon_fap->submenu, buf, 2, select_move_number_callback, pokemon_fap);
  55. snprintf(
  56. buf,
  57. sizeof(buf),
  58. "Move 4: %s",
  59. pokemon_named_list_get_name_from_index(pokemon_fap->move_list, pkmn_move[3]));
  60. submenu_add_item(pokemon_fap->submenu, buf, 3, select_move_number_callback, pokemon_fap);
  61. /* TODO: Add a "Default all moves" item? */
  62. submenu_set_selected_item(
  63. pokemon_fap->submenu,
  64. scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveScene));
  65. /* Clear cursor position on MoveIndex */
  66. scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene, 0);
  67. }
  68. void select_move_index_scene_on_enter(void* context) {
  69. PokemonFap* pokemon_fap = (PokemonFap*)context;
  70. int i;
  71. char letter[2] = {'\0'};
  72. char buf[32];
  73. int curr_pokemon = pokemon_fap->curr_pokemon;
  74. uint32_t move_num = scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveScene);
  75. uint8_t default_move = pokemon_fap->pokemon_table[curr_pokemon].move[move_num];
  76. const NamedList* move_list = pokemon_fap->move_list;
  77. submenu_reset(pokemon_fap->submenu);
  78. /* The move list should always start with No Move, put that at the start
  79. * for quick access.
  80. */
  81. submenu_add_item(
  82. pokemon_fap->submenu,
  83. move_list[0].name,
  84. move_list[0].index,
  85. select_move_selected_callback,
  86. pokemon_fap);
  87. /* Option to set move back to default */
  88. snprintf(
  89. buf,
  90. sizeof(buf),
  91. "Default [%s]",
  92. pokemon_named_list_get_name_from_index(pokemon_fap->move_list, default_move));
  93. submenu_add_item(
  94. pokemon_fap->submenu, buf, UINT32_MAX, select_move_selected_callback, pokemon_fap);
  95. /* Now, walk through the list and make a submenu item for each move's starting letter */
  96. for(i = 1;; i++) {
  97. if(move_list[i].name == NULL) break;
  98. if(toupper(move_list[i].name[0]) != toupper(letter[0])) {
  99. letter[0] = toupper(move_list[i].name[0]);
  100. submenu_add_item(
  101. pokemon_fap->submenu, letter, letter[0], select_move_index_callback, pokemon_fap);
  102. }
  103. }
  104. submenu_set_selected_item(
  105. pokemon_fap->submenu,
  106. scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene));
  107. }
  108. void select_move_set_scene_on_enter(void* context) {
  109. PokemonFap* pokemon_fap = (PokemonFap*)context;
  110. int i;
  111. char letter =
  112. (char)scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene);
  113. /* Populate submenu with all moves that start with `letter` */
  114. /* NOTE! Start with index of 1 in the move list since 0 should always be no move! */
  115. submenu_reset(pokemon_fap->submenu);
  116. for(i = 1;; i++) {
  117. if(pokemon_fap->move_list[i].name == NULL) break;
  118. if(toupper(pokemon_fap->move_list[i].name[0]) == toupper(letter)) {
  119. submenu_add_item(
  120. pokemon_fap->submenu,
  121. pokemon_fap->move_list[i].name,
  122. pokemon_fap->move_list[i].index,
  123. select_move_selected_callback,
  124. pokemon_fap);
  125. }
  126. }
  127. }