/ build-in-public / I Balanced My Roguelike With A Bot That Plays A Thousand Games
build-in-public 6 min read

I Balanced My Roguelike With A Bot That Plays A Thousand Games

A balance bot runs hundreds of optimal teams through the full gauntlet and reports the champion rate. That dial replaced the playtest team a solo developer does not have.

World 11 main menu showing the play, daily challenge, and mode options

A studio with a balance problem hires playtesters. They put a room full of people on the game, watch where everyone dies, read the heatmaps, and tune from real data. A solo developer has none of that. I am one person, and I cannot play World 11 enough times to know whether the gauntlet is too hard or too easy from my own runs alone. My sample size is tiny and my judgment is biased, because I know the game too well to play it like a normal person would.

So I built the playtest team I could not hire. It is a bot, and it plays the game a thousand times while I do something else.

Play World 11 in your browser, or read the overview of how the whole game was built for the wider tour.

What The Balance Bot Actually Does

The balance bot lives at tools/balance_bot.tscn, and its job is narrow on purpose. It builds optimal captained teams, the kind of strong, well-drafted eleven a good player would assemble, and it runs them through the full gauntlet. Not a slice of it. The whole thing, six qualifiers, the four group matches with the points threshold to clear, then the Round of 16, the Quarterfinal, the Semifinal, and the Final. Same single-elimination road a human run faces, where any non-win ends it.

Then it does that hundreds of times and writes down two things. How often a run becomes champion, and where the runs that fail actually fail.

That second number is the one people forget to collect. A champion rate alone tells you how hard the game is. The distribution of where runs end tells you what kind of hard it is. A game where most failed runs die in the qualifiers is a very different game from one where most runs make the final and lose it, even if both have the same champion rate. The bot reports both, so I can see not just whether the difficulty is right but whether it is shaped right.

None of this works unless the match engine takes only a draft and a seed, which is the architecture I broke down in the post on the deterministic simulation. Because the bot does not have to render anything or wait for frames, it hands a draft and a seed to the sim and reads the result straight back, and it can grind through hundreds of full gauntlets in a few seconds.

Reading The Dial Instead Of Guessing

The thing the bot really gives me is a dial I can read instead of a feeling I have to trust.

Before the bot, balancing meant guessing. I would play a handful of runs, win or lose a few, and form an opinion. Too hard, I would mutter, after losing three in a row, and I would soften something. The next day I would win three in a row and decide I had overcorrected. I was tuning off a sample of my own moods. It is the worst possible way to balance a game and it is the only way most solo developers have.

With the bot, the question stops being how do I feel and becomes what does the number say. I had a target in mind, a strong captained team should win the cup roughly a third of the time. That is the feel I wanted, a great draft rewarded but never a sure thing, with real heartbreak still on the table. The bot tells me where I actually am against that target. If it reports a champion rate well above a third, the game is too soft and I tighten it. Well below, too punishing, and I loosen it. I am not arguing with my own runs anymore. I am reading a dial and turning it toward a number.

The Tuning Loop In Practice

The loop that came out of this is short and almost boring, which is exactly what you want from a tuning process.

I change a balance value, and because all the balance lives in data, that change is a quick edit. Then I run the bot. It plays its hundreds of full gauntlets and reports the new champion rate and the new distribution of where runs ended. I compare that to the one-third target and to the shape I want, and I decide whether to keep the change, push further, or pull back.

That is the entire cycle. Edit, run the bot, read the dial, adjust. It converges because every step is measured against the same stable instrument. Dozens of passes later, the champion rate sits near a third and the failures are spread across the gauntlet in a way that feels fair, with some runs dying early to a bad draw and others getting heartbreakingly close. None of that was guessed. All of it was tuned against a number the bot reported.

Why This Matters For A Solo Developer

The honest reason this approach exists is that I do not have the alternative. A studio tunes against hundreds of human runs a week. I cannot generate hundreds of meaningful human runs, and the few I can generate myself are tainted by knowing the game inside out. Automated playtesting is not a clever optimization here. It is the only way I get a real sample at all.

And it generalizes past this one game. Any time your game has a measurable outcome, a win rate, a clear time, a score, a survival depth, you can write a bot that produces that outcome at scale and reports the distribution. The bot does not need to be smart. Mine just builds strong teams and runs them through honestly. What it needs is to play enough times to turn your gut feeling into a statistic you can aim at.

It does require one thing of your architecture, which is that the core has to be runnable without a human and without the full game spun up. If your simulation is tangled into the rendering and the input, a bot cannot drive it cheaply. Keep the core pure and deterministic, and a balance bot is a small file you can point at it. That is the trade I would push every solo developer to make early. The discipline of a clean core is what buys you the playtest team you were never going to be able to hire.

World 11 is the game the bot balanced, tuned to that one-third champion rate, and it is free to play in your browser. See if you can land in the third that lifts the cup, and if a difficulty spike feels wrong, there is a feedback button right on the page. Play it at games.kevingabeci.com/world-11.

Built by Kevin

Like this? You'll like what I'm building too.

Two ways to support and get more of this work.

Desktop App

HEARTH

A privacy-first Life OS for your desktop. Journal, tasks, and notes that stay on your machine. Coming soon, direct download from this site.

Read more
Digital Products

MY TOOLKITS

Receipts-first toolkits for shipping after hours, building Claude agents, publishing on Amazon, and more. The exact methods I used, not theory.

Browse on Whop

Need This Built?

Kevin builds products solo, from first version to live. If you want something like this made, work with him.