Bommyknocker Press

Dice-Drop Hexmaps with Minecraft Biomes

Hexmine

This post contains a dice-drop system designed to mimic Minecraft world generation for hexmaps. The goal is to create fantastic but logical hexmaps that mimic the Minecraft traversal experience in your elfgame of choice.

If you just want the process, skip to the method here.
You'll also need the Random Biome Roller on Google Sheets here.

Minecraft
A logical progression of landscapes (most of the time)

CONTENTS

Introduction

One of the many lovely things about Minecraft is the pleasure of traversing the land, as one biome gives way to the next.

To be fair, watching the landscape slowly change is also one of the pleasures of going for a walk in the real world. Minecraft offers a toy version of it, and does it well. Narratives emerge as you pick your way from the snowy peak of a mountain to a vast desert far below. This sense of narrative is tied to the relation between each region and the next, usually a logical (if fantastical) progression of landscapes.

This is a neat concept to plug into our own hexcrawls. Minecraft's own world generation is too computation-heavy to replicate exactly. Besides, you can already mod Minecraft to spit out hexagonal biomes. So my goal in this post is to make a toy version of this toy biome generation that we we can build by hand.

Here are the design goals:

The Idea

Each region will be made up of multiple hexes; a different biome will be assigned to each region. The overall plan is to create regions using a die drop method to generate contour maps.

die-drop-1

Die-drop contour lines

Overlapping 2 contour maps, we get the shapes for our regions, as well as a pair of values for each of them. Each contour map represents one of the Minecraft worldgen parameters (Temperature & Elevation).

die-drop-2

A pair of values

We reference these parameters to create a set of tables to roll on when selecting which biome to place in which region.

Biome Generation Parameters

Minecraft uses an algorithm to generate unique worlds for each game seed. This means each game takes place in a world that is unique but familiar.

Thankfully we're only interested in the overworld, and we're only interested in biome generation - how each region's shape and theme is decided. Even then, it's complicated. We'll come back to shape; just considering the placement of each biome, there are 6 parameters that the algorithm uses to decide which biome is generated where:

Additionally, as a function of 'Weirdness' we have

When a new world is created, each spot has a value for each of these parameters; the exact combination of the values determines which biome is generated. I'm not going to go into it because we're throwing most of it out - 6 parameters are too many to feasibly replicate on dice and paper. We'll use 2.

Going back to our design goals, we're aiming to replicate a logical progression of landscapes. So similar biomes ought to appear next to one another. What parameters will we use to determine similarity?

Temperature and elevation seem the simplest to implement and have the benefit of being easily understood with reference to the real world. So we need to ensure that the world we generate has a gradient of hot regions to cold ones, and high regions to low ones.

Luckily, the Minecraft Wiki has a chart of overworld generation parameters. Luckier still, the values for our parameters fall into 5 discrete bands for temperature (Frozen | Cold | Medium | Lukewarm | Warm), and 5 discrete bands for elevation (Valleys | Low | Mid | High | Peaks).

Unfortunately this doesn't include oceans. I want to add them as a possibility, so we'll add a band for Oceans and combine the High and Peaks elevations into a single band (they have similar biome generation anyway). This gives us the final 5 elevation bands: (Oceans | Valleys | Low | Mid | High/Peaks).

For each pair of Temperature and Elevation parameters, we can now make a list of biomes which may generate for any given location.

For instance, here's the list of possible Warm Valleys biomes:

The Random Biome Generator sheet lists these out too.

Biome Shapes

Let's go back to the shape of the regions. All the world generation in minecraft runs on Perlin noise. Have a look at it: it's got a trademark blobby shape.

Perlin Noise

Perlin Noise - lovely randomish blobby shapes

This is desirable for us; it's a pleasing mix of randomness and determinism. We're aiming for regions with nice blobby shapes like that.

You can create noise with dice rolls. But you need thousands of dice rolls, and we're not working on those scales. The good news is, we can create blobby shapes quite easily with a pencil and paper.

This is where we actually begin making our hexmap.

Freeform Generation

To make the contour maps that represent the different parameters, we drop a handful of dice. We'll start with Elevation, which most contour maps typically represent.

Draw a dot next to each die and number it with the face shown. I was pretty arbitrary with the exact location of the dot, mostly trying to avoid them being to near one another.

die-drop-3

For my first hexmap I cheated and used d4s

Keep dropping the dice, trying to get a roughly even distribution of dots on the page. Remember, the more dots you generate the smaller your final regions will be.

die-drop-4

A page full of dots

Now we collect the dots inside our contour lines. Steeper contour lines represent steeper gradients.

die-drop-5

Remember: contour lines never cross

When the whole page is covered, we have a map of the final elevations. Every point is within a band, which tells us which elevation it will be in when we select our biomes.

Now it's time to do the temperatures. We choose a different coloured pencil (blue in the example) and generate the overlaying contour map.

die-drop-6

Two contour maps overlaid

The final region shapes are these overlapping areas. I like the organic nature of the map at this stage, but later we will superimpose a hexgrid over this and transfer the regions to a final hexmap.

die-drop-7

Regions with codes

Each of these regions now has a code on it. (I found the 2-number code a bit tricky to work with, so in the future I've decided to use numbers == temperature and letters == elevation.)

Now I have my list of coded regions and a list of which biomes might generate for each code. If I wanted a regular old map I could now generate my world. Instead, we'll transfer the region codes to a hexmap first.

I used Photopea for this step. (It's Photoshop but free and online.)

I decided to map colours to the temperature bands because that's already a familiar visual language.

I outlined the original temperature contours and coloured them appropriately using a paint bucket fill.

die-drop-11

Colourised temperature contours

On a new layer I outlined and filled the elevation contours using greyscale.

die-drop-12

Elevation contours

I used the Overlay blend mode on these two layers. This combines the greyscale info and the colour info to produce progressively lighter areas as the elevation goes up.

die-drop-13

Blended contour maps

At this point I started thinking, Oof this is a lot of work. We're not quite done yet though.

Finally I imported a free hexmap and overlaid it on a higher layer. By setting the Blending Mode to Multiply, you can see through the hexmap and refer to the original region map.

On the hexmap layer I used the paint bucket tool to fill one hex at a time with the underlying colour. Numbering the regions means that I can enter the region codes into the Random Biome Roller and generate the whole world at once.

die-drop-10

Numbered hexmap

I took the region codes to the Google Sheet and generated the various biomes.

World-Roller

Worldgen in Google Sheets

From here I recreated the map in HexKit. For the tileset I used a mix of Highland Paranormal Society's and Wuggy's sets. I also used Vicky Radcliffe's Heightened Sensory Input tiles for a lot of the colours to make them pop.

NOTE: all three of these tilesets use art that relies on the hexmap being pointy-side up. I didn't check this before starting the process and had to redo a few steps, make sure you plan ahead!

final-map

The final map

It looks good! I'm planning to actually use this in an upcoming Mythic Bastionland campaign.

BUT it really was a lot of work. Overlaying the hexmap and the contour map was time-consuming, and worse, flouted one of the design principles - if I'm using a computer this much I might as well do the whole thing on a computer. (It probably could be done with some clever Hex Kit plugin.) I'm going to try again, and stick to pencils and paper.

Direct-to-hexgrid Generation

The solution came from Prismatic Warren in Discord.

You could put the dots on a blank hex map and, when drawing the lines, have them lock to the nearest hexlines instead of the naturalistic curvey lines

By dropping dice directly onto the hexmap, I could skip the transcribing stage. Long story short - it's good, and saved a heap of time.

Again, I started with temperature bands

I also decided to move to a d10, and halve the result to generate the numbers 1-5. I had fudged some results onto my d4 rolls before to get a wider spread of values. This feels fairer. (Unfortunately dropping d10s is way less satisfying than d4s. But this is the price of accuracy). I coloured the tiles directly as they were generated.

die-drop-15

Dropping d10s for temperatures

We generate a series of points across the map, and will connect them up as logically as we can, as if we are working with contour lines.

die-drop-16

Temperature points

Now we have certain points generated, we can infill the rest of the tiles to make a gradient between the hotter regions and the colder ones. I've tried to step up the list of temperatures one at a time. This wasn't always possible - there are a few places where I've had to put a Frozen region next to a Temperate region for example.

die-drop-17

Temperature gradients

Once the temperature gradients were done I moved to elevations. First a series of points.

die-drop-18

Dice drop for elevations

Then outlined regions.

die-drop-19

Outlined elevation bands

Finally I used a thick sharpie to outline the elevation changes and a thin sharpie to outline the various regions.

die-drop-20

The final hexmap

Overall I think there are too many small regions, which means I've dropped too many dice. For some reason I also wound up with a few huge regions, which I've carved into smaller sub-regions to get some biome variation.

I'm happy with the outcome. It was way faster than the freeform method, and didn't require a computer at all. To complete this map I will next have to roll on the biome tables and assign biomes to each region.

It's probably still worth taking into HexKit for a player-facing version, but this is already gameable.

Region codes

Initially I was labelling regions with a pair of numbers - (3,1), for example. This kept getting confusing, so for the final version I've changed to a number and a letter.

By entering the list of regions into the Random Biome Roller I can generate biomes for the whole map at once.

Limitations

Variations

Overall I think this is cool. Minecraft biomes are neat, and there's a lot you could do with them from here in terms of generating unique structures, landmarks and encounters for each biome type. Minecraft generation itself has data that would make a good starting point here.

But if you wanted to step away from Minecraft you can easily utilise these techniques for other approaches.

Temperature Bands

Modelling a bit closer to real-world climates, you can use die-drop for elevation, and simply draw temperature bands, to simulate the climate getting hotter as you travel further north. I actually tried this one.

If I were going to do it again I think I would be more intentional with the temperatures and ensure my highest elevations got colder temperatures.

die-drop-21

Temperature drops the further south you travel

Different Parameters

Rather than modelling Temperature vs Elevation, you could use this format to generate other sorts of hexmaps. For those of us who aren't looking to just emulate Minecraft this might be the most fruitful outcome of the whole endeavour.

Some thoughts:

Credits

There was some good chatter about this project in the Prismatic Wasteland Discord. Thanks to Mr. Wasteland himself for the original idea & the idea to die drop directly onto the hexmap. Check out his excellent adventure Barkeep on the Borderlands here. (And why don't you go read my jam entry supplement here while you're at it.)
I'll also call out his Hexcrawl Checklist for next steps - it contains a wealth of ideas and points to other resources if you actually want to run a hexcrawl on your shiny new hexmap.
Thanks to Farmer Gadda and LootLootLore for their expertise in Minecraft worldgen and for assisting with resources for it. Gadda has a Nether Depthcrawl that looks great, and provides a useful format for if you want to flesh out Minecraft biomes with structures and encounters.
LootLootLore did this wonderful post on 1d6 Small Gods recently.
Thanks to Personable for the temperature bands idea. Check out his excellent post on Reframing Skill Checks.

#hexcrawl #mechanics #world generation