Balancing an Unbalanceable Game - Part 1


Part 1: The Challenge

Hi, Maverick here,

I want to give you some insight into one of the biggest challenges of my career as a game designer. Currently, I’m working on Net.Attack(), a game where you code your own attacks in gameplay similar to Vampire Survivors.

The coding experience is one of the core pillars, allowing players to create crazy, imaginative attacks that would be impossible in most games. Want an example? Here’s one:


So, what does this coded attack do?

  1. Tick: Executes the following code at regular intervals.
  2. PingNear: Hits a enemy near you.
  3. Infect: Works like poison—infected enemies take damage every 0.5 seconds.
  4. Foreach Infected: Loops through each infected enemy.
  5. PingNonInfected: Hits an enemy that isn’t already infected.
  6. DamageInRange: Applies damage to every unit within a certain range.

What happens here is something like a virus spreading: every infected enemy infects another enemy on each tick, while dealing damage to units within range. This creates exponential damage growth. Ignoring the fact that infected enemies eventually die, the infection grows exponentially, following this pattern:

InfectedEnemies = 2ⁿ

This is incredibly satisfying to watch. It feels like you’re coding a virus, spreading chaos while hacking your way through enemies. But balancing a mechanic like this? That’s where the real trouble begins. Exponential power increases are a massive challenge—and this isn’t even the only “power build” we’ve created!

The Curse of Overpowered Builds

Normally, something like this would be nerfed. But you know what? It’s fun! Creating these builds is one of the best parts of Net.Attack(). It’s a cursed design problem:

  • If we ignore the overpowered builds, the game risks feeling unchallenging and boring.
  • If we balance for these builds, the game might feel too reliant on luck—you’d need the right nodes to win. This could alienate players who don’t fully grasp the mechanics or who don’t enjoy such depth.

We’ve tried a lot of approaches to balance this system, but the problem isn’t fully solved yet. That said, I’m excited to be working on solutions. In the next part, I’ll dive into what we’ve tried so far—and how some solutions ended up negatively impacting the game.

Stay tuned for the next part, coming soon!

Wishing you an awesome day, and I hope to see you in the grid.

MaverickHorn

Get Net.Attack()

Comments

Log in with itch.io to leave a comment.

One solution is to provide content at different levels, so players who want an easier experience can play one way (avoiding 'extra challenge' floors, for example) while those who want to engage with the game more intensely can play it another (unlocking the ability to skip non-challenge floors and just do challenge ones, for example).  As for luck, one solution is to have a 'puzzle mode' where the available node rewards are fixed and the runtime is quite short (5 mins of combat or less, probably), built around various coding challenges.  In general, though, I think you are right that because the maximal build quality each run varies so much, especially early on, scaling the difficulty to challenge even mediocre builds that get the luck they need will involve rendering a large percentage of runs functionally unwinnable since even a small amount more luck is a huge force multiplier.