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() {
|
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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -55,6 +55,7 @@ public class EtherealChains extends Artifact {
|
||||||
charge = 5;
|
charge = 5;
|
||||||
|
|
||||||
defaultAction = AC_CAST;
|
defaultAction = AC_CAST;
|
||||||
|
usesTargeting = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -78,6 +78,7 @@ public abstract class Wand extends Item {
|
||||||
|
|
||||||
{
|
{
|
||||||
defaultAction = AC_ZAP;
|
defaultAction = AC_ZAP;
|
||||||
|
usesTargeting = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//couldn't find anything, just have it directly target
|
|
||||||
GameScene.handleCell( lastTarget.pos );
|
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 );
|
||||||
}
|
}
|
||||||
|
@ -195,6 +186,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++) {
|
||||||
if (instance[i] != null) {
|
if (instance[i] != null) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user