#include "pokemon_instance.hpp" static uint16_t _determine_stat(const uint32_t base_stat_value, const uint32_t determinant_value, const uint32_t stat_experience, const uint32_t level) { const uint32_t x = base_stat_value + determinant_value; const uint32_t y = sqrt_ceil(stat_experience) / 4; const uint32_t z = (x * 2 + y) * level; return (z / 100); } static_assert(_determine_stat(106, 0b0100, 0, 70) == (234 - 10 - 70)); static_assert(_determine_stat(110, 0b1110, 0, 70) == (178 - 5)); static_assert(_determine_stat( 90, 0b0101, 0, 70) == (138 - 5)); static_assert(_determine_stat(130, 0b1000, 0, 70) == (198 - 5)); static_assert(_determine_stat(154, 0b0110, 0, 70) == (229 - 5)); constexpr inline uint16_t pokemon_instance_t::determine_stat(enum stat_t stat) { switch (stat) { default: case stat_t::hit_points: return _determine_stat(pokemon[species].base_stat_values.hit_points, determinant_values.hit_points(), stat_experience.hit_points, level) + 10 + level; case stat_t::attack: return _determine_stat(pokemon[species].base_stat_values.attack, determinant_values.attack(), stat_experience.attack, level) + 5; case stat_t::defense: return _determine_stat(pokemon[species].base_stat_values.defense, determinant_values.defense(), stat_experience.defense, level) + 5; case stat_t::speed: return _determine_stat(pokemon[species].base_stat_values.speed, determinant_values.speed(), stat_experience.speed, level) + 5; case stat_t::special: return _determine_stat(pokemon[species].base_stat_values.special, determinant_values.special(), stat_experience.special, level) + 5; } } constexpr inline uint16_t pokemon_instance_t::learn_move(enum move_t::move move, int32_t index) { switch (index) { case 0: [[fallthrough]]; case 1: [[fallthrough]]; case 2: [[fallthrough]]; case 3: moves[index] = move; break; default: moves[0] = moves[1]; moves[1] = moves[2]; moves[2] = moves[3]; moves[3] = move; break; } }