#pragma once #include #include "sqrt.hpp" #include "gen/pokemon/moves.hpp" #include "pokemon.hpp" #include "ailment.hpp" struct determinant_values_t { uint16_t dvs; inline constexpr uint8_t attack() { return (dvs >> 12) & 0b1111; } inline constexpr uint8_t defense() { return (dvs >> 8) & 0b1111; } inline constexpr uint8_t speed() { return (dvs >> 4) & 0b1111; } inline constexpr uint8_t special() { return (dvs >> 0) & 0b1111; } inline constexpr uint8_t hit_points() { return ((attack() & 1) << 3) | ((defense() & 1) << 2) | ((speed() & 1) << 1) | ((special() & 1) << 0); } }; struct stat_experience_t { uint16_t hit_points; uint16_t attack; uint16_t defense; uint16_t speed; uint16_t special; }; // unlike base_stat_values, stat_values is uint16_t struct stat_values_t { union { struct { uint16_t hit_points; uint16_t attack; uint16_t defense; uint16_t speed; uint16_t special; }; uint16_t value[5]; }; }; static_assert((sizeof (stat_values_t)) == 10); struct move_instance_t { enum move_t::move type; uint8_t pp; }; struct pokemon_instance_t { static constexpr uint8_t maximum_moves = 4; uint8_t nickname[12]; enum pokemon_t::pokemon species; uint8_t level; uint32_t total_experience; determinant_values_t determinant_values; stat_values_t stat_values; stat_experience_t stat_experience; move_instance_t move_instances[maximum_moves]; uint16_t current_hit_points; enum ailment_t::ailment ailment; // missing attributes: // "fluff" attributes: // - id number // - original trainer inline constexpr uint8_t moves_count() const { for (int32_t i = maximum_moves; i > 0; i--) { if (move_instances[i - 1].type != move_t::no_move) return i; } return 0; } void determine_stats(); void learn_move(enum move_t::move move, int32_t index); void learn_all_moves(); void init(const enum pokemon_t::pokemon species, const uint8_t level); };