|
|
@@ -0,0 +1,164 @@
|
|
|
+#include "../pokemon_app.h"
|
|
|
+#include "../pokemon_char_encode.h"
|
|
|
+
|
|
|
+#include "pokemon_menu.h"
|
|
|
+#include "pokemon_select.h"
|
|
|
+#include "pokemon_nickname.h"
|
|
|
+#include "pokemon_level.h"
|
|
|
+#include "pokemon_move.h"
|
|
|
+#include "pokemon_type.h"
|
|
|
+#include "pokemon_stats.h"
|
|
|
+#include "pokemon_ot_id.h"
|
|
|
+#include "pokemon_ot_name.h"
|
|
|
+#include "pokemon_trade.h"
|
|
|
+
|
|
|
+static void scene_change_from_main_cb(void* context, uint32_t index) {
|
|
|
+ PokemonFap* pokemon_fap = (PokemonFap*)context;
|
|
|
+
|
|
|
+ /* Set scene state to the current index so we can have that element highlighted when
|
|
|
+ * we return.
|
|
|
+ */
|
|
|
+ scene_manager_set_scene_state(pokemon_fap->scene_manager, MainMenuScene, index);
|
|
|
+ scene_manager_next_scene(pokemon_fap->scene_manager, index);
|
|
|
+}
|
|
|
+
|
|
|
+bool main_menu_back_event_callback(void* context) {
|
|
|
+ furi_assert(context);
|
|
|
+ PokemonFap* pokemon_fap = context;
|
|
|
+ return scene_manager_handle_back_event(pokemon_fap->scene_manager);
|
|
|
+}
|
|
|
+
|
|
|
+void main_menu_scene_on_enter(void* context) {
|
|
|
+ char buf[32];
|
|
|
+ char name_buf[11]; // All name buffers are 11 bytes at most, including term
|
|
|
+ PokemonFap* pokemon_fap = (PokemonFap*)context;
|
|
|
+
|
|
|
+ /* Clear the scene state of the Move scene since that is used to set the
|
|
|
+ * highlighted meny item.
|
|
|
+ */
|
|
|
+ scene_manager_set_scene_state(pokemon_fap->scene_manager, SelectMoveScene, 0);
|
|
|
+
|
|
|
+ submenu_reset(pokemon_fap->submenu);
|
|
|
+
|
|
|
+ snprintf(
|
|
|
+ buf,
|
|
|
+ sizeof(buf),
|
|
|
+ "Pokemon: %s",
|
|
|
+ pokemon_fap->pokemon_table[pokemon_fap->curr_pokemon].name);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu, buf, SelectPokemonScene, scene_change_from_main_cb, pokemon_fap);
|
|
|
+ pokemon_encoded_array_to_str(
|
|
|
+ name_buf, (uint8_t*)pokemon_fap->trade_block->nickname, sizeof(name_buf));
|
|
|
+ snprintf(buf, sizeof(buf), "Nickname: %s", name_buf);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu, buf, SelectNicknameScene, scene_change_from_main_cb, pokemon_fap);
|
|
|
+ snprintf(buf, sizeof(buf), "Level: %d", pokemon_fap->trade_block->party[0].level);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu,
|
|
|
+ buf,
|
|
|
+ SelectLevelScene,
|
|
|
+ scene_change_from_main_cb,
|
|
|
+ pokemon_fap);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu,
|
|
|
+ "Select Moves",
|
|
|
+ SelectMoveScene,
|
|
|
+ scene_change_from_main_cb,
|
|
|
+ pokemon_fap);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu,
|
|
|
+ "Select Types",
|
|
|
+ SelectTypeScene,
|
|
|
+ scene_change_from_main_cb,
|
|
|
+ pokemon_fap);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu,
|
|
|
+ stats_text[pokemon_fap->curr_stats],
|
|
|
+ SelectStatsScene,
|
|
|
+ scene_change_from_main_cb,
|
|
|
+ pokemon_fap);
|
|
|
+ snprintf(
|
|
|
+ buf,
|
|
|
+ sizeof(buf),
|
|
|
+ "OT ID#: %05d",
|
|
|
+ __builtin_bswap16(pokemon_fap->trade_block->party[0].ot_id));
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu, buf, SelectOTIDScene, scene_change_from_main_cb, pokemon_fap);
|
|
|
+ pokemon_encoded_array_to_str(
|
|
|
+ name_buf, (uint8_t*)pokemon_fap->trade_block->ot_name, sizeof(name_buf));
|
|
|
+ snprintf(buf, sizeof(buf), "OT Name: %s", name_buf);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu, buf, SelectOTNameScene, scene_change_from_main_cb, pokemon_fap);
|
|
|
+ submenu_add_item(
|
|
|
+ pokemon_fap->submenu, "Trade PKMN", TradeScene, scene_change_from_main_cb, pokemon_fap);
|
|
|
+
|
|
|
+ submenu_set_selected_item(
|
|
|
+ pokemon_fap->submenu,
|
|
|
+ scene_manager_get_scene_state(pokemon_fap->scene_manager, MainMenuScene));
|
|
|
+
|
|
|
+ view_dispatcher_set_navigation_event_callback(
|
|
|
+ pokemon_fap->view_dispatcher, main_menu_back_event_callback);
|
|
|
+ view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewMainMenu);
|
|
|
+}
|
|
|
+
|
|
|
+bool null_scene_on_event(void* context, SceneManagerEvent event) {
|
|
|
+ UNUSED(context);
|
|
|
+ UNUSED(event);
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+void null_scene_on_exit(void* context) {
|
|
|
+ UNUSED(context);
|
|
|
+}
|
|
|
+
|
|
|
+void (*const pokemon_scene_on_enter_handlers[])(void*) = {
|
|
|
+ main_menu_scene_on_enter,
|
|
|
+ select_pokemon_scene_on_enter,
|
|
|
+ select_nickname_scene_on_enter,
|
|
|
+ select_level_scene_on_enter,
|
|
|
+ select_move_scene_on_enter,
|
|
|
+ select_move_index_scene_on_enter,
|
|
|
+ select_move_set_scene_on_enter,
|
|
|
+ select_type_scene_on_enter,
|
|
|
+ select_stats_scene_on_enter,
|
|
|
+ select_ot_id_scene_on_enter,
|
|
|
+ select_ot_name_scene_on_enter,
|
|
|
+ trade_scene_on_enter,
|
|
|
+};
|
|
|
+
|
|
|
+void (*const pokemon_scene_on_exit_handlers[])(void*) = {
|
|
|
+ null_scene_on_exit,
|
|
|
+ select_pokemon_scene_on_exit,
|
|
|
+ select_nickname_scene_on_exit,
|
|
|
+ select_level_scene_on_exit,
|
|
|
+ null_scene_on_exit,
|
|
|
+ null_scene_on_exit,
|
|
|
+ null_scene_on_exit,
|
|
|
+ select_type_scene_on_exit,
|
|
|
+ null_scene_on_exit,
|
|
|
+ select_ot_id_scene_on_exit,
|
|
|
+ select_ot_name_scene_on_exit,
|
|
|
+ null_scene_on_exit,
|
|
|
+};
|
|
|
+
|
|
|
+bool (*const pokemon_scene_on_event_handlers[])(void*, SceneManagerEvent) = {
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+ null_scene_on_event,
|
|
|
+};
|
|
|
+
|
|
|
+const SceneManagerHandlers pokemon_scene_manager_handlers = {
|
|
|
+ .on_enter_handlers = pokemon_scene_on_enter_handlers,
|
|
|
+ .on_exit_handlers = pokemon_scene_on_exit_handlers,
|
|
|
+ .on_event_handlers = pokemon_scene_on_event_handlers,
|
|
|
+ .scene_num = SceneCount,
|
|
|
+};
|