Further fixes for rounding errors in damage calculations.
continuous-integration/drone/push Build is failing Details

This commit is contained in:
Deukhoofd 2021-08-28 12:16:01 +02:00
parent 037ff590f0
commit aee0f04d9c
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
2 changed files with 31 additions and 22 deletions

View File

@ -21,6 +21,30 @@ uint32_t PkmnLib::Battling::DamageLibrary::GetDamage(CreatureLib::Battling::Exec
floatDamage = fl(floatDamage * statMod); floatDamage = fl(floatDamage * statMod);
floatDamage = fl(floatDamage / 50) + 2; floatDamage = fl(floatDamage / 50) + 2;
floatDamage = fl(floatDamage * damageMod); floatDamage = fl(floatDamage * damageMod);
if (attack->GetTargetCount() > 1) {
floatDamage = fl(floatDamage * 0.75f);
}
if (hitData.IsCritical()) {
float critModifier = 1.5;
PKMN_HOOK(OverrideCriticalModifier, attack, attack, target, hitIndex, &critModifier);
floatDamage = fl(floatDamage * critModifier);
}
if (_hasRandomness) {
Ensure(attack->GetUser()->GetBattle().GetValue());
float randPercentage = 85 + attack->GetUser()->GetBattle().GetValue()->GetRandom()->Get(0, 16);
floatDamage = fl(floatDamage * (randPercentage / 100.0));
}
if (attack->GetUser()->HasType(hitData.GetType())) {
float stabModifier = 1.5;
PKMN_HOOK(OverrideSTABModifier, attack, attack, target, hitIndex, &stabModifier);
floatDamage = fl(floatDamage * stabModifier);
}
floatDamage = fl(floatDamage * hitData.GetEffectiveness());
uint32_t damage = 0; uint32_t damage = 0;
if (floatDamage < 0) { if (floatDamage < 0) {
damage = 0; damage = 0;
@ -77,29 +101,10 @@ float PkmnLib::Battling::DamageLibrary::GetStatModifier(CreatureLib::Battling::E
return offensiveValue / defensiveValue; return offensiveValue / defensiveValue;
} }
float PkmnLib::Battling::DamageLibrary::GetDamageModifier(CreatureLib::Battling::ExecutingAttack* attack, float PkmnLib::Battling::DamageLibrary::GetDamageModifier(CreatureLib::Battling::ExecutingAttack*,
CreatureLib::Battling::Creature* target, uint8_t hitIndex, CreatureLib::Battling::Creature*, uint8_t,
const HitData& hitData) const { const HitData&) const {
float mod = 1; float mod = 1;
if (attack->GetTargetCount() > 1)
mod *= 0.75;
if (hitData.IsCritical()) {
float critModifier = 1.5;
PKMN_HOOK(OverrideCriticalModifier, attack, attack, target, hitIndex, &critModifier);
mod *= critModifier;
}
if (_hasRandomness) {
Ensure(attack->GetUser()->GetBattle().GetValue());
float randPercentage = 85 + attack->GetUser()->GetBattle().GetValue()->GetRandom()->Get(0, 16);
mod *= randPercentage / 100.0;
}
if (attack->GetUser()->HasType(hitData.GetType())) {
float stabModifier = 1.5;
PKMN_HOOK(OverrideSTABModifier, attack, attack, target, hitIndex, &stabModifier);
mod *= stabModifier;
}
mod *= hitData.GetEffectiveness();
// HOOK: Modify damage modifier. // HOOK: Modify damage modifier.
return mod; return mod;
} }

View File

@ -37,6 +37,10 @@ TEST_CASE("Correct rounding for damage.") {
auto damage = lib->GetDamageLibrary()->GetDamage(&executingAttack, mon2, 0, hit); auto damage = lib->GetDamageLibrary()->GetDamage(&executingAttack, mon2, 0, hit);
REQUIRE_EQ(144, damage); REQUIRE_EQ(144, damage);
hit.SetBasePower(110);
damage = lib->GetDamageLibrary()->GetDamage(&executingAttack, mon2, 0, hit);
REQUIRE_EQ(284, damage);
} }
#endif #endif