/ 6 min read
Undead Signal: five days of rules before a line of code
Killing three drafts, the rule that gave back depth I never designed, and balancing a roguelike with a bot that plays 300 runs.
I made Undead Signal for a Wavedash jam with the theme Bad Connection. It is an anti-poker zombie roguelike, live on Wavedash as a WebGL build with achievements, leaderboards, and cloud saves. It was my fourth shipped game and my second in Unity, after Spare Knight in Phaser, I Won’t Be Abducted in Godot, and ThunderBashers.
This one was design-first on purpose. The earlier jams taught me to ship. This time I wanted the rules to be the interesting part, so I spent the first five days entirely on rules, in a design vault, before any build existed.
The pitch
You are a radio engineer restoring the signal in overrun locations. The dead are networked by frequency. A lone zombie is a body, but when they align into a lineup, a poker hand, they form a resonance that hits you at the location’s exit. Each act deals more zombies onto the table. Whatever you do not remove survives to form the horde’s best five-card hand, and its threat comes out of your health.
Threat is one equation: the sum of the five zombie ranks times a poker-hand multiplier. That gives you exactly two levers. Drop the sum by killing or shrinking the big ranks, or break the structure by scattering a pair and splitting a straight. Breaking their hand is fixing the bad connection is restoring the signal. The theme and the core mechanic are the same sentence, which is the thing in the whole design I am proudest of.
Killing three drafts
The honest history is that the first drafts were derivative. Draft one was a straight zombie card battler. Draft two leaned hard into Balatro: build your hand, stack multipliers, score big. It functioned on paper and it was boring on paper, because Balatro already exists and a worse Balatro with zombies is a reskin, not a game.
The unlock was inverting it. In Balatro you assemble the scoring hand. What if the enemy assembles it, and every verb you have subtracts from their hand instead of adding to yours? The power fantasy flips from building a combo to dismantling one. The poker knowledge players already carry becomes threat literacy instead of a scoring manual. And the zombie fiction snaps into place: the horde is the hand.
There was a third draft in between, a corridor-crawl hybrid, and it died too. I kept every dead draft in an archive folder instead of deleting it. If you do solo design work, do this. The graveyard is what proves the final rule set was chosen rather than stumbled into. Five days of it felt irresponsible mid-jam. It was the best production decision in the project, because the build phase never had to stop and redesign anything.
The rule that gave back
My favourite moment in systems design is when one rule starts producing depth I did not put there. In Undead Signal, a zombie’s rank is also its health. Hit it for less than its rank and it does not die, it shrinks. A Mutated 9 hit for 3 becomes a 6.
Which means shrinking can backfire. If two 6s are already on the table, you just completed three of a kind and raised the threat you were trying to lower. That interaction was never designed. It fell out of “rank is HP” colliding with “poker hands multiply,” and the first time it happened in testing I knew the ruleset was alive. I kept it, the game tells you to read the board, and it is the rule people quote back to me most.
Balancing with a bot
The other half of the jam was learning what balancing means when you are solo and the game is a twenty-five minute run. You cannot feel-test your way to a win rate. So the game got a balance lab: a headless harness where a threat-aware bot plays 300 seeded runs per configuration and prints the funnel. Win rate, clear rate per location, how people die.
The first measurement was humbling. Win rate: 19 percent. If the bot used the game’s own loot-digging verb naively, it dropped to 5 percent, which meant one of my core verbs was a trap. The numbers found root causes I would never have felt: whole runs passing without a usable weapon before the first exit, and an average first-location exit damage of 60 against 100 health. The deadliest room in the game was the front door.
Two dial changes later, gear density up and a rule guaranteeing a weapon in the first few cards, the win rate hit 31 percent against a 30 to 40 target, and deaths moved to the late-game wall where they belong. Then playtesting produced the opposite complaint: hands full at all times, loot stopped mattering. So weapons got durability, failed kills got bite-back, and the lab re-tuned the whole thing to 37 percent with weapons cycling. Every one of those numbers is a logged report I can re-run.
The meta-lesson: the lab also measured the dial I thought I understood. Gear density turned out to be two dials in one, because more gear also means fewer zombies in the deck, and the second effect was the stronger one. By hand I would have tuned that dial wrong forever.
Shipping on a platform
This was my first release on Wavedash rather than a plain web upload, and the SDK work was its own small discipline: ten achievements, two leaderboards, the player’s name on the title screen, cloud saves for settings and lifetime stats. The game has no native score, so the leaderboards run on a derived composite, progress first and kills as the tiebreaker, that had to be designed like any other rule. Launch day was a rhythm of build, push, patch against live reports. Five updates went out on day one. It felt closer to live ops than to jam submission, and I want more of it.
Since then
The September update, the Survivor’s Table, rebuilt the interface around one idea: answer the player’s question where they are already looking. Drag a weapon onto a card and the forecast appears beside the target, kill or shrink, bite-back, threat before and after. Right-click any card for a full-art dossier. Hover a keyword and read its rule. It is the same game with the rules finally visible, which is the ThunderBashers lesson again: readability is a mechanic.
What I’d keep
Spend the design days before the build days, and keep the dead drafts as the receipt. When a rule produces depth you did not author, that is the ruleset telling you it works. And balance is a measurement problem. A bot that plays 300 runs will find the truth about your economy faster than a hundred feel passes, and it leaves you numbers you can defend later.