The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;

use Games::Maze;
use Games::Maze::SVG;
use Getopt::Std;

# Parse command line
my %opts = ();

getopts( 'xXs:e:n:o:f:b:i', \%opts ) || usage();

usage() if @ARGV == 1;

my %parms = (
    cols => $ARGV[0] || 12,
    rows => $ARGV[1] || 12,
    ( exists $opts{f} ? ( wallform => $opts{f} ) : () ),
    interactive => $opts{i},
    ( exists $opts{b} ? ( crumb    => $opts{b} ) : () ),
    ( exists $opts{s} ? ( startcol => $opts{s} ) : () ),
    ( exists $opts{e} ? ( endcol   => $opts{e} ) : () ),
);

if ( defined $opts{s} )
{
    unless ( $opts{s} >= 1 and $opts{s} <= $parms{cols} )
    {
        die "Starting column out of range.\n";
    }
}
if ( defined $opts{e} )
{
    unless ( $opts{e} >= 1 and $opts{e} <= $parms{cols} )
    {
        die "Ending column out of range.\n";
    }
}

# Prepare to generate output
my $shape = 'Rect';
$shape = 'RectHex' if $opts{x};
$shape = 'Hex'     if $opts{X};
my $build_maze = Games::Maze::SVG->new( $shape, %parms );

my $out = \*STDOUT;

if ( $opts{o} )
{
    $out = undef;
    open( $out, ">$opts{o}" ) or die "Unable to create $opts{o}: $!";
}

# build maze
my $num = $opts{n} || 1;
print $out $build_maze->toString() while $num-- > 0;

# ----------------------------------------
# Subroutines

# ----------------------
#  Usage message if parameters are messed up.
sub usage
{
    ( my $prog = $0 ) =~ s/^.\///;
    print <<EOH;
Usage: $prog  [-x] [-X] [cols rows [levels]]

where   -x       specifies hexagonal cells
        -X       specifies a hexagonal maze with hexagonal cells
	-s col   what column holds the entrance
	-e col   what column holds the exit
	-f form  wall forms (straight|round|roundcorners|bevel)
	-n num   how many mazes to print.
	-o file  write to a file not the screen
	-i       interactive mode (only for SVG)
	-b style breadcrumb style (dash|dot|line|none)
EOH
    exit 1;
}