Game Balance and DracoFighter

October 28, 2023 - Published

As both a designer and player of PvP games, it should come as no big surprise that my favorite part of DracoFighter's development was designing and balancing movesets. One of the biggest discussion points I see about competitive games (whether it be fighting games like Smash or even MOBAs like League) is game balance, whether it be arguments about it or proposals for balance changes. Either way, I see a lot of fighting game players that love imagining how to balance characters, redesign them, or even create movesets of their own, which is why it really felt like a nice opportunity to be able to do that for my own game.

To explain my thought processes about game balance, let's talk about what we call power budget.

A typical character select screen with stats from Mario & Sonic at the Olympic Games

In PvP games, the ideal is to give every player a fair fight no matter what character they choose. I like to imagine power budget being like those little stat bars when you're in the select screen of certain games, like racing games. A car with a high top speed and low acceleration might hypothetically get you to the end faster, but if you ever lose acceleration by hitting a wall or another player, then you'll lose time by having to build up speed again. Meanwhile, a car with a low top speed but high acceleration will be more forgiving to play as, and might beat out faster cars if a track has lots of hard turns that force cars to slow down, for example. This is the essence of the power budget -- you can give a car lots of top speed OR a lot of acceleration, or medium top speed and medium acceleration, but you CAN'T give them BOTH lots of top speed and lots of acceleration. That's because it would make it so that there's no reason to pick any other car when one is best of both worlds.

Most people only associate game balance with top level and competitive play, but the fact is that if there is a best option, then players will almost always choose that best option. This can result in very stale gameplay, because the game will often boil down to the same characters, the same strategies, and the same gameplay. While not a perfect solution, power budgets are one of the most intuitive ways to look at game balance. How do we look at power budgets?

Some cards from Legends of Runeterra

In some games, balance is almost completely a numbers game. For example, the cards above have 3 variables: Cost, Health, and Power. If a card has too much health or too much power, then we can raise the cost to make it more fair. However, these cards can also have special effects. If this special effect is very powerful, then we can either increase the cost, decrease the health, decrease the power, or all three. If we have some sort of formula like 1 cost = 1 health + 1 power + 1 weak ability, then we can roughly estimate the power of every new card we add. With this formula, we can add a cost 6 card and give it 5 health and 5 power, with a stronger ability to compensate for the lower health/power. We can also identify certain cards as being a clear problem, like a cost 2 card having 7 health and 7 power (too overpowered), or a cost 10 card having 1 health and 1 power (too underpowered). 

However, this becomes a lot more complicated when things like synergies, deck restrictions, and types of cards come to play. We could go over that, but we can also get into something that I'm much more familiar with...

This is all the hitbox data for Draco's jab in DracoFighter. Yes, the code could be a lot more efficient.

DracoFighter is a simple fighting game, but a simple fighting game is still PRETTY complicated under the hood. Every single hitbox in the game had the following variables: position, size, damage, knockback, hitstun, lifetime, delay, hitlag, blockstun, and blockpush. Every move had the extra variables of character velocity, FAF (first actionable frame), and hurtbox position/size/lifetime/delay. Almost every single variable had to be tweaked by hand through constant playtesting to figure out the best results based on the moveset, matchups, and the animation. Why do I say almost?

That's because, like the cards, we still use the fundamental method of creating a base "card" and tweaking it for everything else. Every hitbox in DracoFighter was based on Draco's jab, either on purpose or by accident, either directly or indirectly, because it happened to be the first hitbox I made. It's a 10 damage move that takes 8 frames to come out, has a 30 frame animation, and has decent range and knockback. Plexie's jab does 12 damage, takes 10 frames to come out, has a 50 frame animation, but is disjointed and stays active for basically twice as long.

"But wait a minute Vecderg," you might say, "didn't you say it's a lot more complicated than that?" And it is! That's because we have to take EVERYTHING into account. Let's take a look at a move that is, simply put, overpowered.

BiOS' dash attack is a monstrosity. It does 11 damage, takes 4 frames to come out (that's less than 7 hundredths of a second), has an animation of 25 frames, and is a COMBO STARTER. Because of the blockstun, it's +4 on block, giving him the ADVANTAGE if you block it, and the forward momentum gives it more range than it appears to have. Vecderg, how did you let this get in the game???

The answer is that move balance also takes into account the rest of the moveset! There is a power budget not only for a move itself (think of the card), but also the entire moveset (think of the whole deck)! While dash attack itself is very powerful, it's only accessible from BiOS' dash stance, which doesn't let you input a move for 17 frames and extends your hurtbox. That means that while technically the move comes out frame 4, its actual startup is 21 frames at minimum. It's also allowed to be a combo starter because BiOS doesn't have access to very high damage combos, so at most you'll get 25 damage from this move with 21 frame startup. Doesn't sound that unbalanced anymore, huh?

Another way we can stretch out these parameters is by putting more power budget into one move and less in the rest of the moveset. 

why are you so big... and why are you so smol??

Plexie's F-Attack is an absolute monster, and unlike BiOS' dash attack, it isn't locked behind a stance. It deals 15 damage, takes 13 frames to come out, can hit someone from half a screen away, and is unpunishable at the tip due to the distance, despite being -10. In practice, it can be used as a mid-range check, a whiff punish, a poke, a tool to pressure the opponent into jumping, and a move to end combos. 

Meanwhile, her B-Attack does 15 damage, takes 15 frames to come out, has absolutely abysmal range, and is -26 on block. It might lead to a mini combo, but how are you supposed to hit that on a mid-range zoner? The fact is that Plexie's entire kit was designed around her F-Attack; it was so powerful that I literally removed an entire move from her due to it being redundant -- and it was a projectile! Her F-Attack is allowed to be powerful because her other options are either much weaker or much more situational. 

Plexie's B-Attack is very important because it's an anti-air that stops the enemy from jumping in, which is the only notable weakness that F-Attack has. While F-Attack might have 5 different uses and B-Attack only has 1, that 1 use is what F-Attack lacks. This is what makes an interesting power dynamic at all -- she's able to throw out her F-Attack very safely and consistently, but if you dodge it with a jump, then she's completely vulnerable. She can only cover herself with either an N-Special by preparing it beforehand, or with her B-Attack on reaction; preparing either of these leaves her more vulnerable on the ground. This is a power dynamic that is defined solely through numbers and hitbox placement! 

However, balance things incorrectly and these razor-thin interactions can fall apart. In her very first iteration, Plexie's F-Attack was TOO powerful and made it so that nobody wanted to use any other move, making her feel really boring, even if it technically made up for her other underpowered moves. Notice how thin her F-Attack hitbox is? It used to be thicker which made it harder to jump over -- the only counterplay working only half the time! Before the current patch, her B-Attack was too slow, which made her completely helpless to jump-ins. Again, these were fixed by just adjusting numbers, i.e. game balance. However, I wouldn't have identified the issues without playtesting with multiple players, and I wouldn't have found the solution without watching the gameplay, discussing issues with others, and testing different kinds of solutions. If something was more problematic, it might have necessitated a complete rework of the move itself.

Now take that problem and test every one of that character's moves against every other character's moves, and now you have the issue that every competitive game developer faces! I complain about it jokingly, but testing and figuring out solutions is actually a very fun and creative challenge for me.

I realized rather late that since Cyrus doesn't have a jump, he didn't actually have a method of countering Plexie's F-Attack! His F-Attack range was buffed so he was able to whiff punish Plexie.

I hope this helps you learn a thing or two! Game balance is a very deep but intuitive topic that a lot of people could learn a lot about. This article only really covers PvP balance, even though game balance also affects co-op and single-player games (which do have similar principles, but different goals).

You may also notice that I avoided the common game balance argument "nobody wants to play a game where every character is the same," because I consider it factually incorrect -- see Rocket League (mostly) and Nidhogg. Having different characters is simply a current design trend that most people seem to prefer, and having VERY different characters is something that usually adds a lot more dynamism to a game. Despite being a lot more difficult to balance, I personally think it's very worth the effort.