85 lines
3.3 KiB
C++
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 |