package squidpony.examples;
import squidpony.squidgrid.DetailedMimic;
import squidpony.squidgrid.mapping.*;
import squidpony.squidmath.RNG;
import squidpony.squidmath.StatefulRNG;
import java.io.FileWriter;
import java.io.IOException;
/**
* Created by Tommy Ettinger on 6/9/2016.
* @author Tommy Ettinger - https://github.com/tommyettinger
*/
public class DetailedMimicDungeonTest {
public static int width = 50, height = 50;
public static void main( String[] args )
{
//seed is, in base 36, the number SQUIDLIB
StatefulRNG rng = new StatefulRNG(2252637788195L);
rng.setState(2252637788195L);
SectionDungeonGenerator sdg = new SectionDungeonGenerator(width, height, rng);
DungeonGenerator dg;
sdg.addDoors(12, false);
//sdg.addWater(SectionDungeonGenerator.CAVE, 13);
sdg.addBoulders(SectionDungeonGenerator.ALL, 13);
sdg.addWater(SectionDungeonGenerator.CAVE, 14);
sdg.addGrass(SectionDungeonGenerator.ALL, 7);
sdg.addLake(12, '£', '¢');
rng.setState(0xFEEEEEEEEEL);
SerpentMapGenerator serpent = new SerpentMapGenerator(width, height, rng, 0.2);
serpent.putWalledBoxRoomCarvers(4);
serpent.putWalledRoundRoomCarvers(2);
serpent.putCaveCarvers(5);
char[][] map = serpent.generate();
int[][] env = serpent.getEnvironment();
map = sdg.generate(map, env);
//RNG rand = new RNG();
//sdg.generate(rand.getRandomElement(TilesetType.values()));
char[][] sdungeon = sdg.getDungeon();
sdg.setDungeon(DungeonUtility.doubleWidth(
DungeonUtility.hashesToLines(sdungeon, true)));
System.out.println(sdg);
System.out.println("------------------------------------------------------------");
/*
sdg.addDoors(30, false);
//sdg.addWater(SectionDungeonGenerator.CAVE, 13);
sdg.addBoulders(SectionDungeonGenerator.ALL, 13);
sdg.addWater(SectionDungeonGenerator.ALL, 10);
sdg.addGrass(SectionDungeonGenerator.ALL, 7);
//sdg.addLake(12, '£', '¢');
rng.setState(0xFEEEEEEEEEL);
DenseRoomMapGenerator dense = new DenseRoomMapGenerator(width, height, rng);
char[][] map = dense.generate();
int[][] env = dense.getEnvironment();
//map = sdg.generate(map, env);
//RNG rand = new RNG();
//sdg.generate(rand.getRandomElement(TilesetType.values()));
//char[][] sdungeon = sdg.getDungeon();
char[][] sdungeon = map;
sdg.setDungeon(DungeonUtility.doubleWidth(
DungeonUtility.hashesToLines(sdungeon, false)));
System.out.println(sdg);
System.out.println("------------------------------------------------------------");
*/
DetailedMimic dm = new DetailedMimic(null, rng);
int[] sample = convertCharToInt(map);
/*
dm.analyze(sample, width, height, 2, 3, true);
for (double i = 0.875; i <= 2.0; i+= 0.125) {
int w = (int)(width * i), h = (int)(height * i);
dg = new DungeonGenerator(w, h, rng);
map = convertIntToChar(dm.process(sample, width, height, w, h,
2, 3, 0.7, true), w, h);
DungeonUtility.ensurePath(map, rng, '\t', '#');
map = DungeonUtility.wallWrap(map);
sdungeon = dg.generate(map);
sdg.setDungeon(DungeonUtility.doubleWidth(
DungeonUtility.hashesToLines(sdungeon, false)));
System.out.println(sdg);
System.out.println("------------------------------------------------------------");
}
*/
for (double i = 0.875; i <= 2.0; i+= 0.125) {
int w = (int)(width * i), h = (int)(height * i);
dg = new DungeonGenerator(w, h, rng);
map = convertIntToChar(dm.neoProcess(sample, width, height, w, h,
2, 3, true), w, h);
DungeonUtility.ensurePath(map, rng, '\t', '#');
map = DungeonUtility.wallWrap(map);
sdungeon = dg.generate(map);
sdg.setDungeon(DungeonUtility.doubleWidth(
DungeonUtility.hashesToLines(sdungeon, false)));
System.out.println(sdg);
System.out.println("------------------------------------------------------------");
}
}
public static int[] convertCharToInt(char[][] map)
{
int w = map.length, h = map[0].length;
int[] result = new int[w * h];
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
result[x * h + y] = map[x][y];
}
}
return result;
}
public static char[][] convertIntToChar(int[] arr, int w, int h)
{
char[][] result = new char[w][h];
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
result[x][y] = (char) arr[x * h + y];
}
}
return result;
}
// 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(120, 120, rng);
dungeonGenerator.addDoors(15, true);
dungeonGenerator.addWater(SectionDungeonGenerator.CAVE, 15);
dungeonGenerator.addGrass(SectionDungeonGenerator.CAVE, 15);
dungeonGenerator.addBoulders(SectionDungeonGenerator.ALL, 6);
dungeonGenerator.addLake(20);
SerpentMapGenerator serpent = new SerpentMapGenerator(120, 120, rng, 0.1);
serpent.putWalledBoxRoomCarvers(3);
serpent.putWalledRoundRoomCarvers(1);
serpent.putCaveCarvers(6);
//dungeonGenerator.generate(serpent.generate(), serpent.getEnvironment());
dungeonGenerator.generate();
dungeonGenerator.setDungeon(
DungeonUtility.hashesToLines(dungeonGenerator.getDungeon(), true));
char[][] iso = dungeonGenerator.getDungeon();
int[][] water = new int[120][120];
for (int i = 0; i < 120; i++)
{
for (int j = 0; j < 120; j++)
{
water[i][j] = -1;
}
}
boolean even = true;
StringBuilder sb = new StringBuilder(64000);
String[] people = new String[]{
"palette0_Hero_Chain_Bow_Iso.gif",
"palette0_Hero_Chain_Dagger_Iso.gif",
"palette0_Hero_Chain_Mace_Iso.gif",
"palette0_Hero_Chain_Staff_Iso.gif",
"palette0_Hero_Chain_Sword_Iso.gif",
"palette0_Hero_Leather_Bow_Iso.gif",
"palette0_Hero_Leather_Dagger_Iso.gif",
"palette0_Hero_Leather_Mace_Iso.gif",
"palette0_Hero_Leather_Staff_Iso.gif",
"palette0_Hero_Leather_Sword_Iso.gif",
"palette0_Hero_Plate_Bow_Iso.gif",
"palette0_Hero_Plate_Dagger_Iso.gif",
"palette0_Hero_Plate_Mace_Iso.gif",
"palette0_Hero_Plate_Robe_Iso.gif",
"palette0_Hero_Plate_Staff_Iso.gif",
"palette0_Hero_Plate_Sword_Iso.gif",
"palette0_Hero_Robe_Bow_Iso.gif",
"palette0_Hero_Robe_Dagger_Iso.gif",
"palette0_Hero_Robe_Staff_Iso.gif",
"palette0_Hero_Robe_Sword_Iso.gif"
};
for(int row = 0, sx = -59, sy = 59; row < 240; ++row, even = (row % 2 == 0), sx += (even) ? 1 : 0, sy += (!even) ? 1 : 0)
{
sb.append("<div class=\"row\">\n");
for(int col = 0; col < 120; col++)
{
int x = sx + col;
int y = sy - col;
if(x < 0 || y < 0 || x > 119 || y > 119)
{
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(120) == 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) * 4);
if(water[x-1][y] > -1) water[x][y] = (water[x][y] & 7) | ((water[x-1][y] & 2) * 4);
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("data.html");
fw.write(sb.toString());
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}