An exploit is a player telling you what your game rewards

STARSWING is a one-thumb arcade game. You orbit a planet, release, fly across the void, catch the next planet. Chain enough catches and the music swells. That's the whole thing.

I handed the first build to a friend. Within four seconds he was farming infinite points — bouncing between two planets that happened to sit close together, A to B, B back to A, forever. Every catch scored. He never had to take a risk.

The obvious fix is the wrong one

The instinct is to punish repetition: decay the score on a re-catch, or cap the points from a planet you've already used. Both work. Both are invisible — the player sees a number get smaller and doesn't know why.

So instead: the planet you leave collapses behind you.

final Set<int> _spent = {};

void _fling() {
  _spent.add(p.id);   // this planet is gone. forever.
  ...
}

You launch off a planet, it dies — still there, greyed out, but you can't catch it again. The two-planet bounce isn't nerfed; it's impossible. You get exactly one bounce, then there's nowhere behind you to land.

The exploit fix became the best mechanic in the game.

Why it's better

The game had a direction problem I hadn't noticed. Nothing stopped you from drifting sideways, hedging, staying safe near a cluster. Collapsing planets make the game directional: the only place to go is forward, into the void you haven't seen yet.

It also made the game legible. A ghost line predicts where you'll land — green if you'll make it, amber if you won't. Once planets collapse, that line has a second job: it turns amber when you aim backwards, at a dead planet. The game teaches its own rule, in the moment you try to break it, with no tutorial.

The test that only exists because of him

Every release runs a headless quality gate — bots play the game and assert six properties. One is now FARM-PROOF: a bot that deliberately tries the two-planet bounce and fails the build if the score is unbounded. If the exploit ever comes back, the build goes red.

The lesson I keep relearning

He wasn't cheating. He was optimising, and the optimum was boring. The bug wasn't that he could bounce between two planets. The bug was that my game paid him to be safe.

The fix isn't to make the safe thing worth less. It's to make it impossible, visibly, in a way he can watch happen.