Everything Was Green

Everything Was Green
Our calamansi (calamondin) plant blossoming despite not being fully potted and surviving pretty terrible midwestern storms the past few weeks.

I've been craving table top nostalgia as a way to slow down. My summer so far has been cognitively heavy and I'm finding myself flitting from one task to the next without much pause these days. Something about a half day of light math, role playing, story telling and discovery makes time stretch. This essay is part nostalgia and part exploration into my way of archiving the game through digitization.

During some parts of this essay, I have my coding assistant articulating its decisions. I welcome reader feedback on the suggestions and approaches we're taking, call this an essay-based code review? Drop me a note anytime!


At some point during this frenetic summer season, I stumbled upon my dice, character sheets, and notes from a table top role playing game my friends and I used to play. Helna, a world my friend created. 13 gods standing in for a class system in a world loosely based on Dungeons and Dragons, lots of 10 sided dice, and belly laughs. My friend took days to draw intricate maps and worlds with the utmost care, he'd illustrate special weapons he'd bestow upon you during adventures. All one of a kind collections. We played it for 15 years off and on.

Since it was loosely based on the D&D system, our character sheets were all hand crafted too. Old me picked the worst combination of materials for preservation with the first item I photographed and archived - a yellow legal notepad page and a #2 pencil. Scribbles and sketches, skills crossed out here and there, weapons power mismatches against various other notes. Next, was a printed template version of it and finally the clarity of who this character was: Ezva "Hero of Vika, Champion of Slipos." I created her as a character for this world and game around 2006.

The transcription of the first sheet is full of bracketed notes where I am pretty sure the hours-long game sessions would just get parenthetical attention by the end of it. And rightfully so, since half the time game sessions ended up in side conversation catching up about life or sharing a quick meal in the kitchen arguing about whether we heard the game master say something about an enemy's hit points that could be a 1 or a 0 - a disastrous difference during active gameplay.

This isn't the first time we've archived the game, but it was the first time I'd taken pictures of my old character sheets and various permutations of the same hero. The first time we archived the game was during the pandemic, it helped us play remotely over Zoom. I used Notion to setup the database structure and the party of friends filled in the content as we went. This worked for a while, and as life happens, we lost track of playing together for the last few years.

Sketch of one instance of our party by our friend and hyper talented illustrator Chris Bell (who also played Demetrius, Far Left). https://www.cbellillustrations.com/

First things first

Fast forward a few years later and so much more is possible. This time I'm approaching Helna with AI assistance (and an explicit intention to learn what is happening under the hood). I decided that the engine itself should come first. Combat math, the god tokens and action economy and how the characters skills impact the world. I figured that by having the engine first, I could make the development more tractable, even though I badly wanted to bring my other friend's character designs of our latest party to life.

This was an explicit choice. I'm sure I could have outsourced this decision to a bot, but I emphasize this part of the process because it's based on experience building complex products. AI assistance makes it too easy to lean hard the other way into a fully finished product, quickly and expensively. The visually impressive layer ships fast, but it doesn't tell you whether the thing underneath it is correct. My second decision was to keep every increment small enough to play (which arguably isn't too much about the game breadth itself and just a product habit). With these two decisions, I stood up a webapp to be able to test the engine itself first.

NOTE: This is all original artwork so I am taking as great a care as I can to maintain its integrity. I've not used it to regenerate derivative works within any part of this game and even when I touch things up or make a design choice for the system I insist on provenance and transparency within the UI.

This photograph is proof

GLHF OCR!

The third approach I honed in on for this project was focusing on test-driven development. TDD is a topic several of my teams have gotten wrapped around the axel on before. Strong opinions, strongly held. In this case, it seemed like the right approach to emphasize to keep myself sane. Thankfully, we had moved some of the game mechanics to spreadsheets anyhow. A 2021 version says Endurance 5, Strength 4, Life 10. The engine has to work with HP 10. I had the spreadsheet as an artifact for this very purpose ready to go out of the box.

Except the spreadsheet was still only a secondary source. We built it in 2021, carefully, out of how we understood the rules back then. Having the spreadsheets revealed mismatches with paper versions of the character sheets and adventure notes. These discrepancies made it even more important to focus on both the engine and a test driven approach. This made it possible to have every assertion in my test suite a transcription with an expectation attached. Pretty convenient!

To make that work at the dice mechanics layer, the rules engine takes an injected random number generator instead of Math.random. A helper maps a desired die face to the value that produces it, so a test can hand the engine exact values and assert the chain totals the correct amount. That decision, made for testability, is why there's a seed box in the working prototype of the game. Anyone at the table can type the same seed and replay a fight die for die. Reproducibility started as a unit-testing convenience and can now be used to assert the game's world.

The formula that matched exactly

I worked through this approach codifying what I could of the engine myself based on a very hazy memory of playing. The thing about these kinds of games for me is that I end up being very present focusing on the story of the characters and adventure narrative (or let's be honest, just hanging out with friends) over absorbing the actual mechanics. Unlike Civ, talk to me about details of that all day. But alas, a poor recollection makes for poor engine replication.

So from memory: a check is a bare d10. Natural 10 succeeds and explodes. Natural 1 blunders and so on.

The reasoning was decent. The game has a reroll economy, a character level-10 perk called Reroll Fail plus god tokens lets you spend to try again, and that economy is pointless in any system where skill adds to the roll, because a 10 would auto-succeed. The weapon tables are labeled POWER in the game master's handwriting but the archives didn't reveal much about how this impacted the tallies.

I did have one singular fight log from a 2021 session transcribed into Notion, so I was able to build the damage formula on top and calibrated it against Attacker's weapon skill 9, plus the staff's Power of 1, minus the brute's armor of 3. That's 7. The log recorded a hit of −7. We mostly kept our own notes on individual adventures and fights, so there's always been a huge gap in this area of documentation.

What I should have asked is what a fight log is for. It's the record of a night at a table, written at speed by somebody keeping the game moving. Whether it could serve as this kind of artifact for game development led to all sorts of other problems - more on that later.

One of many hand drawn maps by our game master.

11 days into this. How do I know it's right?

Spot checking all of this from only my own memory is a fool's errand. One day I asked my partner what he remembered. He's played beside me for most of those 15 years, he drew the map of the Crossroads and expanded the world himself - he has a better head for rules than I do.

He said you roll a pool of dice equal to your skill level. A single natural 10 is a success. 2 or more natural 1s is a blunder. A blunder beats a success even when a 10 is showing on the table.

Under my version, skill was the force behind the swing. Under his, it's the size of the handful.

Memories restored. It took one conversation. Yet another tool that's served as instrumental is my decision log - left for myself, agents, and the poor other souls I'll ask to collaborate with me on this project. Decision 015 supersedes decisions 001, 008, and 011, and partially supersedes 002. The entire resolution layer built on quicksand folding onto itself by design.

Rebuilding on the rules cranked the test suite up 152 tests and a 500-fight soak now reruns on every commit. All of it turning that happy green as I hummed along. It's too green. Experience has taught me to dig deeper if everything is passing all the time. Super sus as they say.

For this, I badged the new rules transcript, which serves as a tag when the decision is based on a corroborated conversation (recorded and actually transcribed) about the rules from other players in the game.

I'd been building this for weeks before I asked for one other person's clarification and it changed so much. I'd been treating this like a solo project because I thought I had all that I needed to let AI do its thing, but it turns out I was missing pockets of ground truth about the game everywhere. How would I know this game is right otherwise?

I'd lost touch with my friend, the OG game master. Would he have it? For the most part, yes, however during my QA passes at the archives he also showed internal inconsistencies with his own world (of course he's only human and he did iterate on the game).

The main modules

At this point I decided this version of the webapp will be its own utility for the Helna platform. One that will be useful for friends if they end up creating their own games in this world. Now that I'm through most of the guts of the main chassis, I can see distinct aspects of the Helna platform emerging.

I could have gone with a monorepo with this project but decided against it for two reasons. The first is a separation of concerns. I wanted the world to be able to be maintained on its own entirely. Consider it a Codex or Compendium of Helna. There were many contributors and friends that participated in making artwork and more that I imagine some day may want this archive for themselves. The second reason is because I saw this as an opportunity to inner source the game amongst my friends. We already had side-quests where a friend would serve as game master for an adventure. My partner would build entire new cities, people, species. Another friend would build custom mini-games when he took his turn as game master. Helna was something of a platform for creativity. Maybe my friends would like to use the Helna archives to make their own worlds too. For this, the chassis QA utility is the webapp that is powered by evals and truth validation against the codex.

A custom validation station

Every evaluation measures a system against ground truth, and most writing about evals treats ground truth as a thing you go and get. (I'm biting back the urge to digress into epistemic commentary...)

My ground truth is 48 photographs of a typed binder, 34 handwritten sheets across 3 template generations and mostly in my own hand, a Notion page wiki whose Rules page is blank, a spreadsheet 2 of the players built in 2021, and 4 people's memories. Plenty of it disagrees with itself, and none of it is authoritative alone.

For this, I created a taxonomy for deciding what counts as correct. Confidence here has 5 states.

  • confirmed is verbatim, with the photograph attached
  • transcript is relayed by a person
  • inferred is derived, usually from a single source
  • house is a hole I filled myself, linked to the decision that filled it
  • disputed is 2 sources contradicting each other, with no winner

An entry claiming confirmed fails to compile without verified provenance, the build will fail if this happens.

A little looser, confirmed only means a photograph proves a page said something, and whether anybody played it that way is a claim my schema can't evaluate e.g. Decision 006 promoted a poison rule to confirmed because 2 documents agreed against 1, a vote among pieces of paper that's made it through almost 20 years of moves.

Retracing steps through the archives while keeping track of the rest of the codex.

The heart of the doc

D&D is a shared world because it has a document. The rules are published, versioned, and citable, which is why thousands of tables can run the same game and argue about it in the same vocabulary. The thing that makes that work isn't the game. It's the reference.

We tried to do that with Helna. More than one of us ran sessions, writing adventures, adding monsters, pushing into corners of the map nobody had used. It half worked. What kept snagging was that everybody's rules had drifted a little, in different directions, and there was no text to check against. You could ask the person who made it, and he'd tell you, and the next time he might tell you something adjacent.

This is the portion of the game build that's been captivating me the most. The author is a source, and a source is fallible. He built the world, so his memory outranks mine by a mile, and it's still a memory, subject to the same decay as everybody else's.

Which is what the confidence states are actually for. I'd been treating them as bookkeeping for my own uncertainty. They're the thing that lets more than one game master eventually stand on the same corpus.

What's still open

There's a notebook page in the corpus dated 4/13/21, in my handwriting, working out who Ceridwen was going to be. Assistant to the high priest, studying the origins of the gods. The word Philosopher is crossed out and replaced with Knowledge lover. Down the margin are comparisons I was reaching for, Ceridwen and her cauldron from the Celts, Seshat from Egypt, then "Mayari / Filipino?" with a question mark I put there myself. Here I was doing provenance work on my own character 5 years before I started doing it on this iteration of the game, and I wasn't sure of my sources then either. More questions, less truth.

This whole process has left me feeling like a time traveler, moving forwards and backwards all at once. I'm glad to have actually played this game and lived with it enough to cherish it as a sentimental archivist. At least this is one ground truth I can self-validate.

My very first character sheet from ~2006.

Subscribe to Of Hearts and Minds

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe