fabric-community/the-hallow

Entity/Content Difficulty Scaling

Opened this issue · 0 comments

As an extension to my latest issue thread (which discusses providing methods of nerfing damage types without ruining them), I would also like to briefly point out another issue. Boss fights often grow stale after the first few attemps, and we need a way to spice things up based on how strong the player is. We also should have a method of altering existing content to support multiple players taking it on at once.

There are 3 things that go into calculating the difficulty of content (let's assume a boss fight)

  • number of players
  • amount of completions each player has
  • gear player has

My proposal is turning these 3 points into a numerical value, which can then be used to scale content difficulty appropriately.

As an example, let's take a boss with 150 HP. We can assume the recommended gear level is mid-iron, and we can also assume the boss is beatable without extra help (and it is the first try). Let's assign this the base difficulty value of 50, which is based on what we assume is reasonable for a first time fight.

Let's say 2 players show up, each with mid-iron level armor. 1 player has beaten the boss previously. The difficulty is 100 due to 2 players having mid-iron gear, and the second player's difficulty is scaled by 10% due to a previous defeat. This leaves us with a difficulty of 105 (50+55).

When the boss spawns, we subtract the initial difficulty from the instance difficulty. This leaves us at 55. Let's assume this abstract value means "105% easier to beat," as 2 players should be able to clear the boss in half the time, with a bit of extra time from a previous victory.

The entity or content can now scale based on this value. In the case of this boss, it's HP rises to 307 (150 * (1 + 1.05)) and attack rises by 20%. Boom: we now have properly scaling content that accounts for 3 important metrics.

Interestingly enough, I actually think a context builder would work best for calculating values before they are used by the entity. Having an interface for generic difficulty scaling wouldn't make much sense (at that point it's just a static method), and a context builder would be the same as having a lot of different method options for calculating difficulty.

The primary issues (which we can fix) include:

  • not wearing armor till fight starts
  • not being able to get a drop because you're not lucky and now you can't beat the boss (as it's scaled too high)
  • other player joins mid-fight

Just another fun way to provide semi-dynamic content with an actual challenge.