Balancing a Roguelike to a One-in-Three Win Rate With a Headless Harness
My draft roguelike was too easy. A strong team won the cup two-thirds of the time, so winning meant nothing. Here is how I stopped guessing and tuned it to a real one-in-three with a few hundred simulated runs.
The first playable version of my draft roguelike, World 11, had a problem I did not notice until someone said it out loud: it was too easy. You drafted a team, ran the fourteen-match gauntlet, and lifted the cup almost every time. When winning is the default, winning is worthless. The whole arc of a roguelike, the tension of a run that might end, was missing.
The temptation was to nerf something by feel. Make opponents stronger, see if it feels better, repeat. I have done that on other projects and it is a trap, because "feels right" after you have played the same build forty times is not the same as "is right." So this time I measured.
The Harness
Because the match simulation is pure and seeded (a deterministic function, no rendering, no scene tree), I could run it thousands of times in a headless process. I wrote a small harness that:
- Auto-drafts a strong team, the kind of optimal, chemistry-stacked side a focused player builds.
- Plays it like a human would: names a captain, picks an attacking mentality.
- Runs the full fourteen-match gauntlet.
- Repeats a few hundred times and reports the champion rate plus where the losing runs fall out.
The first run of the harness told me the truth in about thirty seconds: a strong, captained, attacking team was winning the cup 65 percent of the time. That is not a tournament. That is a coronation with extra steps. And crucially, it explained why my own playtests felt easy without me having to trust my gut, the number was just sitting there.
The Levers
I wanted a strong team to win roughly a third of the time, with a believable spread of teams falling at every stage and a healthy number of heartbreak losses in the final. Two data-driven levers got me there, neither of which touched the simulation code.
A difficulty ramp. Each knockout round adds a flat bump to the opponent's strength, escalating toward the final. Early rounds stay winnable; the back half bites. This shapes where runs end, pushing the drama into the knockouts where it belongs.
Match-day variance. A small random swing on the opponent's strength each match, so the favourite is never a sure thing. This is the lever that creates upsets, the smash-and-grab loss in the quarterfinal that makes a run feel alive. Without it, the better team wins too cleanly and every run feels the same.
Both values live in a balance data file. Tuning was a loop: change a number, run the harness, read the champion rate and the exit distribution, adjust. No reloading the game, no playing by hand.
Where It Landed
After a few iterations, the harness reported a champion rate around 31 percent for a strong team, with losses spread sensibly across the rounds and a satisfying clump of defeats in the final. That is the number I wanted: a good team makes a deep run more often than not, but lifting the cup, and especially going unbeaten, is an achievement rather than a formality.
I left the harness in the repo. It is now a permanent dial. Any time I change the squad data, a formation, or the rating math, I can re-run it and see immediately whether the balance drifted. Balance is not a one-time pass; it is a number I can re-measure whenever the game changes.
The Takeaway
The reusable lesson has nothing to do with football. If your game has an outcome you can simulate without a player, you can measure its balance instead of guessing at it. A few hundred headless runs told me more, more honestly, than an hour of playing on a hunch ever could, because my hunch was contaminated by having played the same build all week.
Decouple the thing that decides outcomes from the thing that draws them. Then you can run the first part ten thousand times in a loop, and balance stops being vibes and starts being a measurement.
World 11 is free in the browser if you want to see whether a one-in-three feels right to you. It is harder than it was. That is the point.
Like this? You'll like what I'm building too.
Two ways to support and get more of this work.
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 moreMY 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 WhopRelated Articles
Fetching Free Player Faces for a Game Without Shipping the Wrong Human
I wanted real footballer photos on the cards in my draft game, free-licensed only. The fetch was easy. Not shipping the philosopher Socrates instead of the footballer was the hard part. Here is the pipeline and the disambiguation fix.
Solo Game Development: Trap or Actually Doable?
Everyone says solo game dev is impossible. Then you look at Stardew Valley. Here's the realistic breakdown of building games alone in 2025.
How I Built a Seeded Football Match Simulation for a Draft Game
Players draft the team but never play the match, so the simulation has to feel fair. Here is the possession-and-event model behind World 11, why it is deterministic from a single seed, and what that buys you for free.