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 63a49942c..56088de0b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/MiningLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/MiningLevel.java @@ -23,88 +23,59 @@ package com.shatteredpixel.shatteredpixeldungeon.levels; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Bones; -import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; -import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; -import com.shatteredpixel.shatteredpixeldungeon.levels.features.LevelTransition; +import com.shatteredpixel.shatteredpixeldungeon.levels.builders.BranchesBuilder; +import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.MiningLevelPainter; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; +import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.CaveRoom; -import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.EntranceRoom; +import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.StandardRoom; import com.shatteredpixel.shatteredpixeldungeon.tiles.CustomTilemap; import com.watabou.noosa.Group; import com.watabou.noosa.Image; import com.watabou.noosa.Tilemap; -import com.watabou.noosa.audio.Music; import com.watabou.utils.Random; +import java.util.ArrayList; import java.util.Arrays; -public class MiningLevel extends Level { +public class MiningLevel extends CavesLevel { - { - color1 = 0x534f3e; - color2 = 0xb9d661; + @Override + protected ArrayList initRooms() { + ArrayList initRooms = new ArrayList<>(); + initRooms.add ( roomEntrance = new EntranceRoom()); + + //currently spawns 10-12 cave rooms, of any size + int rooms = Random.NormalIntRange(10, 12); + for (int i = 0; i < rooms; i++){ + StandardRoom s; + do { + s = new CaveRoom(); + } while (!s.setSizeCat( 8 )); + //i += s.sizeCat.roomValue-1; + initRooms.add(s); + } + + return initRooms; } @Override - public void playLevelMusic() { - Music.INSTANCE.playTracks( - new String[]{Assets.Music.CAVES_1, Assets.Music.CAVES_2, Assets.Music.CAVES_2}, - new float[]{1, 1, 0.5f}, - false); + protected Builder builder() { + return new BranchesBuilder().setTunnelLength(new float[]{1}, new float[]{1}); } @Override - public String tilesTex() { - return Assets.Environment.TILES_CAVES; - } - - @Override - public String waterTex() { - return Assets.Environment.WATER_CAVES; - } - - @Override - protected boolean build() { - - setSize(32, 32); - - CaveRoom c = new CaveRoom(); - c.set(1, 1, 31, 31); - c.paint(this); - - Painter.fill(this, 15, 15, 3, 3, Terrain.EMPTY); - int entrance = 16 * width() + 16; - - transitions.add(new LevelTransition(this, - entrance, - LevelTransition.Type.BRANCH_ENTRANCE, - Dungeon.depth, - 0, - LevelTransition.Type.BRANCH_EXIT)); - - map[entrance] = Terrain.ENTRANCE; - - Painter painter = new MiningLevelPainter() + protected Painter painter() { + return new MiningLevelPainter() .setGold(Random.NormalIntRange(42, 46)) .setWater(0.35f, 6) .setGrass(0.10f, 3); - - painter.paint(this, null); - - CustomTilemap vis = new BorderTopDarken(); - vis.setRect(0, 0, width, 1); - customTiles.add(vis); - - vis = new BorderWallsDarken(); - vis.setRect(0, 0, width, height); - customWalls.add(vis); - - return true; } @Override @@ -124,53 +95,12 @@ public class MiningLevel extends Level { protected void createItems() { Item item = Bones.get(); if (item != null) { - drop( item, entrance()-width() ).setHauntedIfCursed().type = Heap.Type.REMAINS; - } - } - - @Override - public int randomRespawnCell( Char ch ) { - return entrance()-width(); - } - - @Override - public String tileName( int tile ) { - switch (tile) { - case Terrain.GRASS: - return Messages.get(CavesLevel.class, "grass_name"); - case Terrain.HIGH_GRASS: - return Messages.get(CavesLevel.class, "high_grass_name"); - case Terrain.WATER: - return Messages.get(CavesLevel.class, "water_name"); - case Terrain.STATUE: - //city statues are used - return Messages.get(CityLevel.class, "statue_name"); - default: - return super.tileName( tile ); - } - } - - @Override - public String tileDesc( int tile ) { - switch (tile) { - case Terrain.WATER: - return super.tileDesc( tile ) + "\n\n" + Messages.get(CavesBossLevel.class, "water_desc"); - case Terrain.ENTRANCE: - return Messages.get(CavesLevel.class, "entrance_desc"); - case Terrain.EXIT: - //city exit is used - return Messages.get(CityLevel.class, "exit_desc"); - case Terrain.HIGH_GRASS: - return Messages.get(CavesLevel.class, "high_grass_desc"); - case Terrain.WALL_DECO: - return Messages.get(CavesLevel.class, "wall_deco_desc"); - case Terrain.BOOKSHELF: - return Messages.get(CavesLevel.class, "bookshelf_desc"); - //city statues are used - case Terrain.STATUE: - return Messages.get(CityLevel.class, "statue_desc"); - default: - return super.tileDesc( tile ); + int cell = randomDropCell(); + if (map[cell] == Terrain.HIGH_GRASS || map[cell] == Terrain.FURROWED_GRASS) { + map[cell] = Terrain.GRASS; + losBlocking[cell] = false; + } + drop( item, cell ).setHauntedIfCursed().type = Heap.Type.REMAINS; } } @@ -178,6 +108,15 @@ public class MiningLevel extends Level { public Group addVisuals() { super.addVisuals(); CavesLevel.addCavesVisuals(this, visuals); + + CustomTilemap vis = new BorderTopDarken(); + vis.setRect(0, 0, width, 1); + customTiles.add(vis); + + vis = new BorderWallsDarken(); + vis.setRect(0, 0, width, height); + customWalls.add(vis); + return visuals; } 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 25b4e2cc3..9158131dd 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 @@ -25,11 +25,13 @@ 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.levels.rooms.standard.StandardRoom; import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTileSheet; import com.watabou.utils.PathFinder; import com.watabou.utils.Random; import java.util.ArrayList; +import java.util.HashMap; public class MiningLevelPainter extends CavesPainter { @@ -80,7 +82,7 @@ public class MiningLevelPainter extends CavesPainter { //fill in only the exposed potential gold cells... for (int i : goldPosCandidates){ if (map[i] == Terrain.WALL) { - map[i] = Terrain.BARRICADE; + map[i] = Terrain.WALL_DECO; goldToAdd--; } @@ -88,7 +90,7 @@ public class MiningLevelPainter extends CavesPainter { 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.BARRICADE; + map[i+k] = Terrain.WALL_DECO; goldToAdd--; } }; @@ -104,7 +106,7 @@ public class MiningLevelPainter extends CavesPainter { 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.BARRICADE; + map[i+k] = Terrain.WALL_DECO; goldToAdd--; } }; @@ -130,4 +132,49 @@ public class MiningLevelPainter extends CavesPainter { } } */ + + @Override + protected void paintDoors(Level l, ArrayList rooms) { + + HashMap roomMerges = new HashMap<>(); + + //add door types are empty, except secret, which becomes wall + for (Room r : rooms) { + for (Room n : r.connected.keySet()) { + + //normal sized rooms can be merged at most once. Large and Giant rooms can be merged many times + if (roomMerges.get(r) == n || roomMerges.get(n) == r){ + continue; + } else if (!roomMerges.containsKey(r) && !roomMerges.containsKey(n) && + mergeRooms(l, r, n, r.connected.get(n), Terrain.EMPTY)) { + if (((StandardRoom) r).sizeCat == StandardRoom.SizeCategory.NORMAL) roomMerges.put(r, n); + if (((StandardRoom) n).sizeCat == StandardRoom.SizeCategory.NORMAL) roomMerges.put(n, r); + continue; + } + + Room.Door d = r.connected.get(n); + int door = d.x + d.y * l.width(); + + //TODO should be more purposeful about this + if (Random.Int(2) == 0 || d.type == Room.Door.Type.HIDDEN){ + l.map[door] = Terrain.WALL; + } else { + l.map[door] = Terrain.EMPTY; + } + + } + } + } + + @Override + protected void decorate(Level level, ArrayList rooms) { + super.decorate(level, rooms); + + //no chasms allowed, replace with ground! + for (int i = 0; i < level.length(); i++){ + if (level.map[i] == Terrain.CHASM){ + level.map[i] = Terrain.EMPTY; + } + } + } }