
This week we have what I hope will be the first of many interviews with creators and game developers. I’d love to explore the mechanisms of their games, but as a conversation and in their own words.
The first Skeleton Code Machine designer interview is with M. Allen Hall, the creator of Unhallowed and the kid-friendly TTRPG Sprinkles is Missing!
Allen and I talked about game design, his fantasy book series, and unicorns. I hope you enjoy it.
Thank you so much for taking the time to talk!
Let’s start with a little bit about you and your background. Tell me about how you ended up making games!
A few years ago, I started writing a novel. I had been waiting to have an idea for a story, and D&D gave me the idea that I needed. My novel turned into a series; a 5-book epic fantasy.
When I finished that, I knew I wanted to keep writing, but writing novels was exhausting. At that point, I had gotten my hands on the MÖRK BORG rulebook and fallen in love with the game, its simplicity, and its vibe. So, I turned one of the dungeons from my books into a module. The response from the MÖRK BORG community was amazing, and I was hooked!
I wrote some more modules, and I slowly worked my way toward writing standalone games.
First full game was my Wretched & Alone game, Stork Raven Madge. It's a solo-journaling game about an ornithologist abandoned on an island during a research trip. You will focus on your research while learning ever darker secrets about the island's history.
So you are the first author that I've interviewed! How does novel writing influence your games? It sounds like it's influenced at least one of your MÖRK BORG modules!
For sure! I think my experience writing novels has really helped me focus on the story-telling aspect of TTRPGs. When I write a game or a module, I have an idea for the stories that might be told, and I try to put just enough info in to help a GM/solo-player create a compelling story.
My [book] series is called The Voidbringer Campaign.
I’m curious what your background is related to programming languages. What’s the story of you becoming a coder?
I have always had an interest in coding, and I have taken “Intro to Python” courses three or four times in the last 20 years, but I never really had a reason to use it, so it didn’t stick.
At the end of 2022, I decided that I wanted to make a mobile app version of a solo-journaling game (this ended up being Stork Raven Madge). For that, I learned how to write Dart and work with Flutter.
My kids are taking Python classes now, so I’ve had to refresh myself on the language to help them with homework and stuff. My son asked me once how many battles would be in a game of War (the card game), so we modeled it using the Python that he knew. After that, I’ve been using it for modeling mechanics for TTRPGs that I play or that I am creating.
I'm not familiar with Dart or Flutter. What's the short version on what those are and when you'd use them?
Dart is a full-feature programming language that (I am told) can be used for lots of applications, but it is almost exclusively used to develop Flutter apps.
Flutter is a framework for creating cross-platform apps. You write a Flutter app with Dart code, and you can compile it to run on an iPhone, an Android phone, on the web, on a PC, or on a Mac.
One codebase for almost every place you might want to run your app.
I’m always curious about the workflows of other people. What does writing code look like for you?
After seeing your plots that you made with Seaborn, I tried using that library. Honestly, I struggled with making it do anything interesting. I found the documentation extremely thin on how you are supposed to format your datasets, so I gave up on it.
Now, if I have a small question about a mechanic, I'll use a Python template that I've put together, but for bigger models I have actually started doing more of the testing in Dart. This was because I had already written code for exporting datasets as CSV (I’m sure Python can do this, but I had already written the code in Dart). I then drop that CSV into Numbers on my Mac where I can easily tweak a chart to visualize the data.
I use [Visual Studio Code] for all my coding. And yes, at this point I essentially have a template that starts with creating the dice rolling and card drawing functions and ends with the export functions. I just build the gameplay loop in the middle of the code to create the test.
You actually have not just one, but two games where you used code to help develop them! Let's talk about Unhallowed first. Can you tell me about the game?
So, Unhallowed is a depth crawl. It is also a solo-journaling game.
It has a table of events that might befall your character, and a stress score for your character.
Each round, you roll a die, add your stress, and this gives you the prompt for that journal entry.
When I started, I didn't know how many events to have on the table, what number the stress should start at, or what type of die should be used.
I made a few guesses, and found that the game would give the player something like 40 prompts. I decided that that was far too many, so I had to make adjustments to how to increment the stress each round, and how many events should be available.
Using Python to run the loop 100,000 times to see the average number of prompts given to the player allowed me to make those tweaks very quickly
I didn't actually plot out every possible variation. I set up the code to run the game, ran it 100,000 times, and then went back into the code to tweak one or another of the variables. I'd run it again, see how it looked, and then make another tweak.
The other game is Sprinkles is Missing which is currently live on Crowdfundr! What's the game about?
Sprinkles is Missing! An all-ages TTRPG of creative magic, collaborative problem-solving, and fantasy adventure.
Players take on the roles of elementary school students at a school of magic. The school's mascot, a unicorn named Sprinkles, has gone missing. The students are convinced that a grumpy wizard has kidnapped Sprinkles, and they head off into the nearby enchanted forest to rescue him.
It's a rules-lite game of that's appropriate for RPG players of all ages. To play, you really only need to be able to make up creative solutions to the problems that the game presents. And it is absolutely accessible for kids down to five years.
How did you use Dart to help develop Sprinkles is Missing, and how was it different than what you did with Unhallowed?
There is dice rolling, but in a very simplified way. The players roll D6s, and they want the 2 highest numbers to add up to 8 or more. They have to roll dice any time that they use their magic or any time that they are trying to solve a problem.
For magic, at first, they only get to roll 2D6s. Once they do it successfully, they get better at using the magic, and next time they get to roll 3D6s. They still add up the 2 highest numbers to meet or beat 8. Once they successfully do that, they roll 4D6s when they use that spell.
I used coding to model the dice rolling to find this setup. With these numbers, they have a 42% chance of succeeding, and then a 68% chance, and then a 83% chance.
I wanted the players to be mostly successful, but I also wanted there to be a clear improvement as they used their magic more.
I tested several different mechanics to get to this, but after a while I decided that I only wanted to use D6s.
Another possibility I tested was always roll 4D6, and then add up either the bottom two, the middle two, or the top two. This ended up being a little more confusing than I wanted, and it had a much wider spread of success rates, so I ditched it.
What would this type of testing look like without using coding? Maybe via math and statistics, or playtesting?
Without modeling it with code, I might not have figured it out until live playtesting, and that would have been a long way to roll back the game writing to fix.
I have tried to do statistics to figure these types of mechanics out before. Dice have fixed probabilities, right? But they get complicated really quickly when you add things like dropping the lowest or rolling different combinations of dice.
And I could playtest every possible mechanic, but that would limit me to maybe a few dozen dice rolls before I got bored.
With code, I can play a game a million times in a few seconds. When my son and I made that War simulator, we ended up making the computer play the game 10,000,000 times. It took my laptop a few minutes, but not nearly as long as I expected it to take.
Any thoughts on how to know what to test in Python/Dart vs. what will require actual playtesting with humans?
I focus on the probability of things happening that are decided by dice rolls. Once you add a step that involves a player choice, I usually don’t model that because I don’t want to make assumptions that players would make the optimal choice.
I have found that players rarely make the optimal choice (in fact, many actively avoid it for the sake of telling a funny story).
Writing a model to incorporate the chances of a player making one choice vs. another is where I draw the line.
Many Skeleton Code Machine readers who would love to do the kind of testing you do with Python. How can they get started?
Yikes, I’m not sure. I’ll just use google when I need help with a particular operation, but at this point, I haven’t taken an actual course in Python for a while.
I’d say, start with a dice-based mechanism. Think about the workflow for developing Unhallowed. I didn’t want it to be super long, and I wanted there to be a variety of prompts generated by the table. Try to set up a similar test for a depth crawl. Pick a table length (I ended up with 19 prompts), pick a die (I tried D4, D6, and D12), create the loop for running through the table, and run it 100,000 times. See the average number of prompts you get in a complete game. Then, tweak things: the length of the table, the advancement of depth, the die size.
Most important question: What’s your favorite dinosaur?
Spinosaurus. It’s big. It hunted on land and in the water. Big old sail on its back and it doesn’t care if you can see it coming, cuz it ain’t gonna matter.
Thanks again to M. Allen Hall for taking the time to talk. The Sprinkles is Missing! crowdfunding campaign is live right now, ending on July 28. You can find Unhallowed and Stork Raven Madge on itch.io, and The Voidbringer Campaign on Amazon.
You can also see some of Allen’s code in his Github repo.
The best way to support Skeleton Code Machine is to share it with a friend!
Skeleton Code Machine is a production of Exeunt Press. If you want to see what else is happening at Exeunt Press, check out the Exeunt Omnes newsletter.
See you next week!
— E.P. 💀