From 47ce50e26708be40577cf3d43a1156e988d7d6cc Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 2 Nov 2022 17:05:32 -0400 Subject: [PATCH] v2.0.0: significant improved code for spinner web shooting --- .../actors/mobs/Spinner.java | 83 +++++++++++++------ 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java index 0c1b1e343..ca7ebc174 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Spinner.java @@ -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) {