An Upcoming Campaign Map with Tech Tomfoolery

A hexagon map. The center of the map, from north to south, is  plains and rivers draining into a lake. A mountain range running north/south separates the western forest from the central plains and lake. At the vertical midpoint, a forested pass cuts through the mountains. The eastern portion of the map hints at a mountain range.
Upcoming Campaign Map?

As , I’m thinking about starting up a campaign.
I decided to build a campaign world, as it is something I can do all by my lonesome; Reading and programming are my other solitary hobbies.

So I assembled my initial tools:

An Echo, Resounding

, but I love the concept of the Bloodstone adventure series. Adventure and domain management create different layers. There is the fast burn of an adventure but the slow burn as the seasons roll on.

Sine Nomine’s An Echo, Resounding is a resource for building domains in tension. There are rules for maintaining domains, handling mass combat, and heroic participation. While it is written for Labyrinth Lord, it appears to be easy enough to port to Dungeons and Dragons: Fifth Edition (5E 📖).

I re-read a few bits, then grabbed a random map.

Random Map

I found a good hex generator over at Isomage’s House. After a few clicks, I settled on something like the above map.

I liked the map, but I wanted something I could continue to tinker with.

I am not an Adobe person, preferring text based representations. I remembered Alex Schroeder’s TextMapper (available on Github) from a blog post I can no longer cite.

The gist of TextMapper is you can write your maps in plain text. Then generate an Scalable Vector Graphics (SVG 📖) image from the text. Specify some attributes (or use the awesome defaults), then give the grid coordinates.

grass attributes fill="green"
sea attributes fill="blue"
0101 grass
0102 sea
0201 grass
0202 sea

TextMapper comes with a random generator, but I had fallen in love another map.

I set about translating the image into a text file. I used Google Sheets to record the entries; A few hours of transcription and I was done.

I threw the table into a plain text file. Then translated the information into Ruby arrays (with a few regular expressions).

From there I began augmenting the text version of the map. I…

  • added towns, cities, rivers, and roads.
  • tweaked the colors.
  • placed ruins, lairs, and resources.

When I wanted a new version of the map, I ran the following shell command:

$ perl ~/bin/ map="$(ruby ./campaign2015/mapping.rb)" |
  tail -n +3 >
  ./campaign2015/map.svg ;
  open ./campaign2015/map.svg -a Firefox

Why All the Work?

All of this was a lot of work. I could’ve drawn the map by hand. Which I may still do. But the purpose of this map is not to generate an artifact.

The purpose of this map is to convey the current state of the game. And to handle updates to that state as game play progresses.

In pushing things to text, I’m able to work in a domain that I am very comfortable. I can…

  • Generate numerous contextual maps (GM only, Players, Ruins only)
  • Version changes
  • Begin modeling the information to grow a campaign-centric application
  • Consider how I might drill down into a smaller scale
  • Generate a map from a simple script