pokemon/pokemon_instance.cpp
Zack Buhman 853457a79d generate: add pokemon
This also includes a handful of functions for creating instances of a
pokemon species, though certainly not complete.
2023-08-02 23:49:42 +00:00

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;
}
}