pokemon_move.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include <gui/modules/submenu.h>
  2. #include <gui/scene_manager.h>
  3. #include <stdio.h>
  4. #include <src/include/named_list.h>
  5. #include <src/include/pokemon_app.h>
  6. #include <src/include/pokemon_data.h>
  7. #include <src/scenes/include/pokemon_scene.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, PokemonSceneMove);
  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. view_dispatcher_send_custom_event(
  29. pokemon_fap->view_dispatcher, (PokemonSceneMove | PokemonSceneSearch));
  30. }
  31. static void select_move_index_callback(void* context, uint32_t index) {
  32. PokemonFap* pokemon_fap = (PokemonFap*)context;
  33. /* Move to next scene */
  34. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneMoveIndex, index);
  35. view_dispatcher_send_custom_event(pokemon_fap->view_dispatcher, PokemonSceneMoveSet);
  36. }
  37. static void select_move_number_callback(void* context, uint32_t index) {
  38. PokemonFap* pokemon_fap = (PokemonFap*)context;
  39. /* Move to move index scene, save which move number we're selecting,
  40. * This doubles as the move slot we're going to write to later.
  41. */
  42. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneMove, index);
  43. view_dispatcher_send_custom_event(pokemon_fap->view_dispatcher, PokemonSceneMoveIndex);
  44. }
  45. void pokemon_scene_select_move_on_enter(void* context) {
  46. furi_assert(context);
  47. PokemonFap* pokemon_fap = (PokemonFap*)context;
  48. char buf[64];
  49. int i;
  50. submenu_reset(pokemon_fap->submenu);
  51. for(i = 0; i < 4; i++) {
  52. snprintf(
  53. buf,
  54. sizeof(buf),
  55. "Move %d: %s",
  56. i + 1,
  57. namedlist_name_get_index(
  58. pokemon_fap->pdata->move_list,
  59. pokemon_stat_get(pokemon_fap->pdata, STAT_MOVE, i)));
  60. submenu_add_item(pokemon_fap->submenu, buf, i, select_move_number_callback, pokemon_fap);
  61. }
  62. /* TODO: Add a "Default all moves" item? */
  63. submenu_set_selected_item(
  64. pokemon_fap->submenu,
  65. scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneMove));
  66. /* Clear cursor position on MoveIndex */
  67. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneMoveIndex, 0);
  68. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewSubmenu);
  69. }
  70. bool pokemon_scene_select_move_on_event(void* context, SceneManagerEvent event) {
  71. furi_assert(context);
  72. PokemonFap* pokemon_fap = context;
  73. bool consumed = false;
  74. if(event.type == SceneManagerEventTypeCustom) {
  75. if(event.event & PokemonSceneBack)
  76. scene_manager_previous_scene(pokemon_fap->scene_manager);
  77. else if(event.event & PokemonSceneSearch)
  78. scene_manager_search_and_switch_to_previous_scene(
  79. pokemon_fap->scene_manager, (event.event & ~PokemonSceneSearch));
  80. else
  81. scene_manager_next_scene(pokemon_fap->scene_manager, event.event);
  82. consumed = true;
  83. }
  84. return consumed;
  85. }
  86. void pokemon_scene_select_move_on_exit(void* context) {
  87. UNUSED(context);
  88. }
  89. void pokemon_scene_select_move_index_on_enter(void* context) {
  90. PokemonFap* pokemon_fap = (PokemonFap*)context;
  91. int i;
  92. char letter[2] = {'\0'};
  93. char buf[32];
  94. const char* name;
  95. uint32_t move_num =
  96. scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneMove);
  97. submenu_reset(pokemon_fap->submenu);
  98. /* The move list should always start with No Move, put that at the start
  99. * for quick access.
  100. */
  101. submenu_add_item(
  102. pokemon_fap->submenu,
  103. namedlist_name_get_index(pokemon_fap->pdata->move_list, 0),
  104. 0,
  105. select_move_selected_callback,
  106. pokemon_fap);
  107. /* Option to set move back to default */
  108. snprintf(
  109. buf,
  110. sizeof(buf),
  111. "Default [%s]",
  112. namedlist_name_get_index(
  113. pokemon_fap->pdata->move_list,
  114. table_stat_base_get(
  115. pokemon_fap->pdata->pokemon_table,
  116. pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE),
  117. STAT_MOVE,
  118. move_num)));
  119. submenu_add_item(
  120. pokemon_fap->submenu, buf, UINT32_MAX, select_move_selected_callback, pokemon_fap);
  121. /* Now, walk through the list and make a submenu item for each move's starting letter */
  122. for(i = 1;; i++) {
  123. name = namedlist_name_get_pos(pokemon_fap->pdata->move_list, i);
  124. if(name == NULL) break;
  125. /* TODO: Add check here for generation match. Currently, this will populate
  126. * the letters that have any move associated with them, even if not for the
  127. * generation currently being used.
  128. */
  129. if(name[0] != letter[0]) {
  130. letter[0] = name[0];
  131. submenu_add_item(
  132. pokemon_fap->submenu, letter, letter[0], select_move_index_callback, pokemon_fap);
  133. }
  134. }
  135. submenu_set_selected_item(
  136. pokemon_fap->submenu,
  137. scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneMoveIndex));
  138. }
  139. bool pokemon_scene_select_move_index_on_event(void* context, SceneManagerEvent event) {
  140. furi_assert(context);
  141. PokemonFap* pokemon_fap = context;
  142. bool consumed = false;
  143. if(event.type == SceneManagerEventTypeCustom) {
  144. if(event.event & PokemonSceneBack)
  145. scene_manager_previous_scene(pokemon_fap->scene_manager);
  146. else if(event.event & PokemonSceneSearch)
  147. scene_manager_search_and_switch_to_previous_scene(
  148. pokemon_fap->scene_manager, (event.event & ~PokemonSceneSearch));
  149. else
  150. scene_manager_next_scene(pokemon_fap->scene_manager, event.event);
  151. consumed = true;
  152. }
  153. return consumed;
  154. }
  155. void pokemon_scene_select_move_index_on_exit(void* context) {
  156. UNUSED(context);
  157. }
  158. void pokemon_scene_select_move_set_on_enter(void* context) {
  159. PokemonFap* pokemon_fap = (PokemonFap*)context;
  160. int i;
  161. const char* name;
  162. char letter =
  163. (char)scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneMoveIndex);
  164. /* Populate submenu with all moves that start with `letter` */
  165. /* NOTE! Start with index of 1 in the move list since 0 should always be no move! */
  166. submenu_reset(pokemon_fap->submenu);
  167. for(i = 1;; i++) {
  168. name = namedlist_name_get_pos(pokemon_fap->pdata->move_list, i);
  169. if(name == NULL) break;
  170. if(name[0] == letter &&
  171. (pokemon_fap->pdata->gen & namedlist_gen_get_pos(pokemon_fap->pdata->move_list, i))) {
  172. submenu_add_item(
  173. pokemon_fap->submenu,
  174. name,
  175. namedlist_index_get(pokemon_fap->pdata->move_list, i),
  176. select_move_selected_callback,
  177. pokemon_fap);
  178. };
  179. }
  180. }
  181. bool pokemon_scene_select_move_set_on_event(void* context, SceneManagerEvent event) {
  182. furi_assert(context);
  183. PokemonFap* pokemon_fap = context;
  184. bool consumed = false;
  185. if(event.type == SceneManagerEventTypeCustom) {
  186. if(event.event & PokemonSceneBack)
  187. scene_manager_previous_scene(pokemon_fap->scene_manager);
  188. else if(event.event & PokemonSceneSearch)
  189. scene_manager_search_and_switch_to_previous_scene(
  190. pokemon_fap->scene_manager, (event.event & ~PokemonSceneSearch));
  191. else
  192. scene_manager_next_scene(pokemon_fap->scene_manager, event.event);
  193. consumed = true;
  194. }
  195. return consumed;
  196. }
  197. void pokemon_scene_select_move_set_on_exit(void* context) {
  198. UNUSED(context);
  199. }