Game-TextMapper
view release on metacpan or search on metacpan
lib/Game/TextMapper/Folkesten.pm view on Meta::CPAN
# Copyright (C) 2023 Alex Schroeder <alex@gnu.org>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
=encoding utf8
=head1 NAME
Game::TextMapper::Folkesten - generate fantasy wilderness maps
=head1 SYNOPSIS
my $text = Game::TextMapper::Folkesten->new
->generate_map();
=head1 DESCRIPTION
This generates a wilderness map based on the algorithm by Andreas Folkesten. See the
blog posts at L<http://arch-brick.blogspot.com/2023/08/hexmap-terrain-generator.html>.
=head1 METHODS
Note that this module acts as a class with the C<generate_map> method, but none
of the other subroutines defined are actual methods. They don't take a C<$self>
argument.
=cut
package Game::TextMapper::Folkesten;
use Game::TextMapper::Log;
use Game::TextMapper::Point;
use Modern::Perl '2018';
use Mojo::Base -base;
use List::Util qw(shuffle any first);
has 'world' => sub { {} };
has 'dry' => sub { {} };
has 'wet' => sub { {} };
has 'width' => 10;
has 'height' => 10;
has 'rivers' => sub { [] };
has 'canyons' => sub { [] };
has 'altitude' => sub {
{
'mountain' => 3,
'forest-hill' => 2,
'green-hills' => 2,
'hills' => 2,
'plain' => 1,
'water' => 0,
'ocean' => 0,
}
};
*coord = \&Game::TextMapper::Point::coord;
my $log = Game::TextMapper::Log->get;
=head2 neighbors
The list of directions for neighbours one step away (0 to 5).
=cut
sub neighbors { 0 .. 5 }
=head2 random_neighbor
A random direction for a neighbour one step away (a random integer from 0 to 5).
=cut
sub random_neighbor { int(rand(6)) }
=head2 neighbor($hex, $i)
say join(",", $map->neighbor("0203", 1));
# 2,2
Returns the coordinates of a neighbor in a particular direction (0 to 5), one
step away.
C<$hex> is an array reference of coordinates or a string that can be turned into
one using the C<xy> method.
C<$i> is a direction (0 to 5).
=cut
sub neighbor {
my $self = shift;
# $hex is [x,y] or "0x0y" and $i is a number 0 .. 5
( run in 1.651 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )