In the comment section of my last article, reader Roxysteve commented about the random terrain generation of Source Of The Nile, one of the games on my “Great games of yesteryear” wish list. I have never read Source Of The Nile, and am only vaguely familiar with it (players compete for gold and glory by outfitting expeditions to the heart of unexplored Africa and discovering the randomly generated wonders therein) but his comment made me think about doing something similar for myself. What I came up with is a system that randomly generates terrain based on the hexes about it. To start, you need to make a seed hex by picking an elevation, vegetation and water from the lists below. From there, pick blank hexes adjacent to filled ones one at a time and roll on the tables below to fill them. This is of course an excellent time to make a custom d10,000,000. In this case, you’ll need a d12, d10, d12, d12, d12, d20, d20 combo.
For starters, if there is more than one filled hex bordering the hex you’re generating, you’ll need to randomly choose a source hex from those available. To do so, roll a d12 and d10 and consult the following table. Assume hex 1 is directly north or west (or whatever, it doesn’t matter) and count clockwise from there.
|# of surrounding hexes||d12 and d10 roll|
|2||d12/6 (round down)|
|3||d12/4 (round down)|
|4||d12/3 (round down)|
|5||d10/2 (round down)|
|6||d12/2 (round down)|
From there, generate the elevation of your new hex with another d12 roll and the following table:
|Source Elevation||d12 result|
Interpret those results liberally. Mountains and hills both might be a single large elevated feature, or a cluster of smaller ones. They might be any number of shapes. Similarly, lowlands could be basins, deltas, swampland. You don’t have to limit yourself to only five options. This table results in a map that is approximately 2/14 Mountains, 3/14 Hills, 4/14 Plains, 3/14 Lowlands, and 2/14 Valleys. You can alter the table to achieve different distributions. I’ll cover the math behind that in a separate article.
Next, generate the vegetation of your new hex based on the vegetation of the source hex and another d12 table:
|Source Vegetation||d12 result|
For the purposes of this table, I’m considering dense vegetation to be jungles, thick forests, choking swamps and the like, Grassland to include lots of small vegetation and frequent trees or other large plants, and scrubland to include short coarse grasses and infrequent scraggly brush. Like elevation, play fast and loose with those definitions and let the contents of the hex and nearby hexes inform your interpretation. Because the rolls are the same, this table creates a distribution the same as the one created by the height table: 2/14 Dense, 3/14 Forest, 4/14 Grassland, 3/14 Scrubland, 2/14 Barren.
The next table is for water features.
|Source Water||d12 result|
Water features should be present wherever makes sense. Feel free to add them in where appropriate, for example to connect a randomly selected water system to a nearby source. Also, take it as writ that there are dozens of streams and ponds too small to be shown on the map at smaller scales unless the terrain makes that unlikely. With the table above water will have the following distribution: 4/19 Lakes, 5/19 Rivers, 10/19 None.
The last component of the map is points of interest. The frequency of these will depend more on the scale of your map and your personal preference. According to this article from Hydra’s Grotto, the entirety of the massively populated game worlds of Skyrim and Oblivion would each fit into a single 6 mile hex, have hundreds of distinct points of interest each and roughly match real world distributions, so you really can’t pack them in too tightly. Instead, the limit is whatever distribution of points of interest to white space you’re comfortable with in your game. For these tables I went with 3/10 of hexes with points of interest with 1/6 of those being major points of interest. Roll on the next table. If the result indicates a point of interest, roll on the point of interest table.
|1-14||No Point Of Interest|
|15-19||Point Of Interest|
|20||Major Point Of Interest (Use the same table, think big when interpreting the results.)|
The following table is by no means exhaustive. Add entries, fiddle with weights to your heart’s content.
|1-3||Ruins||Wall or foundation fragment, tomb or graveyard, statuary, collapsed hut, ruined keep or tower|
|4-6||Caves||Simple one room lair, 5 room dungeon, huge complex|
|7-9||Natural Formations||Massive tree, oddly shaped boulder, waterfall|
|10-11||Lair of unique NPC/creature||Lair of an “alpha monster”, odd or quirky NPC, unusual but non hostile monster etc…|
|12-14||Campsite||Wayside shrine, small lean-to, small cave|
|15-16||Settlement||Small encampment or village. May be hostile, friendly or neutral|
|17||Magic||AÂ magical feature of some sort. An endless fire, magic fountain, floating tower, etc…|
|18-20||Unusual Terrain||AÂ pocket of terrain that is different than the surrounding hex or an unusual type. AÂ barren defile in the middle of a forested hex or a quicksand marsh|
Once you finish randomizing the map you can add some additional features, connect water features, add roads between settlements, water features and points of interest as appropriate and any other finishing touches you feel like.
Here’s a sample I started with a seed hex of mountain forest in the upper left corner. You can see that even if the long term results tend to a single distribution, small regions are heavily influenced by their seed hex. It features 11 points of interest, key below.
1 – a small cave with the remains of a campfire and a few crude iron tools scattered about
2 – area between hills here is full of wet mucky forest detritus
3 – small cave complex full of giant mud wasps
4 – mountain in the middle of the forest is the lair of a great serpent, knows much, is dangerous, but can be bargained with
5 – hills riddled with boltholes and tunnels, home to morlock-like creatures
6 – a village of refugee duergar have a town in some caves here, they are shrewd and conniving but needy
7 – the caves in this forest basin are home to root-gnawing worm and crusted with strange salts
8 – a strange wild man lives in these woods
9 – an “undead” treant roams these wood infected with giant termites
10- several hills are connected by natural bridges
11- small hide tent village of desert lizard folk
So what do you think? Too complex? Not complex enough? Dying to see the math behind it? (Not holding my breath on that one.) Missing anything obvious?
Do you have a way to bias the result according to surrounding terrain? Like “if two adjacent hexes are open water, there is a higher chance of this one being open water unless there is also adjacent dry land, in which event this hex will be coast. Check for swamp“?
And why all the triangular-headed sheep? OW!OWOWOW!
So since the terrain is generated according to a surrounding hex, the more hexes of a given type exist around the target hex the more likely it is to be based on a hex of that type which increases its chances of having similar terrain. But you could design your own tables that work off of two or more surrounding hexes if you like. I just chose to go a more simple route.
I’m a little late to this article, but I was wondering what scale you had in mind when you developed this method of hex generation? I’ve been looking for a smaller-scale method, something closer to 1 or 2 miles, but I’ve been having trouble finding something that I like. Either way, you present an interesting method that I will likely incorporate into my game in some fashion.
I honestly don’t recall what I had in mind at the time, but I will happily point you to one of my favorite articles on why the 6 mile hex is the optimal choice for hexes:
There’s also a follow up with a template in which the 6 mile hex is broken up into 1 mile hexes, which may be just what you’re looking for:
Hi, don’t know if you still keep track of the comments here, but I’ve “reworked” your tables a bit for my upcoming hex crawl game. If you’re interested I can share them with you.
Love to see what you’ve done to make it your own!