Game-TextMapper
view release on metacpan or search on metacpan
lib/Game/TextMapper/Smale.pm view on Meta::CPAN
# Copyright (C) 2009-2021 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::Smale - generate fantasy wilderness maps
=head1 SYNOPSIS
my $text = Game::TextMapper::Smale->new
->generate_map($width, $height, $bw);
=head1 DESCRIPTION
This generates a wilderness map based on the algorithm by Erin D. Smale. See the
blog posts at L<http://www.welshpiper.com/hex-based-campaign-design-part-1/> and
L<http://www.welshpiper.com/hex-based-campaign-design-part-2/> for more
information.
Generally speaking, the idea is that the algorithm picks a random terrain for a
hex in the middle of the map. Based on that, the surrounding hexes a bit further
away are picked, and finally the remaining hexes are picked. This is why the
maps vary so drastically in terrain distribution.
=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::Smale;
use Game::TextMapper::Log;
use Game::TextMapper::Point;
use Modern::Perl '2018';
use Mojo::Base -base;
my $log = Game::TextMapper::Log->get;
my %world = ();
# ATLAS HEX PRIMARY TERRAIN TYPE
# Water Swamp Desert Plains Forest Hills Mountains
# Water P W W W W W -
# Swamp W P - W W - -
# Desert W - P W - W W
# Plains S [1] S T P [4] S T -
# Forest T [2] T - S P [5] W [8] T [11]
# Hills W - S [3] T T [6] P [9] S
# Mountns - - W - W [7] S [10] P [12]
#
# 1. Treat as coastal (beach or scrub) if adjacent to water
# 2. 66% light forest
# 3. 33% rocky desert or high sand dunes
# 4. Treat as farmland in settled hexes
# 5. 33% heavy forest
# 6. 66% forested hills
# 7. 66% forested mountains
# 8. 33% forested hills
# 9. 20% canyon or fissure (not implemented)
# 10. 40% chance of a pass (not implemented)
# 11. 33% forested mountains
# 12. 20% chance of a dominating peak; 10% chance of a mountain pass (not
# implemented); 5% volcano (not implemented)
#
# Notes
# water: water
# sand: sand or dust
# swamp: dark-grey swamp (near trees) or dark-grey marshes (no trees)
# plains: light-green grass, bush or bushes near water or forest
# forest: green trees (light), green forest, dark-green forest (heavy);
# use firs and fir-forest near hills or mountains
# hill: light-grey hill, dust hill if sand dunes
# mountain: grey mountain, grey mountains (peak)
# later, grass land near a settlement might get the colors soil or dark-soil!
my %primary = ("water" => ["water"],
"swamp" => ["dark-grey swamp"],
"desert" => ["dust desert"],
"plains" => ["light-green grass"],
"forest" => ["green forest",
"green forest",
"dark-green fir-forest"],
"hill" => ["light-grey hill"],
"mountain" => ["grey mountain",
"grey mountain",
"grey mountain",
"grey mountain",
"grey mountains"]);
my %secondary = ("water" => ["light-green grass",
"light-green bush",
"light-green bushes"],
"swamp" => ["light-green grass"],
( run in 1.369 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )