#ifndef CONFIG_H #define CONFIG_H #include namespace PokEng { // Generation support enum class Generation : uint8_t { I = 1, II = 2, III = 3, IV = 4, V = 5, VI = 6, VII = 7, VIII = 8, IX = 9 }; // Stat indices for nature calculations enum class StatIndex : uint8_t { HP = 0, ATTACK = 1, DEFENSE = 2, SP_ATTACK = 3, SP_DEFENSE = 4, SPEED = 5 }; // Pokemon Nature - encoded as 8 bits: upper 4 bits = positive stat, lower 4 bits = negative stat // Stat encoding: 0=HP/None, 1=Attack, 2=Defense, 3=SpAttack, 4=SpDefense, 5=Speed struct Nature { private: uint8_t m_encoded; // Upper 4 bits: positive stat, Lower 4 bits: negative stat public: // Constructor from encoded value constexpr explicit Nature(uint8_t encoded = 0) : m_encoded(encoded) {} // Constructor from positive and negative stats constexpr Nature(StatIndex positive, StatIndex negative) : m_encoded((static_cast(positive) << 4) | static_cast(negative)) {} // Get the stat that is increased by this nature constexpr StatIndex getPositiveStat() const { return static_cast((m_encoded >> 4) & 0xF); } // Get the stat that is decreased by this nature constexpr StatIndex getNegativeStat() const { return static_cast(m_encoded & 0xF); } // Check if nature is neutral (same positive and negative stat) constexpr bool isNeutral() const { return getPositiveStat() == getNegativeStat(); } constexpr uint8_t getMultiplier10(StatIndex stat) const { return static_cast(10u + (getPositiveStat() == stat) - (getNegativeStat() == stat)); } // Get encoded value constexpr uint8_t getEncoded() const { return m_encoded; } // Comparison operators constexpr bool operator==(const Nature& other) const { return m_encoded == other.m_encoded; } constexpr bool operator!=(const Nature& other) const { return m_encoded != other.m_encoded; } // Predefined nature constants static constexpr Nature HARDY() { return Nature(StatIndex::ATTACK, StatIndex::ATTACK); } static constexpr Nature DOCILE() { return Nature(StatIndex::DEFENSE, StatIndex::DEFENSE); } static constexpr Nature BASHFUL() { return Nature(StatIndex::SP_ATTACK, StatIndex::SP_ATTACK); } static constexpr Nature QUIRKY() { return Nature(StatIndex::SP_DEFENSE, StatIndex::SP_DEFENSE); } static constexpr Nature SERIOUS() { return Nature(StatIndex::SPEED, StatIndex::SPEED); } static constexpr Nature LONELY() { return Nature(StatIndex::ATTACK, StatIndex::DEFENSE); } static constexpr Nature ADAMANT() { return Nature(StatIndex::ATTACK, StatIndex::SP_ATTACK); } static constexpr Nature NAUGHTY() { return Nature(StatIndex::ATTACK, StatIndex::SP_DEFENSE); } static constexpr Nature BRAVE() { return Nature(StatIndex::ATTACK, StatIndex::SPEED); } static constexpr Nature BOLD() { return Nature(StatIndex::DEFENSE, StatIndex::ATTACK); } static constexpr Nature IMPISH() { return Nature(StatIndex::DEFENSE, StatIndex::SP_ATTACK); } static constexpr Nature LAX() { return Nature(StatIndex::DEFENSE, StatIndex::SP_DEFENSE); } static constexpr Nature RELAXED() { return Nature(StatIndex::DEFENSE, StatIndex::SPEED); } static constexpr Nature MODEST() { return Nature(StatIndex::SP_ATTACK, StatIndex::ATTACK); } static constexpr Nature MILD() { return Nature(StatIndex::SP_ATTACK, StatIndex::DEFENSE); } static constexpr Nature RASH() { return Nature(StatIndex::SP_ATTACK, StatIndex::SP_DEFENSE); } static constexpr Nature QUIET() { return Nature(StatIndex::SP_ATTACK, StatIndex::SPEED); } static constexpr Nature CALM() { return Nature(StatIndex::SP_DEFENSE, StatIndex::ATTACK); } static constexpr Nature GENTLE() { return Nature(StatIndex::SP_DEFENSE, StatIndex::DEFENSE); } static constexpr Nature CAREFUL() { return Nature(StatIndex::SP_DEFENSE, StatIndex::SP_ATTACK); } static constexpr Nature SASSY() { return Nature(StatIndex::SP_DEFENSE, StatIndex::SPEED); } static constexpr Nature TIMID() { return Nature(StatIndex::SPEED, StatIndex::ATTACK); } static constexpr Nature HASTY() { return Nature(StatIndex::SPEED, StatIndex::DEFENSE); } static constexpr Nature JOLLY() { return Nature(StatIndex::SPEED, StatIndex::SP_ATTACK); } static constexpr Nature NAIVE() { return Nature(StatIndex::SPEED, StatIndex::SP_DEFENSE); } }; } // namespace PokEng #endif