This also includes a handful of functions for creating instances of a pokemon species, though certainly not complete.
76 lines
2.1 KiB
C++
76 lines
2.1 KiB
C++
#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<uint16_t>(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;
|
|
}
|
|
}
|