v2.5.0: various enemy AI behaviour tweaks:
- reduced enemy willingness to be 'guided' by hero's path at a distance - fixed sleeping chars not being alerted by close enemies if they focused a far enemy - fixed enemies not properly prioritizing targets based on distance - fixed characters being stuck fleeing from allies
This commit is contained in:
@@ -293,6 +293,9 @@ public abstract class Mob extends Char {
|
|||||||
//We are charmed and current enemy is what charmed us
|
//We are charmed and current enemy is what charmed us
|
||||||
} else if (buff(Charm.class) != null && buff(Charm.class).object == enemy.id()) {
|
} else if (buff(Charm.class) != null && buff(Charm.class).object == enemy.id()) {
|
||||||
newEnemy = true;
|
newEnemy = true;
|
||||||
|
//We are sleeping (rather than preferring existing target, we want to see if anything is closer
|
||||||
|
} else if (state == SLEEPING){
|
||||||
|
newEnemy = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//additionally, if we are an ally, find a new enemy if...
|
//additionally, if we are an ally, find a new enemy if...
|
||||||
@@ -378,17 +381,26 @@ public abstract class Mob extends Char {
|
|||||||
//go after the closest potential enemy, preferring enemies that can be reached/attacked, and the hero if two are equidistant
|
//go after the closest potential enemy, preferring enemies that can be reached/attacked, and the hero if two are equidistant
|
||||||
PathFinder.buildDistanceMap(pos, Dungeon.findPassable(this, Dungeon.level.passable, fieldOfView, true));
|
PathFinder.buildDistanceMap(pos, Dungeon.findPassable(this, Dungeon.level.passable, fieldOfView, true));
|
||||||
Char closest = null;
|
Char closest = null;
|
||||||
|
int closestDist = Integer.MAX_VALUE;
|
||||||
|
|
||||||
for (Char curr : enemies){
|
for (Char curr : enemies){
|
||||||
|
int currDist = Integer.MAX_VALUE;
|
||||||
|
//we aren't trying to move into the target, just toward them
|
||||||
|
for (int i : PathFinder.NEIGHBOURS8){
|
||||||
|
if (PathFinder.distance[curr.pos+i] < currDist){
|
||||||
|
currDist = PathFinder.distance[curr.pos+i];
|
||||||
|
}
|
||||||
|
}
|
||||||
if (closest == null){
|
if (closest == null){
|
||||||
closest = curr;
|
closest = curr;
|
||||||
|
closestDist = currDist;
|
||||||
} else if (canAttack(closest) && !canAttack(curr)){
|
} else if (canAttack(closest) && !canAttack(curr)){
|
||||||
continue;
|
continue;
|
||||||
} else if ((canAttack(curr) && !canAttack(closest))
|
} else if ((canAttack(curr) && !canAttack(closest))
|
||||||
|| (PathFinder.distance[curr.pos] < PathFinder.distance[closest.pos])){
|
|| (currDist < closestDist)){
|
||||||
closest = curr;
|
closest = curr;
|
||||||
} else if ( curr == Dungeon.hero &&
|
} else if ( curr == Dungeon.hero &&
|
||||||
(PathFinder.distance[curr.pos] == PathFinder.distance[closest.pos]) || (canAttack(curr) && canAttack(closest))){
|
(currDist == closestDist) || (canAttack(curr) && canAttack(closest))){
|
||||||
closest = curr;
|
closest = curr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -494,10 +506,10 @@ public abstract class Mob extends Char {
|
|||||||
|
|
||||||
boolean newPath = false;
|
boolean newPath = false;
|
||||||
//scrap the current path if it's empty, no longer connects to the current location
|
//scrap the current path if it's empty, no longer connects to the current location
|
||||||
//or if it's extremely inefficient and checking again may result in a much better path
|
//or if it's quite inefficient and checking again may result in a much better path
|
||||||
if (path == null || path.isEmpty()
|
if (path == null || path.isEmpty()
|
||||||
|| !Dungeon.level.adjacent(pos, path.getFirst())
|
|| !Dungeon.level.adjacent(pos, path.getFirst())
|
||||||
|| path.size() > 2*Dungeon.level.distance(pos, target))
|
|| path.size() > 1.33f*Dungeon.level.distance(pos, target))
|
||||||
newPath = true;
|
newPath = true;
|
||||||
else if (path.getLast() != target) {
|
else if (path.getLast() != target) {
|
||||||
//if the new target is adjacent to the end of the path, adjust for that
|
//if the new target is adjacent to the end of the path, adjust for that
|
||||||
@@ -1231,9 +1243,7 @@ public abstract class Mob extends Char {
|
|||||||
|
|
||||||
//enemies will turn and fight if they have nowhere to run and aren't affect by terror
|
//enemies will turn and fight if they have nowhere to run and aren't affect by terror
|
||||||
protected void nowhereToRun() {
|
protected void nowhereToRun() {
|
||||||
if (buff( Terror.class ) == null
|
if (buff( Terror.class ) == null && buff( Dread.class ) == null) {
|
||||||
&& buffs( AllyBuff.class ).isEmpty()
|
|
||||||
&& buff( Dread.class ) == null) {
|
|
||||||
if (enemySeen) {
|
if (enemySeen) {
|
||||||
sprite.showStatus(CharSprite.WARNING, Messages.get(Mob.class, "rage"));
|
sprite.showStatus(CharSprite.WARNING, Messages.get(Mob.class, "rage"));
|
||||||
state = HUNTING;
|
state = HUNTING;
|
||||||
|
|||||||
Reference in New Issue
Block a user