Weekly event
The weekly event gives a player something to race between district releases (progression design, “Between district releases”). Every week has one special rule and three races, opened from the main menu’s Weekly event button. Each race pays brand tokens and gold on its first win of the week. It costs 1 fuel a race, like every other race, and needs no art of its own: the rivals drive the player’s own car and the tracks come from the career.
The week
Section titled “The week”A week runs from Monday 00:00 UTC to the next Monday and is named by its ISO week, such as 2026-W45 (player/weeklyEvent/weekCalendar.ts). UTC rather than the phone’s time zone, so the game and the race server agree on the week, as the daily bonus does for the day.
The rule comes from a fixed six-week rotation by week index (WEEKLY_ROTATION in weeklyRules.ts), the same for every player:
| Kind | Rule | Distances in the rotation |
|---|---|---|
| Distance week (Half-mile, Sprint) | cars of the player’s class | 1/2 mile, 1/8 mile |
| Stock week | cars of the player’s class, raced with their parts and part brands off | 1/4 mile, 1/8 mile |
| Class limit week | up to one class below the player’s (class 1 stays class 1) | 1/4 mile, 1/2 mile |
The kind and the distance are global; the class follows the player’s furthest open district (weeklyRule), so a Street player and a Strip player each meet cars of their own stage. Week 2026-W46 is a class limit week over the quarter mile, then sprint, stock, class limit, half mile and stock.
The three races
Section titled “The three races”The rivals are a quick race’s (quickRival in player/quickRace.ts): a copy of the car the player races, with the same model and parts but less power, at three steps (weeklyRival in weeklyLadder.ts):
| Race | Rival | Power | Sloppiness |
|---|---|---|---|
| 1 | Easy rival | 72% | 0.4 |
| 2 | Medium rival | 82% | 0.3 |
| 3 | Hard rival | 90% | 0.1 |
So the event follows the player’s own car: a player who just opened a district meets rivals of the car they drive, not the district’s last crew member. scripts/quickRaceCheck.ts sized these steps: a decent driver wins about 4 in 5 easy races and half the medium ones, the hard one takes a good driver. The rivals copy the parts but not the part brands, as in a quick race.
Stock weeks
Section titled “Stock weeks”A stock week lets in every car of the player’s class (CarRule.stock) and races it with its parts and part brands off, for that race only: carUnderRule swaps in stockCar (the nitrous kit every car comes with, nothing else) where the race is built (race/eventRaceSetup.ts), so the garage keeps its parts. The rivals are stock copies of the same model. The race server builds the stock car the same way when it replays the race, so a car with parts never needs to be swapped out or bought for the week. The screen’s rule line reads “PARTS OFF”.
The races open in order: the second needs a win in the first this week. The track is the source district’s (the player’s own district, or for a class limit week the first district of the lower class).
Rewards
Section titled “Rewards”| Race | Gold | Brand tokens |
|---|---|---|
| 1 | 10 | 1 |
| 2 | 15 | 1 |
| 3 | 25 | 2 |
All tokens of a week are of one brand, rotating by week (rotatingBrand, as the daily bonus rotates by day). A week pays at most 50 gold and 4 tokens. The career pays about 15 tokens a week of play (“Economy as built” in the progression design), so the event adds a little without becoming the main source. The gold follows the monetization doc’s free gold (10 for a first win). Only first wins of the week pay: a lost race, a race already won this week and a race that finishes after the week turned pay nothing, so the event cannot be farmed.
Gold is a balance on the garage (GarageState.gold), shown on the event screen. Nothing spends it yet.
How it runs
Section titled “How it runs”A weekly race is a CareerRace without an event, with an id like weekly~2026-W45~1~0: week, the player’s district (index) and the race (weeklyRaceId). The id and the car raced hold everything, so pickRace (race/EventRace.ts, with the current car) and the race server’s raceOf (party/src/api/raceApi.ts, with the car stored on the ticket) build the same race and the same rival from them.
On the ticket the server checks, in order: the car is not blown, the district is open and the current car passes the week’s rule (racedCar; a stock week checks the class only), the id’s week is the server’s current week and the race is not past the next one to win (weeklyStartRefusal), then it spends 1 fuel. A race already won may be raced again for nothing, as a retry after a win does. The finish replays the input log and judgeWeeklyRace (party/src/race/weeklyRace.ts) settles it with settleWeeklyRace (weeklySettle.ts): no cash, XP, stars, leaderboard time or double prize.
The screen (weekly/scenes/Weekly.ts) shows the week’s name and time left, the rule, distance and track, the player’s gold, the three races with their rival, prize and state, and the car to race with a line saying whether the rule lets it in (in a stock week, that its parts are off). Race goes through the blown engine check, the eligible car picker (ui/pickEligibleCar.ts, which offers an owned car that may enter) and the fuel check. Results and the pause menu lead back to the event screen (race/raceHome.ts).
Checking it
Section titled “Checking it”tests/weeklyEvent.test.ts covers the calendar, the rotation, the rivals and their stock copies, the stock car a stock week races, eligibility, the server’s start checks and the rewards with their weekly cap. npm --prefix party run test:weekly runs the same flow against a running wrangler dev: refused tickets, the fuel spent, a won race paid once and a repeat paying nothing.