Files
pokemon-battle-engine/include/core/pokemon.h
2025-08-15 14:30:00 +00:00

85 lines
3.3 KiB
C++

#ifndef POKEMON_H
#define POKEMON_H
#include "config.h"
#include "types.h"
#include "pokemon_stats.h"
#include <string>
namespace PokEng {
class Pokemon {
public:
Pokemon() = default;
~Pokemon() = default;
// Basic constructors
Pokemon(uint16_t id) : m_id(id) {}
Pokemon(uint16_t id, uint16_t currentHP) : m_id(id), m_currentHP(currentHP) {}
Pokemon(uint16_t id, uint16_t currentHP, Type primaryType) : m_id(id), m_currentHP(currentHP), m_types(primaryType) {}
Pokemon(uint16_t id, uint16_t currentHP, Type primaryType, Type secondaryType) : m_id(id), m_currentHP(currentHP), m_types(primaryType, secondaryType) {}
// Constructor that calculates stats from PokemonInfo
template<Generation Gen = Generation::III>
Pokemon(uint16_t id, const PokemonInfo& info, const PokemonTypes& types, uint8_t friendship = 0)
: m_id(id), m_types(types), m_friendship(friendship) {
m_battleStats = info.calculateBattleStats<Gen>();
m_currentHP = m_battleStats.hp; // Start at full health
}
// Constructor that takes pre-calculated battle stats
Pokemon(uint16_t id, const BattleStats& stats, const PokemonTypes& types, uint8_t friendship = 0)
: m_id(id), m_battleStats(stats), m_types(types), m_friendship(friendship) {
m_currentHP = m_battleStats.hp; // Start at full health
}
public:
// Basic getters
uint16_t getId() const { return m_id; }
uint16_t getCurrentHP() const { return m_currentHP; }
uint16_t getMaxHP() const { return m_battleStats.hp; }
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
const BattleStats& getBattleStats() const { return m_battleStats; }
uint16_t getAttack() const { return m_battleStats.attack; }
uint16_t getDefense() const { return m_battleStats.defense; }
uint16_t getSpAttack() const { return m_battleStats.sp_attack; }
uint16_t getSpDefense() const { return m_battleStats.sp_defense; }
uint16_t getSpeed() const { return m_battleStats.speed; }
// Basic setters
void setCurrentHP(uint16_t hp) { m_currentHP = (hp > m_battleStats.hp) ? m_battleStats.hp : hp; }
void setTypes(Type primary) { m_types.setPrimary(primary); m_types.setSecondary(Type::NONE); }
void setTypes(Type primary, Type secondary) { m_types.setPrimary(primary); m_types.setSecondary(secondary); }
void SetPokemonTypes(PokemonTypes types) { m_types = types; }
void setFriendship(uint8_t friendship) { m_friendship = friendship; }
// Battle stat setters (for direct stat assignment if needed)
void setBattleStats(const BattleStats& stats) {
m_battleStats = stats;
if (m_currentHP > m_battleStats.hp) m_currentHP = m_battleStats.hp;
}
public:
// 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_id = 0;
uint16_t m_currentHP = 0;
BattleStats m_battleStats;
PokemonTypes m_types;
uint8_t m_friendship = 0;
};
} // namespace PokEng
#endif