#include "DamageLibrary.hpp" #include "../Pokemon/Pokemon.hpp" using HitData = const CreatureLib::Battling::ExecutingAttack::HitData; uint32_t PkmnLib::Battling::DamageLibrary::GetDamage(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, const HitData& hitData) const { auto levelMod = static_cast(2 * attack->GetUser()->GetLevel()); auto bp = hitData.GetBasePower(); auto statMod = GetStatModifier(attack, target, hitIndex, hitData); // HOOK: Modify stat modifier int damage = static_cast((((levelMod * static_cast(bp) * statMod) / 50) + 2) * GetDamageModifier(attack, target, hitIndex, hitData)); // HOOK: Override damage return damage; } uint8_t PkmnLib::Battling::DamageLibrary::GetBasePower(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, const HitData& hitData) const { auto bp = attack->GetAttack()->GetAttack()->GetBasePower(); // HOOK: modify base power. return bp; } float PkmnLib::Battling::DamageLibrary::GetStatModifier(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, const HitData& hitData) const { auto user = attack->GetUser(); // HOOK: allow overriding for which users stat we use. CreatureLib::Library::Statistic offensiveStat; CreatureLib::Library::Statistic defensiveStat; auto learnedMove = static_cast(attack->GetAttack()); auto moveData = learnedMove->GetMoveData(); if (moveData->GetCategory() == Library::MoveCategory::Physical) { offensiveStat = Library::Statistic::PhysicalAttack; defensiveStat = Library::Statistic::PhysicalDefense; } else { offensiveStat = Library::Statistic::SpecialAttack; defensiveStat = Library::Statistic::SpecialDefense; } auto bypassDefensive = hitData.IsCritical() && target->GetStatBoost(defensiveStat) > 0; // HOOK: allow bypassing defensive stat modifiers. auto bypassOffensive = hitData.IsCritical() && user->GetStatBoost(offensiveStat) < 0; // HOOK: Allow bypassing offensive stat modifiers. float offensiveValue; float defensiveValue; if (bypassOffensive) { offensiveValue = user->GetFlatStat(offensiveStat); } else { offensiveValue = user->GetBoostedStat(offensiveStat); } if (bypassDefensive) { defensiveValue = target->GetFlatStat(defensiveStat); } else { defensiveValue = target->GetBoostedStat(defensiveStat); } return offensiveValue / defensiveValue; } float PkmnLib::Battling::DamageLibrary::GetDamageModifier(CreatureLib::Battling::ExecutingAttack* attack, CreatureLib::Battling::Creature* target, uint8_t hitIndex, const HitData& hitData) const { float mod = 1; mod *= hitData.GetEffectiveness(); // HOOK: Modify damage modifier. return mod; }