#ifndef CREATURELIB_BATTLECREATURE_HPP #define CREATURELIB_BATTLECREATURE_HPP #include "../../GenericTemplates.cpp" #include "../../Library/CreatureData/CreatureSpecies.hpp" #include "../../Library/Items/Item.hpp" #include "LearnedAttack.hpp" #include "DamageSource.hpp" #include "../ScriptHandling/ScriptSet.hpp" #include "../ScriptHandling/ScriptAggregator.hpp" #include "../ScriptHandling/ScriptSource.hpp" namespace CreatureLib::Battling{ // Forward declare battle class class Battle; class BattleSide; class BattleLibrary; class Creature : public ScriptSource{ GetProperty(const Library::CreatureSpecies*, Species); GetProperty(const Library::SpeciesVariant*, Variant); GetProperty(uint8_t, Level); GetProperty(uint32_t, Experience); GetProperty(Core::StatisticSet, StatExperience); GetProperty(Core::StatisticSet, StatPotential); GetProperty(uint32_t, UniqueIdentifier); GetProperty(Library::Gender, Gender); GetProperty(uint8_t, Coloring); GetProperty(const Library::Item*, HeldItem); GetProperty(uint32_t, CurrentHealth); private: Core::StatisticSet _statBoost; Core::StatisticSet _flatStats; Core::StatisticSet _boostedStats; Battle* _battle; BattleSide* _side; BattleLibrary* _library; std::string _nickname = ""; int8_t _talentIndex; std::vector _attacks; Script* _status = nullptr; ScriptSet _volatile = {}; public: Creature(const Library::CreatureSpecies* species, const Library::SpeciesVariant* variant, uint8_t level, uint32_t experience, Core::StatisticSet statExp, Core::StatisticSet statPotential, uint32_t uid, Library::Gender gender, uint8_t coloring, const Library::Item* heldItem, std::string nickname, int8_t talent, std::vector attacks); virtual ~Creature() = default; const std::string& GetNickname() const; const std::string& GetTalent() const; void ChangeLevel(int8_t amount); void Damage(uint32_t damage, DamageSource source); void SetBattleData(Battle* battle, BattleSide* side); Battle* GetBattle() const; BattleSide* GetBattleSide() const; [[nodiscard]] bool IsFainted() const; [[nodiscard]] const std::vector& GetTypes() const; [[nodiscard]] bool HasType(uint8_t type) const; void GetActiveScripts(ScriptAggregator& aggr) const override; //region Stat APIs void SetBattle(Battle* battle); void SetBattleLibrary(BattleLibrary* library); void ChangeStatBoost(Core::Statistic stat, int8_t diffAmount); [[nodiscard]] uint32_t GetFlatStat(Core::Statistic stat) const; [[nodiscard]] uint32_t GetBoostedStat(Core::Statistic stat) const; [[nodiscard]] uint32_t GetBaseStat(Core::Statistic stat) const; [[nodiscard]] uint32_t GetStatPotential(Core::Statistic stat) const; [[nodiscard]] uint32_t GetStatExperience(Core::Statistic stat) const; [[nodiscard]] int8_t GetStatBoost(Core::Statistic stat) const; void RecalculateFlatStats(); void RecalculateBoostedStats(); void RecalculateFlatStat(Core::Statistic); void RecalculateBoostedStat(Core::Statistic); //endregion }; } #endif //CREATURELIB_CREATURE_HPP