From 921a2d3b8f44c9129f87081b4230e8ee7a51f53a Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 13 Jun 2022 12:08:30 -0400 Subject: [PATCH] v1.3.0: fixed various bugs with damage boosting effects --- .../shatteredpixeldungeon/actors/Char.java | 27 ++++++++++++------- .../actors/buffs/AscensionChallenge.java | 6 ++--- .../actors/buffs/Berserk.java | 7 +++-- .../actors/hero/Hero.java | 2 +- .../actors/hero/abilities/warrior/Endure.java | 6 ++--- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java index 11b321533..0508d0f73 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -315,7 +315,7 @@ public abstract class Char extends Actor { } else if (hit( this, enemy, accMulti )) { - int dr = Math.round(enemy.drRoll() * AscensionChallenge.statModifier(this)); + int dr = Math.round(enemy.drRoll() * AscensionChallenge.statModifier(enemy)); Barkskin bark = enemy.buff(Barkskin.class); if (bark != null) dr += Random.NormalIntRange( 0 , bark.level() ); @@ -332,7 +332,9 @@ public abstract class Char extends Actor { } } - int dmg; + //we use a float here briefly so that we don't have to constantly round while + // potentially applying various multiplier effects + float dmg; Preparation prep = buff(Preparation.class); if (prep != null){ dmg = prep.damageRoll(this); @@ -352,6 +354,13 @@ public abstract class Char extends Actor { dmg *= 1.5f; } + for (ChampionEnemy buff : buffs(ChampionEnemy.class)){ + dmg *= buff.meleeDamageFactor(); + } + + dmg *= AscensionChallenge.statModifier(this); + + //flat damage bonus is applied after positive multipliers, but before negative ones dmg += dmgBonus; //friendly endure @@ -367,10 +376,15 @@ public abstract class Char extends Actor { if (enemy.buff(ScrollOfChallenge.ChallengeArena.class) != null){ dmg *= 0.67f; } + + if ( buff(Weakness.class) != null ){ + dmg *= 0.67f; + } - int effectiveDamage = enemy.defenseProc( this, dmg ); + int effectiveDamage = enemy.defenseProc( this, Math.round(dmg) ); effectiveDamage = Math.max( effectiveDamage - dr, 0 ); - + + //vulnerable specifically applies after armor reductions if ( enemy.buff( Vulnerable.class ) != null){ effectiveDamage *= 1.33f; } @@ -505,14 +519,9 @@ public abstract class Char extends Actor { // atm attack is always post-armor and defence is already pre-armor public int attackProc( Char enemy, int damage ) { - if ( buff(Weakness.class) != null ){ - damage *= 0.67f; - } for (ChampionEnemy buff : buffs(ChampionEnemy.class)){ - damage *= buff.meleeDamageFactor(); buff.onAttackProc( enemy ); } - damage = Math.round( damage * AscensionChallenge.statModifier(this)); return damage; } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AscensionChallenge.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AscensionChallenge.java index 920ac4083..48de2ca07 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AscensionChallenge.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/AscensionChallenge.java @@ -81,7 +81,7 @@ public class AscensionChallenge extends Buff { } for (Class cls : modifiers.keySet()){ - if (ch.getClass().isAssignableFrom(cls)){ + if (cls.isAssignableFrom(ch.getClass())){ return modifiers.get(cls); } } @@ -132,7 +132,7 @@ public class AscensionChallenge extends Buff { //only enemies that are boosted count boolean found = false; for (Class cls : modifiers.keySet()){ - if (enemy.getClass().isAssignableFrom(cls)){ + if (cls.isAssignableFrom(enemy.getClass())){ found = true; break; } @@ -168,7 +168,7 @@ public class AscensionChallenge extends Buff { return 7; //half of 13, rounded up } else { for (Class cls : modifiers.keySet()){ - if (m.getClass().isAssignableFrom(cls)){ + if (cls.isAssignableFrom(m.getClass())){ return Math.max(13, m.EXP); //same exp as an eye } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java index f9ca1cc7f..240da8d97 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/buffs/Berserk.java @@ -122,9 +122,8 @@ public class Berserk extends Buff { return Math.min(1f, power); } - public int damageFactor(int dmg){ - float bonus = Math.min(1.5f, 1f + (power / 2f)); - return Math.round(dmg * bonus); + public float damageFactor(float dmg){ + return dmg * Math.min(1.5f, 1f + (power / 2f)); } public boolean berserking(){ @@ -221,7 +220,7 @@ public class Berserk extends Buff { @Override public String desc() { - float dispDamage = (damageFactor(10000) / 100f) - 100f; + float dispDamage = ((int)damageFactor(10000) / 100f) - 100f; switch (state){ case NORMAL: default: return Messages.get(this, "angered_desc", Math.floor(power * 100f), dispDamage); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index bb945951c..8ea0bd948 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -1223,7 +1223,7 @@ public class Hero extends Char { if (!(src instanceof Char)){ //reduce damage here if it isn't coming from a character (if it is we already reduced it) if (endure != null){ - dmg = endure.adjustDamageTaken(dmg); + dmg = Math.round(endure.adjustDamageTaken(dmg)); } //the same also applies to challenge scroll damage reduction if (buff(ScrollOfChallenge.ChallengeArena.class) != null){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/warrior/Endure.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/warrior/Endure.java index 917cda97e..428be1dee 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/warrior/Endure.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/hero/abilities/warrior/Endure.java @@ -109,10 +109,10 @@ public class Endure extends ArmorAbility { hitsLeft = 0; } - public int adjustDamageTaken(int damage){ + public float adjustDamageTaken(float damage){ if (enduring) { damageBonus += damage/2; - return damage/2; + return damage/2f; } return damage; } @@ -155,7 +155,7 @@ public class Endure extends ArmorAbility { } } - public int damageFactor(int damage){ + public float damageFactor(float damage){ if (enduring){ return damage; } else {