Curves

Stanislav Stankovic
5 min readMay 22, 2023

Intro

One of the most typical tasks in game design is balancing some sort of a progression vector. For example, you might need to come up with a set of values, a number of points that a player needs to collect to advance to the next level. Another example might be the number of cards needed to upgrade a character. It could also be the number of tokens that a player needs to collect in order to unlock another tier in the premium pass or a limited-time reward track.

Pretty much every game designer that has ever come into contact with a metagame has had to do this task. I have done it over and over multiple times. You can use all sorts of tools to accomplish this, but my tool of choice remains a good old spreadsheet.

Recently, I had to do this all over again, and finally, I decided to make a nice Google Spreadsheet template and share it with anyone who might need it. You can find it in a link at the end of this text.

All the stuff that you will find there is pretty basic and routine. There should be no surprises for any game designer. However, if you are just taking your first steps in this field it might be good to read the following.

Curves

What we are talking about here are two sets of values that can be derived one from the other:

  1. Point thresholds, i.e. total cumulative number of points that the player needs to unlock a particular level.
  2. Additional points that the player needs to collect in order to unlock the next level, i.e. gaps between levels.

Assume that player starts with 0 points at Level 1. Let S1 be the number of points that the player needs to unlock Level 2, let S2 be the number ADDITIONAL of points that the player needs to unlock Level 3, etc., etc.

Assume, also that the player starts with 0 points at Level 1. Let P1 be the number of points that the player needs to unlock Level 2, let P2 be the TOTAL number of points that the player needs to unlock Level 3, etc., etc.

It follows that P1 = S1, P2 = S1 + S2, Pn = S1 + S2 + … + SN-1. Likewise, it follows that Sn = Pn-Pn-1.

When you are doing this sort of balancing task, you can always take a lazy approach and make each subsequent level require exactly the same number of additional points to unlock.

For example, a player would start at level 1, level 2 would unlock once the player collects 100 points, level 3 at 200, level 4… 300, etc. It is obvious that the gap between point-level requirements remains constant, and is 100 points. The cumulative number of points that the player needs to unlock a particular level is a linear function.

This is very simple maths that is easy to follow and code. However, it is also very boring. Its intuitive nature is what makes it so. Even if we, as players, don’t pay attention to numbers our brains do. The human brain can easily subconsciously perform linear extrapolation. This predictability is what makes linear progressions feel monotonous.

Furthermore, as the game progresses it is very likely that the player’s ability to collect points will evolve. In skill-based games, the player is likely to become better at playing the game. In addition to this, the gameplay itself should and will evolve. This makes finding a good balance all the more difficult. A gap of 100 points might be daunting at the start of the game, while it might become trivial by the time the player reaches the end game. This is exactly the opposite of what you, as a game designer, want to achieve. The game should feel relatively easy at the start when the player has not yet mastered it, and remain challenging forevermore.

In order to achieve this you should resort to a just a bit more complex type of math formula, i.e. to non-linear functions a.k.a. Curves.

As time progresses the player should need more and more points to collect in order to unlock the next level. The cumulative number of points should grow relatively slowly at first and pick up speed as the game unfolds.

This can be achieved with the use of an Exponential function, a.k.a. The Power curve of the P-curve. We can apply this sort of mathematical function to create The picture below gives an example of one such curve. You can notice that the slope of the curve starts relatively gently and becomes steeper and steeper between levels 7 and 11.

The power curve gives you, as a designer a good overview of the progression in general. However, things are a bit different from the player’s perspective. The players will most likely never see this curve as a whole. The player will most likely get to see the additional number of points he needs to reach in order to unlock the next milestone.

The player’s behavior will be influenced greatly by the values of these gaps between thresholds. Having too big gaps at the start of the game would present way too big of a challenge for a novice player. Even if we are designing a live event aimed at seasoned players, most likely we would like to make the start of the event easier. The point gaps between levels should thus, grow as the player progresses through the levels. On the other hand, we do not want to let this increase continue to infinity, as we do not want to make the player have to deal with absurd values.

In order to achieve this, game designers usually apply what is known as the Sigmoid function or S-curve. The formula used to generate this curve in my Google Spreadsheet is S(x) = (1/(1+exp(-kx))^a where k and a are parameters dictating the shape of the curve. The picture below shows an example of one such S-curve.

As you can notice the value are nearly constant at the very start. They begin to grow faster at around level 5 and grow at the fastest rate until level 10. The slope becomes agin shallower. In the end, values become constant from level 18 onwards.

In many ways, S-curve approximates the so-called learning curve that usually follows the acquisition of every new skill by the players. The idea here is to maintain the constant rate at which the player reaches milestones within the game. Maintaining the so-called density of goals.

Links

--

--

Stanislav Stankovic

Game Designer at Supercell, Ex-PixelUnited Ex-EA, Ex-Rovio.