Skip to content
Tools to work with hex maps for roleplaying games. Usually web applications written in Perl and producing SVG output.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
gnomeyland Fixed links in Gnomeyland README Nov 16, 2017
.gitignore Ingore backup files. Feb 2, 2015
Makefile README: use en dash Jun 14, 2018 hex-describe: added /rule/markdown May 14, 2019 Moved away from GitHub Jun 13, 2018 text-mapper: villages and towns need rivers nearby Apr 23, 2019 Traveller: more colors Oct 29, 2018

Hex Mapping

Many role-playing games use hex maps. Traditionally, D&D used hex maps for the wilderness and Traveller used a hex map for sectors and subsectors. They are everywhere.

This project collects the various tools I have used to work with hex maps. All of them are web applications (CGI scripts) written in Perl 5 and the maps are always SVG documents.

Bugs, feature requests, questions – all sorts of questions: please see the Software Wiki.

Table of Contents

Text Mapper

This application takes a textual representation of a map and produces SVG output.

Example input:

0101 empty
0102 mountain
0103 hill "bone hills"
0104 forest

Try it.

Text Maps from the Command Line

xmllint allows us to extract text from XML and HTML documents. On a Debian system, it's part of libxml2-utils.

Generate a text file with a 20x20 alpine wilderness map:

perl get /alpine 2>/dev/null | xmllint --html --xpath '//textarea/text()' - > random-alpine-map.txt

You'll note that at the very end it contains the seed value.

You can regenerate the same map using this seed:

perl get "/alpine?seed=1499413794" 2>/dev/null | xmllint --html --xpath '//textarea/text()' - > 1499413794.txt

You can also modify the width and breadth of the map:

perl get "/alpine?width=10&height=5" 2>/dev/null | xmllint --html --xpath '//textarea/text()' - > random-alpine-map.txt

Let's define an alias to handle the encoding of the map for us:

alias encodeURIComponent='perl -pe '\''s/([^a-zA-Z0-9_.!~*()'\''\'\'''\''-])/sprintf("%%%02X",ord($1))/ge'\'

Make some changes to the text file generated above using a text editor and generate the updated map:

perl get --header 'Content-Type:application/x-www-form-urlencoded' --method POST --content map=$(cat 1499413794.txt|encodeURIComponent) /render 2>/dev/null > 1499413794.svg

You can use svgexport to generate a PNG image, if you want.

First, install it:

npm install svgexport -g

You need to tell it what quality to use when exporting. I use 100% for PNG files; I'd use less for JPG files.

svgexport 1499413794.svg 1499413794.png 100%

Hex Describe

This application takes a map generated by Text Mapper and a set of random tables to generate a textual description of the region. It's ideal if your players are wandering into unprepared regions, and it's great if you need some seed material to base your work on.

You can provide your own random tables if you have the file online somewhere in a Pastebin or shared it from Dropbox, etc.

The format is simple: every word in the map description and every two word combo from the map description is a potential table in your file. If it exists, it will be used.

Assuming the following description:

0101 dark-green trees village

The description will be generated from any tables that match:

  • dark-green
  • trees
  • village

It would make sense to just provide tables for "trees" and "village", for example.

Tables looks like this:

1,some trees
1,you encounter [forest monster]

;forest monster
3,[3d6] bandits
1,an elf

A semicolon and some text begin a new table. A number, a comma, and some text are an entry in he table. The text needs to be on one line. The numbers are relative probabilities. The chances for an encounter in the forest are thus 50% and the chances to encounter an elf, if you are encountering anything at all, are 25%. The example also shows how you can link from one table to another using square brackets.

Square brackets are also used for dice rolls. A dice roll can look like this: 3d6, 3d6+5 3d6x10, or 3d6x10+5.

There's an built-in help page with more details for end users. If you intend to host the application yourself, use perldoc to get a more technical documentation based on the comments in the code.

Try it.

Traveller Subsector Generator

This application generates a random UWP list suitable for Traveller-style Science Fiction games.

It generates output like the following:

Tavomazupa       0103  D85D000-0           Ba Wa
Xeqqtite         0107  C858651-6       S   Ag Ga NI
Baziezoti        0108  C467100-7           Lo A
Zuzinba          0109  D350697-3       S   De Lt NI Po
Titutelu         0202  C75B988-6           Hi Wa

It also takes the UWP of a sector or subsector and generates a map for you. If possible, it also adds communication and trade routes based on some heuristics.

Try it.

Subsectors from the Command Line

xmllint allows us to extract text from XML and HTML documents. On a Debian system, it's part of libxml2-utils.

How to get a random UWP from the command line:

perl get /uwp/874568503 2>/dev/null | xmllint --html --xpath '//pre/text()' - | perl -MHTML::Entities -pe 'decode_entities($_);'

How to generate a SVG file from the command line:

perl get /map/874568503 2>/dev/null > 874568503.svg

Generating a simple SVG file from a map on the command line (URL-escaped):

perl get --header 'Content-Type:application/x-www-form-urlencoded' --method POST --content "map=Rezufa%200101%20E310000-0%20Ba" /map 2>/dev/null

Generating an SVG map from UWP in a text file:

perl get --header 'Content-Type:application/x-www-form-urlencoded' --method POST --content map=$(cat 874568503.txt|encodeURIComponent) /map

This assumes you defined the following alias:

alias encodeURIComponent='perl -pe '\''s/([^a-zA-Z0-9_.!~*()'\''\'\'''\''-])/sprintf("%%%02X",ord($1))/ge'\'

Old School Hex

This application takes an ASCII art representation of a map and turns it into a black-and-white hex map.

Example input:

 n " " .
n-n O-. .
 n-"-" .

Try it.


This application generates an island using a Voronoi diagram. It's based on Amit Patel's post Polygonal Map Generation for Games (2010).

Try it.


This application generates a bunch of names based on a set of syllables. When you reload, it will generate a new set of syllables and a new set of names based on them. The effect is that these names all sound as if they're part of the same "language". This idea is based on the original Elite system name generator. One way to look at the relevant code would be Text Elite.

Try it.

You can’t perform that action at this time.