package squidpony.examples; import squidpony.ArrayTools; import squidpony.squidgrid.Radius; import squidpony.squidgrid.mapping.*; import squidpony.squidgrid.mapping.styled.TilesetType; import squidpony.squidmath.Coord; import squidpony.squidmath.OrderedSet; import squidpony.squidmath.RNG; import squidpony.squidmath.StatefulRNG; import java.io.FileWriter; import java.io.IOException; /** * Sample output: {@code * ┌─────────────────┐ ┌─────────────┐ ┌─────┐ ┌───────┐ ┌─────┐ * │ ~ ~ ~ ~ ~ ~ ~ ~ └─┐ │ . . . . . . └───┤ . . │ │ . . . │ │ . . │ * │ ~ ~ ~ ~ ~ ~ ~ ~ ~ │ │ . . . . . . . . │ . . │ │ . . ──┴─┬─┘ . . │ * │ ~ ~ ~ ~ ~ ~ ~ ~ ~ │ ┌─┘ . . . . . . . . │ . . │ │ . . . . │ . . . │ * │ ~ ~ ~ ┌───┐ ~ ~ ~ │ │ . . . . . . . │ . │ . . └─┘ . . . . . . . . │ * │ ~ ~ ──┤ │ ~ ~ ~ │ │ . . . . . . . │ . . . . . . . ^ . . . . . . │ * │ ~ ~ ~ └───┘ ~ ~ ~ │ │ . . . . . . . │ . . . ^ . . . . . . . . . ┌─┘ * │ ~ ~ ~ ~ ~ ~ ~ ~ ~ │ │ . . . . . . . ├───────────┐ . . . . ┌─────┘ * │ ~ . ~ ~ ~ ~ ~ ~ ┌─┘ │ . . . . . . . │ │ . . ┌───┘ * └─┐ ~ ~ ~ ~ ~ ┌───┘ │ . . ────────┬─┘ ┌─────┘ . . │ * │ ~ ~ ~ ~ ~ │ │ . . . . . . │ │ . . . . . │ ┌─────┐ * │ ~ ~ ~ ┌───┴───┬───┴─┐ . . . . . └─┐ ┌─┘ . . . . . ├─────┘ . . │ * ┌─┴─┐ ~ ~ │ ~ ~ ~ │ ~ ~ └─┐ . . . . . └───┘ . . . . . ┌─┘ . . . . . │ * │ ~ │ ~ ~ │ ~ ~ ~ │ ~ ~ ~ └─┐ . . . . ~ . . . . . . ┌─┘ . . . . . . │ * │ ~ │ ~ ~ │ ~ ~ ~ │ ~ ~ ~ ~ └─┬─┐ . ~ ~ . . . . . ┌─┘ . . . ┌─┐ . . │ * │ ~ │ ~ ~ │ ~ ~ ~ │ ~ ~ ~ ~ ~ └─┼───┐ ~ ~ ┌─────┬─┘ . . . . │ └─────┘ * │ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ └───┘ ~ ~ ├─────┘ . . . . . │ * │ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + . . . . . . . ┌─┘ ┌───┐ * │ ~ ~ ~ ~ ~ ~ ~ ~ ┌───┐ ~ ~ ~ ~ ~ ~ ~ ~ ~ │ . . . . . . ┌─┘ │ . │ * └─────────────────┘ │ ~ ~ ~ ~ ~ ┌───────┤ . . ──┬─────┤ │ . │ * ┌───────────────┐ └───┐ ~ ~ ┌─┘ │ . . . + . . └───────┤ . │ * │ . . . . . . . │ │ ~ ~ ├───────┐ │ . . . │ . . . . . . │ . │ * │ . . . . . . . ├───┐ │ ~ ~ │ . . . └─┴───────┘ . . . . . . ├───┘ * │ . . ┌─┐ . . . │ ~ │ │ ~ ~ │ . . . . . . . . . . . . . . . │ * │ . . │ │ . . ~ . ~ └─────┤ ~ ~ │ ^ . . . . . . . . . . ┌───────┴───┐ * │ . . │ │ ~ ~ ~ ~ ~ ~ ~ ~ │ ~ ~ │ . . . . . . ──────────┤ . . . . . │ * │ . . │ │ ~ ~ ~ ~ ~ ~ ~ ~ │ ~ ~ │ ^ . . . . . . . . . . │ . . . . . │ * └───┬─┴─┤ ~ ~ ──┐ ~ │ ~ ~ │ ~ ~ │ . . . . . . . . . . . │ . . . . . │ * │ ~ │ . . ~ ├───┤ ~ ~ │ ~ . │ . . ┌───┐ . . . . . . │ . . . . . │ * │ ~ + ~ ~ ~ │ │ ~ ~ + ~ ~ ~ ~ . │ │ . . . . . ┌─┴─────┐ ^ . │ * ┌───┴───┴─┐ ~ ~ │ │ ~ ~ │ ~ ~ ~ ~ ~ │ ┌─┘ . . . . . │ ┌─┘ . . │ * │ . . . . │ . ~ └───┼─────┤ ~ . ┌─────┘ │ . . . . . . │ │ . . . │ * │ . . . . . . ~ . . │ . . └─┬───┘ ┌─────┤ . . . . . . │ ┌─┘ . . . │ * └─┐ . . . . . ~ ~ . + . . . └───┐ │ . . ├───────┐ . . │ │ . . . . │ * │ . . . . . ~ . . │ . . . . . └─┤ . . ├───────┤ . . │ │ . . . . │ * │ . . . . . . . . ├─┐ . . . . . │ . . │ . ~ ~ │ . . └───┤ . . . ──┤ * │ . . . . . . . . │ └─┐ . . . . . . . + . ~ ~ │ . . . . + . . . . │ * │ . . ┌───────────┘ └─┐ . . . . . . │ . . . │ . . . . │ . . . . │ * │ . . │ └─┐ . . . . ┌─┤ . . . └─────. . ├─┐ . . . │ * │ . . │ ┌───┴───. . ┌─┘ │ . . . . . . . . │ └─┬─────┤ * │ . . ├─────────┬─────┤ . . . . ^ │ │ . . . . . . . . │ │ . . │ * │ . . │ . . . . │ ~ ~ │ . . . . . └───┴─────┬─┐ . . . . │ │ . . │ * │ . . │ . . . . │ ~ ~ │ . . . . . . . . . . │ │ . ^ . . ├───┤ . . │ * │ . . │ . . . . │ ~ ~ │ . . . . . . . . . . │ │ . . . . │ . │ . . │ * │ . . │ . . . . │ ~ ~ │ . . . . . . ┌─┬───/ ┤ └───┬─────┘ . └─/ ──┤ * ┌─┘ . . └─────. . │ ~ ~ │ . . . . . . │ │ . . │ │ . . . . . . . │ * │ . . . . . . . . │ ~ ~ └─────────. . │ │ . ^ └─────┘ . . . . . . . │ * │ . . . . . . . . │ ~ ~ ~ ~ ~ ~ ~ ~ ~ │ │ . . . . . . . . │ . . . . │ * └─┐ . . . . . . . │ ~ ~ ~ ~ ~ ~ ~ ~ ~ │ │ . . ^ . . . . . ├─────────┘ * │ . . . . . ┌───┴───┐ ~ ~ ──┬───────┘ └───┐ . . . . . ┌─┘ ┌─────┐ * └───┐ . . ┌─┘ ├───~ ~ │ │ . . . . . │ │ . . │ * │ . . │ ┌─┘ ~ ~ ~ ├───────────┬─┴───. . . . └─────┘ . . │ * ┌─────┤ . . └─┐ │ . ~ ~ ~ │ . . . . . │ . . . . . . . . . . . . │ * │ . . │ . . . │ │ . . ~ ┌─┤ . . . . . + . . . . . . . . . . . . │ * │ . . + . . . │ │ . . ┌─┘ │ . . │ . . │ . . ┌─┐ . . ┌─────┐ . . │ * │ . . ├─┐ . . └─────┘ . . └───┘ . . │ . . │ . . │ │ . ^ │ │ . . │ * │ . . │ │ . . . . . . . . . . . . . ├─────┘ . . └─┘ . . │ │ . . │ * │ . . │ │ . ^ . . . . ^ ^ . . . . . │ . . . . . . . . . │ │ ^ . │ * └─────┘ └─────────────┐ . . . . . . + . . . . . . . . . │ │ . . │ * └─────────────┴───────────────────┘ └─────┘ * } * Created by Tommy Ettinger on 4/8/2015. * @author Tommy Ettinger - https://github.com/tommyettinger */ public class DungeonGeneratorTest { public static int width = 70, height = 70, depth = 16; public static void main(String[] args) { //seed is, in base 36, the number SQUIDLIB StatefulRNG rng = new StatefulRNG(2252637788195L); DungeonGenerator dungeonGenerator = new DungeonGenerator(width, height, rng); dungeonGenerator.addDoors(15, true); dungeonGenerator.addWater(15); dungeonGenerator.addGrass(10); dungeonGenerator.addBoulders(5); dungeonGenerator.addTraps(2); //MixedGenerator mix = new MixedGenerator(width, height, rng); //mix.putCaveCarvers(3); //mix.putWalledBoxRoomCarvers(2); //mix.putWalledRoundRoomCarvers(2); //dungeonGenerator.generate(mix.generate()); dungeonGenerator.generate(TilesetType.DEFAULT_DUNGEON); char[][] dungeon = dungeonGenerator.getDungeon(); dungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; dungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(dungeon, true))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); dungeonGenerator = new DungeonGenerator(width, height, rng); dungeonGenerator.addDoors(12, false); dungeonGenerator.addWater(8); dungeonGenerator.addGrass(11); rng.setState(2252637788195L); SerpentMapGenerator serpent = new SerpentMapGenerator(width, height, rng, 0.2); serpent.putWalledBoxRoomCarvers(5); serpent.putRoundRoomCarvers(3); serpent.putCaveCarvers(3); char[][] map = serpent.generate(); dungeonGenerator.generate(map); char[][] sdungeon = DungeonUtility.closeDoors(dungeonGenerator.getDungeon()); sdungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; sdungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); rng.setState(2252637788195L); SectionDungeonGenerator sdg = new SectionDungeonGenerator(width, height, rng); sdg.addDoors(12, false); //sdg.addWater(SectionDungeonGenerator.CAVE, 13); sdg.addBoulders(SectionDungeonGenerator.ALL, 13); sdg.addWater(SectionDungeonGenerator.CAVE, 9); sdg.addMaze(15); sdg.addLake(8, '£', '¢'); rng.setState(0xFEEEEEEEEEL); serpent = new SerpentMapGenerator(width, height, rng, 0.2); serpent.putWalledBoxRoomCarvers(5); serpent.putRoundRoomCarvers(3); serpent.putCaveCarvers(3); map = serpent.generate(); int[][] env = serpent.getEnvironment(); sdg.generate(map, env); //RNG rand = new RNG(); //sdg.generate(rand.getRandomElement(TilesetType.values())); sdungeon = ArrayTools.copy(sdg.getDungeon()); sdungeon[sdg.stairsUp.x][sdg.stairsUp.y] = '<'; sdungeon[sdg.stairsDown.x][sdg.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon, true))); System.out.println(dungeonGenerator); /* for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { switch (env[x][y]) { case MixedGenerator.ROOM_FLOOR: sdungeon[x][y] = '1'; break; case MixedGenerator.CAVE_FLOOR: sdungeon[x][y] = '3'; break; case MixedGenerator.CORRIDOR_FLOOR: sdungeon[x][y] = '5'; break; } } } */ for (OrderedSet<Coord> lhs : sdg.placement.getAlongStraightWalls()) { for (Coord c : lhs) { sdungeon[c.x][c.y] = '}'; } } for (OrderedSet<Coord> lhs : sdg.placement.getCorners()) { for (Coord c : lhs) { sdungeon[c.x][c.y] = 'º'; } } for (OrderedSet<Coord> lhs : sdg.placement.getCenters()) { for (Coord c : lhs) { sdungeon[c.x][c.y] = '$'; } } for (Coord c : sdg.placement.getHidingPlaces(Radius.CIRCLE, 8)) { sdungeon[c.x][c.y] = 'h'; } // Just a little fun with Java that uses no alphanumerics other than keywords to express "Hello, World!" //char[] __ = {'$' << (',' ^ '-'), '`' | ('-' - '('), '$' << (',' ^ '-') | '$', '$' << (',' ^ '-') | '$', '/' + '@', ',', ' ', '(' + '/', '/' + '@', '(' + '%' + '%', '$' << (',' ^ '-') | '$', '*' + ':', '!'}; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon, true))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); /* dungeonGenerator = new DungeonGenerator(width, height, rng); //dungeonGenerator.addDoors(10, false); rng.setState(2252637788195L); PacMazeGenerator pac = new PacMazeGenerator(width, height, rng); map = pac.generate(); dungeonGenerator.generate(map); sdungeon = DungeonUtility.closeDoors(dungeonGenerator.getDungeon()); sdungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; sdungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); */ rng.setState(2252637788195L); sdg = new SectionDungeonGenerator(width, height, rng); //sdg.addDoors(12, false); //sdg.addWater(SectionDungeonGenerator.CAVE, 13); //sdg.addBoulders(SectionDungeonGenerator.ALL, 13); //sdg.addWater(SectionDungeonGenerator.CAVE, 9); //sdg.addMaze(30); //sdg.addLake(10, '£', '¢'); rng.setState(0xFEEEEEEEEEL); OrganicMapGenerator organic = new OrganicMapGenerator(0.57, 0.65, width, height, rng); map = organic.generate(); env = organic.getEnvironment(); sdg.generate(map, env); //RNG rand = new RNG(); //sdg.generate(rand.getRandomElement(TilesetType.values())); sdungeon = sdg.getDungeon(); //sdungeon[sdg.stairsUp.x][sdg.stairsUp.y] = '<'; //sdungeon[sdg.stairsDown.x][sdg.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon, false))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); /* rng.setState(2252637788195L); RectangleRoomFinder rrf = new RectangleRoomFinder(sdungeon); rrf.minimumDiagonal = 3; rrf.onlySquareRooms = true; List<Rectangle> rectangles = rng.shuffle(rrf.findRectangles()); int nh, nw, nx, ny; Coord center; char[][] dungeon2 = GwtCompatibility.fill('#', width, height); for(Rectangle rect : rectangles) { if(rng.nextDouble() < 0.1) continue; center = Rectangle.Utils.center(rect); nh = (int)(rect.getHeight() * (rng.nextDouble(1.5) + 1.3)); nw = (int)(rect.getWidth() * (rng.nextDouble(1.5) + 1.3)); nx = Math.max(1, Math.min(width - 2, center.x - nw/2)); ny = Math.max(1, Math.min(height - 2, center.y - nh/2)); GwtCompatibility.insert(DungeonUtility.wallWrap(GwtCompatibility.fill('.', nw, nh)), dungeon2, nx, ny); } DungeonUtility.wallWrap(dungeon2); dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(dungeon2, true))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); */ rng.setState(0xFEEEEEEEEEL); DenseRoomMapGenerator dense = new DenseRoomMapGenerator(width, height, rng); map = dense.generate(); DungeonUtility.ensurePath(map, rng, '\t', '#'); env = dense.getEnvironment(); sdg.addDoors(80, false); sdg.generate(map, env); //RNG rand = new RNG(); //sdg.generate(rand.getRandomElement(TilesetType.values())); sdungeon = sdg.getDungeon(); //sdungeon[sdg.stairsUp.x][sdg.stairsUp.y] = '<'; //sdungeon[sdg.stairsDown.x][sdg.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon, false))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); rng.setState(2252637788195L); ModularMapGenerator mmg = new ModularMapGenerator(width, height, rng); sdg.clearEffects(); sdg.addDoors(70, false); sdg.addBoulders(SectionDungeonGenerator.ROOM, 15); dungeon = mmg.generate(); dungeon = sdg.generate(dungeon, mmg.getEnvironment()); sdg.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(dungeon, false))); System.out.println(sdg); System.out.println("------------------------------------------------------------"); /* dungeonGenerator = new DungeonGenerator(width, height, rng); //dungeonGenerator.addDoors(15, false); //dungeonGenerator.addWater(20); //dungeonGenerator.addGrass(10); rng.setState(0xf00dd00dL); serpent = new SerpentMapGenerator(width, height, rng, 0.4, true); serpent.putWalledBoxRoomCarvers(2); serpent.putWalledRoundRoomCarvers(2); serpent.putCaveCarvers(3); map = serpent.generate(); dungeonGenerator.generate(map); sdungeon = dungeonGenerator.getDungeon(); sdungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; sdungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon))); System.out.println(dungeonGenerator); */ /* dungeonGenerator = new DungeonGenerator(width, height, rng); //dungeonGenerator.addDoors(15, false); //dungeonGenerator.addWater(20); //dungeonGenerator.addGrass(10); rng.setState(0xf00dd00dL); LanesMapGenerator lanes = new LanesMapGenerator(width, height, rng, 1); lanes.putBoxRoomCarvers(1); dungeon = lanes.generate(); sdungeon = dungeonGenerator.generate(dungeon); //sdungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; //sdungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); dungeonGenerator = new DungeonGenerator(width, height, rng); //dungeonGenerator.addDoors(15, false); //dungeonGenerator.addWater(20); //dungeonGenerator.addGrass(10); rng.setState(0xf00dd00dL); lanes = new LanesMapGenerator(width, height, rng, 2); lanes.putBoxRoomCarvers(1); dungeon = lanes.generate(); sdungeon = dungeonGenerator.generate(dungeon); //sdungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; //sdungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); dungeonGenerator = new DungeonGenerator(width, height, rng); //dungeonGenerator.addDoors(15, false); //dungeonGenerator.addWater(20); //dungeonGenerator.addGrass(10); rng.setState(0xf00dd00dL); lanes = new LanesMapGenerator(width, height, rng, 3); lanes.putBoxRoomCarvers(1); dungeon = lanes.generate(); sdungeon = dungeonGenerator.generate(dungeon); //sdungeon[dungeonGenerator.stairsUp.x][dungeonGenerator.stairsUp.y] = '<'; //sdungeon[dungeonGenerator.stairsDown.x][dungeonGenerator.stairsDown.y] = '>'; dungeonGenerator.setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(sdungeon))); System.out.println(dungeonGenerator); System.out.println("------------------------------------------------------------"); */ /* rng.setState(2252637788195L); SerpentDeepMapGenerator deepSerpent = new SerpentDeepMapGenerator(width, height, depth, rng, 0.15); deepSerpent.putWalledBoxRoomCarvers(2); deepSerpent.putWalledRoundRoomCarvers(2); deepSerpent.putCaveCarvers(3); char[][][] map3D = deepSerpent.generate(); DungeonGenerator[] gens = new DungeonGenerator[depth]; for (int i = 0; i < depth; i++) { gens[i] = new DungeonGenerator(width, height, rng); gens[i].addWater(rng.nextInt(25)); gens[i].addGrass(rng.nextInt(15)); gens[i].addBoulders(rng.nextInt(30)); gens[i].addDoors(rng.between(4, 10), false); gens[i].generateRespectingStairs(map3D[i]); gens[i].setDungeon(DungeonUtility.doubleWidth( DungeonUtility.hashesToLines(gens[i].getDungeon(), true))); System.out.println(gens[i]); System.out.print ("------------------------------------------------------------"); System.out.print ("------------------------------------------------------------"); System.out.print ("------------------------------------------------------------"); System.out.println("------------------------------------------------------------"); } for(int k : new int[]{ThinDungeonGenerator.CAVE_WALL_NORMAL | ThinDungeonGenerator.CORRIDOR_WALL_NORMAL | ThinDungeonGenerator.ROOM_WALL_NORMAL, ThinDungeonGenerator.CAVE_WALL_RETRACT | ThinDungeonGenerator.CORRIDOR_WALL_RETRACT | ThinDungeonGenerator.ROOM_WALL_RETRACT, ThinDungeonGenerator.CAVE_WALL_CHAOTIC | ThinDungeonGenerator.CORRIDOR_WALL_EXPAND | ThinDungeonGenerator.ROOM_WALL_EXPAND }) { ThinDungeonGenerator tdg = new ThinDungeonGenerator(width, height, rng, k, 0, 0); tdg.addDoors(12, false); //tdg.addWater(SectionDungeonGenerator.CAVE, 13); //tdg.addBoulders(SectionDungeonGenerator.ALL, 13); tdg.addWater(SectionDungeonGenerator.CAVE, 9); tdg.addMaze(30); tdg.addLake(10, '£', '¢'); rng.setState(0xFEEEEEEEEEL); serpent = new SerpentMapGenerator(width, height, rng, 0.2); serpent.putWalledBoxRoomCarvers(5); serpent.putWalledRoundRoomCarvers(3); serpent.putCaveCarvers(4); map = serpent.generate(); env = serpent.getEnvironment(); tdg.generate(map, env); //RNG rand = new RNG(); //tdg.generate(rand.getRandomElement(TilesetType.values())); sdungeon = GwtCompatibility.copy(tdg.getDungeon()); sdungeon[tdg.stairsUp.x][tdg.stairsUp.y] = '<'; sdungeon[tdg.stairsDown.x][tdg.stairsDown.y] = '>'; //System.out.println(tdg); tdg.setDungeon(DungeonUtility.hashesToLines(sdungeon, true)); System.out.println(tdg); } sdg = new SectionDungeonGenerator(width, height, rng); sdg.addDoors(12, false); //tdg.addWater(SectionDungeonGenerator.CAVE, 13); //tdg.addBoulders(SectionDungeonGenerator.ALL, 13); sdg.addWater(SectionDungeonGenerator.CAVE, 9); sdg.addMaze(30); sdg.addLake(10, '£', '¢'); rng.setState(0xFEEEEEEEEEL); serpent = new SerpentMapGenerator(width, height, rng, 0.2); serpent.putWalledBoxRoomCarvers(5); serpent.putWalledRoundRoomCarvers(3); serpent.putCaveCarvers(4); map = serpent.generate(); env = serpent.getEnvironment(); sdg.generate(map, env); //RNG rand = new RNG(); //tdg.generate(rand.getRandomElement(TilesetType.values())); sdungeon = GwtCompatibility.copy(sdg.getDungeon()); sdungeon[sdg.stairsUp.x][sdg.stairsUp.y] = '<'; sdungeon[sdg.stairsDown.x][sdg.stairsDown.y] = '>'; //System.out.println(sdg); sdg.setDungeon(DungeonUtility.hashesToLines(sdungeon, true)); System.out.println(sdg); */ } // Generates a preview webpage when given the right images. // See the following for generated images with different parameters (scroll down and right to see the map) // http://tommyettinger.github.io/home/PixVoxel/dungeon/dungeon.html (DungeonGenerator) // http://tommyettinger.github.io/home/PixVoxel/dungeon/serpent.html (SerpentMapGenerator) // http://tommyettinger.github.io/home/PixVoxel/dungeon/occupied.html (SectionDungeonGenerator with people) // The assets are CC0 licensed (effectively public domain), made by me (Tommy Ettinger). If you intend to use // them in a project, maybe ask to see if there's a newer version already made or in progress. public static void mainAlt(String[] args) { RNG rng = new RNG(2252637788195L); SectionDungeonGenerator dungeonGenerator = new SectionDungeonGenerator(width, width, rng); dungeonGenerator.addDoors(15, true); dungeonGenerator.addWater(SectionDungeonGenerator.ALL, 12); dungeonGenerator.addGrass(SectionDungeonGenerator.ALL, 8); dungeonGenerator.addBoulders(SectionDungeonGenerator.ALL, 4); //dungeonGenerator.addMaze(4); dungeonGenerator.addLake(15); /*SerpentMapGenerator serpent = new SerpentMapGenerator(width, width, rng, 0.12); serpent.putWalledBoxRoomCarvers(4); serpent.putWalledRoundRoomCarvers(2); serpent.putCaveCarvers(5); */ // /dungeonGenerator.generate(serpent.generate(), serpent.getEnvironment()); char[][] iso = DungeonUtility.hashesToLines(dungeonGenerator.generate(), true); int[][] water = new int[width][width]; for (int i = 0; i < width; i++) { for (int j = 0; j < width; j++) { water[i][j] = -1; } } boolean even = true; StringBuilder sb = new StringBuilder(64000); String[] people = new String[]{ "palette0_Hero_Chain_Bow_Attack.gif", "palette0_Hero_Chain_Crossbow_Attack.gif", "palette0_Hero_Chain_Dagger_Attack.gif", "palette0_Hero_Chain_Mace_Attack.gif", "palette0_Hero_Chain_Staff_Attack.gif", "palette0_Hero_Chain_Sword_Attack.gif", "palette0_Hero_Leather_Bow_Attack.gif", "palette0_Hero_Leather_Crossbow_Attack.gif", "palette0_Hero_Leather_Dagger_Attack.gif", "palette0_Hero_Leather_Mace_Attack.gif", "palette0_Hero_Leather_Staff_Attack.gif", "palette0_Hero_Leather_Sword_Attack.gif", "palette0_Hero_Plate_Bow_Attack.gif", "palette0_Hero_Plate_Crossbow_Attack.gif", "palette0_Hero_Plate_Dagger_Attack.gif", "palette0_Hero_Plate_Mace_Attack.gif", "palette0_Hero_Plate_Staff_Attack.gif", "palette0_Hero_Plate_Sword_Attack.gif", "palette0_Hero_Robe_Bow_Attack.gif", "palette0_Hero_Robe_Crossbow_Attack.gif", "palette0_Hero_Robe_Dagger_Attack.gif", "palette0_Hero_Robe_Mace_Attack.gif", "palette0_Hero_Robe_Staff_Attack.gif", "palette0_Hero_Robe_Sword_Attack.gif", "palette6_Heroine_Chain_Bow_Attack.gif", "palette6_Heroine_Chain_Crossbow_Attack.gif", "palette6_Heroine_Chain_Dagger_Attack.gif", "palette6_Heroine_Chain_Mace_Attack.gif", "palette6_Heroine_Chain_Staff_Attack.gif", "palette6_Heroine_Chain_Sword_Attack.gif", "palette6_Heroine_Leather_Bow_Attack.gif", "palette6_Heroine_Leather_Crossbow_Attack.gif", "palette6_Heroine_Leather_Dagger_Attack.gif", "palette6_Heroine_Leather_Mace_Attack.gif", "palette6_Heroine_Leather_Staff_Attack.gif", "palette6_Heroine_Leather_Sword_Attack.gif", "palette6_Heroine_Plate_Bow_Attack.gif", "palette6_Heroine_Plate_Crossbow_Attack.gif", "palette6_Heroine_Plate_Dagger_Attack.gif", "palette6_Heroine_Plate_Mace_Attack.gif", "palette6_Heroine_Plate_Staff_Attack.gif", "palette6_Heroine_Plate_Sword_Attack.gif", "palette6_Heroine_Robe_Bow_Attack.gif", "palette6_Heroine_Robe_Crossbow_Attack.gif", "palette6_Heroine_Robe_Dagger_Attack.gif", "palette6_Heroine_Robe_Mace_Attack.gif", "palette6_Heroine_Robe_Staff_Attack.gif", "palette6_Heroine_Robe_Sword_Attack.gif" }; for (int y = 0; y < width; y++) { sb.append("<div class=\"row\">\n"); for (int x = 0; x < width; x++) { sb.append("<div class=\"orthotile\">"); switch (iso[x][y]) { case '.': sb.append("<img src=\"dungeon/palette13_Floor_Ortho_face").append(rng.nextInt(4)).append("_0.png\" />"); if (rng.nextInt(15) == 0) { sb.append("<img class=\"ppl\" src=\"dungeon/"); sb.append(rng.getRandomElement(people)); sb.append("\" />"); } break; case '"': case ':': sb.append("<img src=\"dungeon/palette14_Grass_Ortho_face").append(rng.nextInt(4)).append("_0.png\" />"); break; case '#': sb.append("<img src=\"dungeon/palette13_Boulder_Ortho_face").append(rng.nextInt(4)).append("_0.png\" />"); break; case '~': case ',': water[x][y] = rng.nextInt(16); if (water[x][y - 1] > -1) water[x][y] = (water[x][y] & 14) | ((water[x][y - 1] & 4) >> 2); if (water[x][y + 1] > -1) water[x][y] = (water[x][y] & 11) | ((water[x][y + 1] & 1) << 2); if (water[x - 1][y] > -1) water[x][y] = (water[x][y] & 7) | ((water[x - 1][y] & 2) << 2); if (water[x + 1][y] > -1) water[x][y] = (water[x][y] & 13) | ((water[x + 1][y] & 8) >> 2); sb.append("<img src=\"dungeon/palette15_Water_Ortho_face0_").append(Integer.toHexString(water[x][y])).append(".png\" />"); break; case '│': sb.append("<img src=\"dungeon/palette13_Wall_Straight_Ortho_face").append(rng.nextInt(2) * 2 + 1).append("_0.png\" />"); break; case '─': sb.append("<img src=\"dungeon/palette13_Wall_Straight_Ortho_face").append(rng.nextInt(2) * 2).append("_0.png\" />"); break; case '┌': sb.append("<img src=\"dungeon/palette13_Wall_Corner_Ortho_face1_0.png\" />"); break; case '┐': sb.append("<img src=\"dungeon/palette13_Wall_Corner_Ortho_face2_0.png\" />"); break; case '└': sb.append("<img src=\"dungeon/palette13_Wall_Corner_Ortho_face0_0.png\" />"); break; case '┘': sb.append("<img src=\"dungeon/palette13_Wall_Corner_Ortho_face3_0.png\" />"); break; case '┤': sb.append("<img src=\"dungeon/palette13_Wall_Tee_Ortho_face3_0.png\" />"); break; case '┴': sb.append("<img src=\"dungeon/palette13_Wall_Tee_Ortho_face0_0.png\" />"); break; case '├': sb.append("<img src=\"dungeon/palette13_Wall_Tee_Ortho_face1_0.png\" />"); break; case '┬': sb.append("<img src=\"dungeon/palette13_Wall_Tee_Ortho_face2_0.png\" />"); break; case '┼': sb.append("<img src=\"dungeon/palette13_Wall_Cross_Ortho_face").append(rng.nextInt(4)).append("_0.png\" />"); break; case '+': sb.append("<img src=\"dungeon/palette13_Door_Closed_Ortho_face").append(rng.nextInt(2) * 2 + 1).append("_0.png\" />"); break; case '/': sb.append("<img src=\"dungeon/palette13_Door_Closed_Ortho_face").append(rng.nextInt(2) * 2).append("_0.png\" />"); break; } sb.append("</div>\n"); } sb.append("</div>\n"); } try { FileWriter fw = new FileWriter("index.html"); fw.write(sb.toString()); fw.close(); } catch (IOException e) { e.printStackTrace(); } } } // for(int row = 0, sx = 1 - (width>>1), sy = (width>>1) - 1; row < (width<<1); ++row, even = (row % 2 == 0), sx += (even) ? 1 : 0, sy += (!even) ? 1 : 0) // { // sb.append("<div class=\"row\">\n"); // for(int col = 0; col < width; col++) // { // int x = sx + col; // int y = sy - col; // if(x < 0 || y < 0 || x >= width || y >= width) // { // sb.append("<div class=\"isotile\"></div>\n"); // } // else // { // switch (iso[x][y]) // { // case '.': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Floor_Huge_face" + rng.nextInt(4) + "_0.png\" />"); // if(rng.nextInt(40) == 0) { // sb.append("<img class=\"ppl\" src=\"dungeon/"); // sb.append(rng.getRandomElement(people)); // sb.append("\" />"); // } // sb.append("</div>\n"); // break; // case '"': // case ':': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette47_Grass_Huge_face" + rng.nextInt(4) + "_0.png\" /></div>\n"); // break; // case '#': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Boulder_Huge_face" + rng.nextInt(4) + "_0.png\" /></div>\n"); // break; // case '~': // case ',': // water[x][y] = rng.nextInt(16); // if(water[x][y-1] > -1) water[x][y] = (water[x][y] & 14) | ((water[x][y-1] & 4) >> 2); // if(water[x][y+1] > -1) water[x][y] = (water[x][y] & 11) | ((water[x][y+1] & 1) << 2); // if(water[x-1][y] > -1) water[x][y] = (water[x][y] & 7) | ((water[x-1][y] & 2) << 2); // if(water[x+1][y] > -1) water[x][y] = (water[x][y] & 13) | ((water[x+1][y] & 8) >> 2); // // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette0_Water_Huge_face0_" + (Integer.toHexString(water[x][y])) + ".png\" /></div>\n"); // break; // case '│': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Straight_Huge_face" + (rng.nextInt(2) * 2) + "_0.png\" /></div>\n"); // break; // case '─': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Straight_Huge_face" + (rng.nextInt(2) * 2 + 1) + "_0.png\" /></div>\n"); // break; // // case '┌': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Corner_Huge_face2_0.png\" /></div>\n"); // break; // case '┐': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Corner_Huge_face3_0.png\" /></div>\n"); // break; // case '└': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Corner_Huge_face1_0.png\" /></div>\n"); // break; // case '┘': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Corner_Huge_face0_0.png\" /></div>\n"); // break; // // case '┤': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Tee_Huge_face0_0.png\" /></div>\n"); // break; // case '┴': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Tee_Huge_face1_0.png\" /></div>\n"); // break; // case '├': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Tee_Huge_face2_0.png\" /></div>\n"); // break; // case '┬': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Tee_Huge_face3_0.png\" /></div>\n"); // break; // // case '┼': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Wall_Cross_Huge_face" + rng.nextInt(4) + "_0.png\" /></div>\n"); // break; // // case '+': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Door_Closed_Huge_face" + (rng.nextInt(2) * 2) + "_0.png\" /></div>\n"); // break; // case '/': // sb.append("<div class=\"isotile\"><img src=\"dungeon/palette48_Door_Closed_Huge_face" + (rng.nextInt(2) * 2 + 1) + "_0.png\" /></div>\n"); // break; // // case ' ': // sb.append("<div class=\"isotile\"></div>\n"); // break; // default: // System.out.println("BAD GLYPH: " + iso[x][y] + " AT X: " + x + ", Y: " + y); // } // } // } // sb.append("</div>\n"); // } // try { // FileWriter fw = new FileWriter("index.html"); // fw.write(sb.toString()); // fw.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } //}