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.Generator;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.mechanics.ConeAOE;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM200Sprite;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM200Sprite;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
||||||
import com.watabou.utils.Bundle;
|
import com.watabou.utils.Bundle;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
import com.watabou.utils.Random;
|
import com.watabou.utils.Random;
|
||||||
|
|
||||||
public class DM200 extends Mob {
|
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{
|
private class Hunting extends Mob.Hunting{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -137,7 +150,7 @@ public class DM200 extends Mob {
|
|||||||
|
|
||||||
int oldPos = pos;
|
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)) {
|
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
||||||
sprite.zap( enemy.pos );
|
sprite.zap( enemy.pos );
|
||||||
return false;
|
return false;
|
||||||
@@ -150,7 +163,7 @@ public class DM200 extends Mob {
|
|||||||
spend( 1 / speed() );
|
spend( 1 / speed() );
|
||||||
return moveSprite( oldPos, pos );
|
return moveSprite( oldPos, pos );
|
||||||
|
|
||||||
} else if (ventCooldown <= 0) {
|
} else if (canVent(target)) {
|
||||||
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
||||||
sprite.zap( enemy.pos );
|
sprite.zap( enemy.pos );
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
|
|||||||
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.GolemSprite;
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.GolemSprite;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.utils.BArray;
|
||||||
import com.watabou.utils.Bundle;
|
import com.watabou.utils.Bundle;
|
||||||
import com.watabou.utils.PathFinder;
|
import com.watabou.utils.PathFinder;
|
||||||
import com.watabou.utils.Random;
|
import com.watabou.utils.Random;
|
||||||
@@ -169,6 +170,16 @@ public class Golem extends Mob {
|
|||||||
enemyTeleCooldown = 20;
|
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{
|
private class Wandering extends Mob.Wandering{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -204,8 +215,8 @@ public class Golem extends Mob {
|
|||||||
|
|
||||||
int oldPos = pos;
|
int oldPos = pos;
|
||||||
|
|
||||||
if (enemyTeleCooldown <= 0 && distance(enemy) >= 1 && Random.Int(100/distance(enemy)) == 0
|
if (distance(enemy) >= 1 && Random.Int(100/distance(enemy)) == 0
|
||||||
&& !Char.hasProp(enemy, Property.IMMOVABLE)){
|
&& !Char.hasProp(enemy, Property.IMMOVABLE) && canTele(target)){
|
||||||
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
||||||
sprite.zap( enemy.pos );
|
sprite.zap( enemy.pos );
|
||||||
return false;
|
return false;
|
||||||
@@ -218,7 +229,7 @@ public class Golem extends Mob {
|
|||||||
spend( 1 / speed() );
|
spend( 1 / speed() );
|
||||||
return moveSprite( oldPos, pos );
|
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)) {
|
if (sprite != null && (sprite.visible || enemy.sprite.visible)) {
|
||||||
sprite.zap( enemy.pos );
|
sprite.zap( enemy.pos );
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user