Magic Number Difficulty Balancing

So I've been working on my game for roughly two years now and although it's significantly more balanced than it was a year ago, I still feel like it's too easy, or rather, doesn't really have any sort of difficulty curve over time. It's a top-down shooter, and more enemies appear as you get to later waves, but the bosses are all a joke in terms of difficulty and some of the weapons can easily obliterate large groups of enemies if you know how to use them properly.

So how do I know what "magic numbers" to pick to have a consistent difficulty to my game, and is there a good way to determine a formula to increase that difficulty in later waves? Should I be increasing health of enemies over time? Or would that not make sense since they're the same enemies? I increase number of enemies over time by having a "spawning pool" which is just an integer that increases on a logarithmic scale according to a formula I just came up with and plotted a while ago. Each enemy has a "cost" to spawn and at the beginning of each wave, random enemies are chosen and their cost deducted until the spawning pool is depleted for that wave.

The enemies' damage and health are calculated randomly using a sort of D20 system like Dungeons & Dragons where, for example, the very first enemy you encounter in the game's health is calculated by rolling 2d8+12 (roll two 8-sided die and add 12), so the range of health values they can have is 14-28. All enemies' health is calculated this way. The enemies' attacks and damage over time effects, as well as the player's weapons all use this method to generate numbers.

Is there a good way to decide on good numbers short of just playing over and over again until it feels right? Would it be bad to increase their health and damage over time since they're still the same enemies? Or maybe I should get rid of them in later waves and replace them with an upgraded basic enemy that's identical (maybe a color swap) but with better stats?

Examples would be awesome.

• You can start by getting rid of the RNG while you're still working out basic game balance. Then follow the advice from the real answers below. Then when you have something that reliably heads in the direction you want you should reconsider whether you want to use RNG at all and only add it back if you can make a good case for how it makes the game better. Commented Apr 26, 2019 at 1:14

Your problem isn't in finding the magic numbers or magic formula that makes your game feel "good"

Different games will use wildly different health & damage numbers and progression curves, because they're targeting different ideas of what the ideal experience is for that game.

So, your first step is to establish concrete goals (or anti-targets you want to avoid):

• What does your observed eperience say?

• Think about the best run you've gotten from the RNG so far. What made that satisfying?

• Think about a frustrating or underwhelming run you got from your RNG. What made that unsatisfying or painful?

• Try experimenting with different game scenarios, trying out different parameter ranges:

• How many enemies on screen feels dull? How many is insurmountable? How many sits at the sweet spot in between, where it looks overwhelming, but you can pull through?

• How much health feels "puny"? How much health feels "tough"? How much feels "bullet sponge"?

• What does your dream playthrough look like? Try writing it out as a short story from the player's eye view - what do they do, what challenges do they overcome?

Once you've done this, you can start to extract concrete criteria for what sorts of situations are enjoyable in the game you've built, or create your desired level of gameplay intensity & problem-solving.

You might find for instance...

• "A good early game challenge is to have 1-3 enemies on screen, where each one dies after 3-5 seconds of focus from the player"

• "It's good when there are short periods where there are are 5-8 enemies on screen, and they take 7 seconds to defeat. But if that lasts for more than a minute the player always loses, so these challenges should come in short bursts"

You can then work out a range of health numbers and spawning rate variations that create scenarios aligned with these patterns you've identified as desirable. That step can be a "magic formula," but the magic is in the way you've crafted the formula to suit your personal goals for your specific game. Then the numbers are just the concrete consequence of those articulated goals.

Your game sounds fairly similar to Killing Floor 2, as in it's a wave-based shooter game with scaling difficulties. From being a part of the KF2 community for a while, I'll some concerns/praises about difficulty that many people shared. I may not agree with them all but there are some valid points.

Damage sponge enemies are not fun. Increasing the numbers or damage is usually a better choice over increasing the health. Players feel more satisfying feedback in killing hordes of enemies vs killing stronger smaller numbers of enemies. This was also a complaint about the console versions of Diablo 3, as people suspected they cut down on enemy numbers for performance reasons. Of course, there is a caveat to this - damage sponge enemies are awesome when they're rare and truly scary. Fleshpounds in Killing Floor 2 not only do a TON of damage but they also take a TON of damage. It feels very rewarding when the team comes together to even take down one of these. But not every enemy is a damage sponge, just the really strong ones which show up sparsely.

Upping the damage they can take can help add difficulty, but you need to walk a fine line before you accidentally get into bullet sponge territory.

Reward players for skillful strategies. The Fleshpounds can be a cakewalk for skilled players who know strategies for handling them. However, higher difficulties have balanced this a bit by providing a higher spawnrate of Fleshpounds, making players deal with several at once. The number is manageable to a team of skilled players but would obliterate anyone without higher knowledge of game mechanics.

On the contrary, do not punish players for skillful strategies. Let them break your game and make it dirt easy with their crazy good skills. Enemies called EDARs were added to KF2 and people had a big complaint - headshots didn't kill them. Their weakest spot was their chest. You were forced to body shot this enemy type to kill it most of the time. This feels counter productive and less rewarding than landing a clean headshot. People with good headshot accuracy were now forced to awkwardly aim for the body rather than use their aiming skill to land oh-so-satisfying headshots. EDARs are still pretty heavily disliked additions to the game.

Give enemies new movesets at higher difficulties. A lot of enemies on the higher difficulties in KF2 have completely new moves which add a lot of danger. They also move faster and more erratically, making them harder to headshot. This feels like a much more "natural" increase in difficulty.

Off the top of my head, those were some of the biggest discussion points in the community to come to mind. I will add more later if more come to me. As a summary, I'd say give enemies new moves at a higher scaling, make them do more damage, make them move faster, and maybe give them slightly more health.

An example of a unity build, albeit different from your project, is called "Clone Drone in the Danger Zone" - It is an indie game that takes advantage of exactly color swapping and improved stats (AI) on enemy models encountered later in the game.

An early side scrolling example of the same color swap idea for enemies is found in the Sega Genesis classic "Teenage Mutant Ninja Turtles".

Overall - I completely agree with DMGregory's response. Take time to read his words! I know I sure did.

My comment is strictly added to provide you some very basic examples of enemy creation in published games and to address your final thoughts.

You can definitely choose to make enemy health a function of time - but I think your second idea of replacing your enemies altogether with a different color is a tried and true method that we all can probably think of many examples of. I believe that it is a great way to tailor your player experience - which as your question suggests is a very daunting task at times, especially if your current user experience is somewhat governed by random number generation.

If you are determined to use random number generation, maybe decreasing your output range for certain parameters would help you further tailor the player experience. Instead of 2d8 + 12 for your first enemies' HP , why not 2d4 + 20? that yields you a bit more stable output range of 22-28 as opposed to 14-28.. These are just some ideas to hopefully push you in the right direction friend!

EDIT : RNG is a very deep topic.

Look into the well known game DOOM and the RNG algorithm/methods used by designers. Although there is no "Magic" per se, there are some very provoking discussions on randomness and the use of code to tune the human experience of randomness in the greater field of user experience design.

I had to take a look for myself at some discussions on DOOM RNG

Eventually finding myself in the Deeper Rabbit Hole of RNG

I truly hope this helps you on your quest to conquer practical RNG in game design.