Quick race
Quick race is a single race from the main menu, outside the career. The player picks a car, a track and a distance, then Easy, Medium or Hard. It pays a little XP and cash, gives no stars and puts no time on the leaderboards.
The rival
Section titled “The rival”The rival is nameless (“Rival”) and drives a copy of the player’s car: the same model, the same parts and the same part brands (OpponentCarSpec.brands), with less power and a driver who makes more or fewer mistakes (QUICK_RIVALS in player/quickRace.ts). Each level has its own paint, so the levels look different on the line; its decals and underglow are rolled anew each race (rivalLook in player/career/rivalLook.ts).
| Level | Power | Sloppiness | Paint |
|---|---|---|---|
| Easy | 74.5% | 0.4 | Toxic Lime |
| Medium | 78% | 0.3 | Bayside Blue |
| Hard | 87% | 0.1 | Jet Black |
Because the rival copies the car, the difficulty follows the player’s progress in every class without a table per car. scripts/quickRaceCheck.ts measures it and tests/quickRaceBalance.test.ts holds it in range on a stock car and on 6 and 12 parts (scripts/quickRaceRates.ts): a player at 85% of the car’s best run (the career check’s driver until 2026-11-13) wins 78 to 91% of easy races and 38 to 55% of medium ones, and hard needs a better driver (66 to 88% at 92% of the best run). Traction control (2026-11-08) made a full-power car worth more against a detuned copy, so easy went from 65% to 72% power and medium from 75% to 82%; the real parts (2026-11-10) moved them to 74.5%, 80% and 86% for hard; the fixed nitrous shot (2026-11-11) to 78% for medium and 87% for hard.
How it runs
Section titled “How it runs”A quick race is a CareerRace without an event, with an id like quick~hard~harbor~half (quickRaceId). pickRace in race/EventRace.ts and raceOf (race/judge/raceOf.ts, which the race server uses) build it from that id and the car raced, so the ticket, the replay and the result screens work as for a career race. The server rebuilds the rival from the car stored on the ticket, so the client cannot pick a weaker one.
settleSingleRace (race/judge/settleRace.ts, called by the server’s judgeRace) settles it with settleQuickRace (player/level/quickRaceRewards.ts) instead of the career’s prize and stars, and skips the leaderboards and the double prize. Results and the pause menu lead back to the quick race screen (race/raceHome.ts).
Tracks are those of the districts the career has opened, so a quick race shows nothing the career has not.
Rewards
Section titled “Rewards”A win pays a share of the furthest open district’s average event prize (quickRaceCash, rounded to
$50), the same base as the daily bonus, so quick races keep up with the career. Medium pays a
fifth, what replaying an average event pays (REPLAY_SHARE).
| Level | Win | Finished loss |
|---|---|---|
| Easy | 10 XP, 12% of the average event prize ($150 in Street) | 5 XP |
| Medium | 20 XP, 20% ($250 in Street) | 5 XP |
| Hard | 35 XP, 28% ($350 in Street) | 5 XP |
A race that does not reach the line pays nothing. Only the first 20 finished quick races of a UTC day pay (GarageState.quickRaces, the server’s clock), so an easy rival cannot be farmed for cash or levels. The screen shows how many prize races are left today.
Checking it
Section titled “Checking it”tests/quickRace.test.ts covers the ids, the rival and the rewards with the daily cap. npx tsx scripts/quickRaceCheck.ts prints the win rates per level; tests/quickRaceBalance.test.ts fails when one leaves its range.