Gold
Gold buys speed, never a higher ceiling. It fills the fuel tank, swaps for cash and buys a few brand tokens of the player’s pick, so a player who spends reaches the same cars and brand levels sooner, never ones a free player cannot reach. Three free sources pay it (see below): at most 25 gold a day and 50 from the weekly event, 225 a week. The design is in docs/2026-11-08-progression-design.md (“Currencies”); every price is an estimate to tune after playtesting.
Prices
Section titled “Prices”| What | Price | Limit |
|---|---|---|
| A full tank (10 fuel), from any amount | 30 gold | refused when the tank is full |
| Cash | 1 gold = 5% of the furthest open district’s average event prize, rounded to $10 | any whole amount; the dialog offers 10, 50 and 250 |
| 1 brand token, any brand | 20 gold | 3 a week (ISO week, Monday 00:00 UTC) |
The cash rate per district: Street $240, Harbor $630, Chinatown $1,410, the Strip $1,820. A replayed win pays 25% of the prize, so 1 gold is a fifth of a replayed win wherever the player is, and 550 gold (the EUR 4.99 pack in docs/2026-11-06-monetization-design.md) buys about three days of racing in any district (36 races a day, “Economy as built”).
A tank of 10 races is worth about 50 gold in replayed wins at that rate, so racing on a bought tank pays more than swapping the same 30 gold for cash. The free 50 gold a week buy one or two tanks. A free player earns about 15 brand tokens a week by racing, so the 3 bought tokens add a fifth at most.
Free gold
Section titled “Free gold”| Source | Gold | Limit |
|---|---|---|
| Weekly event wins | 10, 15, 25 | the first win of each rung, once a week (see Weekly event) |
| The day’s first won career event | 10 | once a UTC day |
| Rewarded gold ad | 5 | 3 a UTC day |
Sized against the 30 gold tank: a day’s free gold (25) stays under a tank, so it adds at most about 8 races of fuel to the 36 a day in the play model. The gold ad’s 5 gold are about 1.7 fuel, less than the fuel ad’s 2, so the fuel ad stays the better ad for fuel. Only a won career event counts for the first-win gold: a boss fight’s or tournament’s rounds, quick races and weekly races do not.
The rules
Section titled “The rules”player/gold/ holds them, with no Phaser, so the race server and the game run the same code.
goldPrices.ts:TANK_PRICE,GOLD_CASH_SHARE,CASH_BUNDLES,TOKEN_PRICE,TOKENS_PER_WEEKandgoldCashRate(progress), built onaverageEventPrize(player/career/progress.ts), the same base as the daily bonus and the quick race prizes.freeGold.ts:DAILY_WIN_GOLD,GOLD_PER_AD,GOLD_ADS_PER_DAY,payDailyWinGold(adds the gold to the garage and to the race’s award) andapplyGoldAd, both counted inGarageState.goldDay({ date, winPaid, ads }, the UTC day fromads/dailyBonus.tsbonusDay). A new day starts a newgoldDay.goldActions.ts: the three spending actions andgoldAd.goldFuelfills the tank withfillFuel(player/fuel/fuel.ts);goldCashtakes a whole number of gold and pays it at the current rate;goldTokenadds one token of the named brand and counts it inGarageState.goldTokens({ week, count }, the week key fromplayer/weeklyEvent/weekCalendar.ts). Each refuses without changing anything:Not enough gold., a full tank, a bad amount, an unknown brand orNo gold tokens left this week.
tests/freeGold.test.ts covers the first-win gold once a day, the gold ad’s cap and their reset at midnight UTC, and that the game cannot set goldDay. tests/gold.test.ts covers the tank price, the rate per district, the exchange, the weekly token cap and its reset on Monday, and that the game’s own copy of gold and the token count is ignored.
On the race server
Section titled “On the race server”The actions are garage actions (player/garageActions.ts), applied by POST /api/garage/action (party/src/api/garageApi.ts) with the server’s clock: the server decides the week and the fuel, and works out every price itself. goldAd is an ad reward like fuelAd and dailyBonus: it pays only against an ad credit AdMob confirmed (party/src/api/adCredit.ts). The first-win gold is paid where the server settles a judged career event (party/src/race/judgedRace.ts), and comes back in the race’s award (RaceAward.gold), which the results line shows as “+10 gold for today’s first win”. gold, goldTokens and goldDay are not among the fields the game’s sync sends (player/garageSync.ts), so the game never sets its own gold.
In the game
Section titled “In the game”- Top bar (
menu/topBar/goldGauge.ts): a coin and the amount left of the fuel. Tapping the gold or the fuel opens the gold dialog; a spend redraws the menu. - Gold dialog (
ui/gold/goldDialog.ts): fill the tank, swap for cash (a second dialog with the amounts and what they pay) or brand tokens (a dialog with the 4 brands and the count the player has of each). “Watch an ad” (ui/gold/goldAd.ts) shows while a rewarded ad is loaded and one of the day’s 3 is left; paid, the menu redraws. - Results (
race/raceAward.ts): the prize line ends with “+10 gold for today’s first win” when the race paid it. - Out of fuel (
ui/fuelGuard.ts): with enough gold, “Fill the tank” sits next to the fuel ad and starts the race once paid. - Brand dialog in the parts shop (
shop/parts/brands/BrandDialog.ts): “Buy tokens” opens the token pick and comes back to the brand dialog after. - DEV menu: “+100 gold” adds gold to a dev account’s garage.
Not built yet
Section titled “Not built yet”- Buying gold with real money. The purchase code kept from Remove ads (
player/account/purchases.ts,POST /api/purchases/sync) reads RevenueCat’s active entitlements, which fits a one-time purchase that stays owned but not a consumable: crediting a gold pack needs the server to see each store transaction once (RevenueCat’s purchase history or a webhook, with a record of transactions already credited) or RevenueCat’s virtual currency. Until then gold comes only from the free sources above. - The play-length model (
npm run career:check) does not count the free gold’s fuel.