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}