#pragma once #include #include "menu.hpp" #include "../trainer.hpp" struct cursor_t { int16_t x; // in menu items int16_t y; // in menu items }; struct window_t { enum input_event { input_up, input_down, input_left, input_right, input_a, input_b, }; enum window_event { no_op, spawn, dismiss, }; cursor_t cursor; }; struct window_descriptor_t { enum type { start, fight, fight_moves, }; union data { menu_t const * const menu; }; union data data; struct result { enum window_t::window_event window_event; union { uint8_t no_op; enum type type; }; result(enum window_t::window_event window_event, enum type type) : window_event(window_event), type(type) {} result(enum window_t::window_event window_event) : window_event(window_event), no_op(0) {} }; void (* const draw)(const uint32_t base_pattern, const union data& data, const window_t& window, const trainer_state_t& trainer_state); result (* const update)(const union data& data, window_t& window, trainer_state_t& trainer_state, const enum window_t::input_event event ); }; extern const window_descriptor_t window_descriptors[]; // window types struct window__menu_t { static void draw(const uint32_t base_pattern, const union window_descriptor_t::data& data, const window_t& window, const trainer_state_t& trainer_state); static void draw_fight_moves(const uint32_t base_pattern, const union window_descriptor_t::data& data, const window_t& window, const trainer_state_t& trainer_state); static window_descriptor_t::result update(const union window_descriptor_t::data& data, window_t& window, trainer_state_t& trainer_state, const enum window_t::input_event event ); static window_descriptor_t::result update_fight(const union window_descriptor_t::data& data, window_t& window, trainer_state_t& trainer_state, const enum window_t::input_event event ); static window_descriptor_t::result update_fight_moves(const union window_descriptor_t::data& data, window_t& window, trainer_state_t& trainer_state, const enum window_t::input_event event ); };