Games-RolePlay-MapGen

 view release on metacpan or  search on metacpan

MapGen/Generator/XMLImport.pm  view on Meta::CPAN


            my $mapclose = $xp->find( closure => $tile );
            for my $closure ($mapclose->get_nodelist) {
                my $type = $xp->findvalue( '@type' => $closure )->value;
                my $dir  = $xp->findvalue( '@dir'  => $closure )->value;
                   $dir =~ s/^(\w)\w+/$1/;

                if( $type eq "wall" ) {
                    $t->{od}{$dir} = 0;

                } elsif( $type eq "door" ) {
                    if( $dir eq "n" or $dir eq "w" ) {
                        my $o_x      = $x_pos - ($dir eq "w" ? 1:0);
                        my $o_y      = $y_pos - ($dir eq "n" ? 1:0);
                        my $opposite = $map->[$o_y][$o_x];
                        my $opp      = $Games::RolePlay::MapGen::opp{$dir};

                        # <closure dir="east" type="door" locked="no"
                        #   stuck="no" secret="yes" major_open_dir="east"
                        #   minor_open_dir="south" />

                        my $d_locked = ($xp->findvalue( '@locked' => $closure ) eq "yes" ? 1:0);
                        my $d_stuck  = ($xp->findvalue( '@stuck'  => $closure ) eq "yes" ? 1:0);
                        my $d_secret = ($xp->findvalue( '@secret' => $closure ) eq "yes" ? 1:0);
                        my $d_open   = ($xp->findvalue( '@open'   => $closure ) eq "yes" ? 1:0);
                        my $d_majod  = substr $xp->findvalue( '@major_open_dir' => $closure ), 0, 1;
                        my $d_minod  = substr $xp->findvalue( '@minor_open_dir' => $closure ), 0, 1;

                        $opposite->{od}{$opp} = $t->{od}{$dir} = &_door(
                            locked => $d_locked,
                            stuck  => $d_stuck,
                            secret => $d_secret,
                            'open' => $d_open,
                            open_dir => {
                                major => $d_majod,
                                minor => $d_minod,
                            },
                        );
                    }

                } else {
                    die "hrm: closure type=$type";
                }
            }

            $opts->{t_cb}->(($x_pos+1,$y_pos+1), $tile) if exists $opts->{t_cb};
        }
    }

    my $tilegroups = $xp->find('/MapGen/tile_group');
    for my $tile_group ($tilegroups->get_nodelist) {
        my $t_name = $xp->findvalue( '@name' => $tile_group )->value;
        my $t_type = $xp->findvalue( '@type' => $tile_group )->value;

        my $group = &_group;
           $group->name( $t_name );
           $group->type( $t_type );

        my $rectangles = $tile_group->find('rectangle');
        for my $rec ($rectangles->get_nodelist) {
            my @r_loc  = split m/,/, $xp->findvalue( '@loc' => $rec );
            my @r_size = split m/x/, $xp->findvalue( '@size' => $rec );

            $group->add_rectangle(\@r_loc, \@r_size, $map);
        }

        push @$groups, $group;
    }

    $map = new Games::RolePlay::MapGen::_interconnected_map( $map );

    return ($map, $groups);
}

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

=head1 NAME

Games::RolePlay::MapGen::Generator::XMLImport - Slurp up XML map data into MapGen memory form

=head1 SYNOPSIS

    use Games::RolePlay::MapGen;

    my $map = new Games::RolePlay::MapGen;
    
    $map->set_generator( "XMLImport" );
    $map->generate( xml_input_file => "map.xml" );

The MapGen base object also knows a shortcut to perform the above:

    my $map = Games::RolePlay::MapGen->import_xml("map.xml"); 

=head1 SEE ALSO

Games::RolePlay::MapGen

=cut



( run in 0.853 second using v1.01-cache-2.11-cpan-71847e10f99 )