Implements Pokemon stat calculation.
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2020-01-05 15:18:30 +01:00
parent 02ab4b3272
commit 191b128125
12 changed files with 323 additions and 31 deletions

View File

@@ -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,

View 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);
}

View 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