All case studies

Neon Dodge — making every death the player's fault

A one-input reflex game where the obstacle is always on screen longer than a human reaction time.

Neon Dodge — making every death the player's fault
Client
In-house title
Platform
WebGL / browser
Engine
Unity
Genre
Arcade
Unity WebGLC#Brotli compressionApache

The challenge

A one-input game has nowhere to hide. There is no inventory to explore, no story to carry a weak minute, no second system to distract from a control that feels slightly wrong. Either the tap feels right or the game is dead in ten seconds.

The specific problem with endless dodgers is that players blame the game for deaths they could not have avoided. If an obstacle appears with less warning than a human reaction time, the run stops feeling like a skill test and starts feeling arbitrary — and players quit, usually without being able to say why.

The third constraint was reach. This had to run on a mid-range Android phone in a browser tab, with no install, and still hold a steady frame rate while the speed climbs.

A further constraint came from where this game actually gets played. A browser game has no install step, which is its advantage, but it also means the player has invested nothing and will leave at the first sign of friction. There is no sunk cost keeping them there — so a slow load, an unresponsive first input, or a death they did not understand all cost the same thing: the entire session.

Our approach

Every obstacle is spawned far enough ahead that it is on screen for longer than a worst-case human reaction time before it can kill you. That single rule is what separates a reflex game from a slot machine. As speed increases, spawn distance increases with it, so the warning window stays constant even as the game gets harder.

Difficulty rises through speed alone, not through new rules. The player never has to re-learn anything mid-run — they get faster at a thing they already understand, which is the version of difficulty that feels fair.

The input is deliberately one channel: hold to rise, release to fall. Touch, mouse and keyboard all map to that same channel, so the game does not need a separate mobile and desktop design, and nothing feels like a port.

Visually the board is high contrast and low detail on purpose. The gap the player must thread is the brightest readable shape on screen. Synthwave styling sits behind that priority, never in front of it.

The build ships Brotli-compressed with its own server rule declaring that encoding, so the browser decompresses it natively instead of falling back to the slower JavaScript path.

Speed rises continuously rather than in steps, because a sudden jump reads as the game cheating even when it is announced. The player should notice that they are working harder without being able to point at the moment it changed.

The input is deliberately one channel — hold to rise, release to fall — mapped identically to touch, mouse and keyboard. That is what keeps the game from needing separate mobile and desktop designs, and it is why nothing about it feels like a port in either direction.

The result

A reflex game where deaths read as the player's fault — the obstacle was always visible long enough to react to, so the lesson is learnable instead of arbitrary.

It runs in the browser on desktop and mobile with no download and no account, and holds its square board uncropped at any window size.

Playable on this site right now. It replaced the placeholder demo that previously sat in the game library.

Difficulty scales through speed alone while the warning window stays constant, so the game gets harder without ever becoming unfair — the obstacle is always on screen long enough to react to.

One input channel serves touch, mouse and keyboard identically, so there is no second-class platform.

It replaced the placeholder demo that previously sat in the game library, which means the first browser game a visitor meets is now a real title rather than a test asset.