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.17, idle torque share +0.2
Overrev top end Pulls hard to a higher redline. rev range +11%, drag area -14%
Bareframe light Less car to push. mass -12.8%
Fullhouse all-round A little of everything, on every part. grip +0.05, idle torque +0.045, rev range +5%, drag area -7%, mass -4%

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. Retuned again for the real parts (2026-11-10, docs/2026-11-10-real-parts-and-cash-design.md): drag tyres and the limited-slip differential cover most of the grip and the cars got their real, heavier masses, so Hookline grew and Bareframe 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 and the limiter by that share (engineShape) and adds the same share to the peak power, 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 in buildCarStats, added to what the weight parts take off.

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 same for every staged part: one over the parts of a full build (FULL_BUILD_PARTS, one boost kind), so the shares of a full build add up to 1. Single parts (nitrous, bottles, weight parts) take no brand. Swapping the turbo for the supercharger, or back, moves the brand to the new part (player/installPart.ts).
  • 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 the class’s share of every upgrade (CLASS_FACTOR in sim/specs.ts), 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, bottles and weight parts 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 parts, puts one brand on every staged part at level 5, and runs the best run at each distance per brand. It prints the table per car and exits 1 when a brand is fastest nowhere.

Fastest counts after the real parts and the class bands (2026-11-10): Overrev 13, Hookline 11, Bareframe 9, Fullhouse 9 (with the real parts and the brand sizes before: Bareframe 30, Overrev 5, Fullhouse 5, Hookline 2). Before the real parts, after traction control: Overrev 13, Fullhouse 12, Bareframe 9, Hookline 8.

What the table said (before the real parts)

Section titled “What the table said (before the real parts)”
  • 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 (Brennwerk Funke, Brennwerk Falke, Halden Vesper, 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 Ironside Haymaker), and the shop’s brand dialog warns about it.