diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java index 026509e1a..a9192a255 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java @@ -390,31 +390,47 @@ public abstract class RegularPainter extends Painter { //no more than one trap every 5 valid tiles. nTraps = Math.min(nTraps, validCells.size()/5); - - for (int i = 0; i < nTraps; i++) { - - Integer trapPos = Random.element(validCells); - validCells.remove(trapPos); //removes the integer object, not at the index - - Trap trap = Reflection.newInstance(trapClasses[Random.chances( trapChances )]).hide(); + + //for traps that want to avoid being in hallways + ArrayList validNonHallways = new ArrayList<>(); + + //temporarily use the passable array for the next step + for (int i = 0; i < l.length(); i++){ + l.passable[i] = (Terrain.flags[l.map[i]] & Terrain.PASSABLE) != 0; + } + + for (int i : validCells){ + if ((l.passable[i+PathFinder.CIRCLE4[0]] || l.passable[i+PathFinder.CIRCLE4[2]]) + && (l.passable[i+PathFinder.CIRCLE4[1]] || l.passable[i+PathFinder.CIRCLE4[3]])){ + validNonHallways.add(i); + } + } + + //no more than one trap every 5 valid tiles. + nTraps = Math.min(nTraps, validCells.size()/5); + + //5x traps on traps level feeling, but the extra traps are all visible + for (int i = 0; i < (l.feeling == Level.Feeling.TRAPS ? 5*nTraps : nTraps); i++) { + + Trap trap = Reflection.newInstance(trapClasses[Random.chances( trapChances )]); + + Integer trapPos; + if (trap.avoidsHallways && !validNonHallways.isEmpty()){ + trapPos = Random.element(validNonHallways); + } else { + trapPos = Random.element(validCells); + } + //removes the integer object, not at the index + validCells.remove(trapPos); + validNonHallways.remove(trapPos); + + if (i < nTraps) trap.hide(); + else trap.reveal(); + l.setTrap( trap, trapPos ); //some traps will not be hidden l.map[trapPos] = trap.visible ? Terrain.TRAP : Terrain.SECRET_TRAP; } - - //4x regular trap count of visible traps on traps level feeling - if (l.feeling == Level.Feeling.TRAPS){ - for (int i = 0; i < 4*nTraps; i++) { - - Integer trapPos = Random.element(validCells); - validCells.remove(trapPos); //removes the integer object, not at the index - - Trap trap = Reflection.newInstance(trapClasses[Random.chances( trapChances )]).reveal(); - l.setTrap( trap, trapPos ); - //some traps will not be hidden - l.map[trapPos] = trap.visible ? Terrain.TRAP : Terrain.SECRET_TRAP; - } - } } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/connection/ConnectionRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/connection/ConnectionRoom.java index 71fc0795b..04b09fcee 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/connection/ConnectionRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/connection/ConnectionRoom.java @@ -45,12 +45,6 @@ public abstract class ConnectionRoom extends Room { else return 0; } - @Override - public boolean canPlaceTrap(Point p) { - //traps cannot appear in connection rooms on floor 1 - return super.canPlaceTrap(p) && Dungeon.depth > 1; - } - //FIXME this is a very messy way of handing variable connection rooms private static ArrayList> rooms = new ArrayList<>(); static { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java index c585f491d..93617d59b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/DisintegrationTrap.java @@ -43,6 +43,7 @@ public class DisintegrationTrap extends Trap { shape = CROSSHAIR; canBeHidden = false; + avoidsHallways = true; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FlashingTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FlashingTrap.java index 6ef0e33e7..c3a2a6402 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FlashingTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/FlashingTrap.java @@ -40,19 +40,11 @@ public class FlashingTrap extends Trap { { color = GREY; shape = STARS; + + disarmedByActivation = false; + avoidsHallways = true; } - - @Override - public void trigger() { - if (Dungeon.level.heroFOV[pos]){ - Sample.INSTANCE.play(Assets.Sounds.TRAP); - } - //this trap is not disarmed by being triggered - reveal(); - Level.set(pos, Terrain.TRAP); - activate(); - } - + @Override public void activate() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GatewayTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GatewayTrap.java index 7dafe4125..6c2de2762 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GatewayTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GatewayTrap.java @@ -1,6 +1,6 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.traps; -import com.shatteredpixel.shatteredpixeldungeon.Assets; + import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; @@ -8,9 +8,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation; -import com.shatteredpixel.shatteredpixeldungeon.levels.Level; -import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; -import com.watabou.noosa.audio.Sample; import com.watabou.utils.Bundle; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; @@ -22,21 +19,13 @@ public class GatewayTrap extends Trap { { color = TEAL; shape = CROSSHAIR; + + disarmedByActivation = false; + avoidsHallways = true; } private int telePos = -1; - @Override - public void trigger() { - if (Dungeon.level.heroFOV[pos]){ - Sample.INSTANCE.play(Assets.Sounds.TRAP); - } - //this trap is not disarmed by being triggered - reveal(); - Level.set(pos, Terrain.TRAP); - activate(); - } - @Override public void activate() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java index 433103624..a3013db50 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrimTrap.java @@ -42,6 +42,7 @@ public class GrimTrap extends Trap { shape = LARGE_DOT; canBeHidden = false; + avoidsHallways = true; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java index 1db7f077b..713acb71d 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/GrippingTrap.java @@ -38,17 +38,9 @@ public class GrippingTrap extends Trap { { color = GREY; shape = DOTS; - } - - @Override - public void trigger() { - if (Dungeon.level.heroFOV[pos]){ - Sample.INSTANCE.play(Assets.Sounds.TRAP); - } - //this trap is not disarmed by being triggered - reveal(); - Level.set(pos, Terrain.TRAP); - activate(); + + disarmedByActivation = false; + avoidsHallways = true; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java index 5ae6a802e..cb9af9210 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/PoisonDartTrap.java @@ -42,6 +42,7 @@ public class PoisonDartTrap extends Trap { shape = CROSSHAIR; canBeHidden = false; + avoidsHallways = true; } protected int poisonAmount(){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/RockfallTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/RockfallTrap.java index ff52fabe4..1a55cf238 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/RockfallTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/RockfallTrap.java @@ -49,6 +49,7 @@ public class RockfallTrap extends Trap { shape = DIAMOND; canBeHidden = false; + avoidsHallways = true; } @Override diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java index eb0eeb738..09bccb796 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/Trap.java @@ -58,10 +58,13 @@ public abstract class Trap implements Bundlable { public boolean visible; public boolean active = true; + public boolean disarmedByActivation = true; public boolean canBeHidden = true; public boolean canBeSearched = true; + public boolean avoidsHallways = false; //whether this trap should avoid being placed in hallways + public Trap set(int pos){ this.pos = pos; return this; @@ -88,7 +91,7 @@ public abstract class Trap implements Bundlable { if (Dungeon.level.heroFOV[pos]) { Sample.INSTANCE.play(Assets.Sounds.TRAP); } - disarm(); + if (disarmedByActivation) disarm(); reveal(); activate(); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java index 2155bfbd6..f66817fc3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/WornDartTrap.java @@ -40,6 +40,7 @@ public class WornDartTrap extends Trap { shape = CROSSHAIR; canBeHidden = false; + avoidsHallways = true; } @Override