MeeMs Thoughts on Difficulty… Again…

So recently, I’ve been thinking about what exactly makes games hard. And, unlike my previous discussion on the matter I’ve been thinking more about this problem from a developer perspective. Particularly the notion that if you make a game too easy people will skip over it, too hard and people will ragequit (before someone mentions it, Dark Souls and similar don’t count – they’re meant to be hard). I was thinking more along the lines of simple, progression-orientated fighting games.

In many games to be found there is always a few constant elements to keep said game interesting and fun for the full duration of a playthrough, either through character development for story-orientated games or by unlocks and upgrades for combat-orientated games. This article will be focusing on the logic and execution of the latter and different methods that can be employed to achieve the desired effects. For most examples we will have a simplified scenario where the enemy health (H) is determined by one equation, weapon damage (D) by another. The damage represents damage the enemy takes, not deals. The level is denoted L, for the sake of comparison we will say the level scales between 0 and 100. SPK (shots per kill) represent how many shots it will take to kill a given enemy of a certain health value and is calculated by H / D, rounded up. SPK will be our simplified measure of difficulty.

Linear methods:

By determining a base value and claiming a simple per-level multiplier it is possible to create a progressively increasing system which remains generally consistent in terms of difficulty and SPK (shots per kill). For example, if we use the equations

H = 100 + 4L

D = 30 + 4L

Linear representation, SPK multiplied by 100 for clarity. Damage shown in red, damage in yellow, SPK in blue.

What this means is that enemy health is a linear function which for the range of L scales between 100 and 500. If we assume the same equation for both enemy health and attack damage we can make some notable inferences. If we assume a base damage of 30, a level 0 player will have 100 health and take 4 shots to kill a level 0 enemy. It will continue to take 4 shots up to level 5, where it will take a 5th shot to kill the enemy. What’s interesting about this method is that it implies that the game will actually become easier as levels continue, due to a linear relationship between health and damage. As the level increases the SPK decreases such that, while SPK at level 0 is 4, SPK at level 100 is 2. Keep in mind that the SPK can never be one as D is never greater than or equal to H. This might be expected to be used in roguelike games where enemies other stats (speed, damage, etc) often scale more drastically, offsetting the lowered SPK.

Exponential methods:

Since the last method had the downside of making the game easier with time we have to attempt to find a method which makes it more difficult. Perhaps the simplest available is using an exponential equation to determine health and damage, for example:

H = 100 * 1.02^L

D = 30 * 1.01^L

Exponential variation, SPK multiplied by 5 for clarity. Damage shown in red, damage in yellow, SPK in blue.

For this setup, H scales between 100 and 724, D scales between 30 and 81 and SPK scales between 4 and 9. What’s important about this method is that SPK goes up with time, instead of down. This implies a simplified difficulty curve where, as the player gets better at the game (eg, learning the controls / physics / etc) the game gets harder to compensate, creating a suitable feeling of challenge and accomplishment for players. This would generally be used in progressive games where players are constantly upgrading and the numbers have to reflect this, while not letting the game become a rollfest.

Relative methods:

These methods allow for much more direct control of SPK, by declaring one value as a modified version of the other. This method can still contain aspects of the previous two by using them as a basis for the leading value. A simple example of this could be:

H = 100 * 1.02^L

D = H / 10

Relative variation. Damage shown in red, damage in yellow, SPK in blue.

What’s important to note about this is that, as SPK = H/D, our current SPK = H/(H/10), which is 10, always. This means we can set a constant difficulty for a given scenario. By setting a flat, non-adaptive level we grant the player more control over their experience and open up alternate meanings for “easy” or “medium” difficulties. We can also make a slight modification to this giving us an exponential value for SPK. Consider the following:

H = 100 * 1.02^L

D = H / 1.025^L

Relative exponential variation, SPK multiplied by 10 for clarity. Damage shown in red, damage in yellow, SPK in blue.

The only difference between this one and the previous one is, as last time, when the equation is rearranged we find that SPK is:

(100 * 1.02^L) / (100 * 1.02^L) / 1.01^L =

(100 * 1.02^L * 1.01^L) / (100 * 1.02^L) =

1.01^L

which, you may notice, is the same as above. Whatever you divide H by is equivalent to SPK. This allows us to create an exponential difficulty. In our given example this scales between 1 and 12. This method purely allows for SPK to be calculated more easily.

Using these different methods and varying values it is easy to predict the difficulty curve of a game, assuming you know the equations for the values. By rearranging it into the different forms as above, we can change our calculations to create what we consider a desirable difficulty curve for our given game.

At least, that’s my thoughts on difficulty.

Leave a Reply