v2.0.0: significant improved code for spinner web shooting

This commit is contained in:
Evan Debenham
2022-11-02 17:05:32 -04:00
parent a96d62f6bf
commit 47ce50e267

View File

@@ -52,6 +52,7 @@ public class Spinner extends Mob {
loot = new MysteryMeat();
lootChance = 0.125f;
HUNTING = new Hunting();
FLEEING = new Fleeing();
}
@@ -92,27 +93,26 @@ public class Spinner extends Mob {
@Override
protected boolean act() {
if (state == HUNTING || state == FLEEING){
webCoolDown--;
}
AiState lastState = state;
boolean result = super.act();
//if state changed from wandering to hunting, we haven't acted yet, don't update.
//We only want to update target position once per turn, so if switched from wandering, wait for a moment
//Also want to avoid updating when we visually shot a web this turn (don't want to change the position)
if (!(lastState == WANDERING && state == HUNTING)) {
webCoolDown--;
if (shotWebVisually){
result = shotWebVisually = false;
} else {
if (!shotWebVisually){
if (enemy != null && enemySeen) {
lastEnemyPos = enemy.pos;
} else {
lastEnemyPos = Dungeon.hero.pos;
}
}
shotWebVisually = false;
}
if (state == FLEEING && buff( Terror.class ) == null && buff( Dread.class ) == null &&
enemy != null && enemySeen && enemy.buff( Poison.class ) == null) {
state = HUNTING;
}
return result;
}
@@ -133,25 +133,15 @@ public class Spinner extends Mob {
private boolean shotWebVisually = false;
@Override
public void move(int step, boolean travelling) {
if (travelling && enemySeen && webCoolDown <= 0 && lastEnemyPos != -1){
if (webPos() != -1){
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
sprite.zap( webPos() );
shotWebVisually = true;
} else {
shootWeb();
}
}
}
super.move(step, travelling);
}
public int webPos(){
Char enemy = this.enemy;
if (enemy == null) return -1;
//don't web a non-moving enemy that we're going to attack
if (state != FLEEING && enemy.pos == lastEnemyPos && canAttack(enemy)){
return -1;
}
Ballistica b;
//aims web in direction enemy is moving, or between self and enemy if they aren't moving
@@ -230,7 +220,52 @@ public class Spinner extends Mob {
immunities.add(Web.class);
}
private class Hunting extends Mob.Hunting {
@Override
public boolean act(boolean enemyInFOV, boolean justAlerted) {
if (enemyInFOV && webCoolDown <= 0 && lastEnemyPos != -1){
if (webPos() != -1){
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
sprite.zap( webPos() );
shotWebVisually = true;
return false;
} else {
shootWeb();
return true;
}
}
}
return super.act(enemyInFOV, justAlerted);
}
}
private class Fleeing extends Mob.Fleeing {
@Override
public boolean act(boolean enemyInFOV, boolean justAlerted) {
if (buff( Terror.class ) == null && buff( Dread.class ) == null &&
enemyInFOV && enemy.buff( Poison.class ) == null){
state = HUNTING;
return true;
}
if (enemyInFOV && webCoolDown <= 0 && lastEnemyPos != -1){
if (webPos() != -1){
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
sprite.zap( webPos() );
shotWebVisually = true;
return false;
} else {
shootWeb();
return true;
}
}
}
return super.act(enemyInFOV, justAlerted);
}
@Override
protected void nowhereToRun() {
if (buff(Terror.class) == null && buff(Dread.class) == null) {