Game review
Traffic
8 / 10
- Developer
- Krisztian Toth
- Publisher
- Krisztian Toth (open source)
- Released
- 1 January 2013
- Platforms
- Web browser (desktop and mobile - best in landscape)
- Genre
- Simulation / Arcade
- Monetisation
- Free, open source, no ads and no in-game purchases
- Players
- Single-player only
The short version
Traffic asks you to do one job — keep six isometric city intersections moving by flipping traffic lights before drivers get too angry and the game ends — and does it with a level of craft that explains its 2nd-place finish in js13kGames 2013's Mobile category, all inside a 13-kilobyte submission. The candidate arrived with one real problem: its viewport meta tag omitted `width=device-width`, which causes mobile browsers to fall back to a legacy ~980-pixel layout viewport and throws off the game's own scale-to-fit math, confirmed by direct measurement before and after the fix. With that one line corrected, the game's touch handling — which was already properly built, converting touch coordinates through the same scale factor the canvas itself uses — works precisely: a tap lands on exactly the intersection tapped, with a visible highlight box confirming the hit before the light flips. Best experienced in landscape, which the game's own orientation-change handling clearly expects, but functional in portrait too once the underlying scaling bug is gone.
Biggest strengths
- Touch input is a real, dedicated implementation — a `touchstart` handler converts touch coordinates through the same `engine.scaleToFit` factor the canvas rendering itself uses, and testing confirmed a tap correctly identifies and toggles the exact intersection tapped, with a visible hover-highlight box appearing at the precise location before the light change registers
- A genuinely well-designed arcade loop: six real cities (Paris, London, New York, Rome, Sydney, Budapest) with different road layouts, a rising "anger level" pressure mechanic, and a day/night lighting cycle that's more than cosmetic dressing
- Charming, detailed isometric art for a 13KB competition entry — cars with working turn signals and headlights, water animation, six distinct city skylines
Biggest weaknesses
- As committed, the viewport meta tag lacked `width=device-width`, which on real mobile browsers causes a fallback to a roughly 980-pixel legacy layout viewport; combined with `user-scalable=no` disabling pinch-zoom as a workaround, this would have made the game render its full scene as a distant, hard-to-read miniature with no way to zoom in — fixed here with a one-line meta tag correction, confirmed by measuring the canvas before (980px reported viewport) and after (390px, correct) the fix
- The game is landscape-first — a portrait phone gets a noticeably smaller board (around 390×250 CSS pixels) than a landscape one (around 607×390), since the underlying 1008×648 canvas is a fixed wide aspect ratio; still fully playable in portrait after the fix, just more comfortable turned sideways
- No licence exists for this game anywhere the author has published; treated here under this shelf's policy for stated-no-licence work, credited by name with a same-day takedown offer
Who it's for: Anyone who enjoys light management/optimization games, and appreciates when a 13-year-old 13-kilobyte game turns out to still hold up
Our recommendation: Worth playing, ideally with the phone turned sideways
8 / 10
Every entry in the js13kGames competition has to fit inside a 13-kilobyte zip file, which tends to produce either scrappy tech demos or, occasionally, something genuinely tight and well-made because there was no room left for anything unnecessary. Traffic is the second kind. You watch over an isometric city — Paris to start, five more to unlock — where cars stream through intersections and your only tool is tapping a crossroad to flip its lights. Let too many drivers sit too long and their collective "anger level" ends the round. It's a small, clear idea executed with real polish: working turn signals on the cars, a day/night cycle with its own lighting pass, six distinct city layouts rather than one map reused six times. The result placed 2nd in js13kGames 2013's Mobile category, and played today, that result still holds up.
A one-line bug, confirmed and fixed
The candidate arrived with a real, measurable problem rather than a vague "might not work on mobile" concern. Its viewport meta tag read user-scalable=no with no width=device-width directive, and measuring the rendered canvas directly on a simulated phone confirmed the consequence: the browser fell back to treating the page as if it were roughly 980 CSS pixels wide — the legacy default many mobile browsers use for pages that don't explicitly declare a mobile-aware viewport — rather than the phone's actual ~390-pixel width. Because user-scalable=no also blocks pinch-zoom, there would have been no way for a player to compensate by zooming in. Adding width=device-width, initial-scale=1 to the meta tag and re-measuring confirmed the fix: the canvas correctly reports and renders at the device's real width afterward, with the game's own engine.scaleToFit calculation then working exactly as its author intended.
That calculation, once it has correct inputs, is worth crediting on its own: windowResized() computes a scale factor from the true viewport dimensions and applies it via a CSS transform, and the touch handler divides incoming touch coordinates by that same factor before checking which intersection was tapped. That symmetry is why the fix was a pure viewport-tag correction rather than anything touching the game's own logic — the underlying math was already right, it just never received accurate numbers to work with. Confirmed by testing in the game's clearly intended landscape orientation, a tap on a specific intersection produced a visible white highlight box at exactly that intersection before the light flipped, with the resulting green light appearing precisely where expected. The same interaction still works with a smaller board in portrait, since the underlying scale-to-fit correction applies regardless of orientation.
Small, but not thin
Six cities, each with a genuinely different road layout rather than a palette swap, is more content than a lot of jam games bother with. The anger-level pressure system gives the light- flipping loop actual stakes rather than being a static puzzle, and the day/night toggle changes the lighting pass rather than just tinting the screen. None of this is complicated, but all of it is deliberate, and it adds up to something with real replay pull for anyone who likes optimization-under-pressure arcade games.
Where that leaves it
An 8.0 reflects a genuinely well-built, competitively-recognized small game that needed exactly one line changed to work correctly on the device category this shelf cares most about — confirmed by direct measurement, not assumed. Recommended, and best played with the phone turned to landscape, the way its own orientation-handling code clearly expects.
Pros and cons
Pros
- Touch input is a real, dedicated implementation — a `touchstart` handler converts touch coordinates through the same `engine.scaleToFit` factor the canvas rendering itself uses, and testing confirmed a tap correctly identifies and toggles the exact intersection tapped, with a visible hover-highlight box appearing at the precise location before the light change registers
- A genuinely well-designed arcade loop: six real cities (Paris, London, New York, Rome, Sydney, Budapest) with different road layouts, a rising "anger level" pressure mechanic, and a day/night lighting cycle that's more than cosmetic dressing
- Charming, detailed isometric art for a 13KB competition entry — cars with working turn signals and headlights, water animation, six distinct city skylines
- Entirely self-contained in one file with zero external assets, zero analytics, and zero console errors once the viewport issue was fixed
- A real, verified competitive result — 2nd place in js13kGames 2013's dedicated Mobile category — rather than an assumed or inferred reputation
Cons
- As committed, the viewport meta tag lacked `width=device-width`, which on real mobile browsers causes a fallback to a roughly 980-pixel legacy layout viewport; combined with `user-scalable=no` disabling pinch-zoom as a workaround, this would have made the game render its full scene as a distant, hard-to-read miniature with no way to zoom in — fixed here with a one-line meta tag correction, confirmed by measuring the canvas before (980px reported viewport) and after (390px, correct) the fix
- The game is landscape-first — a portrait phone gets a noticeably smaller board (around 390×250 CSS pixels) than a landscape one (around 607×390), since the underlying 1008×648 canvas is a fixed wide aspect ratio; still fully playable in portrait after the fix, just more comfortable turned sideways
- No licence exists for this game anywhere the author has published; treated here under this shelf's policy for stated-no-licence work, credited by name with a same-day takedown offer
- A dated codebase by design — this is a 2013 js13k submission, so don't expect modern responsive-design conventions beyond what's been patched here