diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java index 225ef8092..b204a59ba 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/actors/hero/Hero.java @@ -936,30 +936,32 @@ public class Hero extends Char { } private void checkVisibleMobs() { - ArrayList visible = new ArrayList(); + ArrayList visible = new ArrayList<>(); boolean newMob = false; - Mob closest = null; + Mob target = null; for (Mob m : Dungeon.level.mobs) { if (Level.fieldOfView[ m.pos ] && m.hostile) { - visible.add( m ); + visible.add(m); if (!visibleEnemies.contains( m )) { newMob = true; } - if (closest == null){ - closest = m; - } else if (distance(closest) > distance(m)) { - closest = m; + if (QuickSlotButton.autoAim(m) != -1){ + if (target == null){ + target = m; + } else if (distance(target) > distance(m)) { + target = m; + } } } } - if (closest != null && (QuickSlotButton.lastTarget == null || + if (target != null && (QuickSlotButton.lastTarget == null || !QuickSlotButton.lastTarget.isAlive() || !Dungeon.visible[QuickSlotButton.lastTarget.pos])){ - QuickSlotButton.target(closest); + QuickSlotButton.target(target); } if (newMob) { diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Bomb.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Bomb.java index 9f1ee4b01..b63535b54 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/Bomb.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Bomb.java @@ -50,7 +50,10 @@ public class Bomb extends Item { { name = "bomb"; image = ItemSpriteSheet.BOMB; + defaultAction = AC_LIGHTTHROW; + usesTargeting = true; + stackable = true; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java index a944bb695..2af3e07d4 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Honeypot.java @@ -45,7 +45,10 @@ public class Honeypot extends Item { { name = "honeypot"; image = ItemSpriteSheet.HONEYPOT; + defaultAction = AC_THROW; + usesTargeting = true; + stackable = true; } diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java index 2313a7ddf..ef064027b 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/Item.java @@ -66,6 +66,7 @@ public class Item implements Bundlable { public static final String AC_THROW = "THROW"; public String defaultAction; + public boolean usesTargeting; protected String name = "smth"; public int image = 0; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java index d492ea23c..75d283e43 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/EtherealChains.java @@ -55,6 +55,7 @@ public class EtherealChains extends Artifact { charge = 5; defaultAction = AC_CAST; + usesTargeting = true; } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java index ba0af62d1..e49cbbb05 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/artifacts/LloydsBeacon.java @@ -88,6 +88,7 @@ public class LloydsBeacon extends Artifact { chargeCap = 3+level; defaultAction = AC_ZAP; + usesTargeting = true; } private static final String DEPTH = "depth"; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java index 0122bf029..830b198b7 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/wands/Wand.java @@ -78,6 +78,7 @@ public abstract class Wand extends Item { { defaultAction = AC_ZAP; + usesTargeting = true; } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java index 2b99f8ad8..7a99204c9 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/melee/MagesStaff.java @@ -61,6 +61,7 @@ public class MagesStaff extends MeleeWeapon { image = ItemSpriteSheet.MAGES_STAFF; defaultAction = AC_ZAP; + usesTargeting = true; unique = true; bones = false; diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java index 9b424ff8f..78b9c587f 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/items/weapon/missiles/MissileWeapon.java @@ -47,7 +47,9 @@ public class MissileWeapon extends Weapon { { stackable = true; levelKnown = true; + defaultAction = AC_THROW; + usesTargeting = true; } @Override diff --git a/src/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java b/src/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java index b96fce51e..2713d44b4 100644 --- a/src/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java +++ b/src/com/shatteredpixel/shatteredpixeldungeon/ui/QuickSlotButton.java @@ -79,26 +79,17 @@ public class QuickSlotButton extends Button implements WndBag.Listener { @Override protected void onClick() { if (targeting) { - //first try to directly target - if (new Ballistica(Dungeon.hero.pos, lastTarget.pos, Ballistica.PROJECTILE).collisionPos == lastTarget.pos) { - GameScene.handleCell(lastTarget.pos); - return; - } + int cell = autoAim(lastTarget); - //Otherwise pick nearby tiles to try and 'angle' the shot, auto-aim basically. - for (int i : Level.NEIGHBOURS9DIST2) { - if (new Ballistica(Dungeon.hero.pos, lastTarget.pos+i, Ballistica.PROJECTILE).collisionPos == lastTarget.pos){ - GameScene.handleCell( lastTarget.pos+i ); - return; - } + if (cell != -1){ + GameScene.handleCell(cell); + } else { + //couldn't auto-aim, just target the position and hope for the best. + GameScene.handleCell( lastTarget.pos ); } - - //couldn't find anything, just have it directly target - GameScene.handleCell( lastTarget.pos ); } else { Item item = select(slotNum); - //FIXME: sloppy, should have a better way to decide if an item uses targeting. - if (item instanceof EquipableItem || item instanceof Wand) + if (item.usesTargeting) useTargeting(); item.execute( Dungeon.hero ); } @@ -194,6 +185,23 @@ public class QuickSlotButton extends Button implements WndBag.Listener { } } } + + public static int autoAim(Char target){ + //first try to directly target + if (new Ballistica(Dungeon.hero.pos, target.pos, Ballistica.PROJECTILE).collisionPos == lastTarget.pos) { + return target.pos; + } + + //Otherwise pick nearby tiles to try and 'angle' the shot, auto-aim basically. + for (int i : Level.NEIGHBOURS9DIST2) { + if (new Ballistica(Dungeon.hero.pos, lastTarget.pos+i, Ballistica.PROJECTILE).collisionPos == lastTarget.pos){ + return target.pos+i; + } + } + + //couldn't find a cell, give up. + return -1; + } public static void refresh() { for (int i = 0; i < instance.length; i++) {