From 5c59b3e77764d783729acd4202302ed63e115096 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 21 Sep 2023 16:05:16 -0400 Subject: [PATCH] v2.2.0: substantially improved mining level gold generation --- .../levels/painters/MiningLevelPainter.java | 87 ++++++++----------- .../levels/painters/RegularPainter.java | 6 +- 2 files changed, 43 insertions(+), 50 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/MiningLevelPainter.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/MiningLevelPainter.java index 2d95b279e..5b7a45d1c 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/MiningLevelPainter.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/MiningLevelPainter.java @@ -22,12 +22,12 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.painters; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; -import com.shatteredpixel.shatteredpixeldungeon.levels.Patch; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; -import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet; +import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.quest.MineSecretRoom; import com.watabou.utils.Graph; import com.watabou.utils.PathFinder; +import com.watabou.utils.Point; import com.watabou.utils.Random; import java.util.ArrayList; @@ -35,9 +35,10 @@ import java.util.HashMap; public class MiningLevelPainter extends CavesPainter { - //TODO currently this does an acceptable job of generating veins/clusters of gold - // and an excellent job of ensuring that the total gold amount is consistent - // but it doesn't ensure anything about gold distribution. Gold can often be overly clumped in certain areas + @Override + protected int padding(Level level) { + return 3; + } private int goldToAdd = 0; @@ -56,63 +57,51 @@ public class MiningLevelPainter extends CavesPainter { } int[] map = level.map; - do { - //use the patch system to generate a random smattering of gold with some grouping - boolean[] gold = Patch.generate( level.width(), level.height(), 0.05f, 2, true ); - ArrayList goldPosCandidates = new ArrayList<>(); + Random.shuffle(rooms); + for (Room r : rooms) { - //find all potential gold cells that are exposed - for (int i = 0; i < level.length(); i++){ - if (level.insideMap(i) && goldToAdd > 0 && map[i] == Terrain.WALL && gold[i]){ + if (r instanceof MineSecretRoom) continue; - for (int j : PathFinder.NEIGHBOURS4){ - if (level.insideMap(i+j) && DungeonTileSheet.floorTile(map[i+j])){ - goldPosCandidates.add(i); - break; + ArrayList goldPosCandidates = new ArrayList<>(); + for (Point p : r.getPoints()){ + int i = level.pointToCell(p); + + if (level.insideMap(i) && goldToAdd > 0 && map[i] == Terrain.WALL){ + + for (int j : PathFinder.NEIGHBOURS4){ + if (level.insideMap(i+j) && map[i+j] != Terrain.WALL){ + goldPosCandidates.add(i); + break; + } } } } - } - Random.shuffle(goldPosCandidates); + if (goldToAdd > 0 && !goldPosCandidates.isEmpty()){ + int pos = Random.element(goldPosCandidates); - //fill in only the exposed potential gold cells... - for (int i : goldPosCandidates){ - if (map[i] == Terrain.WALL) { - map[i] = Terrain.WALL_DECO; + map[pos] = Terrain.WALL_DECO; goldToAdd--; - } - //...with some preference to fill in neighbours - for (int k : PathFinder.NEIGHBOURS4){ - if (!level.insideMap(i+k)) continue; - if (goldToAdd > 0 && goldPosCandidates.contains(i+k) && map[i+k] == Terrain.WALL){ - map[i+k] = Terrain.WALL_DECO; - goldToAdd--; - } - }; - - if (goldToAdd <= 0) break; - - } - - //if we have more gold to add, also look into filling in some non-exposed potential gold cells - // that are adjacent to exposed cells - if (goldToAdd > 0){ - for (int i : goldPosCandidates){ - for (int k : PathFinder.NEIGHBOURS4){ - if (!level.insideMap(i+k)) continue; - if (goldToAdd > 0 && gold[i+k] && map[i+k] == Terrain.WALL){ - map[i+k] = Terrain.WALL_DECO; + if (goldToAdd > 0){ + int i = PathFinder.NEIGHBOURS4[Random.Int(4)]; + if (level.insideMap(pos+i) && map[pos+i] == Terrain.WALL){ + map[pos+i] = Terrain.WALL_DECO; goldToAdd--; } - }; - if (goldToAdd <= 0) break; - } - } + if (Random.Int(2) == 0){ + i = PathFinder.NEIGHBOURS4[Random.Int(4)]; + if (level.insideMap(pos+i) && map[pos+i] == Terrain.WALL){ + map[pos+i] = Terrain.WALL_DECO; + goldToAdd--; + } + } + } - //if we don't have enough gold yet, loop + } + + } } while (goldToAdd > 0); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java index 3455bfc5d..380c1d2f9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java @@ -75,6 +75,10 @@ public abstract class RegularPainter extends Painter { trapChances = chances; return this; } + + protected int padding(Level level){ + return level.feeling == Level.Feeling.CHASM ? 2 : 1; + } @Override public boolean paint(Level level, ArrayList rooms) { @@ -82,7 +86,7 @@ public abstract class RegularPainter extends Painter { //painter can be used without rooms if (rooms != null) { - int padding = level.feeling == Level.Feeling.CHASM ? 2 : 1; + int padding = padding(level); int leftMost = Integer.MAX_VALUE, topMost = Integer.MAX_VALUE;