diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java index 189fe6fa5..16268c47d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java @@ -50,22 +50,25 @@ public class DisintegrationTrap extends Trap { @Override public void activate() { Char target = Actor.findChar(pos); - + //find the closest char that can be aimed at + //can't target beyond view distance, with a min of 6 (torch range) + int range = Math.max(6, Dungeon.level.viewDistance); if (target == null){ float closestDist = Float.MAX_VALUE; for (Char ch : Actor.chars()){ if (!ch.isAlive()) continue; float curDist = Dungeon.level.trueDistance(pos, ch.pos); - if (ch.invisible > 0) curDist += 1000; + //invis targets are considered to be at max range + if (ch.invisible > 0) curDist = Math.max(curDist, range); Ballistica bolt = new Ballistica(pos, ch.pos, Ballistica.PROJECTILE); - if (bolt.collisionPos == ch.pos && curDist < closestDist){ + if (bolt.collisionPos == ch.pos + && ( curDist < closestDist || (curDist == closestDist && target instanceof Hero))){ target = ch; closestDist = curDist; } } - //can't target beyond view distance, with a min of 6 (torch range) - if (closestDist > Math.max(6, Dungeon.level.viewDistance)){ + if (closestDist > range){ target = null; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java index e19afdb57..593f3e18f 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java @@ -26,6 +26,7 @@ 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.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; @@ -62,20 +63,23 @@ public class GrimTrap extends Trap { Char target = Actor.findChar(pos); //find the closest char that can be aimed at + //can't target beyond view distance, with a min of 6 (torch range) + int range = Math.max(6, Dungeon.level.viewDistance); if (target == null){ float closestDist = Float.MAX_VALUE; for (Char ch : Actor.chars()){ if (!ch.isAlive()) continue; float curDist = Dungeon.level.trueDistance(pos, ch.pos); - if (ch.invisible > 0) curDist += 1000; + //invis targets are considered to be at max range + if (ch.invisible > 0) curDist = Math.max(curDist, range); Ballistica bolt = new Ballistica(pos, ch.pos, Ballistica.PROJECTILE); - if (bolt.collisionPos == ch.pos && curDist < closestDist){ + if (bolt.collisionPos == ch.pos + && ( curDist < closestDist || (curDist == closestDist && target instanceof Hero))){ target = ch; closestDist = curDist; } } - //can't target beyond view distance, with a min of 6 (torch range) - if (closestDist > Math.max(6, Dungeon.level.viewDistance)){ + if (closestDist > range){ target = null; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java index 2668c79fa..0df15a629 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java @@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Poison; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.PoisonDart; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -76,20 +77,23 @@ public class PoisonDartTrap extends Trap { } //find the closest char that can be aimed at + //can't target beyond view distance, with a min of 6 (torch range) + int range = Math.max(6, Dungeon.level.viewDistance); if (target == null){ float closestDist = Float.MAX_VALUE; for (Char ch : Actor.chars()){ if (!ch.isAlive()) continue; float curDist = Dungeon.level.trueDistance(pos, ch.pos); - if (ch.invisible > 0) curDist += 1000; + //invis targets are considered to be at max range + if (ch.invisible > 0) curDist = Math.max(curDist, range); Ballistica bolt = new Ballistica(pos, ch.pos, Ballistica.PROJECTILE); - if (canTarget(ch) && bolt.collisionPos == ch.pos && curDist < closestDist){ + if (canTarget(ch) && bolt.collisionPos == ch.pos + && ( curDist < closestDist || (curDist == closestDist && target instanceof Hero))){ target = ch; closestDist = curDist; } } - //can't target beyond view distance, with a min of 6 (torch range) - if (closestDist > Math.max(6, Dungeon.level.viewDistance)){ + if (closestDist > range){ target = null; } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java index fee132c85..5d7e5d5d0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java @@ -26,6 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; +import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; @@ -61,20 +62,23 @@ public class WornDartTrap extends Trap { Char target = Actor.findChar(pos); //find the closest char that can be aimed at + //can't target beyond view distance, with a min of 6 (torch range) + int range = Math.max(6, Dungeon.level.viewDistance); if (target == null){ float closestDist = Float.MAX_VALUE; for (Char ch : Actor.chars()){ if (!ch.isAlive()) continue; float curDist = Dungeon.level.trueDistance(pos, ch.pos); - if (ch.invisible > 0) curDist += 1000; + //invis targets are considered to be at max range + if (ch.invisible > 0) curDist = Math.max(curDist, range); Ballistica bolt = new Ballistica(pos, ch.pos, Ballistica.PROJECTILE); - if (bolt.collisionPos == ch.pos && curDist < closestDist){ + if (bolt.collisionPos == ch.pos + && ( curDist < closestDist || (curDist == closestDist && target instanceof Hero))){ target = ch; closestDist = curDist; } } - //can't target beyond view distance, with a min of 6 (torch range) - if (closestDist > Math.max(6, Dungeon.level.viewDistance)){ + if (closestDist > range){ target = null; } }