REELS

Published 2026-09-04

I changed one exponent four times and made four different games

The toll in REELS grows geometrically. Every time I touched the growth rate I was not balancing the game, I was replacing it.

REELS is a roguelite built on a slot machine. You descend into a pit, the reels drop, your weapons fire on what they land on, and every sixty seconds a toll comes due. I have written already about why the money came out of the machine. This is about the number that took its place, and the four times I got it wrong.

The number

The toll is a soul quota that grows with depth. The version that shipped is 110, multiplied by 1.5 for each floor below the first. Floor 6 asks for 835 souls. Floor 8 asks for 1879. Floor 10 asks for 4229.

Three earlier versions are still written in the comment above that function, left there on purpose. The mockup multiplied by 1.45 per floor. That killed runs before they had a build, which is the standard roguelite failure: the player loses before they own anything worth losing, so the loss teaches them nothing. I dropped it to 1.38 and got the same failure one floor later. Then 1.32, on a base of 90.

1.32 fixed the opening and broke the ending. By floor 6, a competent build finished with roughly 1500 souls of surplus over the quota. The toll was still displayed, still counted, still animated, and it no longer asked for anything. I had spent months on a threshold that had quietly turned into scenery.

Why 1.5 works where 1.32 did not

Charms in REELS multiply. The toll is exponential. So the two curves race.

Additive player power against an exponential toll is not a race, it is a wall. You can compute the floor you die on before you press start, and a game whose ending is arithmetic you could have done in advance is not asking you anything. Multiplicative power against an exponential toll is a real race, still lost in the end, because 1.5 beats anything eventually.

That turned out to be the design rather than a defect. The run is always lost. The player decides how much later, and that decision is the game.

If you take one thing out of this: the growth rate of your pressure curve is not a parameter you tune in the last week. It is the design. Four values, four different games, and I understood that on the fourth.

What the number cost me elsewhere

Two things fell over on the way.

The first was deliberate. I took the soul quota out of two of the three modes. In the campaign and in the daily challenge, the toll is paid by surviving the sixty seconds and nothing else. The quota rules only in endless mode, where the threshold is the level. Asking for both judged the same minute twice, and the second time on a figure the player cannot steer. You kill what comes at you. You do not choose how much comes at you.

The second was not deliberate at all. Months earlier I had written a kindness into the code: dying with the quota already in your pocket pays the toll anyway. Correct when the quota existed everywhere. Rewritten mechanically for a mode with no quota, the condition became "no quota applies, or you have enough souls", and in the campaign the first half of that sentence is unconditionally true.

So every death paid the toll, descended a floor, and dropped the player into the charm draft at full health. For a while, a campaign run could not end. You could die over and over and be rewarded for it. The game had accidentally become the exact thing it was written against: a machine that always pays out.

The fix is one line. Dying stops the run. I tell it because the interesting part is not the bug. It is that a rule which was both kind and correct became absurd without anyone editing it, purely because the thing it depended on had been removed somewhere else. Every compassionate special case in a codebase is a bet that its precondition will outlive it.

The upgrade I deleted

There used to be a workshop upgrade that granted two extra seconds of toll per rank. It is gone, and its removal is the clearest lesson the exponent taught me.

A toll is worth something because it is short. Sixty seconds is long enough to build a shape and too short to settle into. Selling more of it was selling the opposite of what players actually liked, dressed as a reward. It was also worse than useless, because the timer decides when the Accountant arrives, from floor four onwards, at the halfway mark. A longer toll delayed the one enemy that taxes the souls you collect. Players were paying a rank for help they had not asked for.

The toll is sixty seconds everywhere now, and only the campaign can move it at all.

Where it landed

61 charms, and the ones that matter do not hand you damage. They rewrite a rule of the spin: what counts as a hit, what a symbol does beside another, how many reels drop at all. Seven machines, each bending a different rule of the draw. No ads, no lives, no continues, no currency. There is a free trial with no account, then one purchase unlocks everything permanently, and what you earned in the trial stays yours.

Written solo in Swift, with no game engine, in English, French and Spanish. The game is on the App Store, and the trial goes deep enough to feel the toll climb.

All notes