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.
The four brands
Section titled “The four brands”| 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.
The levers
Section titled “The levers”Each field of BrandEffect lands somewhere in the drag model:
gripadds toCarStats.parts.grip, the tyre friction multiplier the drag tyres also raise.lowEndadds 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.revRangestretches 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, andbestShiftRpmsshifts 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.aerotakes a share off the body’s drag area inbuildPhysicsCar.masstakes a share off the whole car (engine and frame) inbuildCarStats. 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.
Share and level
Section titled “Share and level”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] * classFactorbrandShareis the part’supHP + 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_SHAREis 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.classFactoris 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.
Tokens and levels
Section titled “Tokens and levels”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.
Where tokens come from
Section titled “Where tokens come from”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.
The shop’s brand slot
Section titled “The shop’s brand slot”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.
The check
Section titled “The check”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.
What the table says
Section titled “What the table says”- 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.