From f200a89f2d6635439faac83d3c312d4447efebde Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 5 Aug 2022 13:17:23 -0400 Subject: [PATCH] v1.4.0: fixed effect order errors with kinetic and viscosity --- .../shatteredpixeldungeon/actors/Char.java | 14 ++++ .../items/armor/glyphs/Viscosity.java | 71 +++++++++++-------- .../items/weapon/enchantments/Kinetic.java | 21 ++++-- 3 files changed, 70 insertions(+), 36 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 5ec516e87..c32b4fd28 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/Char.java @@ -79,6 +79,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.PrismaticImage; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.AntiMagic; import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Potential; +import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Viscosity; import com.shatteredpixel.shatteredpixeldungeon.items.potions.exotic.PotionOfCleansing; import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfElements; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetribution; @@ -93,6 +94,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLivingEarth; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blazing; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Blocking; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Kinetic; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Shocking; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.ShockingDart; @@ -385,6 +387,11 @@ public abstract class Char extends Actor { int effectiveDamage = enemy.defenseProc( this, Math.round(dmg) ); effectiveDamage = Math.max( effectiveDamage - dr, 0 ); + if (enemy.buff(Viscosity.ViscosityTracker.class) != null){ + effectiveDamage = enemy.buff(Viscosity.ViscosityTracker.class).deferDamage(effectiveDamage); + enemy.buff(Viscosity.ViscosityTracker.class).detach(); + } + //vulnerable specifically applies after armor reductions if ( enemy.buff( Vulnerable.class ) != null){ effectiveDamage *= 1.33f; @@ -658,6 +665,13 @@ public abstract class Char extends Actor { } shielded -= dmg; HP -= dmg; + + if (HP < 0 && src instanceof Char){ + if (((Char) src).buff(Kinetic.KineticTracker.class) != null){ + Buff.affect((Char) src, Kinetic.ConservedDamage.class).setBonus(-HP); + ((Char) src).buff(Kinetic.KineticTracker.class).detach(); + } + } if (sprite != null) { sprite.showStatus(HP > HT / 2 ? diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java index 1efab6f44..12aa90fe3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/armor/glyphs/Viscosity.java @@ -23,6 +23,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs; import com.shatteredpixel.shatteredpixeldungeon.Badges; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; @@ -46,38 +47,10 @@ public class Viscosity extends Glyph { @Override public int proc( Armor armor, Char attacker, Char defender, int damage ) { - //FIXME this glyph should really just proc after DR is accounted for. - //should build in functionality for that, but this works for now - int realDamage = damage - defender.drRoll(); + //we use a tracker so that this glyph can apply after armor + Buff.affect(defender, ViscosityTracker.class).level = armor.buffedLvl(); - //account for icon stomach (just skip the glyph) - if (defender.buff(Talent.WarriorFoodImmunity.class) != null){ - return damage; - } - - //account for huntress armor piercing - if (attacker instanceof Hero - && ((Hero) attacker).belongings.weapon() instanceof MissileWeapon - && ((Hero) attacker).subClass == HeroSubClass.SNIPER - && !Dungeon.level.adjacent(attacker.pos, defender.pos)){ - realDamage = damage; - } - - if (realDamage <= 0) { - return 0; - } - - int level = Math.max( 0, armor.buffedLvl() ); - - float percent = (level+1)/(float)(level+6); - int amount = (int)Math.ceil(realDamage * percent); - - DeferedDamage deferred = Buff.affect( defender, DeferedDamage.class ); - deferred.prolong( amount ); - - defender.sprite.showStatus( CharSprite.WARNING, Messages.get(this, "deferred", amount) ); - - return damage - amount; + return damage; } @@ -85,6 +58,42 @@ public class Viscosity extends Glyph { public Glowing glowing() { return PURPLE; } + + public static class ViscosityTracker extends Buff { + + { + actPriority = Actor.VFX_PRIO; + } + + private int level = 0; + + public int deferDamage(int dmg){ + //account for icon stomach (just skip the glyph) + if (target.buff(Talent.WarriorFoodImmunity.class) != null){ + return dmg; + } + + int level = Math.max( 0, this.level ); + + float percent = (level+1)/(float)(level+6); + int amount = (int)Math.ceil(dmg * percent); + + if (amount > 0){ + DeferedDamage deferred = Buff.affect( target, DeferedDamage.class ); + deferred.prolong( amount ); + + target.sprite.showStatus( CharSprite.WARNING, Messages.get(Viscosity.class, "deferred", amount) ); + } + + return dmg - amount; + } + + @Override + public boolean act() { + detach(); + return true; + } + }; public static class DeferedDamage extends Buff { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java index a9e79502a..b84e53c4d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/weapon/enchantments/Kinetic.java @@ -21,6 +21,7 @@ package com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments; +import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon; @@ -42,12 +43,9 @@ public class Kinetic extends Weapon.Enchantment { conservedDamage = attacker.buff(ConservedDamage.class).damageBonus(); attacker.buff(ConservedDamage.class).detach(); } - - if (damage > (defender.HP + defender.shielding())){ - int extraDamage = damage - (defender.HP + defender.shielding()); - Buff.affect(attacker, ConservedDamage.class).setBonus(extraDamage); - } + //use a tracker so that we can know the true final damage + Buff.affect(attacker, KineticTracker.class); return damage + conservedDamage; } @@ -56,6 +54,19 @@ public class Kinetic extends Weapon.Enchantment { public ItemSprite.Glowing glowing() { return YELLOW; } + + public static class KineticTracker extends Buff { + + { + actPriority = Actor.VFX_PRIO; + } + + @Override + public boolean act() { + detach(); + return true; + } + }; public static class ConservedDamage extends Buff {