Could you treat a character sheet as an append-only log?
2021 08 20
I'm a big player of table-top RPGs, which mean's I've spent a long time working with editable PDFs. Often, you'll get an editable PDF with some huge, overly detailed background image bloating the whole file and you have to deal with updating it every time your character changes or gets some new equipment or whatever. This is less than pleasant, as anyone who's spent any time using an editable PDF will tell you. Changing the parts that it's good at are awkward enough, having to double-click and type in a new number where an old one sat. Changing the parts it's bad at are plain awful - if you intend to keep notes on goings on and other characters in your PDF at the start of a session, you'll have given up by the end.
The alternative is often a little better - spreadsheets wired up in a complex and baroque dance. These take care of a lot of the little pieces of maths for you, meaning you have to edit less often - but the awkwardness remains for editing, and the weakness for longer-form text remains. Spreadsheets hold the added excitement of any mis-click potentially breaking your character sheet in some unknown and possibly unnoticed way until it's too late.
Then there's the hand-written sheet. Which you need to erase over and over again, whenever you need to change it. And in this time of remote play, you'd have to send a photo of your sheet to your GM after every game at least.
Each of these three options only shows what is currently true about the character. You can't go back and ask what was going on a few sessions ago, you can't figure out where you spent that gold you thought you had - and you can't audit where you spent that XP after the fact - even if you made a mistake.
All this to say, I've been wondering if I can do better.
My core idea is the question in the title of this post - could we
treat a character sheet as an append-only log? In a plain-text based
sheet, this would mean that instead of going to a line that said
gold: 42
and changing it to say gold: 43
when your character finds
a penny on the ground, you could add > gold + 1
to the bottom of the
sheet and the next time you ran a program it would tell you gold: 43
. Effectively, instead of overwriting your properties every time,
you never touch old lines and only ever add new - telling the sheet
what has changed since last time.
This simple idea gives us quite a lot, and tooling can be built around the concept in order to smooth away any remaining awkwardness that might come with adding text to the bottom of a simple text-file.
A very simple but useful ability this gives us is the ability to write long-hand notes about what is happening to our character at any given time, possibly even while the game is running. This can come surrounded by the context of mechanical stat changes or adding or removing items or resources. Your character sheet becomes the story of what happened to your character.
For this exact same reason, you also get 'auditability' - you can see what you spent that gold on last time, you can check if that ability really cost that much XP, you can check up on how many times you shot your gun in last weeks session.
And for free, you get the ability to rewind through your sheet. If you add markers to major changes or sessions, you could step through what your character has done and how your character has grown and changed over time.
I'm sure there are other things you could use all this information for. Needless to say, by asking myself this question I've ended up intriguing myself. I've come up with a bunch of ideas using this simple format as a backing format too - from a tool designed to allow for real-time editing, querying and dice-rolling based on your current sheet so you can play and keep up to date all at once; through to a tool which could create GUIs for any arbitrary sheet and allow you to edit it as if it was software built for the purpose, but which was simply adding events to your text-based sheet in the background.
The first step is going to be making a simple parser for the format I have in mind, playing around with what works and what doesn't. Once that's solidified, I might make some posts talking about what it looks like and how I parse it - but for now I think the idea is enough.