Implements Pokemon stat calculation.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -3,11 +3,12 @@
|
||||
|
||||
#include <Battling/Library/BattleLibrary.hpp>
|
||||
#include "../../Library/PokemonLibrary.hpp"
|
||||
#include "StatCalculator.hpp"
|
||||
|
||||
namespace PkmnLib::Battling {
|
||||
class BattleLibrary : public CreatureLib::Battling::BattleLibrary {
|
||||
public:
|
||||
BattleLibrary(Library::PokemonLibrary* staticLib, CreatureLib::Battling::BattleStatCalculator* statCalculator,
|
||||
BattleLibrary(Library::PokemonLibrary* staticLib, StatCalculator* statCalculator,
|
||||
CreatureLib::Battling::DamageLibrary* damageLibrary,
|
||||
CreatureLib::Battling::ExperienceLibrary* experienceLibrary,
|
||||
CreatureLib::Battling::ScriptResolver* scriptResolver,
|
||||
|
||||
70
src/Battling/Library/StatCalculator.cpp
Normal file
70
src/Battling/Library/StatCalculator.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "StatCalculator.hpp"
|
||||
#include "../Pokemon/Pokemon.hpp"
|
||||
|
||||
uint32_t PkmnLib::Battling::StatCalculator::CalculateHealthStat(const Pokemon* pkmn) const {
|
||||
uint32_t base = pkmn->GetBaseStat(Library::Statistic::HealthPoints);
|
||||
uint32_t iv = pkmn->GetIndividualValue(Library::Statistic::HealthPoints);
|
||||
uint32_t ev = pkmn->GetEffortValue(Library::Statistic::HealthPoints);
|
||||
uint8_t level = pkmn->GetLevel();
|
||||
return static_cast<uint32_t>(((2 * base + iv + static_cast<uint32_t>(ev / 4)) * level) / 100) + level + 10;
|
||||
}
|
||||
uint32_t PkmnLib::Battling::StatCalculator::CalculateOtherStat(const Pokemon* pkmn,
|
||||
CreatureLib::Core::Statistic stat) const {
|
||||
uint32_t base = pkmn->GetBaseStat(stat);
|
||||
uint32_t iv = pkmn->GetIndividualValue(stat);
|
||||
uint32_t ev = pkmn->GetEffortValue(stat);
|
||||
uint8_t level = pkmn->GetLevel();
|
||||
uint32_t unmodified =
|
||||
static_cast<uint32_t>(((2 * base + iv + static_cast<uint32_t>(ev / 4)) * level) / 100) + 5;
|
||||
return static_cast<uint32_t>(unmodified * pkmn->GetNature().GetStatModifier(stat));
|
||||
}
|
||||
float PkmnLib::Battling::StatCalculator::GetStatBoostModifier(const CreatureLib::Battling::Creature* pkmn,
|
||||
CreatureLib::Core::Statistic stat) const {
|
||||
int8_t boost = pkmn->GetStatBoost(stat);
|
||||
switch (boost) {
|
||||
case -6: return 2.0 / 8;
|
||||
case -5: return 2.0 / 7;
|
||||
case -4: return 2.0 / 6;
|
||||
case -3: return 2.0 / 5;
|
||||
case -2: return 2.0 / 4;
|
||||
case -1: return 2.0 / 3;
|
||||
case 0: return 1;
|
||||
case 1: return 3.0 / 2;
|
||||
case 2: return 4.0 / 2;
|
||||
case 3: return 5.0 / 2;
|
||||
case 4: return 6.0 / 2;
|
||||
case 5: return 7.0 / 2;
|
||||
case 6: return 8.0 / 2;
|
||||
default: throw CreatureException("Stat boost was out of expected range of -6 till 6.");
|
||||
}
|
||||
}
|
||||
CreatureLib::Core::StatisticSet<uint32_t>
|
||||
PkmnLib::Battling::StatCalculator::CalculateFlatStats(CreatureLib::Battling::Creature* creature) const {
|
||||
auto pkmn = dynamic_cast<Pokemon*>(creature);
|
||||
return CreatureLib::Core::StatisticSet<uint32_t>(
|
||||
CalculateHealthStat(pkmn), CalculateOtherStat(pkmn, Library::Statistic::PhysicalAttack),
|
||||
CalculateOtherStat(pkmn, Library::Statistic::PhysicalDefense),
|
||||
CalculateOtherStat(pkmn, Library::Statistic::SpecialAttack),
|
||||
CalculateOtherStat(pkmn, Library::Statistic::SpecialDefense),
|
||||
CalculateOtherStat(pkmn, Library::Statistic::Speed));
|
||||
}
|
||||
CreatureLib::Core::StatisticSet<uint32_t>
|
||||
PkmnLib::Battling::StatCalculator::CalculateBoostedStats(CreatureLib::Battling::Creature* creature) const {
|
||||
return CreatureLib::Core::StatisticSet<uint32_t>(
|
||||
CalculateBoostedStat(creature, Library::Statistic::HealthPoints),
|
||||
CalculateBoostedStat(creature, Library::Statistic::PhysicalAttack),
|
||||
CalculateBoostedStat(creature, Library::Statistic::PhysicalDefense),
|
||||
CalculateBoostedStat(creature, Library::Statistic::SpecialAttack),
|
||||
CalculateBoostedStat(creature, Library::Statistic::SpecialDefense),
|
||||
CalculateBoostedStat(creature, Library::Statistic::Speed));
|
||||
}
|
||||
uint32_t PkmnLib::Battling::StatCalculator::CalculateFlatStat(CreatureLib::Battling::Creature* creature,
|
||||
CreatureLib::Core::Statistic stat) const {
|
||||
if (stat == Library::Statistic::HealthPoints)
|
||||
return CalculateHealthStat(dynamic_cast<Pokemon*>(creature));
|
||||
return CalculateOtherStat(dynamic_cast<Pokemon*>(creature), stat);
|
||||
}
|
||||
uint32_t PkmnLib::Battling::StatCalculator::CalculateBoostedStat(CreatureLib::Battling::Creature* creature,
|
||||
CreatureLib::Core::Statistic stat) const {
|
||||
return creature->GetFlatStat(stat) * GetStatBoostModifier(creature, stat);
|
||||
}
|
||||
33
src/Battling/Library/StatCalculator.hpp
Normal file
33
src/Battling/Library/StatCalculator.hpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef PKMNLIB_STATCALCULATOR_HPP
|
||||
#define PKMNLIB_STATCALCULATOR_HPP
|
||||
|
||||
#include <Battling/Library/BattleStatCalculator.hpp>
|
||||
#include "../../Library/Statistic.hpp"
|
||||
|
||||
namespace PkmnLib::Battling {
|
||||
class Pokemon;
|
||||
|
||||
class StatCalculator : public CreatureLib::Battling::BattleStatCalculator {
|
||||
protected:
|
||||
virtual uint32_t CalculateHealthStat(const Pokemon* pkmn) const;
|
||||
virtual uint32_t CalculateOtherStat(const Pokemon* pkmn, CreatureLib::Core::Statistic stat) const;
|
||||
virtual float GetStatBoostModifier(const CreatureLib::Battling::Creature* pkmn,
|
||||
CreatureLib::Core::Statistic stat) const;
|
||||
|
||||
public:
|
||||
~StatCalculator() override = default;
|
||||
CreatureLib::Core::StatisticSet<uint32_t>
|
||||
CalculateFlatStats(CreatureLib::Battling::Creature* creature) const override;
|
||||
|
||||
CreatureLib::Core::StatisticSet<uint32_t>
|
||||
CalculateBoostedStats(CreatureLib::Battling::Creature* creature) const override;
|
||||
|
||||
uint32_t CalculateFlatStat(CreatureLib::Battling::Creature* creature,
|
||||
CreatureLib::Core::Statistic stat) const override;
|
||||
|
||||
uint32_t CalculateBoostedStat(CreatureLib::Battling::Creature* creature,
|
||||
CreatureLib::Core::Statistic stat) const override;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // PKMNLIB_STATCALCULATOR_HPP
|
||||
Reference in New Issue
Block a user