001package squidpony.squidgrid; 002 003import squidpony.ArrayTools; 004import squidpony.squidmath.Coord; 005import squidpony.squidmath.IRNG; 006 007/** 008 * A class that imitates patterns in an existing 2D boolean array and uses it to generate a new boolean array with a 009 * similar visual style. Useful for creating procedural filler around a desired path or series of known rooms. Can also 010 * convert between 2D boolean arrays (samples) and 2D char arrays (maps). 011 * Created by Tommy Ettinger on 5/14/2016, porting from https://github.com/mxgmn/ConvChain (public domain) 012 */ 013public class MimicFill { 014 015 private static final int N = 3; 016 017 private MimicFill() 018 { 019 020 } 021 /** 022 * Converts a 2D char array map to a 2D boolean array, where any chars in the array or vararg yes will result in 023 * true in the returned array at that position and any other chars will result in false. The result can be given to 024 * fill() as its sample parameter. 025 * @param map a 2D char array that you want converted to a 2D boolean array 026 * @param yes an array or vararg of the chars to consider true in map 027 * @return a 2D boolean array that can be given to fill() 028 */ 029 public static boolean[][] mapToSample(char[][] map, char... yes) 030 { 031 if(map == null || map.length == 0) 032 return new boolean[0][0]; 033 boolean[][] sample = new boolean[map.length][map[0].length]; 034 if(yes == null || yes.length == 0) 035 return sample; 036 for (int x = 0; x < map.length; x++) { 037 for (int y = 0; y < map[0].length; y++) { 038 for (int c = 0; c < yes.length; c++) { 039 if(sample[x][y] = map[x][y] == yes[c]) 040 break; 041 } 042 } 043 } 044 return sample; 045 } 046 047 /** 048 * Comverts a 2D boolean array to a 2D char array, where false means the parameter no and true the parameter yes. 049 * @param sample a 2D boolean array that you want converted to a 2D char array 050 * @param yes true in sample will be mapped to this char; usually '.' 051 * @param no false in sample will be mapped to this char; usually '#' 052 * @return a 2D char array containing only the chars yes and no 053 */ 054 public static char[][] sampleToMap(boolean[][] sample, char yes, char no) 055 { 056 057 if(sample == null || sample.length == 0) 058 return new char[0][0]; 059 char[][] map = new char[sample.length][sample[0].length]; 060 for (int x = 0; x < sample.length; x++) { 061 for (int y = 0; y < sample[0].length; y++) { 062 map[x][y] = (sample[x][y]) ? yes : no; 063 } 064 } 065 return map; 066 } 067 068 /** 069 * Comverts a 2D boolean array to a 2D char array, where false means the parameter no and true the parameter yes. 070 * @param sample a 1D boolean array that you want converted to a 2D char array 071 * @param width the desired width of the 2D char array 072 * @param height the desired height of the 2D char array 073 * @param yes true in sample will be mapped to this char; usually '.' 074 * @param no false in sample will be mapped to this char; usually '#' 075 * @return a 2D char array containing only the chars yes and no 076 */ 077 public static char[][] sampleToMap(boolean[] sample, int width, int height, char yes, char no) 078 { 079 080 if(sample == null || sample.length == 0 || width <= 0 || height <= 0) 081 return new char[0][0]; 082 char[][] map = new char[width][height]; 083 for (int x = 0, idx = 0; x < width; x++) { 084 for (int y = 0; y < height; y++) { 085 map[x][y] = sample[idx++] ? yes : no; 086 if(idx >= sample.length) 087 return map; 088 } 089 } 090 return map; 091 } 092 093 /** 094 * Runs a logical OR on each pair of booleans at the same position in left and right, and returns the result of all 095 * the OR operations as a 2D boolean array (using the minimum dimensions shared between left and right). 096 * @param left a 2D boolean array 097 * @param right another 2D boolean array 098 * @return the 2D array resulting from a logical OR on each pair of booleans at a point shared by left and right 099 */ 100 public static boolean[][] orSamples(boolean[][] left, boolean[][] right) 101 { 102 if(left == null && right == null) return new boolean[0][0]; 103 else if(left == null || left.length <= 0) return ArrayTools.copy(right); 104 else if(right == null || right.length <= 0) return ArrayTools.copy(left); 105 106 int width = Math.min(left.length, right.length), 107 height = Math.min(left[0].length, right[0].length); 108 boolean[][] done = new boolean[width][height]; 109 for (int x = 0; x < width; x++) { 110 for (int y = 0; y < height; y++) { 111 done[x][y] = left[x][y] || right[x][y]; 112 } 113 } 114 return done; 115 } 116 117 118 /** 119 * Runs a logical AND on each pair of booleans at the same position in left and right, and returns the result of all 120 * the AND operations as a 2D boolean array (using the minimum dimensions shared between left and right). 121 * @param left a 2D boolean array 122 * @param right another 2D boolean array 123 * @return the 2D array resulting from a logical AND on each pair of booleans at a point shared by left and right 124 */ 125 public static boolean[][] andSamples(boolean[][] left, boolean[][] right) 126 { 127 if(left == null || right == null || left.length <= 0 || right.length <= 0) return new boolean[0][0]; 128 129 int width = Math.min(left.length, right.length), 130 height = Math.min(left[0].length, right[0].length); 131 boolean[][] done = new boolean[width][height]; 132 for (int x = 0; x < width; x++) { 133 for (int y = 0; y < height; y++) { 134 done[x][y] = left[x][y] && right[x][y]; 135 } 136 } 137 return done; 138 } 139 140 /** 141 * Given a 2D boolean array sample (usually a final product of this class' fill() method) and an Iterable of Coord 142 * (such as a List or Set of Coord, but a Region can also work), copies sample, then marks every Coord in points as 143 * true if it is in-bounds, and returns the modified copy of sample. Does not alter the original sample. You may 144 * want to use this with techniques like drawing a long line with Bresenham, OrthoLine, or WobblyLine, potentially 145 * widening the line with Radius.expand(), and then passing the result as the Iterable of Coord. You could then make 146 * the start and end of the line into an entrance and exit and be sure the player can get from one to the other 147 * (except for Bresenham and other lines that may make diagonal movements, if the player cannot move diagonally). 148 * @param sample a 2D boolean array; will be copied, not modified directly 149 * @param points an Iterable (such as a List or Set) of Coord that will be marked as true if in-bounds 150 * @return a copy of sample with the Coords in points marked as true 151 */ 152 public static boolean[][] markSample(boolean[][] sample, Iterable<Coord> points) 153 { 154 if(sample == null || sample.length <= 0) 155 return new boolean[0][0]; 156 boolean[][] sample2 = ArrayTools.copy(sample); 157 int width = sample2.length, height = sample2[0].length; 158 for(Coord c : points) 159 { 160 if(c.x >= 0 && c.x < width && c.y >= 0 && c.y < height) 161 { 162 sample2[c.x][c.y] = true; 163 } 164 } 165 return sample2; 166 } 167 168 /* 169 public static boolean[][] fill(boolean[][] sample, int size, double temperature, int iterations, RNG random) { 170 boolean[][] field = new boolean[size][size]; 171 double[] weights = new double[1 << (N * N)]; 172 173 for (int x = 0; x < sample.length; x++) { 174 for (int y = 0; y < sample[x].length; y++) { 175 Pattern[] p = new Pattern[8]; 176 177 p[0] = new Pattern(sample, x, y, N); 178 p[1] = p[0].rotate(); 179 p[2] = p[1].rotate(); 180 p[3] = p[2].rotate(); 181 p[4] = p[0].reflect(); 182 p[5] = p[1].reflect(); 183 p[6] = p[2].reflect(); 184 p[7] = p[3].reflect(); 185 186 for (int k = 0; k < 8; k++) { 187 weights[p[k].index()]++; 188 } 189 } 190 } 191 192 for (int k = 0; k < weights.length; k++) { 193 if (weights[k] <= 0) 194 weights[k] = 0.1; 195 } 196 for (int y = 0; y < size; y++) { 197 for (int x = 0; x < size; x++) { 198 field[x][y] = random.nextBoolean(); 199 } 200 } 201 202 int i, j; 203 double p, q; 204 for (int k = 0; k < iterations * size * size; k++) { 205 i = random.nextInt(size); 206 j = random.nextInt(size); 207 208 p = 1.0; 209 for (int y = j - N + 1; y <= j + N - 1; y++) 210 for (int x = i - N + 1; x <= i + N - 1; x++) p *= weights[Pattern.index(field, x, y, N)]; 211 212 field[i][j] = !field[i][j]; 213 214 q = 1.0; 215 for (int y = j - N + 1; y <= j + N - 1; y++) 216 for (int x = i - N + 1; x <= i + N - 1; x++) q *= weights[Pattern.index(field, x, y, N)]; 217 218 219 if (Math.pow(q / p, 1.0 / temperature) < random.nextDouble()) 220 field[i][j] = !field[i][j]; 221 } 222 return field; 223 } 224 */ 225 /** 226 * The main part of MimicFill; generates a 2D boolean array that mimics the patterns present in the 2D boolean array 227 * sample, but can produce a larger or smaller output 2D array than the sample. 228 * Takes a 2D boolean array as a "sample" (often one of the constants in this class), a size parameter for the 229 * generated square data (same width and height) and several other parameters that affect how closely the output 230 * will match the input. The temperature is how "agitated" or "chaotic" the changes to the map can be; 0.2 is 231 * definitely recommended for map-like data but other values (between 0 and 1, both exclusive) may be better fits 232 * for certain kinds of output. The iterations parameter should usually be between 3 and 5, with higher values 233 * taking longer but fitting more closely; values over 5 are barely different from 5 here. This also takes an RNG, 234 * and because it queries it very frequently, a fast RNG is ideal; the default RandomnessSource used by RNG 235 * ({@link squidpony.squidmath.DiverRNG}) is fine, and in most cases {@link squidpony.squidmath.MiniMover64RNG} will 236 * be reasonably good for quality while probably being slightly faster. On GWT, {@link squidpony.squidmath.GWTRNG} 237 * is a good choice due to how few operations on {@code long} values it needs to do, and GWT has a hard time with 238 * longs; the algorithm used by GWTRNG can also produce all but one possible long value. 239 * @param sample a 2D boolean array to mimic visually; you can use mapToSample() if you have a 2D char array 240 * @param size the side length of the square boolean array to generate 241 * @param temperature typically 0.2 works well for this, but other numbers between 0 and 1 may work 242 * @param iterations typically 3-5 works well for this; lower numbers may have slight problems with quality, 243 * and higher numbers make this slightly slower 244 * @param random an RNG to use for the random components of this technique 245 * @return a new 2D boolean array, width = size, height = size, mimicking the visual style of sample 246 */ 247 public static boolean[][] fill(boolean[][] sample, int size, double temperature, int iterations, IRNG random) 248 { 249 boolean[][] field = new boolean[size][size]; 250 double[] weights = new double[1 << (N * N)]; 251 for (int x = 0; x < sample.length; x++) { 252 for (int y = 0; y < sample[x].length; y++) { 253 weights[Pattern.index(sample, x, y, N, false, false, false)]++; 254 weights[Pattern.index(sample, x, y, N, false, true, true)]++; 255 weights[Pattern.index(sample, x, y, N, true, true, false)]++; 256 weights[Pattern.index(sample, x, y, N, true, false, true)]++; 257 weights[Pattern.index(sample, x, y, N, true, false, false)]++; 258 weights[Pattern.index(sample, x, y, N, true, true, true)]++; 259 weights[Pattern.index(sample, x, y, N, false, true, false)]++; 260 weights[Pattern.index(sample, x, y, N, false, false, true)]++; 261 } 262 } 263 264 for (int k = 0; k < weights.length; k++) 265 { 266 if (weights[k] <= 0) 267 weights[k] = 0.1; 268 } 269 long randomBits; 270 for (int o = (size * size) + 63 >> 6, x = 0, y = 0; o > 0; o--) { 271 randomBits = random.nextLong(); 272 for (long a = 1; a != 0; a <<= 1) { 273 field[x][y++] = (randomBits & a) == 0; 274 if(y >= size) 275 { 276 if(++x >= size) break; 277 y = 0; 278 } 279 } 280 } 281 /* 282 for (int x = 0; x < size; x++) { 283 for (int y = 0; y < size; y++) { 284 field[x][y] = random.nextBoolean(); 285 } 286 }*/ 287 for (int k = 0; k < iterations * size * size; k++) 288 { 289 int x = random.nextInt(size), y = random.nextInt(size); 290 291 double q = 1; 292 for (int sy = y - N + 1; sy <= y + N - 1; sy++) 293 { 294 for (int sx = x - N + 1; sx <= x + N - 1; sx++) 295 { 296 int ind = 0, difference = 0; 297 for (int dy = 0; dy < N; dy++) 298 { 299 for (int dx = 0; dx < N; dx++) 300 { 301 int X = sx + dx; 302 if (X < 0) X += size; 303 else if (X >= size) X -= size; 304 305 int Y = sy + dy; 306 if (Y < 0) Y += size; 307 else if (Y >= size) Y -= size; 308 309 boolean value = field[X][Y]; 310 int power = 1 << (dy * N + dx); 311 ind += value ? power : 0; 312 if (X == x && Y == y) difference = value ? power : -power; 313 } 314 } 315 316 q *= weights[ind - difference] / weights[ind]; 317 } 318 } 319 320 if (q >= 1) { field[x][y] ^= true; continue; } 321 if (temperature != 1) q = Math.pow(q, 1.0 / temperature); 322 field[x][y] ^= (q > random.nextDouble()); 323 } 324 325 return field; 326 } 327 328 /** 329 * The main part of MimicFill; generates a 1D boolean array that, when used correctly, mimics the patterns present 330 * in the 2D boolean array sample, but can produce a larger or smaller output 1D array than the sample. Using the 331 * output correctly mostly involves passing the 1D boolean array with the correct width and height settings to 332 * {@link #sampleToMap(boolean[], int, int, char, char)} to get a 2D char array or producing a GreasedRegion with it 333 * using {@link squidpony.squidmath.GreasedRegion#GreasedRegion(boolean[], int, int)}. Both the width and height 334 * used to interpret the 1D array as a 2D array should be equal to the size parameter passed here. The main reason 335 * you would prefer this method over {@link #fill(boolean[][], int, double, int, IRNG)} is that this overload is 336 * somewhat faster due to slightly less-frequent RNG calls and a lot less nested array reading and writing. 337 * <br> 338 * Takes a 2D boolean array as a "sample" (often one of the constants in this class), a size parameter for the 339 * generated square data (same width and height) and several other parameters that affect how closely the output 340 * will match the input. The temperature is how "agitated" or "chaotic" the changes to the map can be; 0.2 is 341 * definitely recommended for map-like data but other values (between 0 and 1, both exclusive) may be better fits 342 * for certain kinds of output. The iterations parameter should usually be between 3 and 5, with higher values 343 * taking longer but fitting more closely; values over 5 are barely different from 5 here. This also takes an RNG, 344 * and because it queries it very frequently, a fast RNG is ideal; the default RandomnessSource used by RNG 345 * ({@link squidpony.squidmath.DiverRNG}) is fine, and in most cases {@link squidpony.squidmath.MiniMover64RNG} will 346 * be reasonably good for quality while probably being slightly faster. On GWT, {@link squidpony.squidmath.GWTRNG} 347 * is a good choice due to how few operations on {@code long} values it needs to do, and GWT has a hard time with 348 * longs; the algorithm used by GWTRNG can also produce all but one possible long value. 349 * @param sample a 2D boolean array to mimic visually; you can use mapToSample() if you have a 2D char array 350 * @param size the side length of the square boolean array to generate 351 * @param temperature typically 0.2 works well for this, but other numbers between 0 and 1 may work 352 * @param iterations typically 3-5 works well for this; lower numbers may have slight problems with quality, 353 * and higher numbers make this slightly slower 354 * @param random an RNG to use for the random components of this technique 355 * @return a new 1D boolean array, length = size * size, mimicking the visual style of sample when used as 2D data 356 */ 357 public static boolean[] fillSolo(boolean[][] sample, int size, double temperature, int iterations, IRNG random) 358 { 359 int fieldLen = size*size; 360 boolean[] field = new boolean[fieldLen]; 361 double[] weights = new double[1 << (N * N)]; 362 for (int x = 0; x < sample.length; x++) { 363 for (int y = 0; y < sample[x].length; y++) { 364 weights[Pattern.index(sample, x, y, N, false, false, false)]++; 365 weights[Pattern.index(sample, x, y, N, false, true, true)]++; 366 weights[Pattern.index(sample, x, y, N, true, true, false)]++; 367 weights[Pattern.index(sample, x, y, N, true, false, true)]++; 368 weights[Pattern.index(sample, x, y, N, true, false, false)]++; 369 weights[Pattern.index(sample, x, y, N, true, true, true)]++; 370 weights[Pattern.index(sample, x, y, N, false, true, false)]++; 371 weights[Pattern.index(sample, x, y, N, false, false, true)]++; 372 } 373 } 374 375 for (int k = 0; k < weights.length; k++) 376 { 377 if (weights[k] <= 0) 378 weights[k] = 0.1; 379 } 380 long randomBits; 381 for (int o = fieldLen + 63 >> 6, idx = 0; o > 0; o--) { 382 randomBits = random.nextLong(); 383 for (long a = 1; a != 0; a <<= 1) { 384 field[idx++] = (randomBits & a) == 0; 385 } 386 } 387 for (int k = 0; k < iterations * fieldLen; k++) 388 { 389 final int r = random.nextInt(fieldLen); 390 final int x = r % size, y = r / size; 391 392 393 double q = 1; 394 for (int sy = y - N + 1; sy <= y + N - 1; sy++) 395 { 396 for (int sx = x - N + 1; sx <= x + N - 1; sx++) 397 { 398 int ind = 0, difference = 0; 399 for (int dy = 0; dy < N; dy++) 400 { 401 for (int dx = 0; dx < N; dx++) 402 { 403 int X = sx + dx; 404 if (X < 0) X += size; 405 else if (X >= size) X -= size; 406 407 int Y = sy + dy; 408 if (Y < 0) Y += size; 409 else if (Y >= size) Y -= size; 410 411 boolean value = field[X + size * Y]; 412 int power = 1 << (dy * N + dx); 413 ind += value ? power : 0; 414 if (X == x && Y == y) difference = value ? power : -power; 415 } 416 } 417 418 q *= weights[ind - difference] / weights[ind]; 419 } 420 } 421 422 if (q >= 1) { field[r] ^= true; continue; } 423 if (temperature != 1) q = Math.pow(q, 1.0 / temperature); 424 field[r] ^= q > random.nextDouble(); 425 } 426 427 return field; 428 } 429 private static class Pattern { 430 public boolean[][] data; 431 432 433 Pattern(boolean[][] exact) { 434 data = exact; 435 } 436 437 Pattern(boolean[][] field, int x, int y, int size) { 438 data = new boolean[size][size]; 439 for (int i = 0; i < size; i++) { 440 for (int j = 0; j < size; j++) { 441 data[i][j] = 442 field[(x + i + field.length) % field.length][(y + j + field[0].length) % field[0].length]; 443 } 444 } 445 } 446 447 Pattern rotate() { 448 boolean[][] next = new boolean[data.length][data.length]; 449 for (int x = 0; x < data.length; x++) { 450 for (int y = 0; y < data.length; y++) { 451 next[data.length - 1 - y][x] = data[x][y]; 452 } 453 } 454 return new Pattern(next); 455 } 456 457 Pattern reflect() { 458 boolean[][] next = new boolean[data.length][data.length]; 459 for (int x = 0; x < data.length; x++) { 460 System.arraycopy(data[x], 0, next[data.length - 1 - x], 0, data.length); 461 } 462 return new Pattern(next); 463 } 464 465 int index() { 466 int result = 0, power = 1; 467 for (int y = 0; y < data.length; y++) { 468 for (int x = 0; x < data.length; x++) { 469 result += data[data.length - 1 - x][data.length - 1 - y] ? power : 0; 470 power <<= 1; 471 } 472 } 473 return result; 474 } 475 476 static int index(boolean[][] field, int x, int y, int size) { 477 int result = 0; 478 for (int i = 0; i < size; i++) { 479 for (int j = 0; j < size; j++) { 480 if (field[(x + i + field.length) % field.length][(y + j + field[0].length) % field[0].length]) 481 result += 1 << (j * size + i); 482 } 483 } 484 return result; 485 } 486 487 static int index(boolean[][] field, int x, int y, int size, boolean flipX, boolean flipY, boolean swap) { 488 int result = 0; 489 int width = field.length, height = field[0].length; 490 if(swap) 491 { 492 for (int i = 0; i < size; i++) { 493 for (int j = 0; j < size; j++) { 494 if(field[(height * 2 + (flipY ? -(y + j) : (y + j))) % height] 495 [(width * 2 + (flipX ? -(x + i) : (x + i))) % width]) 496 result += 1 << (j * size + i); 497 } 498 } 499 } 500 else 501 { 502 for (int i = 0; i < size; i++) { 503 for (int j = 0; j < size; j++) { 504 if(field[(width * 2 + (flipX ? -(x + i) : (x + i))) % width] 505 [(height * 2 + (flipY ? -(y + j) : (y + j))) % height]) 506 result += 1 << (j * size + i); 507 } 508 } 509 } 510 return result; 511 } 512 } 513 514 /** 515 * Predefined sample; many small separate squares. 516 */ 517 public static final boolean[][] boulders = new boolean[][]{ 518 new boolean[]{true,true,true,true,true,true,true,true,true,true,true,false,false,true,true,true}, 519 new boolean[]{true,true,false,false,true,true,false,false,true,true,true,false,false,true,true,true}, 520 new boolean[]{true,true,false,false,true,true,false,false,true,true,true,true,true,true,true,true}, 521 new boolean[]{true,true,true,true,true,true,true,true,true,false,false,true,true,false,false,true}, 522 new boolean[]{true,true,true,false,false,true,false,false,true,false,false,true,true,false,false,true}, 523 new boolean[]{true,true,true,false,false,true,false,false,true,true,true,true,true,true,true,true}, 524 new boolean[]{false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true}, 525 new boolean[]{false,false,true,true,false,false,true,false,false,true,true,true,true,true,true,true}, 526 new boolean[]{true,true,true,true,false,false,true,false,false,true,true,true,false,false,true,true}, 527 new boolean[]{true,false,false,true,true,true,true,true,true,true,true,true,false,false,true,true}, 528 new boolean[]{true,false,false,true,false,false,true,true,true,true,true,true,true,true,true,true}, 529 new boolean[]{true,true,true,true,false,false,true,true,true,false,false,true,true,true,true,true}, 530 new boolean[]{true,true,true,true,true,true,true,true,true,false,false,true,false,false,true,true}, 531 new boolean[]{true,false,false,true,true,true,false,false,true,true,true,true,false,false,true,true}, 532 new boolean[]{true,false,false,true,true,true,false,false,true,true,true,true,true,true,true,true}, 533 new boolean[]{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true} 534 }; 535 536 /** 537 * Predefined sample; a large, enclosed, organic space that usually makes large cave-like rooms, 538 */ 539 public static final boolean[][] cave = new boolean[][]{ 540 new boolean[]{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 541 new boolean[]{false, false, false, false, true, false, false, false, false, true, false, false, false, false, false, false}, 542 new boolean[]{false, false, false, true, true, true, false, false, true, true, true, true, true, true, false, false}, 543 new boolean[]{false, false, true, true, true, true, true, true, true, true, true, true, false, false, false, false}, 544 new boolean[]{false, false, true, true, true, true, true, true, true, true, true, true, true, true, false, false}, 545 new boolean[]{false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, false}, 546 new boolean[]{false, false, false, true, true, true, true, true, true, true, true, true, true, false, false, false}, 547 new boolean[]{false, false, false, false, true, true, true, true, true, true, true, true, false, false, false, false}, 548 new boolean[]{false, false, false, false, true, true, true, true, true, true, true, true, true, false, false, false}, 549 new boolean[]{false, false, false, true, true, true, true, true, true, true, true, true, true, true, false, false}, 550 new boolean[]{false, false, true, true, true, true, true, true, true, true, true, true, true, true, false, false}, 551 new boolean[]{false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, false}, 552 new boolean[]{false, false, false, true, true, true, true, true, false, false, true, true, true, true, true, false}, 553 new boolean[]{false, false, false, false, true, true, true, false, false, false, false, true, true, false, false, false}, 554 new boolean[]{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, 555 new boolean[]{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false} 556 }; 557 558 /** 559 * Predefined sample; several medium-sized organic spaces that usually make tight, chaotic tunnels. 560 */ 561 public static final boolean[][] caves = new boolean[][]{ 562 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false}, 563 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,true,true,false,false,false}, 564 new boolean[]{false,false,true,true,true,false,false,false,false,false,false,true,true,false,false,false}, 565 new boolean[]{false,true,true,true,true,true,false,false,false,false,true,true,true,true,false,false}, 566 new boolean[]{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false}, 567 new boolean[]{true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true}, 568 new boolean[]{false,false,true,true,true,true,true,false,false,false,true,true,true,true,false,false}, 569 new boolean[]{false,false,false,true,true,true,false,false,false,false,false,true,true,false,false,false}, 570 new boolean[]{false,false,false,false,true,true,false,false,false,false,false,true,false,false,false,false}, 571 new boolean[]{false,false,false,false,true,false,false,false,false,false,true,true,true,false,false,false}, 572 new boolean[]{false,false,true,true,true,true,false,false,false,true,true,true,true,true,false,false}, 573 new boolean[]{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false}, 574 new boolean[]{true,true,true,true,true,true,true,false,false,true,true,true,true,true,true,true}, 575 new boolean[]{false,true,true,true,true,true,false,false,false,true,true,true,true,true,false,false}, 576 new boolean[]{false,false,true,true,true,true,false,false,false,false,true,true,true,true,false,false}, 577 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false} 578 }; 579 580 /** 581 * Predefined sample; a checkerboard pattern that typically loses recognition as such after generation. 582 */ 583 public static final boolean[][] chess = new boolean[][]{ 584 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 585 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 586 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 587 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 588 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 589 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 590 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 591 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 592 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 593 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 594 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 595 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 596 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 597 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true}, 598 new boolean[]{true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false}, 599 new boolean[]{false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true} 600 }; 601 602 /** 603 * Predefined sample; produces rectangular rooms with small corridors between them. 604 */ 605 public static final boolean[][] lessRooms = new boolean[][]{ 606 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false}, 607 new boolean[]{false,false,false,true,false,false,false,false,false,true,true,true,true,true,true,false}, 608 new boolean[]{false,false,false,true,false,false,false,false,false,true,true,true,true,true,true,false}, 609 new boolean[]{false,false,false,true,false,false,false,false,false,true,true,true,true,true,true,false}, 610 new boolean[]{false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false}, 611 new boolean[]{true,true,true,false,false,false,false,false,false,true,true,true,true,true,true,true}, 612 new boolean[]{false,false,true,false,false,false,false,false,false,true,true,true,true,true,true,false}, 613 new boolean[]{false,false,true,false,false,false,false,false,false,true,true,true,true,true,true,false}, 614 new boolean[]{false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false}, 615 new boolean[]{false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false}, 616 new boolean[]{false,false,true,true,true,true,true,true,false,false,false,true,false,false,false,false}, 617 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,true,true,true,true,true}, 618 new boolean[]{false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,false}, 619 new boolean[]{false,false,true,true,true,true,true,true,false,false,false,false,true,false,false,false}, 620 new boolean[]{false,false,true,true,true,true,true,true,false,false,false,false,true,false,false,false}, 621 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false} 622 }; 623 624 /** 625 * Predefined sample; produces a suitable filler for a maze (but it is unlikely to connect both ends like a maze). 626 */ 627 public static final boolean[][] maze = new boolean[][]{ 628 new boolean[]{true,true,true,true,true,false,false,false,false,true,true,true,false,true,true,false}, 629 new boolean[]{true,false,false,false,true,false,true,true,false,true,false,false,false,false,false,false}, 630 new boolean[]{true,false,true,true,true,false,true,false,false,false,false,true,true,true,false,true}, 631 new boolean[]{true,false,false,false,false,false,true,false,true,true,true,true,false,true,false,false}, 632 new boolean[]{true,true,true,false,true,true,true,false,false,false,false,true,false,false,false,true}, 633 new boolean[]{false,false,false,false,false,false,true,true,true,true,false,true,false,true,false,false}, 634 new boolean[]{true,true,true,true,true,false,true,true,false,true,false,true,false,true,false,true}, 635 new boolean[]{false,false,false,false,false,false,true,true,false,true,true,true,false,true,false,true}, 636 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,false,false,true,false,false}, 637 new boolean[]{false,false,false,true,false,false,false,true,true,false,true,true,true,true,false,true}, 638 new boolean[]{true,true,false,true,false,true,true,true,false,false,false,false,false,false,false,false}, 639 new boolean[]{true,false,false,true,false,true,false,true,false,true,true,false,true,false,true,true}, 640 new boolean[]{true,true,true,true,false,false,false,true,false,false,true,false,true,false,false,true}, 641 new boolean[]{false,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false}, 642 new boolean[]{true,false,false,false,false,false,false,false,false,true,true,false,false,true,true,false}, 643 new boolean[]{true,true,true,true,true,true,true,true,false,true,true,true,false,true,true,false} 644 }; 645 646 /** 647 * Predefined sample; produces weird, large areas of "true" and "false" that suddenly change to the other. 648 */ 649 public static final boolean[][] quarterBlack = new boolean[][]{ 650 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 651 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 652 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 653 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 654 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 655 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 656 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 657 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 658 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 659 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 660 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 661 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 662 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 663 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 664 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 665 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true} 666 }; 667 668 /** 669 * Predefined sample; produces multiple directions of flowing, river-like shapes made of "false". 670 */ 671 public static final boolean[][] river = new boolean[][]{ 672 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true}, 673 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true}, 674 new boolean[]{true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true}, 675 new boolean[]{true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true}, 676 new boolean[]{true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true}, 677 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,true,true,true,true,true}, 678 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,true,true,true,true,true}, 679 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,true,true,true,true,true}, 680 new boolean[]{true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true}, 681 new boolean[]{true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true}, 682 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true}, 683 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true}, 684 new boolean[]{true,true,true,true,true,false,false,false,true,true,true,true,true,true,true,true}, 685 new boolean[]{true,true,true,true,true,false,false,false,true,true,true,true,true,true,true,true}, 686 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true}, 687 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true} 688 }; 689 690 /** 691 * Predefined sample; produces rectangular rooms with a dense packing. 692 */ 693 public static final boolean[][] rooms = new boolean[][]{ 694 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false}, 695 new boolean[]{false,false,false,true,false,false,false,false,false,true,true,true,true,true,true,false}, 696 new boolean[]{false,true,true,true,true,true,false,false,false,true,true,true,true,true,true,false}, 697 new boolean[]{false,true,true,true,true,true,false,false,false,true,true,true,true,true,true,false}, 698 new boolean[]{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false}, 699 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true}, 700 new boolean[]{false,true,true,true,true,true,false,false,false,true,true,true,true,true,true,false}, 701 new boolean[]{false,false,true,false,false,false,false,false,false,true,true,true,true,true,true,false}, 702 new boolean[]{false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false}, 703 new boolean[]{false,false,true,false,false,false,false,false,false,false,false,true,false,false,false,false}, 704 new boolean[]{false,false,true,true,true,true,true,true,false,false,true,true,true,true,false,false}, 705 new boolean[]{true,true,true,true,true,true,true,true,false,false,true,true,true,true,true,true}, 706 new boolean[]{false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,false}, 707 new boolean[]{false,false,true,true,true,true,true,true,false,false,true,true,true,true,false,false}, 708 new boolean[]{false,false,true,true,true,true,true,true,false,false,false,false,true,false,false,false}, 709 new boolean[]{false,false,false,true,false,false,false,false,false,false,false,false,true,false,false,false} 710 }; 711 712 /** 713 * Predefined sample; produces an uncanny imitation of a maze with a tiny sample size. 714 */ 715 public static final boolean[][] simpleMaze = new boolean[][]{ 716 new boolean[]{true,true,true,true}, 717 new boolean[]{true,false,false,false}, 718 new boolean[]{true,false,true,false}, 719 new boolean[]{true,false,false,false} 720 }; 721 722 /** 723 * Predefined sample; produces mostly rectangular rooms with very few corridor-like areas. 724 */ 725 public static final boolean[][] simpleRooms = new boolean[][]{ 726 new boolean[]{false,false,false,false,false,true,false,false,false,false,false}, 727 new boolean[]{false,false,false,false,false,true,false,false,false,false,false}, 728 new boolean[]{false,false,true,true,true,true,true,true,true,false,false}, 729 new boolean[]{false,false,true,true,true,true,true,true,true,false,false}, 730 new boolean[]{false,false,true,true,true,true,true,true,true,false,false}, 731 new boolean[]{true,true,true,true,true,true,true,true,true,true,true}, 732 new boolean[]{false,false,true,true,true,true,true,true,true,false,false}, 733 new boolean[]{false,false,true,true,true,true,true,true,true,false,false}, 734 new boolean[]{false,false,true,true,true,true,true,true,true,false,false}, 735 new boolean[]{false,false,false,false,false,true,false,false,false,false,false}, 736 new boolean[]{false,false,false,false,false,true,false,false,false,false,false} 737 }; 738 739 /** 740 * Predefined sample; produces largely rectangular rooms with a good amount of thin corridors. 741 */ 742 public static final boolean[][] thickWalls = new boolean[][]{ 743 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 744 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 745 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 746 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 747 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,false,false,false,false}, 748 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,false,false,false,false}, 749 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,false,false,false,false}, 750 new boolean[]{true,true,true,true,true,true,true,true,true,true,true,true,true,true,true}, 751 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,false,false,false,false}, 752 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,false,false,false,false}, 753 new boolean[]{false,false,false,false,true,true,true,true,true,true,true,false,false,false,false}, 754 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 755 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 756 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false}, 757 new boolean[]{false,false,false,false,false,false,false,true,false,false,false,false,false,false,false} 758 }; 759 760 public static final boolean[][] ruins = new boolean[][]{ 761 new boolean[]{false,true,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true}, 762 new boolean[]{false,true,false,false,false,false,false,true,true,false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true}, 763 new boolean[]{false,true,false,false,false,false,false,false,true,false,false,false,false,false,false,true,true,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true}, 764 new boolean[]{false,true,true,true,true,true,false,false,true,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,false,true,false,false,true}, 765 new boolean[]{false,true,true,true,true,true,true,false,true,false,false,false,false,false,false,true,false,false,false,true,false,false,false,false,true,true,true,true,true,false,false,true}, 766 new boolean[]{false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,true,false,false,false,true,true,true,true,true,true,false,false,true}, 767 new boolean[]{true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true}, 768 new boolean[]{false,true,false,false,true,true,true,true,true,true,true,false,false,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,false,false,false,false}, 769 new boolean[]{false,true,false,false,false,false,false,false,false,false,true,true,false,true,true,true,true,true,true,false,false,false,false,false,false,false,true,true,false,false,false,false}, 770 new boolean[]{false,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,false,false,false,false}, 771 new boolean[]{true,true,true,false,false,false,true,true,true,true,true,true,true,true,false,false,true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true}, 772 new boolean[]{true,true,true,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true,false,false,false,false}, 773 new boolean[]{true,true,true,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,true,true,false,false,false,false,false,true,true,true,false,false,false,false}, 774 new boolean[]{true,true,true,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,false,true,false,false,false,false,false,false,false,true,false,false,true,true}, 775 new boolean[]{false,false,false,false,false,false,false,true,true,true,true,false,true,false,false,true,false,false,false,true,false,false,false,false,false,false,false,true,true,true,true,true}, 776 new boolean[]{false,false,false,false,false,false,false,false,false,true,false,false,true,false,false,true,false,false,false,true,false,false,false,false,false,false,true,true,false,false,false,false}, 777 new boolean[]{false,false,false,false,false,false,false,false,false,true,false,true,true,false,false,true,false,false,false,true,true,true,true,true,true,true,true,true,false,false,false,false}, 778 new boolean[]{false,false,false,false,true,false,false,false,false,true,false,false,true,false,false,true,false,false,false,true,true,true,false,true,true,true,true,true,false,false,false,false}, 779 new boolean[]{false,false,false,true,true,false,false,false,false,true,false,false,true,false,false,true,true,false,false,false,true,true,false,true,false,false,true,false,false,false,false,false}, 780 new boolean[]{false,false,false,true,true,false,false,false,false,true,false,false,true,false,false,true,true,false,false,false,false,true,false,true,false,false,true,false,false,false,false,false}, 781 new boolean[]{false,false,false,false,true,false,false,true,false,true,false,false,true,false,false,false,true,false,false,false,false,true,false,true,false,false,true,false,false,false,true,false}, 782 new boolean[]{false,true,false,false,true,true,true,true,true,true,true,false,true,false,false,false,true,false,false,false,false,true,false,true,true,true,true,false,false,false,true,false}, 783 new boolean[]{true,true,true,true,true,true,true,false,false,true,false,false,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,true}, 784 new boolean[]{true,true,true,true,true,true,true,true,false,true,false,false,true,false,false,false,true,true,true,true,true,true,false,false,false,false,false,true,true,true,true,true}, 785 new boolean[]{false,false,false,false,false,false,true,false,false,true,false,false,true,false,false,false,false,true,false,false,true,true,false,false,false,false,false,false,false,false,false,false}, 786 new boolean[]{false,false,false,false,false,false,true,false,false,true,true,true,true,true,false,false,false,false,false,false,true,true,false,false,false,false,true,true,true,false,false,false}, 787 new boolean[]{false,false,false,false,false,false,true,false,false,false,false,true,true,true,false,false,false,false,false,false,true,true,false,false,false,false,true,true,true,false,false,false}, 788 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,true,true,true,false,false,false,false,false,false,true,true,true,false,false,false,true,true,true,true,true,true}, 789 new boolean[]{false,false,false,false,false,false,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,false,false,true,false}, 790 new boolean[]{false,false,false,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,true,true,true,false,false,false}, 791 new boolean[]{false,false,false,false,false,false,false,true,true,false,false,false,false,false,false,false,false,false,true,false,false,false,false,false,false,false,true,true,true,false,false,false}, 792 new boolean[]{false,true,false,false,false,false,false,true,true,false,false,false,false,false,false,true,true,true,true,false,false,false,false,false,true,true,true,true,true,true,true,true}, 793 }; 794 795 public static final boolean[][] openRooms = new boolean[][]{ 796 new boolean[]{true,true,true,true,true,true,false,true,true,true,true,true,true,false,true,true,true,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true}, 797 new boolean[]{true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true}, 798 new boolean[]{true,true,true,true,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,true}, 799 new boolean[]{true,true,true,true,false,false,false,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true,false,true,true,false,true,true,true,false,true,true}, 800 new boolean[]{true,true,false,false,false,false,false,true,true,true,true,false,true,true,true,true,true,false,false,false,false,false,false,true,true,false,true,true,true,false,true,true}, 801 new boolean[]{true,true,true,true,true,false,false,false,false,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,true,true,true,false,false,false}, 802 new boolean[]{true,true,true,true,true,false,false,false,false,true,true,false,false,false,false,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,false,false}, 803 new boolean[]{true,true,true,true,true,false,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,false,false,false,false,false,false,true,true,false,false}, 804 new boolean[]{true,true,true,true,true,false,true,true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,false,true,true,true,true,false,false,false,false,false}, 805 new boolean[]{true,true,true,true,true,false,true,true,false,false,true,true,true,true,false,false,false,true,true,true,true,true,false,true,true,true,true,false,false,false,false,false}, 806 new boolean[]{true,true,true,true,true,false,true,true,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,true,true,true,true,false,false,false,false,false}, 807 new boolean[]{true,true,true,true,true,false,true,true,false,false,false,false,false,true,true,true,true,true,true,true,true,true,false,true,true,true,true,false,false,false,false,false}, 808 new boolean[]{false,false,false,false,false,false,true,true,false,true,true,true,false,false,false,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,false,false}, 809 new boolean[]{true,true,true,true,true,true,true,true,false,true,true,true,false,false,false,false,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true}, 810 new boolean[]{true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,false,false,false,false,false,true,true,false,true,true,true,true,true,true,true,true,true}, 811 new boolean[]{false,true,true,true,true,true,false,false,false,true,true,true,true,true,true,false,false,false,false,false,true,true,false,false,false,false,false,false,false,true,true,false}, 812 new boolean[]{false,true,true,false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,false}, 813 new boolean[]{false,true,true,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,true,true,true,true,true,true,true,true,false}, 814 new boolean[]{false,true,true,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,false,true,true,true,true,true,true,true,true,false}, 815 new boolean[]{false,false,false,false,false,true,true,true,true,true,true,true,false,true,true,true,true,true,false,true,true,true,false,true,true,true,true,true,true,true,true,false}, 816 new boolean[]{true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,false,false,false,false,false,true,true,true,true,true,true,true,true,false}, 817 new boolean[]{true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false}, 818 new boolean[]{true,true,true,true,true,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false}, 819 new boolean[]{true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,true,true,true,true}, 820 new boolean[]{true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,false,true,true,true,true,true,true,false,false,false,true,true,true,true}, 821 new boolean[]{true,true,true,true,true,true,true,true,true,false,false,false,false,true,true,true,true,true,false,true,true,true,false,false,false,false,false,false,true,true,true,true}, 822 new boolean[]{true,true,true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,false,true,true,true,false,true,true,true,true,false,true,true,true,true}, 823 new boolean[]{true,true,true,true,true,true,true,false,false,false,true,true,true,true,true,true,true,true,false,true,true,true,false,true,true,true,true,false,false,false,true,true}, 824 new boolean[]{true,false,false,false,false,false,false,false,false,false,true,true,true,true,true,true,true,true,false,false,false,false,false,true,true,true,true,false,false,false,true,true}, 825 new boolean[]{true,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,false,false,false,false,false,false,false,false,false,false,true,true}, 826 new boolean[]{true,false,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true}, 827 new boolean[]{true,false,false,false,false,false,false,true,true,true,true,true,true,false,false,false,false,false,true,true,false,false,true,true,true,true,true,true,true,true,true,true}, 828 }; 829 830 public static final boolean[][][] samples = new boolean[][][]{ 831 boulders, cave, caves, chess, lessRooms, maze, quarterBlack, 832 river, rooms, simpleMaze, simpleRooms, thickWalls, ruins, openRooms 833 }; 834 835 /* 836 // this would throw an ArrayIndexOutOfBoundsException before a fix added after beta 8 837 public static void main(String[] args) { 838 boolean[][] binarySample = new boolean[20][20]; 839 int length = 100; 840 boolean[][] binaryOut = MimicFill.fill(binarySample, length, .01, 5, new RNG()); 841 squidpony.squidgrid.mapping.DungeonUtility.debugPrint( 842 squidpony.squidgrid.mapping.DungeonUtility.hashesToLines(sampleToMap(binaryOut, '.', '#'))); 843 } 844 */ 845}