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() {
ArrayList<Mob> visible = new ArrayList<Mob>();
ArrayList<Mob> 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) {

View File

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

View File

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

View File

@ -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;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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++) {