Skip to content

Part brands

A brand is the rare layer on top of a part’s cash stage. Each staged part holds at most one brand at level 1 to 5, and the brand adds its bonus to whatever the stage already does. Brand tokens, one kind per brand, buy the levels in the parts shop. The physics is pure sim code in sim/brands.ts; the tokens and level rules are player/brands/, also without Phaser, so the race server builds the same car and applies the same rules.

Brand Personality Tagline Full effect (every staged part, level 5)
Hookline launch Built for the first sixty feet. grip +0.09, idle torque share +0.12
Overrev top end Pulls hard to a higher redline. rev range +10%, drag area -13%
Bareframe light Less car to push. mass -19%
Fullhouse all-round A little of everything, on every part. grip +0.045, idle torque +0.04, rev range +4.5%, drag area -6.5%, mass -4.5%

The sizes are estimates, tuned (2026-11-08, again after traction control the same day) so each brand is fastest in about a quarter of the check’s cases (below). With traction control a car no longer spins, so grip is worth exactly the extra drive it lets through and Hookline’s grip share went back up; a higher redline no longer feeds a flare, so Overrev shrank.

Each field of BrandEffect lands somewhere in the drag model:

  • grip adds to CarStats.parts.grip, the tyre friction multiplier the drag tyres also raise.
  • lowEnd adds to the torque share at idle (physics/torqueCurve.ts), the point the curve rises from to peak torque. It matters on a launch from low revs.
  • revRange stretches the redline, the limiter and the power peak by that share (engineShape). Torque is held to the stretched power peak, so the engine makes that much more power up there, and bestShiftRpms shifts later because the redline moved. The final drive stays the stock one, so a car that ran into the limiter in sixth gets more top speed. The turbo still spools by the stock redline.
  • aero takes a share off the body’s drag area in buildPhysicsCar.
  • mass takes a share off the whole car (engine and frame) in buildCarStats. Part weight (upWT) only scales the engine, a fifth to a third of the car, which is why it barely changed times.

All of them are 0 without brands, and every one is applied as x + 0 or x * (1 - 0), so a car without brands races bit-identical to before brands existed.

buildCarStats(base, upgrades, brands) takes brands: PartBrands, a map of part id to { brand, level }. For every installed part with a brand, the brand’s effect is added times:

brandShare(part) * BRAND_LEVEL_SHARE[level - 1] * classFactor
  • brandShare is the part’s upHP + upTQ + |upWT| over the sum of all staged parts, so the shares add up to 1 and a turbo carries more of a brand than spark plugs do. Single parts (nitrous, reserves, weight stages) take no brand.
  • BRAND_LEVEL_SHARE is 0.4, 0.55, 0.7, 0.85, 1 for levels 1 to 5: the first token on a part is felt (0.2 at level 1 gave 0.00 to 0.01 s on most parts), the last levels are the slow part.
  • classFactor is 0.8 for R and H class (3 and 4), as with stages.

A brand on a part that is not installed (or whose required part is missing) does nothing. Mixing brands across parts mixes their effects in proportion, so a build can lean on one lever and keep a bit of another.

Each owned car keeps its brands in OwnedCar.brands (part id to brand and level), and the garage keeps the tokens in GarageState.tokens (brand id to count). ownedStats in player/ownedStats.ts builds the player’s car with its brands, and every place that builds it goes through there: races and the server’s replay of them (eventRaceSetup), online entries (party/src/race/onlineEntry.ts), the parts shop preview, the tuning analyzer, test runs, class rules and the car pickers. Career opponents and a quick race’s rival race without brands.

The rules are player/brands/brandRules.ts, applied as the brand garage action, so with the server garage on the race server decides:

  • Only a staged part takes a brand, and only once it is installed (stage 1 or more). Nitrous, reserves and weight stages take none.
  • Fitting a brand puts it on at level 1. The same brand again raises it one level, up to 5.
  • Reaching level 1, 2, 3, 4, 5 costs 1, 2, 3, 4, 5 tokens of that brand (LEVEL_TOKEN_COST), so a part at level 5 has cost 15.
  • Another brand on the same part replaces the old one at level 1. The old brand’s tokens are gone, with no refund.
  • Without enough tokens of the brand the action is refused, and nothing changes.

Tokens are server-owned like cash: the garage sync (garageSync.ts) never copies them, or the brands, from the game.

All amounts are in player/brands/brandEconomy.ts, kept as they were in the economy rebalance (step 6): the play-length check’s player earns about 100 tokens in its 45 days (57 from the career, the rest from daily bonuses) and fits them a level at a time where they save most. Each source names its brand by a fixed rotation (player/brands/tokenPrizes.ts), so the player knows what an event pays and the same event always pays the same brand.

Source Tokens Brand
An event’s first win (any stars) 1 rotates Hookline, Overrev, Bareframe, Fullhouse over the events in career order
A boss’s first defeat 3, 4, 5, 5 by district rotates by district, Hookline first
The day’s first daily bonus 1 rotates by UTC day

Replays, consolation prizes, quick races and online heats pay none. The tokens ride on RaceAward.tokens, paid where the prize cash is paid (settleCareerRace, settleTournament, settleBossFight), which the race server runs when it judges a race. The whole career pays 57 tokens, 13 to 15 per district: enough for about four parts at level 5. The weekly event pays up to 4 tokens a week of one rotating brand. Still to come: a capped number of tokens for gold, once gold can be spent.

The results screen, the pink slip after a boss and the tournament status add the tokens to the prize line (“+1 Hookline token”); the career hub’s daily bonus button names them before the ad.

In the parts shop a staged part shows a Brand button under its stages, with its brand and level; it is greyed out until the part is installed. The token counts sit on the title row. The button opens a dialog (shop/parts/brands/) with, for each brand:

  • its name and tagline,
  • the move (Fit, Level up or Swap), the level it reaches and its token cost, next to the player’s tokens of that brand,
  • the analyzer’s quarter mile now and after the move, green when quicker and red when slower,
  • a red line when the brand makes the car slower than the part without a brand (the table below shows how often that happens), and when a swap drops the current brand.

A brand at level 5 shows no button. The button for a move the rules refuse is greyed out and says why on a tap.

npm run brands:check (scripts/brands-check.ts) fits every dealer and boss car with every staged part at Stage 5 plus the weight stages, puts one brand on every staged part at level 5, and runs the best run at each distance per brand. It prints the table and exits 1 when a brand is fastest nowhere. The result after the traction control tuning of 2026-11-08 (seconds, stock tune):

Car Class Distance No brand Hookline Overrev Bareframe Fullhouse Fastest
Hatch C1 1 1/8 7.259 7.161 7.175 7.161 7.130 Fullhouse
Hatch C1 1 1/4 10.829 10.723 10.643 10.564 10.601 Bareframe
Hatch C1 1 1/2 17.224 17.118 16.500 16.959 16.724 Overrev
Hatch Y2 1 1/8 7.092 6.953 7.058 7.092 7.002 Hookline
Hatch Y2 1 1/4 10.354 10.200 10.178 10.317 10.164 Fullhouse
Hatch Y2 1 1/2 16.652 16.499 15.904 16.615 16.191 Overrev
Coupe B3 2 1/8 5.629 5.502 5.524 5.482 5.473 Fullhouse
Coupe B3 2 1/4 8.566 8.432 8.349 8.319 8.314 Fullhouse
Coupe B3 2 1/2 14.111 13.978 13.391 13.864 13.620 Overrev
Drag D4 2 1/8 5.550 5.420 5.454 5.418 5.394 Fullhouse
Drag D4 2 1/4 8.405 8.267 8.221 8.113 8.165 Bareframe
Drag D4 2 1/2 13.420 13.282 12.837 13.123 12.971 Overrev
Sedan S5 1 1/8 7.289 7.171 7.219 7.211 7.175 Hookline
Sedan S5 1 1/4 10.799 10.670 10.615 10.609 10.580 Fullhouse
Sedan S5 1 1/2 17.371 17.241 16.591 17.180 16.869 Overrev
Muscle M6 2 1/8 5.951 5.821 5.839 5.791 5.784 Fullhouse
Muscle M6 2 1/4 9.063 8.926 8.844 8.784 8.797 Bareframe
Muscle M6 2 1/2 14.873 14.736 14.131 14.594 14.356 Overrev
Super R7 3 1/8 4.995 4.901 4.971 4.999 4.929 Hookline
Super R7 3 1/4 7.280 7.175 7.211 7.231 7.168 Fullhouse
Super R7 3 1/2 11.303 11.197 10.963 11.252 11.055 Overrev
GT NX 3 1/8 5.397 5.301 5.362 5.393 5.323 Hookline
GT NX 3 1/4 7.926 7.819 7.837 7.863 7.797 Fullhouse
GT NX 3 1/2 12.531 12.424 12.111 12.468 12.242 Overrev
Hyper R8 4 1/8 4.464 4.390 4.423 4.435 4.400 Hookline
Hyper R8 4 1/4 6.616 6.533 6.526 6.509 6.506 Fullhouse
Hyper R8 4 1/2 10.425 10.342 10.078 10.317 10.186 Overrev
GT T9 2 1/8 5.389 5.322 5.288 5.241 5.272 Bareframe
GT T9 2 1/4 8.193 8.123 7.993 7.943 7.989 Bareframe
GT T9 2 1/2 13.457 13.387 12.779 13.206 13.026 Overrev
Hatch DX 2 1/8 5.761 5.704 5.637 5.559 5.625 Bareframe
Hatch DX 2 1/4 8.848 8.788 8.625 8.504 8.619 Bareframe
Hatch DX 2 1/2 14.519 14.459 13.796 14.176 14.046 Overrev
Coupe MK 3 1/8 5.352 5.273 5.298 5.277 5.269 Fullhouse
Coupe MK 3 1/4 8.009 7.923 7.883 7.825 7.865 Bareframe
Coupe MK 3 1/2 12.308 12.219 12.026 12.019 12.049 Bareframe
Super VL 4 1/8 4.982 4.877 4.964 4.992 4.920 Hookline
Super VL 4 1/4 7.197 7.066 7.147 7.173 7.098 Hookline
Super VL 4 1/2 11.038 10.906 10.734 11.012 10.811 Overrev
Hyper GX 4 1/8 4.439 4.362 4.404 4.421 4.377 Hookline
Hyper GX 4 1/4 6.534 6.447 6.454 6.449 6.428 Fullhouse
Hyper GX 4 1/2 10.279 10.192 9.939 10.195 10.045 Overrev

Fastest counts: Overrev 13, Fullhouse 12, Bareframe 9, Hookline 8 (before traction control, with the brand sizes before: Hookline 11, Overrev 11, Fullhouse 11, Bareframe 9; with traction control and those old sizes: Overrev 25, Bareframe 14, Hookline 3, Fullhouse 0). By distance: over the 1/8 mile Hookline wins 7 and Fullhouse 5; over the 1/4 mile Fullhouse 7 and Bareframe 6; over the 1/2 mile Overrev wins 13 of 14.

  • The winner follows the distance most: Hookline and Fullhouse take the short races, Fullhouse and Bareframe the quarter mile, Overrev nearly every half mile (drag area and top end matter most at speed).
  • Traction control (see the race sim) means a full Stage 5 build no longer spins through its gears, so a brand is worth what its lever gives: grip lets more drive through while the car is traction limited, the other levers pay once it is not.
  • A brand makes a car slower than no brand in 3 of the 168 brand, car and distance cases, all Bareframe over the 1/8 mile (Hatch Y2, Super R7, Super VL, up to 0.014 s; before traction control 50 cases, up to 0.85 s). That one is physics: a traction-limited car accelerates at grip times g minus drag over mass, so a lighter car loses more to drag per kg. On a build with power parts and no grip parts it shows over the quarter mile too (Bareframe on the turbo of a Muscle M6), and the shop’s brand dialog warns about it.