From 6dcb16f70a837f808bcc3c8593628caae0d4bdd6 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 21 Sep 2023 15:24:55 -0400 Subject: [PATCH] v2.2.0: numerous improvements to mining/crystal quest cave generation --- .../levels/MiningLevel.java | 6 +-- .../levels/rooms/quest/MineEntrance.java | 2 +- .../levels/rooms/quest/MineGiantRoom.java | 12 +++-- .../levels/rooms/quest/MineLargeRoom.java | 46 +++++++++++++++++-- .../levels/rooms/quest/MineSmallRoom.java | 2 +- .../sprites/CrystalGuardianSprite.java | 6 +++ 6 files changed, 61 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/MiningLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/MiningLevel.java index a07abea03..411c02172 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/MiningLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/MiningLevel.java @@ -74,20 +74,20 @@ public class MiningLevel extends CavesLevel { ArrayList initRooms = new ArrayList<>(); initRooms.add ( roomEntrance = new MineEntrance()); - //spawns 1 giant, 3-4 large, and 5-8 regular cave rooms + //spawns 1 giant, 3 large, 6-8 small, and 1-2 secret cave rooms StandardRoom s; s = new MineGiantRoom(); s.setSizeCat(); initRooms.add(s); - int rooms = Random.NormalIntRange(3, 4); + int rooms = 3; for (int i = 0; i < rooms; i++){ s = new MineLargeRoom(); s.setSizeCat(); initRooms.add(s); } - rooms = Random.NormalIntRange(8, 10); + rooms = Random.NormalIntRange(6, 8); for (int i = 0; i < rooms; i++){ s = new MineSmallRoom(); s.setSizeCat(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineEntrance.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineEntrance.java index 989eb892f..0d39207b0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineEntrance.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineEntrance.java @@ -78,7 +78,7 @@ public class MineEntrance extends EntranceRoom { LevelTransition.Type.BRANCH_EXIT)); if (Blacksmith.Quest.Type() == Blacksmith.Quest.CRYSTAL){ - for (int i = 0; i < width()*height()/3; i ++){ + for (int i = 0; i < width()*height()/2; i ++){ Point r = random(1); if (level.distance(level.pointToCell(r), entrance) > 1) { Painter.set(level, r, Terrain.MINE_CRYSTAL); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineGiantRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineGiantRoom.java index 8e6bd3e38..7acf72441 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineGiantRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineGiantRoom.java @@ -46,10 +46,14 @@ public class MineGiantRoom extends CaveRoom { super.paint(level); if (Blacksmith.Quest.Type() == Blacksmith.Quest.CRYSTAL){ - Painter.fillEllipse(level, this, 2, Terrain.MINE_CRYSTAL); - Painter.fillEllipse(level, this, 4, Terrain.EMPTY); - for (int i = 0; i < (width()-8)*(height()-8)/3; i ++){ - Painter.set(level, random(4), Terrain.MINE_CRYSTAL); + Painter.fillEllipse(level, this, 3, Terrain.MINE_CRYSTAL); + Painter.fillEllipse(level, this, 5, Terrain.EMPTY); + + for (int i = 0; i < width()*height()/4; i ++){ + Point r = random(1); + if (level.map[level.pointToCell(r)] != Terrain.WALL) { + Painter.set(level, r, Terrain.MINE_CRYSTAL); + } } Point p = center(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineLargeRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineLargeRoom.java index 9b80ca853..312676789 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineLargeRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineLargeRoom.java @@ -27,8 +27,11 @@ 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.standard.CaveRoom; +import com.watabou.utils.PathFinder; import com.watabou.utils.Point; +import java.util.ArrayList; + public class MineLargeRoom extends CaveRoom { @Override @@ -36,6 +39,16 @@ public class MineLargeRoom extends CaveRoom { return new float[]{0, 1, 0}; } + @Override + public int minHeight() { + return 11; + } + + @Override + public int minWidth() { + return 11; + } + @Override protected float fill() { return 0.55f; @@ -46,14 +59,30 @@ public class MineLargeRoom extends CaveRoom { super.paint(level); if (Blacksmith.Quest.Type() == Blacksmith.Quest.CRYSTAL){ - Painter.fillEllipse(level, this, 2, Terrain.MINE_CRYSTAL); + Painter.fillEllipse(level, this, 3, Terrain.MINE_CRYSTAL); Painter.fillEllipse(level, this, 4, Terrain.EMPTY); - for (int i = 0; i < (width()-8)*(height()-8)/5; i ++){ - Painter.set(level, random(4), Terrain.MINE_CRYSTAL); + Point p = random(5); + ArrayList internalcells = new ArrayList<>(); + findInternalCells(level, level.pointToCell(p), internalcells); + + //we want to ensure that every internal cell has no way out, even diagonally + for (int i : internalcells){ + for (int j : PathFinder.CIRCLE8){ + if (!internalcells.contains(i+j) && level.map[i+j] != Terrain.MINE_CRYSTAL){ + level.map[i] = Terrain.MINE_CRYSTAL; + break; + } + } + } + + for (int i = 0; i < width()*height()/4; i ++){ + Point r = random(1); + if (level.map[level.pointToCell(r)] != Terrain.WALL) { + Painter.set(level, r, Terrain.MINE_CRYSTAL); + } } - Point p = random(5); CrystalGuardian m = new CrystalGuardian(); m.pos = level.pointToCell(p); level.mobs.add(m); @@ -65,4 +94,13 @@ public class MineLargeRoom extends CaveRoom { } + private void findInternalCells(Level level, int cell, ArrayList internalCells){ + for (int i : PathFinder.NEIGHBOURS4){ + if (!internalCells.contains(cell+i) && level.map[cell+i] != Terrain.MINE_CRYSTAL){ + internalCells.add(cell+i); + findInternalCells(level, cell+i, internalCells); + } + } + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineSmallRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineSmallRoom.java index c8ba3e77f..92b7573f2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineSmallRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/quest/MineSmallRoom.java @@ -51,7 +51,7 @@ public class MineSmallRoom extends CaveRoom { super.paint(level); if (Blacksmith.Quest.Type() == Blacksmith.Quest.CRYSTAL){ - for (int i = 0; i < width()*height()/5; i ++){ + for (int i = 0; i < width()*height()/3; i ++){ Point r = random(1); if (level.map[level.pointToCell(r)] != Terrain.WALL) { Painter.set(level, r, Terrain.MINE_CRYSTAL); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalGuardianSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalGuardianSprite.java index 83ebeade8..6a769bf7c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalGuardianSprite.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/CrystalGuardianSprite.java @@ -61,6 +61,12 @@ public abstract class CrystalGuardianSprite extends MobSprite { play(crumple); } + public void endCrumple(){ + if (curAnim == crumple){ + idle(); + } + } + @Override public void link(Char ch) { super.link(ch);