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:
parent
b2494fe76e
commit
0416e7f167
|
@ -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) {
|
||||
|
|
|
@ -50,7 +50,10 @@ public class Bomb extends Item {
|
|||
{
|
||||
name = "bomb";
|
||||
image = ItemSpriteSheet.BOMB;
|
||||
|
||||
defaultAction = AC_LIGHTTHROW;
|
||||
usesTargeting = true;
|
||||
|
||||
stackable = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,10 @@ public class Honeypot extends Item {
|
|||
{
|
||||
name = "honeypot";
|
||||
image = ItemSpriteSheet.HONEYPOT;
|
||||
|
||||
defaultAction = AC_THROW;
|
||||
usesTargeting = true;
|
||||
|
||||
stackable = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -55,6 +55,7 @@ public class EtherealChains extends Artifact {
|
|||
charge = 5;
|
||||
|
||||
defaultAction = AC_CAST;
|
||||
usesTargeting = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -88,6 +88,7 @@ public class LloydsBeacon extends Artifact {
|
|||
chargeCap = 3+level;
|
||||
|
||||
defaultAction = AC_ZAP;
|
||||
usesTargeting = true;
|
||||
}
|
||||
|
||||
private static final String DEPTH = "depth";
|
||||
|
|
|
@ -78,6 +78,7 @@ public abstract class Wand extends Item {
|
|||
|
||||
{
|
||||
defaultAction = AC_ZAP;
|
||||
usesTargeting = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -61,6 +61,7 @@ public class MagesStaff extends MeleeWeapon {
|
|||
image = ItemSpriteSheet.MAGES_STAFF;
|
||||
|
||||
defaultAction = AC_ZAP;
|
||||
usesTargeting = true;
|
||||
|
||||
unique = true;
|
||||
bones = false;
|
||||
|
|
|
@ -47,7 +47,9 @@ public class MissileWeapon extends Weapon {
|
|||
{
|
||||
stackable = true;
|
||||
levelKnown = true;
|
||||
|
||||
defaultAction = AC_THROW;
|
||||
usesTargeting = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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++) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user