v0.6.2: added a safety check to tengu jumping logic

This commit is contained in:
Evan Debenham 2017-10-12 16:17:09 -04:00
parent 2c9156e591
commit a426fa8fb4

View File

@ -163,15 +163,18 @@ public class Tengu extends Mob {
} }
private void jump() { private void jump() {
Level level = Dungeon.level;
if (level == null) return;
for (int i=0; i < 4; i++) { for (int i=0; i < 4; i++) {
int trapPos; int trapPos;
do { do {
trapPos = Random.Int( Dungeon.level.length() ); trapPos = Random.Int( level.length() );
} while (!fieldOfView[trapPos] || Dungeon.level.solid[trapPos]); } while (!fieldOfView[trapPos] || level.solid[trapPos]);
if (Dungeon.level.map[trapPos] == Terrain.INACTIVE_TRAP) { if (level.map[trapPos] == Terrain.INACTIVE_TRAP) {
Dungeon.level.setTrap( new GrippingTrap().reveal(), trapPos ); level.setTrap( new GrippingTrap().reveal(), trapPos );
Level.set( trapPos, Terrain.TRAP ); Level.set( trapPos, Terrain.TRAP );
ScrollOfMagicMapping.discover( trapPos ); ScrollOfMagicMapping.discover( trapPos );
} }
@ -185,27 +188,26 @@ public class Tengu extends Mob {
int tries = 50; int tries = 50;
do { do {
newPos = Random.IntRange(3, 7) + 32*Random.IntRange(26, 30); newPos = Random.IntRange(3, 7) + 32*Random.IntRange(26, 30);
} while ( (Dungeon.level.adjacent(newPos, enemy.pos) || Actor.findChar(newPos) != null) } while ( (level.adjacent(newPos, enemy.pos) || Actor.findChar(newPos) != null)
&& --tries > 0); && --tries > 0);
if (tries <= 0) return; if (tries <= 0) return;
//otherwise go wherever, as long as it's a little bit away //otherwise go wherever, as long as it's a little bit away
} else { } else {
do { do {
newPos = Random.Int(Dungeon.level.length()); newPos = Random.Int(level.length());
} while ( } while (
Dungeon.level.solid[newPos] || level.solid[newPos] ||
Dungeon.level.distance(newPos, enemy.pos) < 8 || level.distance(newPos, enemy.pos) < 8 ||
Actor.findChar(newPos) != null); Actor.findChar(newPos) != null);
} }
if (Dungeon.level.heroFOV[pos]) CellEmitter.get( pos ).burst( Speck.factory( Speck.WOOL ), 6 ); if (level.heroFOV[pos]) CellEmitter.get( pos ).burst( Speck.factory( Speck.WOOL ), 6 );
sprite.move( pos, newPos ); sprite.move( pos, newPos );
move( newPos ); move( newPos );
if (Dungeon.level.heroFOV[newPos]) CellEmitter.get( newPos ).burst( Speck.factory( Speck.WOOL ), 6 ); if (level.heroFOV[newPos]) CellEmitter.get( newPos ).burst( Speck.factory( Speck.WOOL ), 6 );
Sample.INSTANCE.play( Assets.SND_PUFF ); Sample.INSTANCE.play( Assets.SND_PUFF );
spend( 1 / speed() ); spend( 1 / speed() );