v0.3.1a: cleaned up quickslot autotargeting:

- quickslots will now only autotarget enemies they can actually auto-aim for.
- cleaned up code for determining which items should use targeting
This commit is contained in:
Evan Debenham 2015-08-20 10:55:07 -04:00
parent b2494fe76e
commit 0416e7f167
10 changed files with 48 additions and 25 deletions

View File

@ -936,30 +936,32 @@ public class Hero extends Char {
} }
private void checkVisibleMobs() { private void checkVisibleMobs() {
ArrayList<Mob> visible = new ArrayList<Mob>(); ArrayList<Mob> visible = new ArrayList<>();
boolean newMob = false; boolean newMob = false;
Mob closest = null; Mob target = null;
for (Mob m : Dungeon.level.mobs) { for (Mob m : Dungeon.level.mobs) {
if (Level.fieldOfView[ m.pos ] && m.hostile) { if (Level.fieldOfView[ m.pos ] && m.hostile) {
visible.add( m ); visible.add(m);
if (!visibleEnemies.contains( m )) { if (!visibleEnemies.contains( m )) {
newMob = true; newMob = true;
} }
if (closest == null){ if (QuickSlotButton.autoAim(m) != -1){
closest = m; if (target == null){
} else if (distance(closest) > distance(m)) { target = m;
closest = m; } else if (distance(target) > distance(m)) {
target = m;
}
} }
} }
} }
if (closest != null && (QuickSlotButton.lastTarget == null || if (target != null && (QuickSlotButton.lastTarget == null ||
!QuickSlotButton.lastTarget.isAlive() || !QuickSlotButton.lastTarget.isAlive() ||
!Dungeon.visible[QuickSlotButton.lastTarget.pos])){ !Dungeon.visible[QuickSlotButton.lastTarget.pos])){
QuickSlotButton.target(closest); QuickSlotButton.target(target);
} }
if (newMob) { if (newMob) {

View File

@ -50,7 +50,10 @@ public class Bomb extends Item {
{ {
name = "bomb"; name = "bomb";
image = ItemSpriteSheet.BOMB; image = ItemSpriteSheet.BOMB;
defaultAction = AC_LIGHTTHROW; defaultAction = AC_LIGHTTHROW;
usesTargeting = true;
stackable = true; stackable = true;
} }

View File

@ -45,7 +45,10 @@ public class Honeypot extends Item {
{ {
name = "honeypot"; name = "honeypot";
image = ItemSpriteSheet.HONEYPOT; image = ItemSpriteSheet.HONEYPOT;
defaultAction = AC_THROW; defaultAction = AC_THROW;
usesTargeting = true;
stackable = true; stackable = true;
} }

View File

@ -66,6 +66,7 @@ public class Item implements Bundlable {
public static final String AC_THROW = "THROW"; public static final String AC_THROW = "THROW";
public String defaultAction; public String defaultAction;
public boolean usesTargeting;
protected String name = "smth"; protected String name = "smth";
public int image = 0; public int image = 0;

View File

@ -55,6 +55,7 @@ public class EtherealChains extends Artifact {
charge = 5; charge = 5;
defaultAction = AC_CAST; defaultAction = AC_CAST;
usesTargeting = true;
} }
@Override @Override

View File

@ -88,6 +88,7 @@ public class LloydsBeacon extends Artifact {
chargeCap = 3+level; chargeCap = 3+level;
defaultAction = AC_ZAP; defaultAction = AC_ZAP;
usesTargeting = true;
} }
private static final String DEPTH = "depth"; private static final String DEPTH = "depth";

View File

@ -78,6 +78,7 @@ public abstract class Wand extends Item {
{ {
defaultAction = AC_ZAP; defaultAction = AC_ZAP;
usesTargeting = true;
} }
@Override @Override

View File

@ -61,6 +61,7 @@ public class MagesStaff extends MeleeWeapon {
image = ItemSpriteSheet.MAGES_STAFF; image = ItemSpriteSheet.MAGES_STAFF;
defaultAction = AC_ZAP; defaultAction = AC_ZAP;
usesTargeting = true;
unique = true; unique = true;
bones = false; bones = false;

View File

@ -47,7 +47,9 @@ public class MissileWeapon extends Weapon {
{ {
stackable = true; stackable = true;
levelKnown = true; levelKnown = true;
defaultAction = AC_THROW; defaultAction = AC_THROW;
usesTargeting = true;
} }
@Override @Override

View File

@ -79,26 +79,17 @@ public class QuickSlotButton extends Button implements WndBag.Listener {
@Override @Override
protected void onClick() { protected void onClick() {
if (targeting) { if (targeting) {
//first try to directly target int cell = autoAim(lastTarget);
if (new Ballistica(Dungeon.hero.pos, lastTarget.pos, Ballistica.PROJECTILE).collisionPos == lastTarget.pos) {
GameScene.handleCell(lastTarget.pos);
return;
}
//Otherwise pick nearby tiles to try and 'angle' the shot, auto-aim basically. if (cell != -1){
for (int i : Level.NEIGHBOURS9DIST2) { GameScene.handleCell(cell);
if (new Ballistica(Dungeon.hero.pos, lastTarget.pos+i, Ballistica.PROJECTILE).collisionPos == lastTarget.pos){ } else {
GameScene.handleCell( lastTarget.pos+i ); //couldn't auto-aim, just target the position and hope for the best.
return; GameScene.handleCell( lastTarget.pos );
}
} }
//couldn't find anything, just have it directly target
GameScene.handleCell( lastTarget.pos );
} else { } else {
Item item = select(slotNum); Item item = select(slotNum);
//FIXME: sloppy, should have a better way to decide if an item uses targeting. if (item.usesTargeting)
if (item instanceof EquipableItem || item instanceof Wand)
useTargeting(); useTargeting();
item.execute( Dungeon.hero ); 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() { public static void refresh() {
for (int i = 0; i < instance.length; i++) { for (int i = 0; i < instance.length; i++) {