DEV Community

CGT Rocket X Racer
CGT Rocket X Racer

Posted on

Auditing stamp presses and robot arms for a fair browser runner

Fairness is easy to claim and hard to prove in a 3D runner. In CGT Rocket X Racer, a fan-made rocket-car runner that plays in a desktop browser, the two hazards players blame first are giant presses and sweeping robot arms. If either feels random, every other system — parts, boost, flip — gets blamed with it. This post is about how we audit those patterns so a miss reads as a player choice, not a coin flip.

Fan-made · Desktop-only · Not affiliated with any car maker.

Why presses need a cycle audit

A press looks simple: a stamp comes down, a stamp goes up. At one speed that is true. At three speeds it is not. The safe window shrinks or stretches with travel speed, and a pattern that felt generous in the editor can clip the car once boost is held. We treat every press as a full-cycle object: down, dwell, up, reset. An automated audit steps each pattern through that cycle at several speeds and flags any frame where the hit volume overlaps a legal lane at the moment a player could already be committed.

That audit is not a balance spreadsheet. It answers one question: if the player is already in the lane and the press starts its stroke, is there still a readable escape — flip over, ground roll under, or a side cut — before the stamp closes?

Robot arms and the safe-lane rule

Indoor halls use sweeping robot arms. Arms that cover every lane at once feel clever for one run and cheap forever after. Our rule is blunt: every indoor arm pattern must leave at least one safe lane for the whole sweep. We sample the arm from distance along the track rather than wall-clock time, so the safe lane stays the same whether the car is coasting or holding boost. Outdoors the fog drops and the sky opens, but the same rule still applies when an arm stretch appears near a hall exit — the player should not have to guess whether the outdoor lighting changed the hitbox.

Input feel is part of fairness

A fair hazard still fails if input arrives late. Controls are simple on purpose: A/D for lane cuts, W or Space for jump-flip, S for ground roll, Shift for boost. Boost has no cooldown. A tap holds for about 1.5 seconds and climbs toward 370; hold keeps that speed; release eases back over about one second. Because flip and boost share the same keyboard timing indoors and outdoors, the press audit can assume a stable commit window instead of a different curve per biome.

We keep a short input buffer on lane cuts so a single dropped frame in the browser tab does not eat a dodge that was already pressed. That buffer is small on purpose — enough to forgive browser jitter, not enough to let players pre-queue three moves through a dense press row.

Browser budget shapes the audit, not the excuse

The build uses Godot's Compatibility renderer and the no-threads web template. Compatibility keeps the game running on more desktop machines in a tab; no-threads keeps the host as a plain static site without special cross-origin headers. Neither choice is a reason to skip fairness work. They do mean the audit itself has to stay light: we verify patterns offline and ship the verified timings, rather than running heavy probes at runtime in the browser.

Effects stay cheap too. Side nozzle mist is locked to model markers, and underbody hover jets stay on so flight reads as flight. Those visuals do not change hitboxes. They only make a successful dodge feel like it came from the car.

What fairness unlocks downstream

When presses and arms are trustworthy, the rest of the loop can stay honest. Five part types — body, chip, motor, thrust, energy — drive cars-built as the minimum of the five, with the weakest counter marked red on the HUD. The results screen draws a stock-style line that dips where you took damage. Ten skins wait behind a garage CONFIRM. None of that lands if the player thinks the stamp cheated.

Takeaways for other browser runners

  • Audit hazards as full cycles at several speeds, not as a single editor preview.
  • Indoor sweeping hazards should always leave a safe lane; sample by track distance when speed varies.
  • Keep boost and flip timing the same across biomes so dodge windows stay learnable.
  • A tiny input buffer helps browser jitter; a large one hides bad level design.
  • Under Compatibility + no-threads, prove fairness offline and ship the timings.

We are still tightening press dwell windows and arm telegraphs. Feedback from people shipping Godot 4 browser builds is welcome.

Optional peek: desktop browser build at cgt.monster

Fan-made · Desktop-only · Not affiliated with any car maker.

Top comments (0)