Hard but Fair: Keeping Arcade Games Tough Without Feeling Cheap

There is a single sentence that decides whether an arcade game is worth keeping open: "that was my fault." A player who says it and means it hits retry. A player who thinks the game robbed them closes the tab, and no amount of polish wins them back. Difficulty itself is easy. Building a hard game where every death lands as the player's own mistake is the actual work, and most of what we do to our originals after launch is chasing that one line.
Cheap and hard are not the same axis. A game can be punishing and completely fair. A game can be soft and still feel like a swindle. The question that separates them is narrow: could the player have prevented this death with information the game gave them in time? When the answer is yes, brutal is fine. When it is no, even a gentle game feels like a cheat.
Telegraph everything, then be merciless
Pest Wipeout is where we learned this, because the first version got it wrong. It shipped with what we now call the wall of fire: a busy late wave where pests dove and spat with no warning, and you died to attacks you had no way to read. Hard, yes. It also felt like garbage.
The fix was not to slow anything down. It was to make every threat announce itself before it commits. A dashed line now traces exactly where a diver is headed, drawn before it peels off the formation, so you dodge a route you can see instead of guessing at one. Any pest about to shoot flashes a yellow warning triangle over its head first. And the opening waves send a single attacker at a time, adding exactly one new pest before they start mixing, so you learn the cyan mosquito's nervous zig-zag on its own, then meet the looping housefly, then the wasp that spits a golden stinger at wherever you happen to be standing.
None of that made the late game easier. The final waves still lean on a relentless volume of fire, and they still ask for real dodging. What changed is ownership. Every attack that kills you was on screen, marked, before it landed, so if you get clipped you can point at the exact triangle or dashed line you ignored. We do soften the blow one way that isn't about information: after each hit you get 1.2 seconds of blinking invulnerability, enough that a crowded screen can't chain two deaths out of one mistake. That, and the telegraphs, are the whole gap between the old wall of fire and the current one. The rules underneath are nearly identical.
The hitbox has to match what you see
The second way a game cheats is quieter. The thing that kills you is not the size it looks. You dodge the shape on screen and die anyway, because the real hitbox ran bigger than the sprite. Players can't put words to this, but they feel it in a second, and it reads as the game lying.
Nova is one slowly closing vice on your reaction time. Rings bloom, hold a beat, then shrink toward nothing. The window to pop one tightens from 130 frames to a 52-frame floor as you last longer, and the gap between spawns falls from 80 frames to 26. Savage ramp. The fairness lives in one number we refused to touch: the hit radius never drops below 16 pixels. A ring can shrink to what looks like a dot, but the area you can tap to pop it stays honestly large, so a nearly-gone target is still winnable. A tap into empty space costs your combo but never a life, so you don't die for a whiff. And the countdown arc bleeding green to red turns triage into a reading skill rather than a guess: one glance tells you which dying ring to save first.
Aura Dash comes at fairness backwards, and in doing so it exposes the one problem visual juice creates rather than solves. A single rule kills you: touch a red shard and the run ends. At full heat, with the bloom over-blooming and magenta homing shards crowding the core, that rule gets genuinely hard to read. So the real kill radius is smaller than the shard looks, shard size times 0.7 plus 11 pixels. You are being handed slack you can't see. Most of the time it feels great. Once in a while it produces the single honestly cheap death we have not solved, where our own spectacle swallows a hitbox that was actually cutting you a break. Given the choice, we would rather the player lived.
Physics that never betray you
Ionizer carries a fairness bug that stays invisible right up until it ruins a run: tunneling. A ball moving fast enough can, on a naive engine, cover enough ground in one frame to pass clean through a brick without ever registering the hit. The player watches the ball skip a block it obviously touched. No attack to dodge, no lesson to take, just an engine failing in front of them.
We sub-step the collision, chopping each frame's travel into small pieces and testing every one. Cleared waves push the ion from its opening speed of 5 toward an 8.5 cap, and even there it never tunnels through a block it should have hit. Exit angle comes from where the ball meets the paddle, with a little english off the paddle's own speed, and we clamp the result at 1.35 radians so the ball can't go flat enough to skim the floor forever in an unwinnable groove. Neither the sub-stepping nor the clamp is a feature you'll ever notice working. You notice their absence once, as a death you can't explain.
Make the ramp legible
The last piece is the shape of the curve. A player should feel difficulty rising and understand why, instead of getting ambushed by a spike.
Neon Stack starts its slab at 3.4 pixels a frame and adds 0.16 per drop up to a hard cap of 8.5. The scoring window stays a fixed 6 pixels the whole way, so late in a run you aren't fighting a new rule, you're outrunning your own reaction lag against a target barely wider than a single frame. One test, getting faster. You can feel exactly where you sit on the curve, which is why our own tip tells you to release a hair before the slab looks centred.
Flux squeezes space rather than time. Gates open at a 210px gap and pinch 3 pixels with every pass, bottoming out at a 132px floor. You watch the gap close, pass by pass, at a rate you can read. Nothing suddenly halves on you. The pressure is always just the next 3 pixels.
Fair difficulty is not a setting you dial down. It is four promises the game has to keep. It warns you what is about to kill you before it does. The thing that kills you is the size it looks, no bigger. The engine never skips a hit it should have caught. And the curve rises where you can watch it climb. Keep all four and you can make a game as mean as you like. Break one and the softest thing on the site still feels like it mugged you.
Frequently asked questions
What makes a hard game feel fair instead of cheap?+
A fair death is one you could have seen coming and prevented. That usually means the threat was telegraphed before it committed, the hitboxes matched what you saw on screen, and the difficulty rose in a way you could read. When any of those breaks, the same death that should feel earned starts feeling stolen.
Do you make your games easier by shrinking the difficulty?+
No. We keep the pressure high and instead remove the unfair parts: hidden attacks, hitboxes that lie, and physics that let a projectile skip through a wall. Nova's rings still close fast, but the hit radius never drops below 16px so a nearly-gone ring stays honestly poppable.
Why do some arcade deaths still feel cheap even in a well-made game?+
Usually because the spectacle buries the information. At full heat our bloom, shake and homing shards can swallow a hitbox, so a death reads as unfair even when the real kill radius was cutting you slack. It is the one fairness problem visual juice creates rather than solves.
Which of your games is the best example of a fair difficulty curve?+
Pest Wipeout, after our rework. Every dive traces a dashed path line before it commits, every incoming shot flashes a warning triangle, and the first waves send one attacker at a time so you meet each pest cleanly. The late waves are genuinely brutal, but the information you need to survive is always on screen first.




