#include "DamageLibrary.hpp" using namespace CreatureLib::Battling; int DamageLibrary::GetDamage(ExecutingAttack* attack, Creature* target, uint8_t hitIndex) const { auto levelMod = static_cast(2 * attack->GetUser()->GetLevel()); auto hit = attack->GetAttackDataForTarget(target).GetHit(hitIndex); auto bp = hit->GetBasePower(); auto statMod = GetStatModifier(attack, target, hitIndex); // HOOK: Modify stat modifier int damage = static_cast((((levelMod * static_cast(bp) * statMod) / 50) + 2) * GetDamageModifier(attack, target, hitIndex)); // HOOK: Override damage return damage; } int DamageLibrary::GetBasePower(ExecutingAttack* attack, Creature* target, uint8_t hitIndex) const { auto bp = attack->GetAttack()->GetAttack()->GetBasePower(); // HOOK: modify base power. return bp; } float DamageLibrary::GetStatModifier(ExecutingAttack* attack, Creature* target, uint8_t hitIndex) const { auto user = attack->GetUser(); // HOOK: allow overriding for which users stat we use. auto hit = attack->GetAttackDataForTarget(target).GetHit(hitIndex); Core::Statistic offensiveStat; Core::Statistic defensiveStat; if (attack->GetAttack()->GetAttack()->GetCategory() == Library::AttackCategory::Physical) { offensiveStat = Core::Statistic::PhysicalAttack; defensiveStat = Core::Statistic::PhysicalDefense; } else { offensiveStat = Core::Statistic::MagicalAttack; defensiveStat = Core::Statistic::MagicalDefense; } auto bypassDefensive = hit->IsCritical() && target->GetStatBoost(defensiveStat) > 0; // HOOK: allow bypassing defensive stat modifiers. auto bypassOffensive = hit->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 DamageLibrary::GetDamageModifier(ExecutingAttack* attack, Creature* target, uint8_t hitIndex) const { float mod = 1; auto hit = attack->GetAttackDataForTarget(target).GetHit(hitIndex); mod *= hit->GetEffectiveness(); // HOOK: Modify damage modifier. return mod; }