Monday, June 26, 2023

The Dolmenwood Overloaded Encounter Generator

As I mentioned, I started a Dolmenwood game using the His Majesty the Worm ruleset recently.

Dolmenwood is a fantasy setting inspired by British folklore and fairy tales with a delightful psychedelic vibe. It is "mossy," in a word. It was originally published in a series of zines called Wormskin (partially to credit with me getting into the OSR scene). A stand-alone OSE hack, hexcrawl, and monster manual are scheduled to launch on Kickstarter soon

To prepare for my game, I have made an elaborate Dolmenwood Meatgrinder on Perchance. Check it out!

Click here to play around with it!

What is this thing?

A Meatgrinder is a tool like an overloaded encounter dice that's used in His Majesty the Worm. In its simple form, a Meatgrinder is a table of 21 entries of encounters, events, and signs for players to encounter as they explore a megadungeon. 

When the players' guild enters a room, the GM draws an entry for the Meatgrinder, then reads the room key in combination with the Meatgrinder result. The combination makes play dynamic and interesting for everybody involved.

However, when running large hexcrawls, I suffer from tool-switching exhaustion. When running Dolmenwood, I need:

  • Hex key
  • The GM's map
  • His Majesty the Worm rulebook for reference
  • Monster entries
  • The playlist (each region of the forest has its own theme song, plus music for session start, battles, rests, etc.)
  • Dozens of random tables: 
    • the Meatgrinder
    • random herbs
    • reaction tables and monster activities
    • weather
    • settlement rumors
    • treasure tables 
    • etc.

In the past, I've felt bogged down by switching through the dozens of resources I have open to help run the game. I have 30 windows open and can't find shit. 

Hence, the Perchance Meatgrinder. Everything I want for the game in one place.

How does it work?

The Dolmenwood Meatgrinder aggregates the different randomizers I use for the different phases of His Majesty the Worm

Pic from the core book for reference on the different phases

At a top level, you choose one of the regions of Dolmenwood to generate content for (Aldweald, Hag's Addle, Valley of Wise Beasts, etc.). The content for each region is different.

Each section is explained in detail below.

A digression about the Meatgrinder

The purpose of the Meatgrinder is to make the game interesting for both the GM and the players, keep prep easy (maintaining a fresh 21-item table for each dungeon level is only minor maintenance), and introduce a gloss of verisimilitude. 

When playing a game where you visit a dungeon or city for 2-3 sessions, this is unneeded. Indeed, it's probably better handled entirely by GM fiat. When playing in a hex crawl/megadungeon game that's intended to last years, a well-designed Meatgrinder can do a lot to create a sort of internal consistency. Repeated visits to different regions of the 'Wood get their own texture and color by a combination of different vignettes, encounters, and monsters. The region of Nagwood feels darker not because I say "You enter a dark region of the wood," but because the encounters there are with more dangerous foes and you receive no respite from chance encounters with beneficent creatures.

The entire thing consists of 3951 lines of pseudo-code. Click "edit" in the upper right corner to look under the hood. 

Many of the entries were taken from the Patreon Dolmenwood materials, the original Wormskin zines, the excellent d4caltrops blog, the Goatman's Goblet blog, and...just tons of other places. I have a vast amount of random GM prep tools that I put into the sausage grinder.

Importantly, the Meatgrinder should not put out sentences like this: "You encounter 1 trolls. They are tossing a pumpkin back and forth." 

A lot of work was done to make sure that the text serves my purposes at the table. That includes making each output logically consistent, grammatically correct, having important actions bolded, etc. 

The Crawl

The Crawl Phase is where the players spend most of their time, so has the most robust entries for the Meatgrinder. 

Each Crawl entry looks something like this:

<b>Curiosity:</b> [hilly_vignette]
<b>Travel Event:</b> [t = woodland_travel_event.consumableList]
<b>Sign:</b> [table_down_sign] ^0.5
<b>Hex Feature:</b> The guild experiences the encounter specific to this hex.<br><br>If none, a <b>Curiosity</b>: [hilly_vignette]
<b>Encounter:</b> You encounter [m = table_down_encounters.selectOne, ""] <b>[n = encounters[m].number_appearing.selectOne, ""] [if (n > 1) {"[n] [encounters[m].namePlural]"} else {"{a} [encounters[m].name]"}]</b>. They are [encounters[m].activity.consumableList]

Curiosities are moments of serendipity. I don't like entries that say "Nothing happens," but I do like narration that gives a sense of place or purpose to a region. You'll notice that curiosities are based on the environment of a particular region, whether it's civilization, farmland, hills, forests, swamps, etc.

Travel events are challenges that test the player's ingenuity, the character's stats, or force resource attrition. Using a `consumableList`, I ensure that travel events won't be duplicated over the same instance.

Signs hint at the local monster population. This is things like "You hear a wolf howling in the distance." The sign tables and encounter tables are mostly one to one. If you hear a wolf howling in a region, you can also be attacked by 1-22 wolves in that region later.

Hex features are the way I'm handling the keyed entries from the Dolmenwood map. Sometimes these say "Players have a 2-in-6 chance of encountering the Wild Hunt in Hex 3201" or something. Instead of rolling each time, I'll just look at the "Special encounter" section of a hex if the Meatgrinder gives this result. If there are no hex features keyed, I'll default to a curiosity.

Encounters are when you cross paths with creatures. Sometimes these are sentients (knights,  travelers), sometimes these are helpful (merchants, healing friars), sometimes these are aggressive monsters (antler wraiths, bog zombies), sometimes these are wild beasts (musk boars, wolves), sometimes these are sorts of puzzle monsters (sprites, marsh lanterns). 

Each monster entry provides an activity that contextualizes the encounter (the deorling are singing "The Last Lament of the Deorling"), a random reaction (they seem happy to see you), and lists the number appearing. Sentient monsters are given a name: there's named lists for humans, elves, mosslings, goatfolk, woodgrue, etc., and friars and knights are given special tables of names, too. Knights even display their coat of arms!  

Encounters are different depending on whether its Night or Day. For example, `^[if (nightBox.checked) {1} else {0}]` ensures that creatures like headless riders only appear at night. 


Campsite events are important on overland hexcrawls. Sometimes these entries are pure flavor ("In quiet moments between conversation, wind keens its way to your ears"). Sometimes these are role-playing prompts ("Everyone reminisces about a childhood pet or favorite animal"). Sometimes these have mechanical weight ("Double chance to have a nighttime encounter with a sentient humanoid").

Some of these are from d4Caltrops, some of these are from one of the Wormskin zine, some are from the His Majesty core book.


There are three types of City events: City Vignettes, Hex Features, and Signs and Portents.

City Vignettes are curiosities that contextualize your visit to a settlement but don't have mechanical weight. 

Hex Features will be read from the settlement's description.

Signs and Portents are the most rare type of City event. These change the game world in some way. For example, one of the things that might happen is that a star might fall on Drigbolton, triggering the module "The Weird that Befell Drigbolton."

Rumors are something to drop in to conversation as you roleplay the City Phase with the players.

Hangovers occur when a player chooses to take the Carouse action. These are generated here just in case, and so I don't have to maintain a separate list.


Weather varies based on season. Change the season dropdown and generate today's weather. Italicized weather is disorienting and prompts checks to see if the guild gets lost as they travel. Bold weather is extreme and generates Stress if the guild is not properly outfitted.


Each region has its own background musical theme, which I use to provide a sense of continuity. Because of a bug I don't feel like fixing, you'll need to change the region dropdown once before the Music section appears. 

What can I do with this?

Well, if you want to run games exactly like I do, go nuts. Use the damn thing. I hope it's helpful! Practically speaking, I find this webpage to be more useful during play than the beautiful tables of Knock or Morkborg. 

I suspect you will want to change it to suit your own purposes or make your own. That is easy to do. If you have an account, you can click edit and make your own version. Adapt it however you wish, or use the underlying schema for your own games. Perchance has very robust tutorials and a very helpful community.

In the future, I might try and work on doing some, uh, front-end development on it. It looks like it's made with spit and gum right now.