pokemon_move.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #include <gui/modules/submenu.h>
  2. #include <gui/scene_manager.h>
  3. #include <stdio.h>
  4. #include <named_list.h>
  5. #include "../pokemon_app.h"
  6. #include "../pokemon_data.h"
  7. #include "pokemon_menu.h"
  8. static void select_move_selected_callback(void* context, uint32_t index) {
  9. PokemonFap* pokemon_fap = (PokemonFap*)context;
  10. uint32_t move = scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveScene);
  11. uint8_t num = pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE);
  12. if(index == UINT32_MAX) {
  13. pokemon_stat_set(
  14. pokemon_fap->pdata,
  15. STAT_MOVE,
  16. move,
  17. table_stat_base_get(pokemon_fap->pdata->pokemon_table, num, STAT_MOVE, move));
  18. } else {
  19. pokemon_stat_set(pokemon_fap->pdata, STAT_MOVE, move, index);
  20. }
  21. FURI_LOG_D(
  22. TAG,
  23. "[move] Set move %s to %d",
  24. namedlist_name_get_index(
  25. pokemon_fap->pdata->move_list, pokemon_stat_get(pokemon_fap->pdata, STAT_MOVE, move)),
  26. (int)move);
  27. /* Move back to move menu */
  28. scene_manager_search_and_switch_to_previous_scene(pokemon_fap->scene_manager, SelectMoveScene);
  29. }
  30. static void select_move_index_callback(void* context, uint32_t index) {
  31. PokemonFap* pokemon_fap = (PokemonFap*)context;
  32. /* Move to next scene */
  33. scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene, index);
  34. scene_manager_next_scene(pokemon_fap->scene_manager, SelectMoveSetScene);
  35. }
  36. static void select_move_number_callback(void* context, uint32_t index) {
  37. PokemonFap* pokemon_fap = (PokemonFap*)context;
  38. /* Move to move index scene, save which move number we're selecting,
  39. * This doubles as the move slot we're going to write to later.
  40. */
  41. scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveScene, index);
  42. scene_manager_next_scene(pokemon_fap->scene_manager, SelectMoveIndexScene);
  43. }
  44. void select_move_scene_on_enter(void* context) {
  45. furi_assert(context);
  46. PokemonFap* pokemon_fap = (PokemonFap*)context;
  47. char buf[64];
  48. int i;
  49. submenu_reset(pokemon_fap->submenu);
  50. for(i = 0; i < 4; i++) {
  51. snprintf(
  52. buf,
  53. sizeof(buf),
  54. "Move %d: %s",
  55. i + 1,
  56. namedlist_name_get_index(
  57. pokemon_fap->pdata->move_list,
  58. pokemon_stat_get(pokemon_fap->pdata, STAT_MOVE, i)));
  59. submenu_add_item(pokemon_fap->submenu, buf, i, select_move_number_callback, pokemon_fap);
  60. }
  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. const char* name;
  74. uint32_t move_num = scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveScene);
  75. submenu_reset(pokemon_fap->submenu);
  76. /* The move list should always start with No Move, put that at the start
  77. * for quick access.
  78. */
  79. submenu_add_item(
  80. pokemon_fap->submenu,
  81. namedlist_name_get_index(pokemon_fap->pdata->move_list, 0),
  82. 0,
  83. select_move_selected_callback,
  84. pokemon_fap);
  85. /* Option to set move back to default */
  86. snprintf(
  87. buf,
  88. sizeof(buf),
  89. "Default [%s]",
  90. namedlist_name_get_index(
  91. pokemon_fap->pdata->move_list,
  92. table_stat_base_get(
  93. pokemon_fap->pdata->pokemon_table,
  94. pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE),
  95. STAT_MOVE,
  96. move_num)));
  97. submenu_add_item(
  98. pokemon_fap->submenu, buf, UINT32_MAX, select_move_selected_callback, pokemon_fap);
  99. /* Now, walk through the list and make a submenu item for each move's starting letter */
  100. for(i = 1;; i++) {
  101. name = namedlist_name_get_pos(pokemon_fap->pdata->move_list, i);
  102. if(name == NULL) break;
  103. /* TODO: Add check here for generation match. Currently, this will populate
  104. * the letters that have any move associated with them, even if not for the
  105. * generation currently being used.
  106. */
  107. if(name[0] != letter[0]) {
  108. letter[0] = name[0];
  109. submenu_add_item(
  110. pokemon_fap->submenu, letter, letter[0], select_move_index_callback, pokemon_fap);
  111. }
  112. }
  113. submenu_set_selected_item(
  114. pokemon_fap->submenu,
  115. scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene));
  116. }
  117. void select_move_set_scene_on_enter(void* context) {
  118. PokemonFap* pokemon_fap = (PokemonFap*)context;
  119. int i;
  120. const char* name;
  121. char letter =
  122. (char)scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectMoveIndexScene);
  123. /* Populate submenu with all moves that start with `letter` */
  124. /* NOTE! Start with index of 1 in the move list since 0 should always be no move! */
  125. submenu_reset(pokemon_fap->submenu);
  126. for(i = 1;; i++) {
  127. name = namedlist_name_get_pos(pokemon_fap->pdata->move_list, i);
  128. if(name == NULL) break;
  129. if(name[0] == letter &&
  130. (pokemon_fap->pdata->gen & namedlist_gen_get_pos(pokemon_fap->pdata->move_list, i))) {
  131. submenu_add_item(
  132. pokemon_fap->submenu,
  133. name,
  134. namedlist_index_get(pokemon_fap->pdata->move_list, i),
  135. select_move_selected_callback,
  136. pokemon_fap);
  137. };
  138. }
  139. }