|
@@ -0,0 +1,195 @@
|
|
|
|
|
+#include "../pokemon_app.h"
|
|
|
|
|
+#include "select_stats.hpp"
|
|
|
|
|
+
|
|
|
|
|
+static void select_stats_render_callback(Canvas* canvas, void* context) {
|
|
|
|
|
+ canvas_clear(canvas);
|
|
|
|
|
+
|
|
|
|
|
+ SelectPokemonModel* model = (SelectPokemonModel*)context;
|
|
|
|
|
+ const uint8_t current_index = model->current_stats;
|
|
|
|
|
+
|
|
|
|
|
+ canvas_set_font(canvas, FontPrimary);
|
|
|
|
|
+ if(current_index == 0) {
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
|
|
|
|
|
+ } else if(current_index == 1) {
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
|
|
|
|
|
+ } else if(current_index == 2) {
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
|
|
|
|
|
+ } else if(current_index == 3) {
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
|
|
|
|
|
+ } else if(current_index == 4) {
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
|
|
|
|
|
+ } else if(current_index == 5) {
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
|
|
|
|
|
+ canvas_draw_str_aligned(
|
|
|
|
|
+ canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ canvas_set_font(canvas, FontSecondary);
|
|
|
|
|
+ canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
|
|
|
|
|
+ canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
|
|
|
|
|
+ canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Stats");
|
|
|
|
|
+
|
|
|
|
|
+ canvas_set_font(canvas, FontPrimary);
|
|
|
|
|
+ elements_button_center(canvas, "OK");
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static bool select_stats_input_callback(InputEvent* event, void* context) {
|
|
|
|
|
+ furi_assert(context);
|
|
|
|
|
+ SelectStats* select_stats = (SelectStats*)context;
|
|
|
|
|
+ bool consumed = false;
|
|
|
|
|
+
|
|
|
|
|
+ if(event->type == InputTypePress && event->key == InputKeyOk) {
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ select_stats->app->current_stats = model->current_stats;
|
|
|
|
|
+ },
|
|
|
|
|
+ false);
|
|
|
|
|
+
|
|
|
|
|
+ view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectMove1);
|
|
|
|
|
+ consumed = true;
|
|
|
|
|
+ } else if(event->type == InputTypePress && event->key == InputKeyBack) {
|
|
|
|
|
+ view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectLevel);
|
|
|
|
|
+ consumed = true;
|
|
|
|
|
+ } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ if(model->current_stats == 0) {
|
|
|
|
|
+ model->current_stats = 5;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ model->current_stats--;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
|
|
+ consumed = true;
|
|
|
|
|
+ } else if(event->type == InputTypePress && event->key == InputKeyDown) {
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ if(model->current_stats == 0) {
|
|
|
|
|
+ model->current_stats = 5;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ model->current_stats--;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
|
|
+ consumed = true;
|
|
|
|
|
+ } else if(event->type == InputTypePress && event->key == InputKeyRight) {
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ if(model->current_stats == 5) {
|
|
|
|
|
+ model->current_stats = 0;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ model->current_stats++;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
|
|
+ consumed = true;
|
|
|
|
|
+ } else if(event->type == InputTypePress && event->key == InputKeyUp) {
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ if(model->current_stats == 5) {
|
|
|
|
|
+ model->current_stats = 0;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ model->current_stats++;
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
|
|
+ consumed = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return consumed;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void select_stats_enter_callback(void* context) {
|
|
|
|
|
+ furi_assert(context);
|
|
|
|
|
+ SelectStats* select_stats = (SelectStats*)context;
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ model->current_pokemon = select_stats->app->current_pokemon;
|
|
|
|
|
+ model->pokemon_hex_code = select_stats->app->pokemon_hex_code;
|
|
|
|
|
+ model->current_level = select_stats->app->current_level;
|
|
|
|
|
+ model->current_stats = select_stats->app->current_stats;
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+bool select_stats_custom_callback(uint32_t event, void* context) {
|
|
|
|
|
+ UNUSED(event);
|
|
|
|
|
+ furi_assert(context);
|
|
|
|
|
+ SelectStats* select_stats = (SelectStats*)context;
|
|
|
|
|
+ view_dispatcher_send_custom_event(select_stats->app->view_dispatcher, 0);
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void select_stats_exit_callback(void* context) {
|
|
|
|
|
+ furi_assert(context);
|
|
|
|
|
+ UNUSED(context);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+SelectStats* select_stats_alloc(App* app) {
|
|
|
|
|
+ SelectStats* select_stats = (SelectStats*)malloc(sizeof(SelectStats));
|
|
|
|
|
+ select_stats->app = app;
|
|
|
|
|
+ select_stats->view = view_alloc();
|
|
|
|
|
+ view_set_context(select_stats->view, select_stats);
|
|
|
|
|
+ view_allocate_model(select_stats->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
|
|
|
|
|
+ with_view_model_cpp(
|
|
|
|
|
+ select_stats->view,
|
|
|
|
|
+ SelectPokemonModel*,
|
|
|
|
|
+ model,
|
|
|
|
|
+ {
|
|
|
|
|
+ model->current_stats = app->current_stats;
|
|
|
|
|
+ },
|
|
|
|
|
+ true);
|
|
|
|
|
+
|
|
|
|
|
+ view_set_draw_callback(select_stats->view, select_stats_render_callback);
|
|
|
|
|
+ view_set_input_callback(select_stats->view, select_stats_input_callback);
|
|
|
|
|
+ view_set_enter_callback(select_stats->view, select_stats_enter_callback);
|
|
|
|
|
+ view_set_custom_callback(select_stats->view, select_stats_custom_callback);
|
|
|
|
|
+
|
|
|
|
|
+ view_set_exit_callback(select_stats->view, select_stats_exit_callback);
|
|
|
|
|
+ return select_stats;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void select_stats_free(App* app) {
|
|
|
|
|
+ furi_assert(app->select_stats);
|
|
|
|
|
+ view_free(app->select_stats->view);
|
|
|
|
|
+ free(app->select_stats);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+View* select_stats_get_view(App* app) {
|
|
|
|
|
+ furi_assert(app->select_stats);
|
|
|
|
|
+ return app->select_stats->view;
|
|
|
|
|
+}
|