diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java
index 5dac9f134..7111b39d4 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/Dungeon.java
@@ -55,6 +55,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.PrisonLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.SewerLevel;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@@ -199,6 +200,7 @@ public class Dungeon {
Ring.initGems();
SpecialRoom.initForRun();
+ SecretRoom.initForRun();
Random.seed();
@@ -520,6 +522,7 @@ public class Dungeon {
bundle.put( QUESTS, quests );
SpecialRoom.storeRoomsInBundle( bundle );
+ SecretRoom.storeRoomsInBundle( bundle );
Statistics.storeInBundle( bundle );
Notes.storeInBundle( bundle );
@@ -635,6 +638,7 @@ public class Dungeon {
}
SpecialRoom.restoreRoomsFromBundle(bundle);
+ SecretRoom.restoreRoomsFromBundle(bundle);
}
Bundle badges = bundle.getBundle(BADGES);
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java
index 6b9e4705a..1ee95780e 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java
@@ -78,7 +78,18 @@ public class ShatteredPixelDungeon extends Game {
com.watabou.utils.Bundle.addAlias(
com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation.class,
"com.shatteredpixel.shatteredpixeldungeon.items.food.OverpricedRation" );
-
+
+ //v0.6.2
+ com.watabou.utils.Bundle.addAlias(
+ com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.RatKingRoom.class,
+ "com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.RatKingRoom" );
+ com.watabou.utils.Bundle.addAlias(
+ com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.PlantsRoom.class,
+ "com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.GardenRoom" );
+ com.watabou.utils.Bundle.addAlias(
+ com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.GardenRoom.class,
+ "com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.FoliageRoom" );
+
com.watabou.utils.Bundle.exceptionReporter =
new com.watabou.utils.Bundle.BundleExceptionCallback() {
@Override
@@ -86,7 +97,7 @@ public class ShatteredPixelDungeon extends Game {
ShatteredPixelDungeon.reportException(t);
}
};
-
+
}
@SuppressWarnings("deprecation")
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java
index b7432da64..27b21affd 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java
@@ -38,6 +38,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LoopBuilder;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.PitRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.ShopRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom;
@@ -109,6 +110,10 @@ public abstract class RegularLevel extends Level {
for (int i = 0; i < specials; i++)
initRooms.add(SpecialRoom.createRoom());
+ int secrets = SecretRoom.secretsForFloor(Dungeon.depth);
+ for (int i = 0; i < secrets; i++)
+ initRooms.add(SecretRoom.createRoom());
+
return initRooms;
}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java
index c0826da40..1cae9b989 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java
@@ -29,7 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder;
import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LoopBuilder;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
-import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.RatKingRoom;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.RatKingRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EmptyRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.SewerBossEntranceRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.StandardRoom;
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java
index d4eb567f3..1fbaad7c9 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java
@@ -23,6 +23,8 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.builders;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretRoom;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret.SecretTunnelRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.ShopRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EntranceRoom;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.ExitRoom;
@@ -135,8 +137,13 @@ public abstract class RegularBuilder extends Builder {
float[] connectionChances = connChances.clone();
while (i < roomsToBranch.size()){
+ Room r = roomsToBranch.get(i);
+
connectingRoomsThisBranch.clear();
- curr = Random.element(branchable);
+
+ do {
+ curr = Random.element(branchable);
+ } while( r instanceof SecretRoom && curr instanceof ConnectionRoom);
int connectingRooms = Random.chances(connectionChances);
if (connectingRooms == -1){
@@ -146,7 +153,7 @@ public abstract class RegularBuilder extends Builder {
connectionChances[connectingRooms]--;
for (int j = 0; j < connectingRooms; j++){
- ConnectionRoom t = ConnectionRoom.createRoom();
+ ConnectionRoom t = r instanceof SecretRoom ? new SecretTunnelRoom() : ConnectionRoom.createRoom();
tries = 3;
do {
@@ -155,9 +162,9 @@ public abstract class RegularBuilder extends Builder {
} while (angle == -1 && tries > 0);
if (angle == -1) {
- for (Room r : connectingRoomsThisBranch){
- r.clearConnections();
- rooms.remove(r);
+ for (Room c : connectingRoomsThisBranch){
+ c.clearConnections();
+ rooms.remove(c);
}
connectingRoomsThisBranch.clear();
break;
@@ -173,8 +180,6 @@ public abstract class RegularBuilder extends Builder {
continue;
}
- Room r = roomsToBranch.get(i);
-
tries = 10;
do {
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/RatKingRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/RatKingRoom.java
similarity index 91%
rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/RatKingRoom.java
rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/RatKingRoom.java
index 9394bbc31..55f35c943 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/RatKingRoom.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/RatKingRoom.java
@@ -19,7 +19,7 @@
* along with this program. If not, see
*/
-package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special;
+package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.RatKing;
import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
@@ -29,15 +29,15 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
-import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EmptyRoom;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.SewerBossEntranceRoom;
import com.watabou.utils.Random;
-public class RatKingRoom extends SpecialRoom {
+public class RatKingRoom extends SecretRoom {
@Override
public boolean canConnect(Room r) {
- //never at the end of a connection room, or at the entrance
- return r instanceof EmptyRoom && super.canConnect(r);
+ //never connects at the entrance
+ return !(r instanceof SewerBossEntranceRoom) && super.canConnect(r);
}
//reduced max size to limit chest numbers.
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretGardenRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretGardenRoom.java
new file mode 100644
index 000000000..69f98f653
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretGardenRoom.java
@@ -0,0 +1,80 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2017 Evan Debenham
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
+
+import com.shatteredpixel.shatteredpixeldungeon.Challenges;
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Foliage;
+import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
+import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
+import com.shatteredpixel.shatteredpixeldungeon.plants.BlandfruitBush;
+import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass;
+import com.watabou.utils.Random;
+
+//TODO specific implementation
+public class SecretGardenRoom extends SecretRoom {
+
+ public void paint( Level level ) {
+
+ Painter.fill( level, this, Terrain.WALL );
+ Painter.fill( level, this, 1, Terrain.HIGH_GRASS );
+ Painter.fill( level, this, 2, Terrain.GRASS );
+
+ entrance().set( Door.Type.HIDDEN );
+
+ if (Dungeon.isChallenged(Challenges.NO_FOOD)) {
+ level.plant(new Sungrass.Seed(), plantPos(level));
+ } else {
+ level.plant(new BlandfruitBush.Seed(), plantPos(level));
+ }
+
+ level.plant(new WandOfRegrowth.Seedpod.Seed(), plantPos( level ));
+ level.plant(new WandOfRegrowth.Dewcatcher.Seed(), plantPos( level ));
+
+ if (Random.Int(2) == 0){
+ level.plant(new WandOfRegrowth.Seedpod.Seed(), plantPos( level ));
+ } else {
+ level.plant(new WandOfRegrowth.Dewcatcher.Seed(), plantPos( level ));
+ }
+
+ Foliage light = (Foliage)level.blobs.get( Foliage.class );
+ if (light == null) {
+ light = new Foliage();
+ }
+ for (int i=top + 1; i < bottom; i++) {
+ for (int j=left + 1; j < right; j++) {
+ light.seed( level, j + level.width() * i, 1 );
+ }
+ }
+ level.blobs.put( Foliage.class, light );
+ }
+
+ private int plantPos( Level level ){
+ int pos;
+ do{
+ pos = level.pointToCell(random());
+ } while (level.plants.get(pos) != null);
+ return pos;
+ }
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java
new file mode 100644
index 000000000..1b4c0eb63
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java
@@ -0,0 +1,114 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2017 Evan Debenham
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
+
+import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Alchemy;
+import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
+import com.shatteredpixel.shatteredpixeldungeon.items.Item;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.Potion;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfExperience;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfFrost;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMight;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfParalyticGas;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
+import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfToxicGas;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
+import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
+import com.watabou.utils.Point;
+import com.watabou.utils.Random;
+
+import java.util.HashMap;
+
+//TODO specific implementation
+public class SecretLaboratoryRoom extends SecretRoom {
+
+ private static HashMap, Float> potionChances = new HashMap<>();
+ static{
+ potionChances.put(PotionOfHealing.class, 2f);
+ potionChances.put(PotionOfExperience.class, 4f);
+ potionChances.put(PotionOfToxicGas.class, 1f);
+ potionChances.put(PotionOfParalyticGas.class, 2f);
+ potionChances.put(PotionOfLiquidFlame.class, 1f);
+ potionChances.put(PotionOfLevitation.class, 1f);
+ potionChances.put(PotionOfStrength.class, 0f);
+ potionChances.put(PotionOfMindVision.class, 2f);
+ potionChances.put(PotionOfPurity.class, 2f);
+ potionChances.put(PotionOfInvisibility.class, 1f);
+ potionChances.put(PotionOfMight.class, 0f);
+ potionChances.put(PotionOfFrost.class, 1f);
+ }
+
+ public void paint( Level level ) {
+
+ Painter.fill( level, this, Terrain.WALL );
+ Painter.fill( level, this, 1, Terrain.EMPTY_SP );
+
+ Door entrance = entrance();
+
+ Point pot = null;
+ if (entrance.x == left) {
+ pot = new Point( right-1, Random.Int( 2 ) == 0 ? top + 1 : bottom - 1 );
+ } else if (entrance.x == right) {
+ pot = new Point( left+1, Random.Int( 2 ) == 0 ? top + 1 : bottom - 1 );
+ } else if (entrance.y == top) {
+ pot = new Point( Random.Int( 2 ) == 0 ? left + 1 : right - 1, bottom-1 );
+ } else if (entrance.y == bottom) {
+ pot = new Point( Random.Int( 2 ) == 0 ? left + 1 : right - 1, top+1 );
+ }
+ Painter.set( level, pot, Terrain.ALCHEMY );
+
+ Alchemy alchemy = new Alchemy();
+ alchemy.seed( level, pot.x + level.width() * pot.y, Random.IntRange(40, 75) );
+ level.blobs.put( Alchemy.class, alchemy );
+
+ int n = Random.IntRange( 3, 4 );
+ HashMap, Float> chances = new HashMap<>(potionChances);
+ for (int i=0; i < n; i++) {
+ int pos;
+ do {
+ pos = level.pointToCell(random());
+ } while (
+ level.map[pos] != Terrain.EMPTY_SP ||
+ level.heaps.get( pos ) != null);
+ level.drop( prize( level ), pos );
+ }
+
+ entrance.set( Door.Type.HIDDEN );
+ }
+
+ private static Item prize(Level level ) {
+
+ Item prize = level.findPrizeItem( Potion.class );
+ if (prize == null)
+ prize = Generator.random( Generator.Category.POTION );
+
+ return prize;
+ }
+
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLibraryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLibraryRoom.java
new file mode 100644
index 000000000..8f1f78468
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLibraryRoom.java
@@ -0,0 +1,77 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2017 Evan Debenham
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
+
+import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
+import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
+import com.shatteredpixel.shatteredpixeldungeon.items.Item;
+import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
+import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.Scroll;
+import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
+import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
+import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
+import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
+import com.watabou.utils.Random;
+
+//TODO specific implementation
+public class SecretLibraryRoom extends SecretRoom {
+
+ public void paint( Level level ) {
+
+ Painter.fill( level, this, Terrain.WALL );
+ Painter.fill( level, this, 1, Terrain.EMPTY_SP );
+
+ Door entrance = entrance();
+
+ Painter.fill( level, left + 1, top+1, width() - 2, 1 , Terrain.BOOKSHELF );
+ Painter.drawInside(level, this, entrance, 1, Terrain.EMPTY_SP );
+
+ int n = Random.IntRange( 2, 3 );
+ for (int i=0; i < n; i++) {
+ int pos;
+ do {
+ pos = level.pointToCell(random());
+ } while (level.map[pos] != Terrain.EMPTY_SP || level.heaps.get( pos ) != null);
+ Item item;
+ if (i == 0)
+ item = Random.Int(2) == 0 ? new ScrollOfIdentify() : new ScrollOfRemoveCurse();
+ else
+ item = prize( level );
+ level.drop( item, pos );
+ }
+
+ entrance.set( Door.Type.HIDDEN );
+
+ level.addItemToSpawn( new IronKey( Dungeon.depth ) );
+ }
+
+ private static Item prize( Level level ) {
+
+ Item prize = level.findPrizeItem( Scroll.class );
+ if (prize == null)
+ prize = Generator.random( Generator.Category.SCROLL );
+
+ return prize;
+ }
+
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRoom.java
new file mode 100644
index 000000000..6bda5f057
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRoom.java
@@ -0,0 +1,132 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2017 Evan Debenham
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
+
+import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.special.SpecialRoom;
+import com.watabou.utils.Bundle;
+import com.watabou.utils.Random;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+
+public abstract class SecretRoom extends SpecialRoom {
+
+
+ private static final ArrayList> ALL_SECRETS = new ArrayList<>( Arrays.asList(
+ SecretGardenRoom.class, SecretLaboratoryRoom.class, SecretLibraryRoom.class));
+
+ public static ArrayList> runSecrets = new ArrayList<>();
+
+ //this is the number of secret rooms per region (whole value),
+ // plus the chance for an extra secret room (fractional value)
+ private static float[] baseRegionSecrets = new float[]{1.4f, 1.8f, 2.2f, 2.6f, 3.0f};
+ private static int[] regionSecretsThisRun = new int[5];
+
+ public static void initForRun(){
+
+ float[] regionChances = baseRegionSecrets.clone();
+
+ /*if (StartScene.curClass == HeroClass.ROGUE){
+ for (int i = 0; i < regionChances.length; i++){
+ regionChances[i] += 0.6f;
+ }
+ }*/
+
+ for (int i = 0; i < regionSecretsThisRun.length; i++){
+ regionSecretsThisRun[i] = (int)regionChances[i];
+ if (Random.Float() < regionChances[i] % 1f){
+ regionSecretsThisRun[i]++;
+ }
+ }
+
+ runSecrets = new ArrayList<>(ALL_SECRETS);
+ Random.shuffle(runSecrets);
+
+ }
+
+ public static int secretsForFloor(int depth){
+ if (depth == 1) return 0;
+
+ int region = depth/5;
+ int floor = depth%5;
+
+ int floorsLeft = 5 - floor;
+
+ float secrets;
+ if (floorsLeft == 0) {
+ secrets = regionSecretsThisRun[region];
+ } else {
+ secrets = regionSecretsThisRun[region] / floorsLeft;
+ if (Random.Float() < secrets % 1f){
+ secrets = (float)Math.ceil(secrets);
+ } else {
+ secrets = (float)Math.floor(secrets);
+ }
+ }
+
+ regionSecretsThisRun[region] -= (int)secrets;
+ return (int)secrets;
+ }
+
+ public static SecretRoom createRoom(){
+
+ SecretRoom r = null;
+ int index = runSecrets.size();
+ for (int i = 0; i < 4; i++){
+ int newidx = Random.Int( runSecrets.size() );
+ if (newidx < index) index = newidx;
+ }
+ try {
+ r = runSecrets.get( index ).newInstance();
+ } catch (Exception e) {
+ ShatteredPixelDungeon.reportException(e);
+ }
+
+ runSecrets.add(runSecrets.remove(index));
+
+ return r;
+ }
+
+ private static final String ROOMS = "secret_rooms";
+ private static final String REGIONS = "region_secrets";
+
+ public static void restoreRoomsFromBundle( Bundle bundle ) {
+ runSecrets.clear();
+ if (bundle.contains( ROOMS )) {
+ for (Class extends SecretRoom> type : bundle.getClassArray(ROOMS)) {
+ if (type != null) runSecrets.add(type);
+ }
+ } else {
+ initForRun();
+ ShatteredPixelDungeon.reportException(new Exception("secrets array didn't exist!"));
+ }
+ regionSecretsThisRun = bundle.getIntArray(REGIONS);
+ }
+
+ public static void storeRoomsInBundle( Bundle bundle ) {
+ bundle.put( ROOMS, runSecrets.toArray(new Class[0]) );
+ bundle.put( REGIONS, regionSecretsThisRun );
+ }
+
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretTunnelRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretTunnelRoom.java
new file mode 100644
index 000000000..0ccfd1041
--- /dev/null
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretTunnelRoom.java
@@ -0,0 +1,44 @@
+/*
+ * Pixel Dungeon
+ * Copyright (C) 2012-2015 Oleg Dolya
+ *
+ * Shattered Pixel Dungeon
+ * Copyright (C) 2014-2017 Evan Debenham
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ */
+
+package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
+
+import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
+import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.TunnelRoom;
+
+
+public class SecretTunnelRoom extends TunnelRoom {
+
+ @Override
+ public int maxConnections(int direction) {
+ return 2;
+ }
+
+ @Override
+ public void paint(Level level) {
+ super.paint(level);
+
+ for (Door door : connected.values()) {
+ door.set( Door.Type.HIDDEN );
+ }
+ }
+
+}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/FoliageRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/GardenRoom.java
similarity index 81%
rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/FoliageRoom.java
rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/GardenRoom.java
index 7ad2a3b95..ebaf56c35 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/FoliageRoom.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/GardenRoom.java
@@ -31,7 +31,7 @@ import com.shatteredpixel.shatteredpixeldungeon.plants.BlandfruitBush;
import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass;
import com.watabou.utils.Random;
-public class FoliageRoom extends SpecialRoom {
+public class GardenRoom extends SpecialRoom {
public void paint( Level level ) {
@@ -43,22 +43,17 @@ public class FoliageRoom extends SpecialRoom {
if (Dungeon.isChallenged(Challenges.NO_FOOD)) {
if (Random.Int(2) == 0){
- level.plant(new Sungrass.Seed(), level.pointToCell(random()));
+ level.plant(new Sungrass.Seed(), plantPos( level ));
}
} else {
int bushes = Random.Int(3);
if (bushes == 0) {
- level.plant(new Sungrass.Seed(), level.pointToCell(random()));
+ level.plant(new Sungrass.Seed(), plantPos( level ));
} else if (bushes == 1) {
- level.plant(new BlandfruitBush.Seed(), level.pointToCell(random()));
+ level.plant(new BlandfruitBush.Seed(), plantPos( level ));
} else if (Random.Int(5) == 0) {
- int plant1, plant2;
- plant1 = level.pointToCell(random());
- level.plant(new Sungrass.Seed(), plant1);
- do {
- plant2 = level.pointToCell(random());
- } while (plant2 == plant1);
- level.plant(new BlandfruitBush.Seed(), plant2);
+ level.plant(new Sungrass.Seed(), plantPos( level ));
+ level.plant(new BlandfruitBush.Seed(), plantPos( level ));
}
}
@@ -73,4 +68,12 @@ public class FoliageRoom extends SpecialRoom {
}
level.blobs.put( Foliage.class, light );
}
+
+ private int plantPos( Level level ){
+ int pos;
+ do{
+ pos = level.pointToCell(random());
+ } while (level.plants.get(pos) != null);
+ return pos;
+ }
}
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java
index 9e42e81be..ea9adaf72 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/SpecialRoom.java
@@ -61,7 +61,7 @@ public class SpecialRoom extends Room {
}
private static final ArrayList> ALL_SPEC = new ArrayList<>( Arrays.asList(
- WeakFloorRoom.class, MagicWellRoom.class, CryptRoom.class, PoolRoom.class, FoliageRoom.class, LibraryRoom.class, ArmoryRoom.class,
+ WeakFloorRoom.class, MagicWellRoom.class, CryptRoom.class, PoolRoom.class, GardenRoom.class, LibraryRoom.class, ArmoryRoom.class,
TreasuryRoom.class, TrapsRoom.class, StorageRoom.class, StatueRoom.class, LaboratoryRoom.class, VaultRoom.class
) );
@@ -81,7 +81,7 @@ public class SpecialRoom extends Room {
}
if (Dungeon.isChallenged( Challenges.NO_HERBALISM )){
//Would be a bit mean to spawn these with no plants in them
- runSpecials.remove( FoliageRoom.class );
+ runSpecials.remove( GardenRoom.class );
}
pitNeededDepth = -1;
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/GardenRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/PlantsRoom.java
similarity index 98%
rename from core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/GardenRoom.java
rename to core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/PlantsRoom.java
index f2fafaf36..2223d744b 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/GardenRoom.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/PlantsRoom.java
@@ -29,7 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
import com.watabou.utils.Point;
import com.watabou.utils.Random;
-public class GardenRoom extends StandardRoom {
+public class PlantsRoom extends StandardRoom {
@Override
public int minWidth() {
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/StandardRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/StandardRoom.java
index a5266fa54..56234ca62 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/StandardRoom.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/StandardRoom.java
@@ -132,7 +132,7 @@ public abstract class StandardRoom extends Room {
rooms.add(SkullsRoom.class);
- rooms.add(GardenRoom.class);
+ rooms.add(PlantsRoom.class);
rooms.add(AquariumRoom.class);
rooms.add(PlatformRoom.class);
rooms.add(BurnedRoom.class);