NAME
Games::RolePlay::MapGen::Tools - Some support tools and objects for the mapgen suite
SYNOPSIS
use Games::RolePlay::MapGen::Tools qw( choice roll random range str_eval );
my $r1 = roll(1, 20); # 1d20, 1-20
my $r2 = random(20); # 0-19
my $r3 = range(50, 100); # some number between 50 and 100 (not an integer!)
my $r4 = range(9000, 10000, 1); # 100% positively correlated with the last range (ie, not random at all)
my $r5 = range(7, 12, -1); # 100% negatively correlated with the last range (ie, not random at all)
my $ri = irange(0, 7); # An integer between 0 and 7
my $e = choice(qw(test this please)); # picks one of test, this, and please at random
my $v = str_eval("1d8"); # returns int(roll(1,8)) -- returns undef on parse error
# This package also exports _group and _tile, which are shortcut functions for new
# Games::RolePlay::MapGen::_tile and ::_group objects.
Games::RolePlay::MapGen::_group
At this time, the ::_group object is just a blessed hash that contains some variables that need to be set by the ::Generator objects.
## 1.0.3 ## $group->{name} = "Room #$rn";
## 1.0.3 ## $group->{loc_size} = "$size[0]x$size[1] ($spot[0], $spot[1])";
## 1.0.3 ## $group->{type} = "room";
## 1.0.3 ## $group->{size} = [@size];
## 1.0.3 ## $group->{loc} = [@spot];
# Starting with 1.1.0, rooms can have irregular shapes made up of
# rectangles. The rectangles start at @start = @{$group->{loc}[$i]} and
# have @size = @{$group->{size}[$i]}.
$group->{name} = "Room #$rn";
$group->{type} = "room";
$group->{loc} = [\@spot, \@another_spot, ...];
$group->{size} = [\@size, \@another_size, ...];
# The loc_size description became problematic in 1.1.x. It will now
# indicate the maximum extent (x-diff x y-diff) and the "center of mass"
# (average location).
$group->{loc_size} = "($center[0], $center[1]) $extent[0]x$extent[1]";
Happily, there is a new method to add a rectangle that does all the work:
$group->add_rectangle(\@loc, \@size);
If you pass the map object, it will mark the appropriate tiles its $self
$group->add_rectangle(\@loc, \@size, $the_map);
# marks $mapo->[ $y ][ $x ]{group} = $group;
# (can be called without arguments to recalculate {loc_size})
# There is also a new $group->{extents}, which describes the min and max
# locations. They are really only useful for truely rectangular rooms.
# These new methods can be used to access the group's tiles and extents:
my @tiles = $group->enumerate_tiles;
my @extents = $group->enumerate_extents;
# lastly,
my $desc = $group->desc; # returns the {loc_size} calculated by add_rectangle
Games::RolePlay::MapGen::_tile
At this time, the ::_tile object is just a blessed hash that the ::Generators instantiate at every map location. There are no required variables at this time.
v=>0,
od=>{n=>0, s=>0, e=>0, w=>0}
Though, for convenience, visited is set to 0 and "open directions" is set to all zeros.
Games::RolePlay::MapGen::_interconnected_map
This object interconnects all the tiles in a map array, so $tile = $map->[$y][$x] and $tile->{nb} is an array of neighboring tiles. Example: $east_neighbor = $map->[$y][$x]->{nb}{e};
(It also cleans up self-referencing loops at DESTROY time.)
Games::RolePlay::MapGen::_door
A simple object that stores information about a door. Example:
my $door = &_door(
stuck => 0,
locked => 0,
secret => 0,
open_dir => {
major => "n", # the initial direction of the opening door
minor => "w", # the final direction of the opening door (think 90 degree swing)
},
);
print "The door is locked.\n" if $door->{locked};
AUTHOR
Jettero Heller <japh@voltar-confed.org>
Jet is using this software in his own projects... If you find bugs, please please please let him know. :)
Actually, let him know if you find it handy at all. Half the fun of releasing this stuff is knowing that people use it.
COPYRIGHT
Copyright (c) 2008 Paul Miller -- LGPL [Software::License::LGPL_2_1]
perl -MSoftware::License::LGPL_2_1 -e '$l = Software::License::LGPL_2_1->new({holder=>"Paul Miller"});
print $l->fulltext' | less
SEE ALSO
perl(1)