#include "DamageLibrary.hpp" #include "../ScriptHandling/ScriptMacros.cpp" 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(ModifyStatModifier, attack, attack, target, hitIndex, &statMod); int32_t damage = static_cast((((levelMod * static_cast(bp) * statMod) / 50) + 2) * GetDamageModifier(attack, target, hitIndex)); HOOK(OverrideDamage, attack, attack, target, hitIndex, &damage); return damage; } int DamageLibrary::GetBasePower(ExecutingAttack* attack, Creature* target, uint8_t hitIndex) const { auto bp = attack->GetAttack()->GetAttack()->GetBasePower(); HOOK(OverrideBasePower, attack, attack, target, hitIndex, &bp); return bp; } float DamageLibrary::GetStatModifier(ExecutingAttack* attack, Creature* target, uint8_t hitIndex) const { auto user = attack->GetUser(); HOOK(ChangeDamageStatsUser, attack, attack, target, hitIndex, &user); 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(BypassDefensiveStat, attack, attack, target, hitIndex, &bypassDefensive); auto bypassOffensive = hit->IsCritical() && user->GetStatBoost(offensiveStat) < 0; HOOK(BypassOffensiveStat, attack, attack, target, hitIndex, &bypassOffensive); 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(ModifyDamageModifier, attack, attack, target, hitIndex, &mod); return mod; }