pokemon/window/window.hpp

114 lines
2.3 KiB
C++

#pragma once
#include <cstdint>
#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
);
};