diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM200.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM200.java index 45aa30249..843a363bc 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM200.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/DM200.java @@ -28,9 +28,12 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas; import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; +import com.shatteredpixel.shatteredpixeldungeon.mechanics.ConeAOE; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.DM200Sprite; +import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.watabou.utils.Bundle; +import com.watabou.utils.PathFinder; import com.watabou.utils.Random; public class DM200 extends Mob { @@ -125,6 +128,16 @@ public class DM200 extends Mob { } + private boolean canVent(int target){ + if (ventCooldown > 0) return false; + PathFinder.buildDistanceMap(target, BArray.not(Dungeon.level.solid, null), Dungeon.level.distance(pos, target)+1); + //vent can go around blocking terrain, but not through it + if (PathFinder.distance[pos] == Integer.MAX_VALUE){ + return false; + } + return true; + } + private class Hunting extends Mob.Hunting{ @Override @@ -137,7 +150,7 @@ public class DM200 extends Mob { int oldPos = pos; - if (ventCooldown <= 0 && distance(enemy) >= 1 && Random.Int(100/distance(enemy)) == 0){ + if (distance(enemy) >= 1 && Random.Int(100/distance(enemy)) == 0 && canVent(target)){ if (sprite != null && (sprite.visible || enemy.sprite.visible)) { sprite.zap( enemy.pos ); return false; @@ -150,7 +163,7 @@ public class DM200 extends Mob { spend( 1 / speed() ); return moveSprite( oldPos, pos ); - } else if (ventCooldown <= 0) { + } else if (canVent(target)) { if (sprite != null && (sprite.visible || enemy.sprite.visible)) { sprite.zap( enemy.pos ); return false; diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Golem.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Golem.java index 2ace142d3..3c3ff1f8c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Golem.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/Golem.java @@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; import com.shatteredpixel.shatteredpixeldungeon.sprites.GolemSprite; +import com.shatteredpixel.shatteredpixeldungeon.utils.BArray; import com.watabou.utils.Bundle; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; @@ -169,6 +170,16 @@ public class Golem extends Mob { enemyTeleCooldown = 20; } + private boolean canTele(int target){ + if (enemyTeleCooldown > 0) return false; + PathFinder.buildDistanceMap(target, BArray.not(Dungeon.level.solid, null), Dungeon.level.distance(pos, target)+1); + //zaps can go around blocking terrain, but not through it + if (PathFinder.distance[pos] == Integer.MAX_VALUE){ + return false; + } + return true; + } + private class Wandering extends Mob.Wandering{ @Override @@ -204,8 +215,8 @@ public class Golem extends Mob { int oldPos = pos; - if (enemyTeleCooldown <= 0 && distance(enemy) >= 1 && Random.Int(100/distance(enemy)) == 0 - && !Char.hasProp(enemy, Property.IMMOVABLE)){ + if (distance(enemy) >= 1 && Random.Int(100/distance(enemy)) == 0 + && !Char.hasProp(enemy, Property.IMMOVABLE) && canTele(target)){ if (sprite != null && (sprite.visible || enemy.sprite.visible)) { sprite.zap( enemy.pos ); return false; @@ -218,7 +229,7 @@ public class Golem extends Mob { spend( 1 / speed() ); return moveSprite( oldPos, pos ); - } else if (enemyTeleCooldown <= 0 && !Char.hasProp(enemy, Property.IMMOVABLE)) { + } else if (!Char.hasProp(enemy, Property.IMMOVABLE) && canTele(target)) { if (sprite != null && (sprite.visible || enemy.sprite.visible)) { sprite.zap( enemy.pos ); return false;