From 7e1dcec42f8e0300dbfd23c4c4f63a7f6a234a18 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Sat, 14 Oct 2017 03:35:57 -0400 Subject: [PATCH] v0.6.2: implemented five more secret rooms --- .../levels/features/Maze.java | 2 +- .../rooms/secret/SecretArtilleryRoom.java | 59 +++++++++ .../rooms/secret/SecretChestChasmRoom.java | 94 ++++++++++++++ .../levels/rooms/secret/SecretHoardRoom.java | 89 +++++++++++++ .../levels/rooms/secret/SecretMazeRoom.java | 118 ++++++++++++++++++ .../levels/rooms/secret/SecretRoom.java | 3 +- .../rooms/secret/SecretRunestoneRoom.java | 15 +-- .../rooms/secret/SecretSummoningRoom.java | 54 ++++++++ .../levels/traps/SummoningTrap.java | 2 + 9 files changed, 424 insertions(+), 12 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretArtilleryRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretChestChasmRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretHoardRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretMazeRoom.java create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretSummoningRoom.java diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Maze.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Maze.java index 5c8b62b3c..2f2b7a07a 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Maze.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/features/Maze.java @@ -85,7 +85,7 @@ public class Maze { y += mov[1]; maze[x][y] = FILLED; moves++; - } while (Random.Int(moves+1) == 0 && checkValidMove(maze, x, y, mov)); + } while (Random.Int(moves) == 0 && checkValidMove(maze, x, y, mov)); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretArtilleryRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretArtilleryRoom.java new file mode 100644 index 000000000..9eda70a1b --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretArtilleryRoom.java @@ -0,0 +1,59 @@ +/* + * 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.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; + +public class SecretArtilleryRoom extends SecretRoom { + + @Override + public void paint(Level level) { + super.paint(level); + + Painter.fill(level, this, Terrain.WALL); + Painter.fill(level, this, 1, Terrain.EMPTY_SP); + + Painter.set(level, center(), Terrain.STATUE_SP); + + for (int i = 0; i < 4; i++){ + int itemPos; + do{ + itemPos = level.pointToCell(random()); + } while ( level.map[itemPos] != Terrain.EMPTY_SP + || level.heaps.get(itemPos) != null); + + Item item; + do{ + item = Generator.randomWeapon(); + } while (!(item instanceof MissileWeapon)); + + level.drop(item, itemPos); + } + + entrance().set(Door.Type.HIDDEN); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretChestChasmRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretChestChasmRoom.java new file mode 100644 index 000000000..bb6e0102f --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretChestChasmRoom.java @@ -0,0 +1,94 @@ +/* + * 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.Heap; +import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey; +import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; +import com.watabou.utils.Point; + +public class SecretChestChasmRoom extends SecretRoom { + + @Override + public int minWidth() { + return 8; + } + + @Override + public int minHeight() { + return 8; + } + + @Override + public void paint(Level level) { + super.paint(level); + + Painter.fill(level, this, Terrain.WALL); + Painter.fill(level, this, 1, Terrain.CHASM); + + Point p = new Point(left+1, top+1); + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(new GoldenKey(Dungeon.depth), level.pointToCell(p)); + + p.x = right-1; + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(new GoldenKey(Dungeon.depth), level.pointToCell(p)); + + p.y = bottom-1; + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(new GoldenKey(Dungeon.depth), level.pointToCell(p)); + + p.x = left+1; + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(new GoldenKey(Dungeon.depth), level.pointToCell(p)); + + + p = new Point(left+3, top+3); + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(Generator.random(Generator.Category.SCROLL), + level.pointToCell(p)).type = Heap.Type.LOCKED_CHEST; + + p.x = right-3; + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(Generator.random(Generator.Category.POTION), + level.pointToCell(p)).type = Heap.Type.LOCKED_CHEST; + + p.y = bottom-3; + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(Generator.random(Generator.Category.SCROLL), + level.pointToCell(p)).type = Heap.Type.LOCKED_CHEST; + + p.x = left+3; + Painter.set(level, p, Terrain.EMPTY_SP); + level.drop(Generator.random(Generator.Category.POTION), + level.pointToCell(p)).type = Heap.Type.LOCKED_CHEST; + + level.addItemToSpawn(new PotionOfLevitation()); + + entrance().set(Door.Type.HIDDEN); + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretHoardRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretHoardRoom.java new file mode 100644 index 000000000..6b82044e6 --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretHoardRoom.java @@ -0,0 +1,89 @@ +/* + * 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.ShatteredPixelDungeon; +import com.shatteredpixel.shatteredpixeldungeon.items.Gold; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.DisintegrationTrap; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.PoisonDartTrap; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.RockfallTrap; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class SecretHoardRoom extends SecretRoom { + + @Override + public void paint(Level level) { + super.paint(level); + + Painter.fill(level, this, Terrain.WALL); + Painter.fill(level, this, 1, Terrain.EMPTY); + + Class trapClass; + if (Random.Int(2) == 0){ + trapClass = RockfallTrap.class; + } else if (Dungeon.depth >= 10){ + trapClass = DisintegrationTrap.class; + } else { + trapClass = PoisonDartTrap.class; + } + + int goldPos; + //half of the internal space of the room + int totalGold = ((width()-2)*(height()-2))/2; + + //no matter how much gold it drops, roughly equals 8 gold stacks. + float goldRatio = 8 / (float)totalGold; + for (int i = 0; i < totalGold; i++) { + do { + goldPos = level.pointToCell(random()); + } while (level.heaps.get(goldPos) != null); + Item gold = new Gold().random(); + gold.quantity(Math.round(gold.quantity() * goldRatio)); + level.drop(gold, goldPos); + } + + for (Point p : getPoints()){ + if (Random.Int(2) == 0 && level.map[level.pointToCell(p)] == Terrain.EMPTY){ + try { + level.setTrap(trapClass.newInstance().reveal(), level.pointToCell(p)); + Painter.set(level, p, Terrain.TRAP); + } catch (Exception e) { + ShatteredPixelDungeon.reportException(e); + } + } + } + + entrance().set(Door.Type.HIDDEN); + } + + @Override + public boolean canPlaceTrap(Point p) { + return false; + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretMazeRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretMazeRoom.java new file mode 100644 index 000000000..b269fddfd --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretMazeRoom.java @@ -0,0 +1,118 @@ +/* + * 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.Heap; +import com.shatteredpixel.shatteredpixeldungeon.items.Item; +import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.levels.features.Maze; +import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class SecretMazeRoom extends SecretRoom { + + @Override + public int minWidth() { + return 14; + } + + @Override + public int minHeight() { + return 14; + } + + @Override + public int maxWidth() { + return 18; + } + + @Override + public int maxHeight() { + return 18; + } + + @Override + public void paint(Level level) { + super.paint(level); + + Painter.fill(level, this, Terrain.WALL); + Painter.fill(level, this, 1, Terrain.EMPTY); + + //true = space, false = wall + boolean[][] maze = Maze.generate(this); + boolean[] passable = new boolean[width()*height()]; + + Painter.fill(level, this, 1, Terrain.EMPTY); + for (int x = 0; x < maze.length; x++) { + for (int y = 0; y < maze[0].length; y++) { + if (maze[x][y] == Maze.FILLED) { + Painter.fill(level, x + left, y + top, 1, 1, Terrain.WALL); + } + passable[x + width()*y] = maze[x][y] == Maze.EMPTY; + } + } + + PathFinder.setMapSize(width(), height()); + Point entrance = entrance(); + int entrancePos = (entrance.x - left) + width()*(entrance.y - top); + + PathFinder.buildDistanceMap( entrancePos, passable ); + + int bestDist = 0; + Point bestDistP = new Point(); + for (int i = 0; i < PathFinder.distance.length; i++){ + if (PathFinder.distance[i] != Integer.MAX_VALUE + && PathFinder.distance[i] > bestDist){ + bestDist = PathFinder.distance[i]; + bestDistP.x = (i % width()) + left; + bestDistP.y = (i / width()) + top; + } + } + + Item prize; + //1 floor set higher in probability, never cursed + do { + if (Random.Int(2) == 0) { + prize = Generator.randomWeapon((Dungeon.depth / 5) + 1); + } else { + prize = Generator.randomArmor((Dungeon.depth / 5) + 1); + } + } while (prize.cursed || prize instanceof MissileWeapon); + + //33% chance for an extra update. + if (Random.Int(3) == 0){ + prize.upgrade(); + } + + level.drop(prize, level.pointToCell(bestDistP)).type = Heap.Type.CHEST; + + PathFinder.setMapSize(level.width(), level.height()); + + entrance().set(Door.Type.HIDDEN); + } +} 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 index 27bb3fb6d..f6f26bc14 100644 --- 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 @@ -38,7 +38,8 @@ public abstract class SecretRoom extends SpecialRoom { private static final ArrayList> ALL_SECRETS = new ArrayList<>( Arrays.asList( SecretGardenRoom.class, SecretLaboratoryRoom.class, SecretLibraryRoom.class, SecretLarderRoom.class, SecretWellRoom.class, SecretRunestoneRoom.class, - SecretHoneypotRoom.class)); + SecretArtilleryRoom.class, SecretChestChasmRoom.class, SecretHoneypotRoom.class, + SecretHoardRoom.class, SecretMazeRoom.class, SecretSummoningRoom.class)); public static ArrayList> runSecrets = new ArrayList<>(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java index 69476cfe8..a6c256537 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java @@ -22,13 +22,11 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret; import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame; -import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfEnchantment; import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfIntuition; 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; public class SecretRunestoneRoom extends SecretRoom { @@ -64,14 +62,11 @@ public class SecretRunestoneRoom extends SecretRoom { level.addItemToSpawn(new PotionOfLiquidFlame()); - int runeStones = Random.NormalIntRange(2, 4); - for (int i = 0; i + */ + +package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret; + +import com.shatteredpixel.shatteredpixeldungeon.items.Generator; +import com.shatteredpixel.shatteredpixeldungeon.items.Heap; +import com.shatteredpixel.shatteredpixeldungeon.levels.Level; +import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; +import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; +import com.shatteredpixel.shatteredpixeldungeon.levels.traps.SummoningTrap; +import com.watabou.utils.Point; + +public class SecretSummoningRoom extends SecretRoom { + + @Override + public void paint(Level level) { + super.paint(level); + + Painter.fill(level, this, Terrain.WALL); + Painter.fill(level, this, 1, Terrain.SECRET_TRAP); + + Point center = center(); + level.drop(Generator.random(), level.pointToCell(center)).type = Heap.Type.SKELETON; + + for (Point p : getPoints()){ + int cell = level.pointToCell(p); + if (level.map[cell] == Terrain.SECRET_TRAP){ + level.setTrap(new SummoningTrap().hide(), cell); + } + } + + entrance().set(Door.Type.HIDDEN); + } + +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java index d3556c330..2f88b242c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/traps/SummoningTrap.java @@ -86,6 +86,8 @@ public class SummoningTrap extends Trap { //important to process the visuals and pressing of cells last, so spawned mobs have a chance to occupy cells first for (Mob mob : mobs){ ScrollOfTeleportation.appear(mob, mob.pos); + //so hidden traps are triggered as well + Dungeon.level.press(mob.pos, mob); } }