Hexcrawl25 - Making the Map
A few weeks ago, I saw Hexcrawl25, a challenge to make an entire playable setting and map in one year, by taking it just one six-mile hex at a time. I love this concept, and I love coming up with campaign settings and maps, so I thought I'd take a crack at it myself.
If you read the original challenge, it says to draw within the regional hexes before dividing them into subhexes (or use a regional map.) I didn't want to do that.1 I was also initially quite intimidated at the prospect of 319 hexes, and expressed this on the purple/gay OSR discord. Mr. Mann noted that you could utilize the rules in Wilderness Hexplore, Jed McClure's compilation and lightly edited collection of old Judge's Guild worldbuilding content, to help you fill in hexes.2 The generators included there allow for generation of terrain and random placement of rivers, dungeons, villages, etc.
This gave me an idea. What if I generated all the terrain randomly through Wilderness Hexplore's tables, as well as using it to generate the major points of interest? I accepted this as an initial mini-challenge that would give me a detailed, workable map to start the challenge proper.
To do so, I was going to have to get a little creative. Wilderness Hexplore's random terrain and feature generation tables are structured assuming that you are generating the map hex-by-hex as the players explore into the wilderness. I am not doing that, instead pre-generating terrain before players even arrive. Naturally, I'd have to come up with my own way to use the tables and produce results that were interesting. I decided to jump into the process and figure it out as I went. After charting my path, I ended up with a useable map and a set of rules to generate them.
I've written out the rough steps that I followed under each main title. I've also added some commentary on my experience and reasoning under the Notes section of each step.
Step 1 - Set the Stage
Start with a hexmap of the 19 regional hexes. I used Worldographer when making this hexmap, because it was easy to iterate on and has a nifty functionality that will generate sub-hex maps.
If you're using Worldographer, I recommend using a 7-wide, 7-tall map instead of what I have here. Worldographer can be funky about the edge hexes. Fill in any unused hexes with the void as I've done here.
Step 2 - Generate Branches
First, set the center hex of the map as the starting settlement.3 Place a village icon in appropriate terrain.4
Generate terrain and features in a straight line going out from each face of the center hex, as if the players were explore continuously in that direction. Follow the instructions in Wilderness Hexplore on how to generate the terrain and features.
After generating one arm, my map looked like this:
Then, after doing the same process for the other five arms:
Notes
I used the "Borderland" setting for determining features, so that I could get a good range of everything from towns and strongholds to ruins and dungeons.
I was actually quite surprised at the diversity of terrain. Wilderness Hexplore's tables are constructed so that the next piece of terrain is dependent on whatever terrain you're starting out from. Half the results for each terrain type are just that terrain. Therefore, if you start in a Plains hex you're most likely to roll another Plains hex. Other types of terrain have different, smaller probabilities. I was worried that when I did this I'd end up with lots of plains and a generally uninteresting starting point, but lo and behold there's quite a diversity, with a lot of forests, mountains, hills, and even a few seas.5 The structure of the Wilderness Hexplore tables did what they were supposed to, generating batches of one terrain, organized in interesting ways (if not necessarily "realistic", as we'll see later.)
Frankly, you could just stop here. You can already see the little regions starting to form. The northeast seems to be the forested, settled region, while the south is clearly dangerous borderlands neighboring the highlands in the southeast. There's a lake or sea to the northwest and maybe a large, wild forest to the southwest. Honestly, at this point you probably have enough material to come up with the rest of the map yourself.
When I first did this, I was amazed at the result! This step didn't take long,6 but my head was swimming with ideas. It's a testament to the power of a good random table to inspire. However, I also wanted to see where my system would take me. I moved on to starting to fill in the six blank regions on the map.
Step 3 - Fill in Seas
Starting with the first Water hex generated in Step 2, generate terrain starting from the northern face of the hex until a land hex (any hex other than Water) is rolled (or you hit the border). Place the land hex and stop generating.
When you've finished with this, or if the north face already has generated hexes, move to the north-east face, and generate hexes until a land hex is rolled.
Repeat this process for any open faces in clockwise order.
When one hex is done, move through the rest of the water hexes in the order they were generated. This process is iterative and nested. It will generate additional water hexes; fill in terrain from these hexes as well, again in the order they were generated.7 For example, I fully generated the terrain starting from the two water hexes in Step 2 before repeating the process for the water hexes I generated in this step. I filled in terrain from the hexes I branched off of hex 5.10 before I generated terrain from the hexes generated from hex 4.10, and so forth.
Whenever a hex is generated, also roll to generate a feature.
Notes
Once I had the branches I had to figure out how I was going to fill in the rest of the map. There's plenty of ways you could do this - you could make other branches, you could spiral outward from the center hex, you could just start randomly plopping interest pieces of terrain and repeat Step 2. I performed some of these steps a little bit later.
However, one thing I was concerned with was making my terrain somewhat coherent. Generating the branches was fine because they were all separate, they weren't bumping up against each other. From here on out, how I chose to generate terrain would be very informative of the final shape of the map. I wanted clumps of mountain ranges and hills, not strips of mountains in the cardinal directions surrounded by strips of plains or strips of seas. I could have filled things in as I saw fit, but I really wanted to see if I could utilize the tables of Wilderness Hexplore.
So I decided to do an orderly procedure to randomly generate the rest of the terrain; an algorithm that would be random in its heart but reasonable in its output. The rest of my steps here are that algorithm.
First, I decided to tackle the sea in the northwest. In this, I did not follow the Wilderness Hexplore tables fully. In Wilderness Hexplore, characters can skirt around a water hex to adjacent, unexplored hexes, but can't cross the hex on foot. However, if they have a boat, they begin maritime exploration, which generates a Sea Hex (distinct from the coastal "seas" generated by the normal procedure) 95% of the time. If I had followed this idea, I would have ended up with a map that's mostly water, and that just wasn't going to do. Oceanic adventures can be interesting, but the defining feature of the ocean is its vastness and hostility to human life. I feel like a map that's half ocean is an excuse for not creating much at all; an ocean-centric campaign could be interesting, but that wasn't what I wanted at this point.
Instead, I continued to use the standard terrain generation table for water.
As you can see in the image, I also switched mid-process - I started off expanding on the rivers (see Step 4), but I quickly realized the sea/lake/large bodies of water were more important to figure out.
After the generation, I had nice fat water feature surrounded by interesting terrain on all sides - hills, mountains, and lots of marshes. The two marshes and one mountain in the northwest could be islands in front of an ocean, or could be the other side of a large lake. I think I'm going to treat this body of water as a bay; I like the idea of an even bigger world outside the region being able to find its way in.
Step 4 - Run Rivers
Starting with any rivers generated in Step 2, generate terrain following along the river. Follow the procedures in Wilderness Hexplore, generating terrain as if the players were exploring up the river.8 Start on the end point of the river that faces away from the main bodies of water in Step 3 (if applicable). Do not generate features normally; instead, use the river generation table as indicated in Wilderness Hexplore. If the feature generated is a spring, or the terrain generated is a water hex, stop.
If preferred, use the random orientation generation in Wilderness Hexplore to determine which faces the river feature points to, unless that would result in an invalid result. Additionally, you may need to exercise judgement to make a river flow in a logical way. Try to incorporate the random results as best you can but don't feel shackled by them. Remember that rivers can connect to other river pieces with open connections, but rivers cannot "cross" other rivers.
Finish the first branch before moving onto the others, and run the rivers in the order in which they were generated.
Finish all of these "upriver" branches before moving "downriver". When generating downriver, follow the procedure above, with two additions:
- If a roll indicates a branching river feature, reroll.
- When determining orientation, default to whatever orientation places the end of the river closer to the bodies of water generated in Step 3.
Finally, if there is 1 blank hex between two hexes with rivers, fill in that hex with Hills (or Mountains if both are already Hills.)
(I started on Step 5 before I had the presence of mind to take a screenshot; thus the extra roads in the northern hexes.)
Notes
This step and the next step were probably the most finnicky steps. I hope my instructions were clear - it's hard to explain fully without just restating the actual procedures of Wilderness Hexplore (which are quite robust.)
Wilderness Hexplore's generation will result in lots of branches of the river. Following my suggested procedure should prevent too much river-splitting in the wrong direction. Keeping river splits only "upstream" of the midpoint should result in something that looks like lots of tributaries flowing into a main river. If you do end up wanting to put splits further down the river, that's probably fine, but that might edge closer to making the map look like "actual watershed diagram" instead of an indicator of significant/navigable waterways (i.e. the kind that matter during play.)
The little hill rule at the end was added to both help me fill in more tiles, and to try to make the hydrology of the terrain make some sense. The hydrology is still crazy, though. I imagine there's some fantastically deep river valleys in hex 13.9.
I only had one point at which I had a bunch of different branches flowing into each other (there in hexes 13.9, 13.10, 14.9, and 14.10). I've decide it's sort of like a giant, mostly-drained oxbow lake, with the internal terrain having once been a submerged island. After I generated that, though, I started to break my own rules a little and exercise a strong editorial hand. I rerolled some of the invalid results I got later, taking instead only the turns and straightaways I generated randomly. I oriented them by hand. That may have been why I ended up with three river castles. 🤷♀️
Still, these castles are an example of why I love random generation so much. I would never in a dozen attempts have come up with "Terrain = Water/Lake, Feature = Castle." It was pure random chance - the terrain roll was Water, which would normally make the river feature moot, but it was the Castle river tile, so I decided to keep the castle on the water. This is the sort of result that fuels the mind, a fruitful void. It's an obvious question (what's a castle doing on a lake) with a wide variety of answers. You could just say it's a castle on the shore, but there's so many more interesting options. It could be a castle set on a rocky outcropping in the middle of the lake, using the entire lake as a moat and sending knights questing downriver on barges. It could be a floating wizard's castle, situated high over the lake and attendant underwater dungeon, held aloft by a bound water elemental. It could be the Fortress-Barge of the Riverine Overlord, the pirate-king of the river pirates. It could even be a fully underwater castle of a merfolk prince, attended by naiads and nymphs.
Step 5 - Route Roads
Starting with the first road generated in Step 2, generate terrain following the road. Follow the procedures in Wilderness Hexplore, generating terrain as if the players were exploring up the river.8 Start at either end of the road. Do not generate features normally; instead, use the road generation table as indicated in Wilderness Hexplore. If the feature generated is a road end, or the terrain generated is a water hex, stop.
As with rivers, feel free to roll randomly for orientation. However, if two pieces of road are close together, consider using whatever piece of road is rolled to just connect them. Additionally, consider orienting the roads towards villages and strongholds.
Roads can cross other roads, and can cross rivers. However, if a road crosses a river, it is a ford in the river - only place bridges where indicated by the results.9
Notes
Not much to add at this point. At this point I exercised a lot more control over where the roads went. I think that's fine, since I wanted the roads to make a little bit of sense in terms of where they might actually go and roads are manmade constructions, so there's no need for them to feel "natural". There's a hundred and one reasons a road might get built anywhere, and those can easily be added ad-hoc once this generation process is done. Roads that lead to nowhere might be to cities that were abandoned in war, or lost to a magical catastrophe. Roads that go through dangerous terrain might have been built by invading armies in years past.
I do find it interesting that it was basically just one sextant of the map that received the majority of the rivers and roads. Clearly, this is the developed, "civilized" portion of the map, or at least the part of the region that has most of the inhabitants. This works for me, as now I know that the rest of my map will be more an open wilderness, and I can put my thumb on the scale in that direction.
I do find having all the roads and rivers together will make for some interesting navigational challenges. Reading between the lines, the rivers here are those that can't be just waded across (since fords are a specific feature you roll for.) For a party with a boat, or a flying creature, there will be some interesting navigational opportunities.
Step 6 - Repeat
During Steps 3-5, you will have generated additional water terrain, and additional rivers and roads. Repeat steps 3-5 until all water, rivers, and roads are finished and filled in.
Notes
This iterative portion is where it's more important to exercise an editorial hand. Since a lot of the map has already been generated, and you're likely to have an idea of what the key points of the map will look like, tip results to keep them consistent with your vision or given them a degree of verisimilitude. I basically hand-crafted the lake in the northeast, because I thought it would be cool if there was a large body of water locked up in the highlands, that flowed to the northwestern sea through the floodplains of the north.
Also, coincidentally, I generated another water castle. Guess I'll have to dip into my big list of ideas in Step 4.
Step 7 - Fill in the Blanks
For any blank hexes surrounded by four or more generated hexes, fill in that hex using the Consensus Method. Do so until there are no hexes with four or more surrounding hexes.
Consensus Method: This method of terrain generation augments the typical Wilderness Hexplore generation method for a blank hex with 3 or more hexes generated next to it. Generate terrain for the hex as if players had entered from the first hex, then the second, then the third, and so on. If one terrain type is a plurality of the results, use that terrain type for the hex. If there is no plurality or a tie, randomly determine the terrain between the rolled results. Roll for Features only once, as normal.
Notes
The Consensus Method was something I had thought about quite a bit prior to this little project. It's hacky, but I think it works. It focuses the results to something that's reasonable for the surrounding terrain, but still leave room for random/unexpected results. Most importantly, if you follow along the border of generated terrain, it avoids "strips" of terrain along the cardinal hex directions.
As you'll see, it featured in my attempts to fill in the remaining blank sections.
I think the result you see here (two sextants filled in, one partially filled, three mostly blank) will probably be a common result at this stage in the process. I wasn't expecting this, but I like it. I think this makes another good stopping point. At this point, I had lots of interesting little randomly generated tidbits in the north, and open spaces to the south and east where I could slap down what I wanted. If I had particular features I wanted but hadn't shown up, I could put them there. If I wanted to change terrain types, I could start generating from a different table - or entirely different system. I could just hand-fill those sections, having a great jumping-off point and lots of random inspiration.
But I wanted to see how far I could take the little systems I'd been devising.
Step 8 - Draw the Rest of the Map
I'm not going to go into too much detail with what I did for the rest of the map, mostly because all I did was remix and reiterate what I did in the previous steps.
In the southwest sextant, I used the Consensus method to generate the terrain row by row, back and forth, working my way from the center of the map to the outer edge.
For the southeast and eastern sextants, I changed it up. I decided that, because of the mountains seen in the southern and southeastern arms, there was a rain shadow (hence why there's so many rivers in the north), created by mountains in the south, and resulting in a desert in the southeast.
I also decided I wanted more hill/mountains in the eastern sextant. There should be rough highlands here separating the desert region from the large northern lake.
To effect this, I dropped a desert hex and a mountain hex in the middle of each sextant, respectively, then generated arms of terrain outward from there just like in Step 1. When I generated the road, I followed the procedure in Step 5. Then, I used the Consensus Method to fill in the remaining blank hexes. I also dropped a few "Thicket" pieces of terrain next to the desert just for fun.
Finally, I used the Consensus Method to fill in the rest of the western sextant.
Notes
I kind of wish I had added more terrain types, or maybe started off generating different arms with different terrain types. Oh well, it worked out.
My pareidolia was going into overdrive looking at this map. In the direct south - four monster lairs and a castle? Has to be the realm of a dark lord. No doubt his (or her!)10 first act will be to threaten the temples and castle to the west, before sending their armies over the mountains. The ruined city and the road network in the high mountains might be the remnants of a much greater kingdom, reduced through warfare and ruin. I can see the shapes of domains and conflicts that might erupt in this region. I can see choke points, and dangerous areas, and spots where dubious picaresque protagonists can make their fortunes. I see a map brimming with potential.
Conclusion
And there you have it! A fully generated map that can be filled in with further detail. Terrain was generated mostly randomly, so I didn't fall into my "default" setups. I didn't have to sit and ponder for hours, trying to sketch up the perfect set of terrain, or consult geography books and land surveys to make sure everything perfectly made sense. I just followed my own rules and got what I think makes for a fun, playable result.
Obviously, there's a lot of improvements that could be made. For one, with all the rivers and roads, the limits of Worldographer are apparent. If I was redoing this, I might have spent a little more time polishing the looks. If you do this by hand, maybe your drawings will end up a little better than my digital muck. You could probably upgrade from Wilderness Hexplore to a more sophisticated terrain generation system, something with more terrain types than just flat/forested/hilly/mountainous/swamp/water.
Yet the purpose of this was not to develop the perfect, most beautiful map - in my opinion, that's not the spirit of the Hexcrawl25 challenge. The point was to take my existing tools that I'm proficient in, and put together something usable in a reasonable amount of time. My method met and exceeded that goal. The process of doing all this took about ~3ish hours, including building all the tools I used to automate the generation rolls.
Going through this process also reinforced a lot of my thoughts about random generation. Random generation can be valuable precisely for the thing many people complain about - seemingly incompatible results. I think that on most occasions, odd pairings or weird results can be a great springboard for imagination. Of course, there's always going to be a few things that are just unusable as rolled, and there may be points where the editorial hand has to enter to smooth things out. But I know for a fact I would never have put water-castles on a map I didn't randomly generate, despite that being such an interesting concept with many executions.
Of course, if everything is always uniformly random all the time, the world becomes incoherent and visionless, even if all the results are otherwise compatible. That's why I think procedures like mine are so important when using a lot of random generation. My little rules and guidelines helped me shape the random results in a way that made sense to me, and gave me results I could work with, while still occasionally surprising me. I felt like this process struck a good balance, walking the narrow path of weighted randomness.
After having done all of this, I do want to take this a little farther. I like generating settings and maps, and I think the Hexcrawl25 challenge is a reasonable way of doing it. If I come back to this, I may use the further Wilderness Hexplore tables to fill in some details for strongholds, lairs, and other features. That should give me enough inspiration, factions, and ideas that I can riff of that for the rest of the hexes.
I hate all visual artists and refuse to learn the visual arts. Illustrators, painters, and other visual artists dropkicked my parents into a ravine. Since that day I've vowed to fight against them all.↩
I wanted to link the document. However, in the process of writing this blogpost, I discovered that the original document (and possibly Jed's entire site?) were take down with a cease and desist letter from the Judge's Guild. Deeply unfortunate. This is not the time nor the place to get into my opinions on copyright and transformative work, however. I'll say, to any prospective GM who wishes to use my method here: ask around.↩
I'm borrowing the concept from Chicagowiz's Games' "Just Three Hexes" campaign starter. I think this method of campaign generation is great - you really don't need much of anything else. The only thing I didn't follow was putting a dungeon/adventure location next to the starting town, though as you'll see later, I quite fortuitously rolled a lair next to it.↩
I used plains/farmland but that's entirely a personal choice. It should be terrain appropriate to wherever you want a neat little starting village.↩
When I started generating hills, I knew things were going to work out. Hills aren't even rollable from the Plains column of the random terrain table, so their presence is reassuring that was going to get the weighted randomness I was looking for.↩
It was fast thanks to a short script and spreadsheet tool I wrote help me generate ten hexes in sequence. This might be an unpopular opinion, but I think the first thing any computer-literate GM should do when they get their hands on a random table is digitize and automate it, if possible. There is no substitute for being able to iterate on a system or table one hundred, one thousand, or a million times. Maybe there's value in rolling certain things by hand, but if you're going to spend hours to do something by hand, it's worth spending minutes to automate it.↩
As best you can remember, anyway. I'm sure I did some of these out of other and didn't make it too big a deal, but I can imagine if you just start from random-faces on the most recently generated hex, you'll get very snaky lakes instead of a nice big lake, bay, or ocean. But maybe that's what you want! Feel free to adjust or modify this process as you see fit. I'm not your mom.↩
As noted in Wilderness Hexplore, if terrain has already been generated, don't re-generate the terrain; just generate what the river looks like.↩
I think this is best for a pseudo-medieval/vernacular fantasy setting where things like bridges are big constructions from a bygone age, poorly maintained by the modern kingdoms and oft unavailable. Change it if you want.↩
One day I will get to play in a full-on villain game, where I can live out my fantasy of being The Dread Sorceress commanding my legions of monstrous/magical/ne'er-do-well servants to march out from my dark domain and conquer the world. For now, I'll have to settle for being the GM. (Or playing Shadows of Forbidden Gods.)↩