You ever wanted to turn a Gnife Gome into a Possessive Sludge?

Battle Agains a Discourse Tree and two Moon Toads

Never in my life had I imagined I would once dedicate an entire Blogpost to a specific spreadsheet, but it is 2026 and the world is still lost in the Clown-Dimension, so let me tell you why I'm in love with this spreadsheet I've built for my JRPG game.

Here's what it looks like:

Image from the first ten entries of my game's move-spreadsheet.

The main reason for its existence is that I wanted every single attack, or special move in the game to be stored in a central location, instead of hard-coding them into each enemy, or having them be separated between player specific, and enemy specific moves. You'll see why that was important for me soon. The second reason why it's a spreadsheet (that will be turned into a csv file) and not something inside of the engine, is because having a spreadsheet makes it easier to maintain and work with.

In a very simple way, I've taken the basic idea behind the Dialogue Plugin I've been using for Virtue's Heaven and applied it to how this project handles its actions.

Here's an image what roughly happens when you perform an action in this game:

Flowchart showing how my game's interaction between an 'Actor' the spreadsheet and how the collected data is then further processes.

Considering the monuments in honour of spaghetti code I've built in the past, this entire system is shockingly simple. The only thing that's saved on the actor's side in regards to their actions are a handful of strings that correspond to the respective spreadsheet entries.

For example, if you were to perform a physical attack, the game would look up the entry number for the ID "simple_physical" and pull all of the data from the corresponding line, and take that, as well the relevant character stats to calculate the rest.

I initially only intended to use it for battle-specific actions. So enemy attacks and things the players could do. But I quickly realized that I could also use it to create the player's item inventory, or their spell-menu. Basically anything that corresponds to an action you could perform in a battle is saved in here and the only difference between it being treated as an item, or a spell, is the context from which it was pulled. Beyond that, it will always work the same and do the same things.

Further Benefits:

It is easy to work with:

Because all relevant data is located in clearly defined locations, I can quickly check numbers, or change specific parameters. I can very quickly create new moves and test them.

Easy to Fix:

Because every move goes through the same system, it's easy for me to trace any potential problems that occur. Honestly, the biggest source of bugs right now is me miss-spelling something in the spreadsheet.

(Almost) Every Move works Target-Agnostic:

In my eyes, one of the hidden strengths of the ATB-era Final Fantasy games was the fact your moves weren't restricted to specific target types. You were free to use healing items on enemies and attacks on party members, and the games made use of this freedom in a lot of interesting ways that go beyond the simple "use an Elixir on the Undead Boss". It even enabled some very interesting, unintentional use cases.

This system that I've built is similarly target-agnostic. It's not perfect (I made a mistake during the initial set-up that basically doubled my workload), but about 90% of the existing moves work regardless of who is being targeted by them.

The spreadsheet only needs a valid line-number to pull its data:

I said how the game is now also building the player's inventory through the spreadsheet, and the main reason why this is possible, is because all the inventory needs is the move ID of the item in question. Where it is saved and what it's called in the UI doesn't matter.

That also means that it's technically possible to make items out of any move that's in there. All it has to do is to be added to the inventory.

And here is where it gets cool:

Because of these last two elements, I've accidentally built myself a gigantic box of toys that I can access, as long as I can find a way to address one of the lines in the spreadsheet.

Here are some examples:

"Memory of a Past Encounter":

This move performs the action the acting character was last hit with, by saving its move ID and pulling that data, instead of the one from its own line.

The "Fuzzy" status effect

This status effect adds a random value to the spreadsheet line, so that instead of your intended action, there's a chance you perform one of the spreadsheet adjacent moves.

It once caused me to lick a Door, instead of attacking it.

The Monster Pot

This is a move that when it kills an enemy, it adds the ID of the enemy's first attack to a list.

In a separate process, said list is then "cooked" and after a mathematical process, you'll get an item version that corresponds to whatever number you've ended up with.

Minor World Magic

This is the first real example for why I've built this system to begin with. Minor World Magic takes your location on the overworld map, as well as your current (local) position and calculates a number from that. So depending on your location in the world and the map, it'll do something different.

For example, in this battle it turned into the "Rehydrator" Move, which usually turns a "Thieving Crystal" into a "Possessive Sludge", but because of rules also works on a "Gnife Gnome".

A Gnife Gnome (A sort of buff Garden Gnome that wields two knives) gets turned into a big Blob.

By the way: I still don't know what to do in case players use that move on their party.

What excites me here is that all of this is working pretty much right out of the box and it does so because back in Summer of 2025, I very deliberately considered the overall structure of this system and what it had to do, in order to enable stuff like this.

Working on this game has been a lot of fun and so much of that comes from this spreadsheet. It's easy to use, easy to expand, easy to fix (most of the time) and it also gave me this gigantic toybox, that's both daunting to use (there are some busted attacks in that spreadsheet), but also deeply fun to think about.

It also made me a more confident programmer. This was the first time where I really considered what it means if you import data from an external file and manipulate that, instead of having everything exist within the game's engine.

Last year, I mentioned how the way JRPGs frame their actions says something about the metaphysical structure of their worlds, and this spreadsheet and the different ways how actors in the game use it is my version of it.

The reason why "World Magic" works the way it does, is because of the structure of this spreadsheet. The actions emerge out of the rules that govern the world, they are not hard-coded in the game. It's just math.

Now, don't ask me what "World Magic" actually looks like, or what it actually means to "subtract" something from your Monster Pot, but that's what your imagination is for. I'm just building the stuff that it is supposed to carry.