v3.3.0: moved handing unreachable target in hunting to its own method
This commit is contained in:
@@ -178,19 +178,7 @@ public class DM200 extends Mob {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
//attempt to swap targets if the current one can't be reached or vented at
|
//attempt to swap targets if the current one can't be reached or vented at
|
||||||
if (!recursing) {
|
return handleUnreachableTarget(enemyInFOV, justAlerted);
|
||||||
Char oldEnemy = enemy;
|
|
||||||
enemy = null;
|
|
||||||
enemy = chooseEnemy();
|
|
||||||
if (enemy != null && enemy != oldEnemy) {
|
|
||||||
recursing = true;
|
|
||||||
boolean result = act(enemyInFOV, justAlerted);
|
|
||||||
recursing = false;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spend( TICK );
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -247,19 +247,7 @@ public class Golem extends Mob {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
//attempt to swap targets if the current one can't be reached or teleported
|
//attempt to swap targets if the current one can't be reached or teleported
|
||||||
if (!recursing) {
|
return handleUnreachableTarget(enemyInFOV, justAlerted);
|
||||||
Char oldEnemy = enemy;
|
|
||||||
enemy = null;
|
|
||||||
enemy = chooseEnemy();
|
|
||||||
if (enemy != null && enemy != oldEnemy) {
|
|
||||||
recursing = true;
|
|
||||||
boolean result = act(enemyInFOV, justAlerted);
|
|
||||||
recursing = false;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spend( TICK );
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,8 +181,6 @@ public class Guard extends Mob {
|
|||||||
&& !isCharmedBy( enemy )
|
&& !isCharmedBy( enemy )
|
||||||
&& !canAttack( enemy )
|
&& !canAttack( enemy )
|
||||||
&& Dungeon.level.distance( pos, enemy.pos ) < 5
|
&& Dungeon.level.distance( pos, enemy.pos ) < 5
|
||||||
|
|
||||||
|
|
||||||
&& chain(enemy.pos)){
|
&& chain(enemy.pos)){
|
||||||
return !(sprite.visible || enemy.sprite.visible);
|
return !(sprite.visible || enemy.sprite.visible);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1214,9 +1214,6 @@ public abstract class Mob extends Char {
|
|||||||
|
|
||||||
public static final String TAG = "HUNTING";
|
public static final String TAG = "HUNTING";
|
||||||
|
|
||||||
//prevents rare infinite loop cases
|
|
||||||
protected boolean recursing = false;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
|
public boolean act( boolean enemyInFOV, boolean justAlerted ) {
|
||||||
enemySeen = enemyInFOV;
|
enemySeen = enemyInFOV;
|
||||||
@@ -1252,27 +1249,7 @@ public abstract class Mob extends Char {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
//if moving towards an enemy isn't possible, try to switch targets to another enemy that is closer
|
return handleUnreachableTarget(enemyInFOV, justAlerted);
|
||||||
//unless we have already done that and still can't move toward them, then move on.
|
|
||||||
if (!recursing) {
|
|
||||||
Char oldEnemy = enemy;
|
|
||||||
enemy = null;
|
|
||||||
enemy = chooseEnemy();
|
|
||||||
if (enemy != null && enemy != oldEnemy) {
|
|
||||||
recursing = true;
|
|
||||||
boolean result = act(enemyInFOV, justAlerted);
|
|
||||||
recursing = false;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spend( TICK );
|
|
||||||
if (!enemyInFOV) {
|
|
||||||
sprite.showLost();
|
|
||||||
state = WANDERING;
|
|
||||||
target = ((Mob.Wandering)WANDERING).randomDestination();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1293,6 +1270,33 @@ public abstract class Mob extends Char {
|
|||||||
}
|
}
|
||||||
return swapped;
|
return swapped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//prevents rare infinite loop cases
|
||||||
|
protected boolean recursing = false;
|
||||||
|
|
||||||
|
//Try to switch targets to another enemy that is closer or reachable
|
||||||
|
//unless we have already done that and still can't move toward them, then move on.
|
||||||
|
protected boolean handleUnreachableTarget(boolean enemyInFOV, boolean justAlerted){
|
||||||
|
if (!recursing) {
|
||||||
|
Char oldEnemy = enemy;
|
||||||
|
enemy = null;
|
||||||
|
enemy = chooseEnemy();
|
||||||
|
if (enemy != null && enemy != oldEnemy) {
|
||||||
|
recursing = true;
|
||||||
|
boolean result = act(enemyInFOV, justAlerted);
|
||||||
|
recursing = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spend( TICK );
|
||||||
|
if (!enemyInFOV) {
|
||||||
|
sprite.showLost();
|
||||||
|
state = WANDERING;
|
||||||
|
target = ((Mob.Wandering)WANDERING).randomDestination();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class Fleeing implements AiState {
|
protected class Fleeing implements AiState {
|
||||||
|
|||||||
@@ -400,30 +400,32 @@ public class Tengu extends Mob {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
//Try to switch targets to another enemy that is closer
|
return handleUnreachableTarget(enemyInFOV, justAlerted);
|
||||||
//unless we have already done that and still can't attack them, then move on.
|
|
||||||
if (!recursing) {
|
|
||||||
Char oldEnemy = enemy;
|
|
||||||
enemy = null;
|
|
||||||
enemy = chooseEnemy();
|
|
||||||
if (enemy != null && enemy != oldEnemy) {
|
|
||||||
recursing = true;
|
|
||||||
boolean result = act(enemyInFOV, justAlerted);
|
|
||||||
recursing = false;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//attempt to use an ability, even if enemy can't be decided
|
|
||||||
if (canUseAbility()){
|
|
||||||
return useAbility();
|
|
||||||
}
|
|
||||||
|
|
||||||
spend( TICK );
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean handleUnreachableTarget(boolean enemyInFOV, boolean justAlerted) {
|
||||||
|
Char oldEnemy = enemy;
|
||||||
|
enemy = null;
|
||||||
|
enemy = chooseEnemy();
|
||||||
|
if (enemy != null && enemy != oldEnemy) {
|
||||||
|
recursing = true;
|
||||||
|
boolean result = act(enemyInFOV, justAlerted);
|
||||||
|
recursing = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//attempt to use an ability, even if enemy can't be decided
|
||||||
|
//Tengu is always hunting, so we don't lose enemy in this case
|
||||||
|
if (canUseAbility()){
|
||||||
|
return useAbility();
|
||||||
|
}
|
||||||
|
|
||||||
|
spend( TICK );
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//*****************************************************************************************
|
//*****************************************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user