From 025ba0e12d7272ae978df997153afb956c009859 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 2 Jan 2024 20:31:47 -0500 Subject: [PATCH] v2.3.0: retrib and psi blast now compute targets first before damaging --- .../items/scrolls/ScrollOfRetribution.java | 21 +++++++++++----- .../scrolls/exotic/ScrollOfPsionicBlast.java | 25 +++++++++++++------ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRetribution.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRetribution.java index 4293c1018..9ef0539e1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRetribution.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfRetribution.java @@ -33,6 +33,8 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; +import java.util.ArrayList; + public class ScrollOfRetribution extends Scroll { { @@ -51,14 +53,21 @@ public class ScrollOfRetribution extends Scroll { Sample.INSTANCE.play( Assets.Sounds.BLAST ); GLog.i(Messages.get(this, "blast")); - + + ArrayList targets = new ArrayList<>(); + + //calculate targets first, in case damaging/blinding a target affects hero vision for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { if (Dungeon.level.heroFOV[mob.pos]) { - //deals 10%HT, plus 0-90%HP based on scaling - mob.damage(Math.round(mob.HT/10f + (mob.HP * power * 0.225f)), this); - if (mob.isAlive()) { - Buff.prolong(mob, Blindness.class, Blindness.DURATION); - } + targets.add(mob); + } + } + + for (Mob mob : targets){ + //deals 10%HT, plus 0-90%HP based on scaling + mob.damage(Math.round(mob.HT/10f + (mob.HP * power * 0.225f)), this); + if (mob.isAlive()) { + Buff.prolong(mob, Blindness.class, Blindness.DURATION); } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPsionicBlast.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPsionicBlast.java index 63b67393b..7eefe887a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPsionicBlast.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/exotic/ScrollOfPsionicBlast.java @@ -35,6 +35,8 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.watabou.noosa.audio.Sample; +import java.util.ArrayList; + public class ScrollOfPsionicBlast extends ExoticScroll { { @@ -49,19 +51,26 @@ public class ScrollOfPsionicBlast extends ExoticScroll { Sample.INSTANCE.play( Assets.Sounds.BLAST ); GLog.i(Messages.get(ScrollOfRetribution.class, "blast")); - - int targets = 0; + + ArrayList targets = new ArrayList<>(); + + //calculate targets first, in case damaging/blinding a target affects hero vision for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { if (Dungeon.level.heroFOV[mob.pos]) { - targets ++; - mob.damage(Math.round(mob.HT/2f + mob.HP/2f), this); - if (mob.isAlive()) { - Buff.prolong(mob, Blindness.class, Blindness.DURATION); - } + targets.add(mob); + } + } + + for (Mob mob : targets){ + //always kills non-resistant enemies + //resistant enemies take 50% current HP at full health, scaling to 75% at 1/2 HP, and 100% at 1/3 hp + mob.damage(Math.round(mob.HT/2f + mob.HP/2f), this); + if (mob.isAlive()) { + Buff.prolong(mob, Blindness.class, Blindness.DURATION); } } - curUser.damage(Math.max(0, Math.round(curUser.HT*(0.5f * (float)Math.pow(0.9, targets)))), this); + curUser.damage(Math.max(0, Math.round(curUser.HT*(0.5f * (float)Math.pow(0.9, targets.size())))), this); if (curUser.isAlive()) { Buff.prolong(curUser, Blindness.class, Blindness.DURATION); Buff.prolong(curUser, Weakness.class, Weakness.DURATION*5f);