The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# vi:tw=0 syntax=perl:

package Games::RolePlay::MapGen::Generator::OneBigRoom;

use common::sense;
use Carp;
use parent q(Games::RolePlay::MapGen::Generator);
use Games::RolePlay::MapGen::Tools qw( _group _tile );

1;

sub create_tiles {
    my $this = shift;
    my $opts = shift;
    my @map  = ();

    for my $i (0 .. $opts->{y_size}-1) {
        my $a = [];

        for my $j (0 .. $opts->{x_size}-1) {
            $opts->{t_cb}->() if exists $opts->{t_cb};

            push @$a, &_tile(x=>$j, y=>$i);
        }

        push @map, $a;
    }

    return @map;
}

sub genmap {
    my $this   = shift;
    my $opts   = shift;
    my @map    = $this->create_tiles( $opts );
    my $map    = new Games::RolePlay::MapGen::_interconnected_map(\@map);

    my $group = &_group;
       $group->name( "One Big Room" );
       $group->type( "room" );
       $group->add_rectangle( [0, 0], [$opts->{x_size}, $opts->{y_size}] );

    my $groups = [$group];

    my $ymax = $#map;
    my $xmax = $#{ $map[0] };

    for my $y ( 0 .. $ymax ) {
        for my $x ( 0 .. $xmax ) {
            my $tile = $map[$y][$x];

            $opts->{t_cb}->() if exists $opts->{t_cb};

            $tile->{type}  = "room";
            $tile->{group} = $group;

            for my $dir (qw(n e s w)) {
                next if $y == 0     and $dir eq 'n';
                next if $y == $ymax and $dir eq 's';
                next if $x == 0     and $dir eq 'w';
                next if $x == $xmax and $dir eq 'e';

                $tile->{od}{$dir} = 1; # open every direction... except the above

                if( my $n = $tile->{nb}{$dir} ) {
                    $n->{od}{$Games::RolePlay::MapGen::opp{$dir}} = 1;
                }
            }
        }
    }

    return ($map, $groups);
}

__END__
# Below is stub documentation for your module. You better edit it!

=head1 NAME

Games::RolePlay::MapGen::Generator::OneBigRoom - The basic random bounded dungeon generator

=head1 SYNOPSIS

    use Games::RolePlay::MapGen;

    my $map = new Games::RolePlay::MapGen;
    
    $map->set_generator( "OneBigRoom" );

    generate $map;

=head1 DESCRIPTION

This module generates one huge room that takes up the whole map.  Rather like the contsruct program in the matrix.

=head1 SEE ALSO

Games::RolePlay::MapGen

=cut