Spreadsheets

In which I talk about, well, spreadsheets and their place in a designer's arsenal.

I was recently in a job interview for a senior game design position where I was asked one of the strangest questions:

"Have you had any experience balancing games?"

Okay, maybe that's not so unreasonable as there are a lot of different strands to 'game design' these days. But he then followed up with:

"I only ask because it doesn't say you know how to use Excel on your CV..."

No, it doesn't. It also doesn't mention that I can touch type at about 80 WPM or that I know how to use Photoshop, Word, and Outlook. But either way, I was taken aback. I've done tons of balancing. I always have. Everything from determining the initial values to tweaking them based on feedback and data.

So I thought I'd put text to screen and show some recent examples of my process.

Glyph Quest Chronicles

For Chronicles, we'd adopted an entirely procedural process for the creation of quests. The contents of the quest would be determined by the quest's level and the type of terrain they were adventuring in. Monsters had a selection of terrains in which they could appear as well as a level range.

That's all well and good but it still doesn't explain what being a monster at a particular level actually means. For that, we need to delve into how the combat system and damage model work.

Health


Each monster has a health value as does the player. Whenever they take damage, this value is depleted. If it reaches zero, they die. Pretty standard stuff. The amount of health they have is determined by a base value plus an amount multiplied by their level. This is further modified by a health multiplier allowing me to tweak individual monsters.

monsterHealth = (healthBase + (monsterLevel * healthPerLevel)) * healthMultiplier

This is where the first bit of tweaking would come into play. Most of the time I'd leave the multiplier at 1.0 but for weak monsters - perhaps in the early game - I'd drop it down to about 0.5 or so. I'd do something similar for monsters that you'd encounter in packs so the value would generally be 1 / packSize to give an equivalent health of a single monster and keep everything balanced.
Occasionally, I'd even ramp it up to create a particularly tough monster, although in both of these scenarios you also have to consider the damage being dealt to the player as well.

In fact, that's balancing in a nutshell. Whilst you should only ever tweak one thing at a time to keep a handle on what's actually causing the thing to get more or less difficult, you have to bear in mind that each thing you change will have a knock-on effect down the line.

Damage


Next up is Damage. Each attack a monster has does an amount of damage. Well, more correctly, each monster has a series of attacks that each have a multiplier that gets applies to a base damage value, before being scaled by the monster's level. This meant that, if I needed to tweak the amount of damage being done overall by the monsters, I'd only have to change a single value rather than go through each and every attack.

With these two values - health and damage - it was then easy to see how long it would take for the monster to kill the player.

timeToKillPlayer = playerHealth / monsterDamage

If we know the player's damage, we can also work out how long it would take the player to kill the monster. Then we'll know which will win in a battle and can so tune for difficult accordingly. As each quest consists of a number of waves, we also need to multiply the monster health by this value to see if it's possible for the player to complete said wave.

The amount of damage the player does is determined by the length of the spell he has just cast with each 'tier' of spell having its own base damage. At least, that's how it starts out - more on this later, but for now that gives us two different timings and lets us see which one will die first.

By increasing the amount of health and attack damage assigned to each monster per level (at a rate larger than you do the same to the player) you essentially create a difficulty curve*. At some point, the amount of time it takes to clear a wave of monsters exceeds the amount of health the player has. At that point, the game is impossible... without help.




On this section of the spreadsheet, you should be able to see how the difficulty of the first few levels ramps up. Stats that have values in the 2nd row increase by that amount each level. So you can see that, even though the player's health increases by 0.75 per level, monster health increases by double that amount. In addition, even though the player's damage is also increasing, Monster damage increases more.

The stepping you see in the Player Max Damage column is down to their maximum spell length increasing at arbitrary level points. The amount of damage the player is doing is based on the minimum amount of damage a basic spell of maximum length does at that player's level. So even if all the player did was cast a random element spell of maximum length - basic gameplay - they should be able to complete any quest up to level 10 with no problems. After that, they're going to have to get a bit clever.

Extra Things


There are several methods of making an impossible fight possible. The first is to increase the player's health - so that's potions or healing spells. Easy.

The second is to mitigate enemy damage with things like Status Effects. We kept things simple here by having the vast majority of Status Effects simply cause the target to miss a turn**. This still makes it pretty hard to throw into a simple formula, so by this point the difficulty curve becomes more of a guideline. Another thing to consider is the fact that the player can also succumb to these Status Effects, further increasing the difficulty. By way of balance, any attack that also inflicts a Status Effect does less damage than a standard attack. Attacks that do more than one Status Effect have their damage reduced even further.

The third is to increase the amount of damage the player does. One of the core gameplay pillars of the entire Glyph Quest series is the Chains / Reversals system. Damage was increased the more the player did consecutive attacks featuring the same element (Chain). Damage would spike enormously if they then did an attack of the opposite element (Reversal) although this would be at the expense of their built up chain value. I found this impossible to add to the formula, whereupon the difficulty curve became an indicator of just how much the player would have to utilise this method of play in order to progress.

Summary


Spreadsheets are an invaluable tool. They give you a great way of establishing a baseline set of stats to plug into your game.

But here's the thing:

Seeing the numbers all laid out like that is very useful, but it's no replacement for playing the damn game. Or, more importantly, getting others to do so and seeing how they get on with it.

* Only technically a curve if it's non-linear, I guess.
** Dressed up in loads of different ways of course - root, stun, paralyze, freeze, etc.

Post a Comment