v1.2.0: fixed DM-200s and golems attacking through crystal doors
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user