From 4a8373246be470ca51eda7bab9b74abaea04e298 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 6 Sep 2017 02:29:37 -0400 Subject: [PATCH] v0.6.2: implement new secret room logic. Specific secret room implementations are still needed --- .../shatteredpixeldungeon/Dungeon.java | 4 + .../ShatteredPixelDungeon.java | 15 +- .../levels/RegularLevel.java | 5 + .../levels/SewerBossLevel.java | 2 +- .../levels/builders/RegularBuilder.java | 19 ++- .../{special => secret}/RatKingRoom.java | 10 +- .../levels/rooms/secret/SecretGardenRoom.java | 80 +++++++++++ .../rooms/secret/SecretLaboratoryRoom.java | 114 +++++++++++++++ .../rooms/secret/SecretLibraryRoom.java | 77 ++++++++++ .../levels/rooms/secret/SecretRoom.java | 132 ++++++++++++++++++ .../levels/rooms/secret/SecretTunnelRoom.java | 44 ++++++ .../{FoliageRoom.java => GardenRoom.java} | 25 ++-- .../levels/rooms/special/SpecialRoom.java | 4 +- .../{GardenRoom.java => PlantsRoom.java} | 2 +- .../levels/rooms/standard/StandardRoom.java | 2 +- 15 files changed, 505 insertions(+), 30 deletions(-) rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/{special => secret}/RatKingRoom.java (91%) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretGardenRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLaboratoryRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretLibraryRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretTunnelRoom.java rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/special/{FoliageRoom.java => GardenRoom.java} (81%) rename core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/{GardenRoom.java => PlantsRoom.java} (98%) 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 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);