pokemon_gen.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #include <src/include/pokemon_app.h>
  2. #include <src/include/pokemon_data.h>
  3. #include <src/include/pokemon_char_encode.h>
  4. #include <src/include/named_list.h>
  5. #include <src/views/trade.h>
  6. #include <src/views/select_pokemon.h>
  7. #include <src/scenes/include/pokemon_scene.h>
  8. #include <src/scenes/include/pokemon_menu.h>
  9. #include <src/scenes/include/pokemon_shiny.h>
  10. #include <src/include/pokemon_gender.h>
  11. #include <src/scenes/include/pokemon_pokerus.h>
  12. #include <src/include/unown_form.h>
  13. static void scene_change_from_main_cb(void* context, uint32_t index) {
  14. PokemonFap* pokemon_fap = (PokemonFap*)context;
  15. /* Reuse of scenes to allow for using the same functions to set names */
  16. switch(index) {
  17. case PokemonSceneNickname:
  18. case PokemonSceneOTName:
  19. case PokemonSceneUnownForm:
  20. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneNickname, index);
  21. break;
  22. case PokemonSceneLevel:
  23. case PokemonSceneOTID:
  24. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneLevel, index);
  25. break;
  26. case PokemonSceneGender:
  27. if(pokemon_gender_is_static(
  28. pokemon_fap->pdata,
  29. table_stat_base_get(
  30. pokemon_fap->pdata->pokemon_table,
  31. pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE),
  32. STAT_BASE_GENDER_RATIO,
  33. NONE)))
  34. return;
  35. break;
  36. }
  37. /* Set the navigation handler back to the basic one in the main menu. We only
  38. * want gen_back_event_callback from this menu as going back from the gen menu
  39. * means we need to free pdata.
  40. */
  41. view_dispatcher_set_navigation_event_callback(
  42. pokemon_fap->view_dispatcher, main_menu_back_event_callback);
  43. /* Set scene state to the current index so we can have that element highlighted when
  44. * we return.
  45. */
  46. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade, index);
  47. scene_manager_next_scene(pokemon_fap->scene_manager, index);
  48. }
  49. bool gen_back_event_callback(void* context) {
  50. furi_assert(context);
  51. PokemonFap* pokemon_fap = context;
  52. scene_manager_next_scene(pokemon_fap->scene_manager, PokemonSceneExitConfirm);
  53. return true;
  54. }
  55. void pokemon_scene_gen_on_enter(void* context) {
  56. char buf[32];
  57. char name_buf[11]; // All name buffers are 11 bytes at most, including term
  58. PokemonFap* pokemon_fap = (PokemonFap*)context;
  59. int pkmn_num;
  60. uint32_t state;
  61. // Set up trade party struct
  62. if(!pokemon_fap->pdata) {
  63. state = scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade);
  64. switch(state) {
  65. case PokemonSceneGenITrade:
  66. state = GEN_I;
  67. break;
  68. case PokemonSceneGenIITrade:
  69. state = GEN_II;
  70. break;
  71. default:
  72. state = 0;
  73. break;
  74. }
  75. pokemon_fap->pdata = pokemon_data_alloc(state);
  76. /* Clear the scene state as this is the first entry in to this scene
  77. * we definitely want to be completely reset.
  78. */
  79. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade, 0);
  80. /* Allocate select and trade views */
  81. /* Allocates its own view and adds it to the main view_dispatcher */
  82. pokemon_fap->select = select_pokemon_alloc(
  83. pokemon_fap->pdata,
  84. pokemon_fap->view_dispatcher,
  85. pokemon_fap->scene_manager,
  86. AppViewSelectPokemon);
  87. // Trade View
  88. /* Allocates its own view and adds it to the main view_dispatcher */
  89. pokemon_fap->trade = trade_alloc(
  90. pokemon_fap->pdata, &pokemon_fap->pins, pokemon_fap->view_dispatcher, AppViewTrade);
  91. }
  92. pkmn_num = pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE);
  93. /* Clear the scene state of the Move scene since that is used to set the
  94. * highlighted menu item.
  95. * This could be done in move, but move would need its own custom exit handler
  96. * which is fine but would just waste a few more bytes compared to us handling
  97. * it here.
  98. */
  99. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneMove, 0);
  100. scene_manager_set_scene_state(pokemon_fap->scene_manager, PokemonSceneItemSet, 0);
  101. submenu_reset(pokemon_fap->submenu);
  102. snprintf(
  103. buf,
  104. sizeof(buf),
  105. "Pokemon: %s",
  106. table_stat_name_get(pokemon_fap->pdata->pokemon_table, pkmn_num));
  107. submenu_add_item(
  108. pokemon_fap->submenu, buf, PokemonSceneSelect, scene_change_from_main_cb, pokemon_fap);
  109. pokemon_name_get(pokemon_fap->pdata, STAT_NICKNAME, name_buf, sizeof(name_buf));
  110. snprintf(buf, sizeof(buf), "Nickname: %s", name_buf);
  111. submenu_add_item(
  112. pokemon_fap->submenu, buf, PokemonSceneNickname, scene_change_from_main_cb, pokemon_fap);
  113. snprintf(
  114. buf,
  115. sizeof(buf),
  116. "Level: %d",
  117. pokemon_stat_get(pokemon_fap->pdata, STAT_LEVEL, NONE));
  118. submenu_add_item(
  119. pokemon_fap->submenu, buf, PokemonSceneLevel, scene_change_from_main_cb, pokemon_fap);
  120. if(pokemon_fap->pdata->gen == GEN_II) {
  121. snprintf(
  122. buf,
  123. sizeof(buf),
  124. "Held Item: %s",
  125. namedlist_name_get_index(
  126. pokemon_fap->pdata->item_list,
  127. pokemon_stat_get(pokemon_fap->pdata, STAT_HELD_ITEM, NONE)));
  128. submenu_add_item(
  129. pokemon_fap->submenu, buf, PokemonSceneItem, scene_change_from_main_cb, pokemon_fap);
  130. }
  131. submenu_add_item(
  132. pokemon_fap->submenu,
  133. "Select Moves",
  134. PokemonSceneMove,
  135. scene_change_from_main_cb,
  136. pokemon_fap);
  137. if(pokemon_fap->pdata->gen == GEN_I) {
  138. submenu_add_item(
  139. pokemon_fap->submenu,
  140. "Select Types",
  141. PokemonSceneType,
  142. scene_change_from_main_cb,
  143. pokemon_fap);
  144. }
  145. submenu_add_item(
  146. pokemon_fap->submenu,
  147. namedlist_name_get_index(
  148. pokemon_fap->pdata->stat_list, pokemon_stat_get(pokemon_fap->pdata, STAT_SEL, NONE)),
  149. PokemonSceneStats,
  150. scene_change_from_main_cb,
  151. pokemon_fap);
  152. if(pokemon_fap->pdata->gen == GEN_II) {
  153. snprintf(
  154. buf,
  155. sizeof(buf),
  156. "Shiny: %s",
  157. select_shiny_is_shiny(pokemon_fap->pdata) ? "Yes" : "No");
  158. submenu_add_item(
  159. pokemon_fap->submenu, buf, PokemonSceneShiny, scene_change_from_main_cb, pokemon_fap);
  160. snprintf(buf, sizeof(buf), "Gender: %s", pokemon_gender_get(pokemon_fap->pdata));
  161. submenu_add_item(
  162. pokemon_fap->submenu, buf, PokemonSceneGender, scene_change_from_main_cb, pokemon_fap);
  163. snprintf(buf, sizeof(buf), "Pokerus: %s", select_pokerus_status(pokemon_fap));
  164. submenu_add_item(
  165. pokemon_fap->submenu, buf, PokemonScenePokerus, scene_change_from_main_cb, pokemon_fap);
  166. if(pokemon_stat_get(pokemon_fap->pdata, STAT_NUM, NONE) == 0xC8) { // Unown
  167. snprintf(buf, sizeof(buf), "Unown Form: %c", unown_form_get(pokemon_fap->pdata));
  168. submenu_add_item(
  169. pokemon_fap->submenu,
  170. buf,
  171. PokemonSceneUnownForm,
  172. scene_change_from_main_cb,
  173. pokemon_fap);
  174. }
  175. }
  176. snprintf(
  177. buf,
  178. sizeof(buf),
  179. "OT ID#: %05d",
  180. pokemon_stat_get(pokemon_fap->pdata, STAT_OT_ID, NONE));
  181. submenu_add_item(
  182. pokemon_fap->submenu, buf, PokemonSceneOTID, scene_change_from_main_cb, pokemon_fap);
  183. pokemon_name_get(pokemon_fap->pdata, STAT_OT_NAME, name_buf, sizeof(name_buf));
  184. snprintf(buf, sizeof(buf), "OT Name: %s", name_buf);
  185. submenu_add_item(
  186. pokemon_fap->submenu, buf, PokemonSceneOTName, scene_change_from_main_cb, pokemon_fap);
  187. submenu_add_item(
  188. pokemon_fap->submenu, "Trade PKMN", PokemonSceneTrade, scene_change_from_main_cb, pokemon_fap);
  189. /* TODO: Add Save pokemon option here */
  190. /* HACK: No matter what gen were in, we just store the scene state in PokemonSceneGenITrade */
  191. submenu_set_selected_item(
  192. pokemon_fap->submenu,
  193. scene_manager_get_scene_state(pokemon_fap->scene_manager, PokemonSceneGenITrade));
  194. view_dispatcher_set_navigation_event_callback(
  195. pokemon_fap->view_dispatcher, gen_back_event_callback);
  196. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewMainMenu);
  197. }
  198. bool pokemon_scene_gen_on_event(void* context, SceneManagerEvent event) {
  199. UNUSED(context);
  200. UNUSED(event);
  201. return false;
  202. }
  203. void pokemon_scene_gen_on_exit(void* context) {
  204. UNUSED(context);
  205. }