Files
pokemon-battle-engine/include/core/pokemon.h
cdemeyer-teachx 58e3c1c734 prompt description
2025-08-20 15:54:17 +09:00

115 lines
4.0 KiB
C++

#ifndef POKEMON_H
#define POKEMON_H
#include "config.h"
#include "stats.h"
#include "types.h"
#include <string>
namespace PokEng {
// Pokemon species data structure
struct PokemonSpecies {
PokemonSpecies() = default;
std::string name;
uint16_t id;
BaseStats base_stats;
PokemonTypes types;
};
// Pokemon Archetype - contains information on how a pokemon will be instantiated
class PokemonArchetype {
public:
PokemonArchetype() = default;
PokemonArchetype(uint16_t species_id, uint8_t level = 50,
Nature nature = Nature::HARDY(),
const IndividualValues& ivs = IndividualValues(),
const EffortValues& evs = EffortValues(),
uint32_t exp = 0)
: m_species_id(species_id), m_level(level), m_nature(nature),
m_ivs(ivs), m_evs(evs), m_exp(exp) {}
// Getters
uint16_t getSpeciesId() const { return m_species_id; }
uint8_t getLevel() const { return m_level; }
Nature getNature() const { return m_nature; }
const IndividualValues& getIVs() const { return m_ivs; }
const EffortValues& getEVs() const { return m_evs; }
uint32_t getExp() const { return m_exp; }
// Setters
void setSpeciesId(uint16_t species_id) { m_species_id = species_id; }
void setLevel(uint8_t level) { m_level = (level > 100) ? 100 : level; }
void setNature(Nature nature) { m_nature = nature; }
void setIVs(const IndividualValues& ivs) { m_ivs = ivs; }
void setEVs(const EffortValues& evs) { if (evs.isValid()) m_evs = evs; }
void setExp(uint32_t exp) { m_exp = exp; }
// Calculate battle stats for different generations
template<Generation Gen>
BattleStats calculateBattleStats() const;
private:
uint16_t m_species_id = 0;
uint8_t m_level = 50;
Nature m_nature = Nature::HARDY();
IndividualValues m_ivs;
EffortValues m_evs;
uint32_t m_exp = 0; // For Gen I & II stat calculations
};
// Pokemon Instance - only contains data needed for battle
class PokemonInstance {
public:
PokemonInstance() = default;
PokemonInstance(uint16_t species_id, const BattleStats& stats,
const PokemonTypes& types, uint8_t friendship = 0)
: m_species_id(species_id), m_battle_stats(stats), m_types(types),
m_current_hp(stats.hp), m_friendship(friendship) {}
// Create from archetype
template<Generation Gen>
static PokemonInstance fromArchetype(const PokemonArchetype& archetype, uint8_t friendship = 0);
// Getters
uint16_t getSpeciesId() const { return m_species_id; }
uint16_t getCurrentHP() const { return m_current_hp; }
uint16_t getMaxHP() const { return m_battle_stats.hp; }
const BattleStats& getBattleStats() const { return m_battle_stats; }
const PokemonTypes& getTypes() const { return m_types; }
Type getPrimaryType() const { return m_types.getPrimary(); }
Type getSecondaryType() const { return m_types.getSecondary(); }
uint8_t getFriendship() const { return m_friendship; }
// Battle stat getters
uint16_t getAttack() const { return m_battle_stats.attack; }
uint16_t getDefense() const { return m_battle_stats.defense; }
uint16_t getSpAttack() const { return m_battle_stats.sp_attack; }
uint16_t getSpDefense() const { return m_battle_stats.sp_defense; }
uint16_t getSpeed() const { return m_battle_stats.speed; }
// Setters
void setCurrentHP(uint16_t hp) {
m_current_hp = (hp > m_battle_stats.hp) ? m_battle_stats.hp : hp;
}
void setFriendship(uint8_t friendship) { m_friendship = friendship; }
// Type-based operations
template <Generation Gen = Generation::I>
uint32_t calculateDamageTaken(uint32_t baseDamage, Type attackType) const {
return calculateDamage<Gen>(baseDamage, attackType, m_types);
}
private:
uint16_t m_species_id = 0;
BattleStats m_battle_stats;
PokemonTypes m_types;
uint16_t m_current_hp = 0;
uint8_t m_friendship = 0;
};
} // namespace PokEng
#endif // POKEMON_H