Taps can be unreliable inside this app's built-in browser. For the full experience, use its menu to open this page in your browser.
Skip to content

Two Rivals With One Shared Speed

A devlog by Neeraj Kotwani, who builds every game on Elipar.

Turbo Dash shipped as one race. Fixed distance, two rivals, a first-second-third placement at the end, and that was the game. Somebody asked for more levels, which is a reasonable thing to ask for a racing game with exactly one track.

It is a five-stage championship now — Coast Sprint, Palm Mile, Golden Hour, Dusk Run, Night Circuit. Along the way I found that two of the opponents had been the same opponent the whole time.

The fields that did nothing

Starting a race set rivalA.speed and rivalB.speed. Reasonable-looking code, right where you would expect it.

Nothing ever read them. The simulation hardcoded BASE_SPEED * 0.95 for both rivals.

So those two fields were dead, and the consequence was not "slightly wrong pacing" — it was that Bolt and Nova, who have different names and different colours and look like two separate racers, ran at exactly the same speed in every race. Two opponents presented to the player, one actual opponent in the simulation.

This is the kind of bug that cannot be found by playing. Two cars running at identical speed look like two cars. The race felt like a race. Nothing was ever visibly wrong, and no test would have asked whether a field that is written and never read has any effect, because the obvious assumption is that it does.

I only found it while wiring up per-stage difficulty, because I went looking for where the rival speed came from so I could vary it. It is live now, and per-rival per-stage, and Nova is deliberately a shade quicker than Bolt on every stage — which is asserted in a test, so it cannot quietly collapse back into one opponent.

If you set a field at the start of a run, it is worth one grep to check something downstream actually reads it.

Three dials, not one

The temptation with stages is to make later ones longer. Longer is not harder, it is just more of the same.

So difficulty rides on three independent dials: rival pace goes from 0.93 and 0.95 of base speed up to 1.10 and 1.13, traffic spawn interval tightens from 1.55-1.00 seconds down to 0.90-0.62, and distance grows from 2000 to 3200. All three are asserted monotonic by test rather than by reading the table and nodding — a stage table is exactly the kind of hand-written data where one transposed number survives review.

Each stage also repaints sky, fog and lights, running midday through golden hour and dusk to night. That needed a small refactor: the sky dome was built by a one-shot function that ran at load, and it is now a function taking colour stops so a stage can repaint its texture. The five stages are verified to produce five distinct fog colours and a sun that genuinely dims from stage one to stage five.

A championship has a score, which forced a HUD fix

This game never reported a score. That was deliberate and is recorded in my notes: a first-second-third placement is not a climbing numeric score, so there was nothing meaningful to send.

A championship points total is a climbing score. 10, 6 and 3 points per stage, always advancing to the next stage even after a bad result, with the total out of 50 as the real measure. A hard "win to continue" gate would have made stage five's pace a wall; this way a bad stage costs you the title rather than the run.

Adding a score had a consequence I did not predict. The site draws a personal-best badge in the top-left of every game frame, and every game's own HUD is supposed to start below it for that reason. Turbo Dash's chips sat right at the top and had been getting away with it for months — because with no score reported, the badge never appeared at all. The moment the game started sending one, the badge landed on top of the speed readout. The left column starts lower now and the new stage chip went top-right, measured inside the real embedded frame rather than eyeballed.

Worth remembering: a game that reports no score is not exercising the site chrome that surrounds it, so adding one can surface a layout bug that was always there.

Balance measured with two bots

"Is stage five too hard" is not a question I can answer by playing it, because I have played it more than anyone.

So: an expert bot that dodges traffic and boosts on cooldown wins all five stages — but on Night Circuit only by 360 units out of 3200, about 11%. A few traffic hits would erase that, so it is a real race rather than a walkover. A bot that never touches the controls finishes third, 621 units down.

The honest caveat on that: the expert bot reacts every 16 milliseconds with perfect information about the road ahead. It is superhuman. A human sweeping all five stages is not the expected outcome, and the bot's narrow margin on the last stage is the number I actually care about.

The catalogue copy was rewritten too, along with the Racing category introduction. Both still described a single podium race with no climbing score, which had stopped being true — and a description that describes a previous version of a game is its own bug, just not one in the code.

Turbo Dash is free in a browser, five stages, no account, no download. Bolt and Nova are different cars now.

We use cookies to keep games running and, once ads are live, to show relevant content. See our Privacy Policy for details.