From 509c46c15bc5a8d54a48e7f3ee7009d18a4c3231 Mon Sep 17 00:00:00 2001 From: Khiet Le Date: Sun, 8 Nov 2026 16:49:28 +0000 Subject: [PATCH 1/2] docs: choose rain that changes grip on a lap the seed picks Compare visual rain, grip only and a wet tyre in a mockup with a bot trial, and record grip only in ADR 0103. The build waits for the tyre tune's playtest. Closes #332 --- ...in-changes-grip-on-a-lap-the-seed-picks.md | 101 ++++ docs/mockups/rain-on-a-seeded-lap.html | 505 ++++++++++++++++++ tools/repo-checks/test/adr.test.ts | 1 + 3 files changed, 607 insertions(+) create mode 100644 docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md create mode 100644 docs/mockups/rain-on-a-seeded-lap.html diff --git a/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md b/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md new file mode 100644 index 0000000..7ce634d --- /dev/null +++ b/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md @@ -0,0 +1,101 @@ +# ADR 0103: Rain changes grip on a lap the seed picks + +## Status + +Accepted (2026-11-08), a design with nothing built. The comparison and its +evidence are in `docs/mockups/rain-on-a-seeded-lap.html`. Extends ADR 0083's +picks, ADR 0082's rolls from the seed and ADR 0098's presentation zones. The +build waits for the playtest ADR 0085 and ADR 0095 are pending, since rain sits +on top of that tyre tune. + +## Context + +Nothing changes during a race. Card X6 of +`docs/mockups/course-excitement.html` asks for rain on a lap the seed picks; pi +objected that it tangles grip with tyre life and risks unreadable failures in +an eight-kart pack. Three versions were compared: visual rain only, grip only, +and grip with a wet tyre fitted in the pit lane. + +A throwaway trial of about 400 bot races scaled the grip factors mid-race, with +bots, wear and the pit call unchanged. It compared levels and is too small to +tune from: + +- Grip alone sends karts to the pit lane. Over five laps on courses with a lane, + Ace bots made 1.26 stops a kart after the rain's lap in the dry control and + 1.56 at the mild level below. +- A wet tyre would rarely be a choice. Packs already stop 1.2 times a kart over + three laps in the dry, so most karts would collect one at a stop they were + making anyway. The mild level costs about 2.9 s a lap on new tyres against a + stop's 8 s, so two wet laps do not repay an extra stop. It would also do + nothing on the oval, which has no lane, or on Tyres Off, which has no stops. +- Heavier grip loss overruns the end cap. Over five laps, karts past it were 39 + of 512 dry, 59 at the mild level and 104 at a heavy level (steering and + acceleration x 0.80, braking x 0.65, wash-out + 0.10 rad). + +## Decision + +- **Grip only.** There is no wet tyre. A stop still restores life and nothing + else (ADR 0082). +- **Weather is a pick**, Dry or Rain, chosen by the creator with the other picks + (ADR 0083). It starts on Dry until it has been played. A kept room or replay + with no pick is Dry and hashes as it does today. +- **The seed picks the lap**, from a hash that draws nothing from the sim's + random stream: from lap 2 to the lap before the last, or lap 2 or 3 of a + Sprint, which would otherwise have one lap to choose from. +- **The whole field gets wet together.** The rain begins on the first tick any + kart starts the picked lap. Wetness climbs from 0 to 1 over 20 s and holds to + the flag; it never dries. The sim's state holds the tick it began, and the + snapshot carries that to the prediction. A snapshot's 100 ms on the ramp is + 0.5% of the wet, too little to feel. +- **Wetness scales one row of factors** on top of the tyre tables, in + `crates/sim/src/tuning.rs` (ADR 0014), as a starting tune: + + | Effect, fully wet | Factor | + | --- | --- | + | Steering rate | x 0.92 | + | Acceleration | x 0.92 | + | Braking | x 0.80 | + | Wash-out, added at any life | + 0.05 rad | + + The top speed cap, wear rates and mini-turbo charge do not change, so the speed + readout and the tyre gauge keep meaning what they mean. +- **Bots keep today's rules.** Their steering shares the rate, so they slow for + it, and the wear they read decides their pit call. Their table of lap costs + stays dry. +- **The look is shared by every screen:** + - Clouds gather over the leader's last quarter of the lap before, changing + only the look. + - The sky greys through the View's light scale, with no lightning or flashes. + - The asphalt darkens with a soft sheen; kerbs, white lines and boost pads keep + their colours. + - Spray is a low, pale plume at each kart's rear wheels, no higher than their + tops and about two kart lengths long, so wings, helmets and liveries stay + visible through a pack. Item boxes, the runaway wheel, drones and worn-tyre + smoke stay readable. + - Streaks stop under roofs through presentation zones, and a viewer who asks + for less motion gets fewer. Grip stays wet under a roof, since the sim never + reads a zone. + - A RAIN plate shows as it arrives, and a rain bed plays under the SFX toggle, + levelled by wetness and never pitched. + +## Consequences + +- Rain works on every course and with Tyres Off, though the oval barely feels it: + under 1 s a lap on new tyres in the trial. +- Pi's objection is partly answered. One row of factors is simpler than a second + tyre, and spray has a budget, but worn tyres in the wet still stack, up to + 0.20 rad of wash-out at 0% life, under the drift's 0.30. Whether that reads as + rain or as a broken kart on a keyboard is for a playtest. +- Five-lap races overrun the end cap more often, 59 karts of 512 against 39 in + the trial. The build's sweep decides whether the row or `RACE_END_CAP_S` gives. +- The trial did not count missed pit lane forks, though a slide of 0.15 rad or + more has carried bots past one (ADR 0087) and worn wet tyres reach it. It also + did not race Tyres Off packs or the 20 s ramp. The build's sweep covers all + three. +- An Ace bot underrates a stop in the wet, since its lap costs are dry. +- Dry races and existing replay fixtures hash as before; a new fixture covers + rain. The pick bumps the protocol version and regenerates the types. +- The glossary and `docs/style-guide.html` gain their entries with the build, when + there is something drawn to describe. +- Build issues follow this record: the sim and the pick; the look; then the + playtest and retune, before Rain can become a default. diff --git a/docs/mockups/rain-on-a-seeded-lap.html b/docs/mockups/rain-on-a-seeded-lap.html new file mode 100644 index 0000000..df7ef9d --- /dev/null +++ b/docs/mockups/rain-on-a-seeded-lap.html @@ -0,0 +1,505 @@ +Rain on a Seeded Lap + + + + + +
+
+
Issue 332 / card X6 / design only
+

Rain on a seeded lap

+

Three versions of rain, measured with bots where a version touches the sim. Decided: grip only, at the mild level (ADR 0103). It changes the race on every course and pick, and the pit lane already responds to it without a second tyre.

+
+ +
+

Findings

+
+

Rain already sends karts to the pit lane

+

Grip alone raises the stops made after the rain arrives. Over five laps, Ace bots go from stops a kart after rain in the dry control to at the mild level. Nothing about the pit call changed: the same wear costs more laps of slower driving.

+
+
+

A wet tyre would rarely be a choice

+

Packs already stop times a kart over three laps in the dry on courses with a lane. Most karts would collect a wet tyre at a stop they were making anyway. The mild level costs about 2.9 s a lap on new tyres and a stop about 8 s (ADR 0081), so two wet laps do not repay an extra stop.

+
+
+

Heavy grip loss overruns the end cap

+

Over five laps, karts that miss the end cap go from of 512 in the dry control to at mild and at heavy. Bots stay on the road at both levels: no cell put more than 2 of 64 karts on grass.

+
+
+ +
+

The three versions

+
+ + + + + + + + + + + + +
A. Visual rain onlyB. Grip only (chosen)C. Grip and a wet tyre
What changesSky, road, spray and sound. The race runs as it does dry.The same look, plus less steering, traction and braking and a slide on any tyres.As B on slicks. A stop after the rain fits wets, which give back dry grip.
Decision for a driverNone.Drive to the new limit; when to stop, since worn tyres now cost more.As B, plus whether to stop early for wets.
Sim and replaysUntouched.One race-wide wetness in step. Dry races hash as before; a new fixture covers rain.As B, plus a tyre kind per kart in the state and the snapshot.
BotsNothing.Same rules; their steering shares the rate, so they slow for it. The sweep is the gate.A new call for when to take wets, at each level.
Oval, no laneWorks.Works, and costs little: under 1 s a lap on new tyres.No wet tyre to fit.
Tyres OffWorks.Works by the same factors. Not raced in the trial.No stops, so no wet tyre.
Instrument panelA RAIN plate at most.A RAIN plate. The tyre gauge is unchanged.The gauge must also show the tyre kind.
Pi's objectionAnswered: no grip to tangle.Partly answered: one extra row of factors, and spray has a budget. Worn tyres in the wet still need a feel test.Stands: two tyre systems meet in one failure.
Rough costSmall to medium, client only.Medium: the sim, a pick, the client and a sweep.Large.
+

Dropping rain stays open. The case for it is pi's: fixed atmosphere is cheaper, and ADRs 0085 and 0095 are still recorded as pending the maintainer's playtest. Whichever version is chosen, the build should wait for that playtest, since B and C both sit on top of the tyre tune.

+
+ +
+

How it reads in a pack

+

The sky, road and streaks are the same in all three versions. The open question is spray: enough to say the road is wet, without hiding karts, item boxes or hazards. Drag the wetness and compare the spray levels.

+
+ +
+ +
SPRAY +
+ + + +
+
+
+
A hand-drawn sketch, not the game's renderer. The orange kart trails the worn-tyre smoke of ADR 0080, which spray must not be mistaken for; the dark disc on the left is the runaway wheel. The real check is a staged eight-kart race in the build.
+
+

Proposed rules for the look

+
    +
  • Spray budget: a low plume at each kart's rear wheels, no higher than the top of the wheels and about two kart lengths long. Rear wings, helmets and liveries stay visible through a pack.
  • +
  • Always on top: item boxes, the runaway wheel, drones and worn-tyre smoke stay readable. Spray is pale and low, smoke dark and rising.
  • +
  • Road: darker asphalt and a soft sheen under each kart. Kerbs, white lines and boost pads keep their colours.
  • +
  • Sky: grey with the sun's light scaled down, using the View's existing light scale (ADR 0098). No lightning or flashes.
  • +
  • Roofs: streaks stop under Monarch's tunnel and Goldstone's hangar through presentation zones. Grip stays wet there, since the sim never reads a zone.
  • +
  • Less motion: a viewer who asks for less motion gets fewer streaks, as the fireworks do.
  • +
  • Sound: a rain bed under the SFX toggle, levelled by wetness and never pitched.
  • +
+
+ +
+

When it arrives

+

The seed picks the lap from a hash, drawing nothing from the sim's random stream, as a stop's roll does (ADR 0082). Rain comes on lap 2 or later, so the field has spread, and up to the lap before the last, except that a Sprint can also take its last lap, since it has only two to choose from.

+
+
+ + + +
+
+

+
+
    +
  • Trigger: the first tick any kart starts the picked lap, so the whole field gets wet together. Every screen sees one sky.
  • +
  • Warning: the clouds gather over the leader's last quarter of the lap before. They only change the look.
  • +
  • Ramp: wetness climbs from 0 to 1 over 20 s, then holds to the flag. It never dries; a second change is a later decision.
  • +
  • Network: the server's state holds the tick the rain began and the snapshot carries it, as the prediction takes other race facts from the snapshot. A snapshot's 100 ms on a 20 s ramp is 0.5% of the wet, too little to feel.
  • +
  • The pick: Weather, Dry or Rain, chosen by the creator with the other picks (ADR 0083). A kept room or replay with no pick is Dry and hashes as it does today. It starts on Dry until it has been played.
  • +
+
+ +
+

The grip

+

Wetness scales one extra row on top of the tyre tables. Top speed is untouched, so the speedo and the gauge keep meaning what they mean today, and the loss shows in the corners. These are trial numbers, a starting tune.

+
+ + + + + + + + +
Effect, fully wetMild (chosen)Heavy
Steering ratex 0.92x 0.80
Accelerationx 0.92x 0.80
Brakingx 0.80x 0.65
Wash-out, added at any life+ 0.05 rad+ 0.10 rad
Top speed cap, wear rates, mini-turbo chargeunchangedunchanged
+

New tyres slide a little in the wet, and worn tyres slide most. At the mild level a kart at 0% life can slide 0.20 rad, under the drift's 0.30. Bots keep today's rules, including the pit call; the Ace's table of lap costs stays dry, so it will underrate a stop in the wet.

+
+ +
+

The trial

+

A throwaway patch multiplied the grip factors by the table above, with no change to bots, wear or the pit call. Packs were eight bots on Tyres On, 8 seeds a cell, with rain on lap 2 of 3 or lap 3 of 5, at full strength with no ramp. The lone laps held an Ace bot at a set life with the wet on from the start, over 4 seeds. It is about 400 races, enough to compare the levels and too few to tune: Bell Deer's mild lap coming out faster than dry is noise, or the slower steering smoothing the bot's line as ADR 0087 saw.

+

Pack: winner's time against the dry control, and karts past the end cap

+
+
+ Stops a kart after the rain arrives, by cell +
+
+

Lone Ace bot: seconds a lap against dry at the same life

+
+

What the trial did not measure

+
    +
  • Whether bots miss the pit lane fork. A slide of 0.15 rad or more has carried them past it before (ADR 0087), and worn wet tyres now reach that. The build's sweep must count missed lanes.
  • +
  • Tyres Off packs, the 20 s ramp, and any kart on wets: version C's numbers are arithmetic, not races.
  • +
  • How it feels on a keyboard, where steering is all or nothing. Only a playtest answers that.
  • +
+
+ +
+

Build issues to file after the merge

+
    +
  1. Sim and pick: the Weather pick, the seeded lap, wetness in step and the snapshot, the factors in tuning.rs, a replay fixture, and a bot sweep that counts missed lanes.
  2. +
  3. The look: sky, road, streaks, spray budget, RAIN plate and rain bed, with their docs/style-guide.html entries and a staged eight-kart check.
  4. +
  5. Tune: a playtest on keyboard and gamepad, then a retune recorded in its own ADR, before Rain can become a default.
  6. +
+
+
+ + diff --git a/tools/repo-checks/test/adr.test.ts b/tools/repo-checks/test/adr.test.ts index 2a09cd9..e968697 100644 --- a/tools/repo-checks/test/adr.test.ts +++ b/tools/repo-checks/test/adr.test.ts @@ -107,6 +107,7 @@ const DECISION_SLUGS = [ "the-final-lap-lifts-the-course-for-the-own-kart", "a-ramp-is-a-slope-across-part-of-the-road", "a-hop-on-the-lip-is-a-trick", + "rain-changes-grip-on-a-lap-the-seed-picks", ]; const expectedFiles = DECISION_SLUGS.map( From 017bee02a11b7410d224b05165a4c8698e904e0e Mon Sep 17 00:00:00 2001 From: Khiet Le Date: Sun, 8 Nov 2026 16:54:13 +0000 Subject: [PATCH 2/2] fix: correct rain's wash-out, stop arithmetic and names in ADR 0103 Wet wash-out peaks near 5% life and falls at 0%, so cap it where a hop's airtime still lets it go. An extra stop for wets is closer than recorded. Use the laps pick's own names, and list what the trial did not race. Refs #332 --- ...in-changes-grip-on-a-lap-the-seed-picks.md | 52 +++++++++++-------- docs/mockups/rain-on-a-seeded-lap.html | 42 +++++++-------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md b/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md index 7ce634d..d6f2766 100644 --- a/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md +++ b/docs/adr/0103-rain-changes-grip-on-a-lap-the-seed-picks.md @@ -25,9 +25,11 @@ tune from: 1.56 at the mild level below. - A wet tyre would rarely be a choice. Packs already stop 1.2 times a kart over three laps in the dry, so most karts would collect one at a stop they were - making anyway. The mild level costs about 2.9 s a lap on new tyres against a - stop's 8 s, so two wet laps do not repay an extra stop. It would also do - nothing on the oval, which has no lane, or on Tyres Off, which has no stops. + making anyway. An extra stop is a closer call: the mild level costs about 2.9 + s a lap on new tyres, a noisy mean of -1.4 to +5.4 s across the courses, against + a stop's 8 s, so two wet laps barely repay it and four repay about 11.6 s before + traffic. It would also do nothing on the oval, which has no lane, or on Tyres + Off, which has no stops, and it would need a second tyre state and a bot call. - Heavier grip loss overruns the end cap. Over five laps, karts past it were 39 of 512 dry, 59 at the mild level and 104 at a heavy level (steering and acceleration x 0.80, braking x 0.65, wash-out + 0.10 rad). @@ -37,16 +39,16 @@ tune from: - **Grip only.** There is no wet tyre. A stop still restores life and nothing else (ADR 0082). - **Weather is a pick**, Dry or Rain, chosen by the creator with the other picks - (ADR 0083). It starts on Dry until it has been played. A kept room or replay + (ADR 0083), carried with them as one value (ADR 0091). It starts on Dry until it has been played. A kept room or replay with no pick is Dry and hashes as it does today. - **The seed picks the lap**, from a hash that draws nothing from the sim's random stream: from lap 2 to the lap before the last, or lap 2 or 3 of a - Sprint, which would otherwise have one lap to choose from. + 3-lap race, which would otherwise have one lap to choose from. - **The whole field gets wet together.** The rain begins on the first tick any kart starts the picked lap. Wetness climbs from 0 to 1 over 20 s and holds to the flag; it never dries. The sim's state holds the tick it began, and the - snapshot carries that to the prediction. A snapshot's 100 ms on the ramp is - 0.5% of the wet, too little to feel. + snapshot carries that to the prediction. Learning it a tenth of a second late + is 0.5% of the wet, too little to feel. - **Wetness scales one row of factors** on top of the tyre tables, in `crates/sim/src/tuning.rs` (ADR 0014), as a starting tune: @@ -55,14 +57,15 @@ tune from: | Steering rate | x 0.92 | | Acceleration | x 0.92 | | Braking | x 0.80 | - | Wash-out, added at any life | + 0.05 rad | + | Wash-out, added at any life | + 0.05 rad, to at most 0.18 rad | - The top speed cap, wear rates and mini-turbo charge do not change, so the speed - readout and the tyre gauge keep meaning what they mean. + The 0.18 rad is the most a hop's airtime lets go, an invariant of ADR 0087 the + tuning asserts. The top speed cap, wear rates and mini-turbo charge do not + change, so the speed readout and the tyre gauge keep meaning what they mean. - **Bots keep today's rules.** Their steering shares the rate, so they slow for it, and the wear they read decides their pit call. Their table of lap costs stays dry. -- **The look is shared by every screen:** +- **The look follows the wetness, so every screen gets the same rain:** - Clouds gather over the leader's last quarter of the lap before, changing only the look. - The sky greys through the View's light scale, with no lightning or flashes. @@ -72,9 +75,9 @@ tune from: tops and about two kart lengths long, so wings, helmets and liveries stay visible through a pack. Item boxes, the runaway wheel, drones and worn-tyre smoke stay readable. - - Streaks stop under roofs through presentation zones, and a viewer who asks - for less motion gets fewer. Grip stays wet under a roof, since the sim never - reads a zone. + - Streaks stop under roofs through presentation zones, which follow the own + kart (ADR 0098), and a viewer who asks for less motion gets fewer. Grip stays + wet under a roof, since the sim never reads a zone. - A RAIN plate shows as it arrives, and a rain bed plays under the SFX toggle, levelled by wetness and never pitched. @@ -83,15 +86,22 @@ tune from: - Rain works on every course and with Tyres Off, though the oval barely feels it: under 1 s a lap on new tyres in the trial. - Pi's objection is partly answered. One row of factors is simpler than a second - tyre, and spray has a budget, but worn tyres in the wet still stack, up to - 0.20 rad of wash-out at 0% life, under the drift's 0.30. Whether that reads as - rain or as a broken kart on a keyboard is for a playtest. + tyre, and spray has a budget, but worn tyres in the wet still stack. Flat out on + full lock a kart slides 0.05 rad on new tyres and 0.15 at the cliff, and the 0.18 + cap holds near 5% life, under the drift's 0.30. At 0% it slides less than in the + dry, about 0.06 against 0.10, since the slower steering loads the tyres less. + Whether this reads as rain or as a broken kart on a keyboard is for a playtest. +- The spray budget comes from a hand-drawn sketch. A staged eight-kart race in the + build checks it, and the budget gives if a pack does not read. - Five-lap races overrun the end cap more often, 59 karts of 512 against 39 in - the trial. The build's sweep decides whether the row or `RACE_END_CAP_S` gives. + the trial. The build's sweep reports it, and the maintainer decides whether the + row or `RACE_END_CAP_S` gives, as ADR 0085 left a wider cap to them. - The trial did not count missed pit lane forks, though a slide of 0.15 rad or - more has carried bots past one (ADR 0087) and worn wet tyres reach it. It also - did not race Tyres Off packs or the 20 s ramp. The build's sweep covers all - three. + more has carried bots past one (ADR 0087) and worn wet tyres reach it. It raced + only lap 2 of 3 and lap 3 of 5, at full strength at once, so not the ramp, the + other seeded laps or Tyres Off packs. The build's sweep covers all of these. +- Rain on lap 3 of 3 is a last-lap scramble where a stop cannot pay. On the oval, + whose laps take about 14 s, that race ends before the 20 s ramp does. - An Ace bot underrates a stop in the wet, since its lap costs are dry. - Dry races and existing replay fixtures hash as before; a new fixture covers rain. The pick bumps the protocol version and regenerates the types. diff --git a/docs/mockups/rain-on-a-seeded-lap.html b/docs/mockups/rain-on-a-seeded-lap.html index df7ef9d..77e05a5 100644 --- a/docs/mockups/rain-on-a-seeded-lap.html +++ b/docs/mockups/rain-on-a-seeded-lap.html @@ -102,7 +102,7 @@

Rain already sends karts to the pit lane

A wet tyre would rarely be a choice

-

Packs already stop times a kart over three laps in the dry on courses with a lane. Most karts would collect a wet tyre at a stop they were making anyway. The mild level costs about 2.9 s a lap on new tyres and a stop about 8 s (ADR 0081), so two wet laps do not repay an extra stop.

+

Packs already stop times a kart over three laps in the dry on courses with a lane. Most karts would collect a wet tyre at a stop they were making anyway. An extra stop is a closer call: the mild level costs about 2.9 s a lap on new tyres, a noisy mean of -1.4 to +5.4 s across the courses, and a stop about 8 s (ADR 0081), so two wet laps barely repay it and four repay about 11.6 s before traffic.

Heavy grip loss overruns the end cap

@@ -126,12 +126,12 @@

The three versions

Rough costSmall to medium, client only.Medium: the sim, a pick, the client and a sweep.Large.
-

Dropping rain stays open. The case for it is pi's: fixed atmosphere is cheaper, and ADRs 0085 and 0095 are still recorded as pending the maintainer's playtest. Whichever version is chosen, the build should wait for that playtest, since B and C both sit on top of the tyre tune.

+

Dropping rain was the other outcome. The case for it is pi's: fixed atmosphere is cheaper, and ADRs 0085 and 0095 are still recorded as pending the maintainer's playtest. The build waits for that playtest, since B sits on top of the tyre tune.

How it reads in a pack

-

The sky, road and streaks are the same in all three versions. The open question is spray: enough to say the road is wet, without hiding karts, item boxes or hazards. Drag the wetness and compare the spray levels.

+

The sky, road and streaks are the same in all three versions. The risk is spray: enough to say the road is wet, without hiding karts, item boxes or hazards. Drag the wetness and compare the spray levels.

@@ -146,13 +146,13 @@

How it reads in a pack

A hand-drawn sketch, not the game's renderer. The orange kart trails the worn-tyre smoke of ADR 0080, which spray must not be mistaken for; the dark disc on the left is the runaway wheel. The real check is a staged eight-kart race in the build.
-

Proposed rules for the look

+

Rules for the look

  • Spray budget: a low plume at each kart's rear wheels, no higher than the top of the wheels and about two kart lengths long. Rear wings, helmets and liveries stay visible through a pack.
  • Always on top: item boxes, the runaway wheel, drones and worn-tyre smoke stay readable. Spray is pale and low, smoke dark and rising.
  • Road: darker asphalt and a soft sheen under each kart. Kerbs, white lines and boost pads keep their colours.
  • Sky: grey with the sun's light scaled down, using the View's existing light scale (ADR 0098). No lightning or flashes.
  • -
  • Roofs: streaks stop under Monarch's tunnel and Goldstone's hangar through presentation zones. Grip stays wet there, since the sim never reads a zone.
  • +
  • Roofs: streaks stop under Monarch's tunnel, Goldstone's hangar and Bell Deer's bridge through presentation zones, which follow the own kart. Grip stays wet there, since the sim never reads a zone.
  • Less motion: a viewer who asks for less motion gets fewer streaks, as the fireworks do.
  • Sound: a rain bed under the SFX toggle, levelled by wetness and never pitched.
@@ -160,11 +160,11 @@

Proposed rules for the look

When it arrives

-

The seed picks the lap from a hash, drawing nothing from the sim's random stream, as a stop's roll does (ADR 0082). Rain comes on lap 2 or later, so the field has spread, and up to the lap before the last, except that a Sprint can also take its last lap, since it has only two to choose from.

+

The seed picks the lap from a hash, drawing nothing from the sim's random stream, as a stop's roll does (ADR 0082). Rain comes on lap 2 or later, so the field has spread, and up to the lap before the last, except that a 3-lap race can also take its last lap, since it would otherwise have one to choose from. There a stop cannot pay, and on the oval the race ends before the ramp does.

- - + +
@@ -174,8 +174,8 @@

When it arrives

  • Trigger: the first tick any kart starts the picked lap, so the whole field gets wet together. Every screen sees one sky.
  • Warning: the clouds gather over the leader's last quarter of the lap before. They only change the look.
  • Ramp: wetness climbs from 0 to 1 over 20 s, then holds to the flag. It never dries; a second change is a later decision.
  • -
  • Network: the server's state holds the tick the rain began and the snapshot carries it, as the prediction takes other race facts from the snapshot. A snapshot's 100 ms on a 20 s ramp is 0.5% of the wet, too little to feel.
  • -
  • The pick: Weather, Dry or Rain, chosen by the creator with the other picks (ADR 0083). A kept room or replay with no pick is Dry and hashes as it does today. It starts on Dry until it has been played.
  • +
  • Network: the server's state holds the tick the rain began and the snapshot carries it, as the prediction takes other race facts from the snapshot. Learning it a tenth of a second late on a 20 s ramp is 0.5% of the wet, too little to feel.
  • +
  • The pick: Weather, Dry or Rain, chosen by the creator with the other picks (ADR 0083), carried with them as one value (ADR 0091). A kept room or replay with no pick is Dry and hashes as it does today. It starts on Dry until it has been played.
  • @@ -188,11 +188,11 @@

    The grip

    Steering ratex 0.92x 0.80 Accelerationx 0.92x 0.80 Brakingx 0.80x 0.65 - Wash-out, added at any life+ 0.05 rad+ 0.10 rad + Wash-out, added at any life+ 0.05 rad, to 0.18 at most+ 0.10 rad Top speed cap, wear rates, mini-turbo chargeunchangedunchanged -

    New tyres slide a little in the wet, and worn tyres slide most. At the mild level a kart at 0% life can slide 0.20 rad, under the drift's 0.30. Bots keep today's rules, including the pit call; the Ace's table of lap costs stays dry, so it will underrate a stop in the wet.

    +

    Flat out on full lock at the mild level, a kart slides 0.05 rad on new tyres and 0.15 at the cliff, and reaches the 0.18 cap near 5% life. That cap is the most a hop's airtime lets go (ADR 0087), under the drift's 0.30. At 0% it slides less than in the dry, about 0.06 against 0.10, since the slower steering loads the tyres less. Bots keep today's rules, including the pit call; the Ace's table of lap costs stays dry, so it will underrate a stop in the wet.

    @@ -209,7 +209,7 @@

    Lone Ace bot: seconds a lap against dry at the same life

    What the trial did not measure

    • Whether bots miss the pit lane fork. A slide of 0.15 rad or more has carried them past it before (ADR 0087), and worn wet tyres now reach that. The build's sweep must count missed lanes.
    • -
    • Tyres Off packs, the 20 s ramp, and any kart on wets: version C's numbers are arithmetic, not races.
    • +
    • Tyres Off packs, the 20 s ramp, rain on the other seeded laps (only lap 2 of 3 and lap 3 of 5 were raced), and any kart on wets: version C's numbers are arithmetic, not races.
    • How it feels on a keyboard, where steering is all or nothing. Only a playtest answers that.
    @@ -289,13 +289,13 @@

    Build issues to file after the merge

    const cell = (course, level, laps, wet) => PACK.find((r) => r.course === course && r.level === level && r.laps === laps && r.wet === wet); const signed = (n) => (n >= 0 ? "+" : "") + n.toFixed(1); const mean = (rows, of) => rows.reduce((sum, r) => sum + of(r), 0) / rows.length; -const lane = (r) => r.course !== "oval"; +const hasPitLane = (r) => r.course !== "oval"; -// Every figure in the findings is computed from the raw rows above, so prose and table cannot disagree. +// The stop and end cap figures in the findings come from the raw rows above, so prose and table cannot disagree on them. const sums = { - ace5stops: mean(PACK.filter((r) => lane(r) && r.level === "Ace" && r.laps === 5 && r.wet === "dry"), (r) => r.after).toFixed(2), - ace5stopsMid: mean(PACK.filter((r) => lane(r) && r.level === "Ace" && r.laps === 5 && r.wet === "mid"), (r) => r.after).toFixed(2), - sprintStops: mean(PACK.filter((r) => lane(r) && r.laps === 3 && r.wet === "dry"), (r) => r.stops).toFixed(1), + ace5stops: mean(PACK.filter((r) => hasPitLane(r) && r.level === "Ace" && r.laps === 5 && r.wet === "dry"), (r) => r.after).toFixed(2), + ace5stopsMid: mean(PACK.filter((r) => hasPitLane(r) && r.level === "Ace" && r.laps === 5 && r.wet === "mid"), (r) => r.after).toFixed(2), + sprintStops: mean(PACK.filter((r) => hasPitLane(r) && r.laps === 3 && r.wet === "dry"), (r) => r.stops).toFixed(1), capDry: PACK.filter((r) => r.laps === 5 && r.wet === "dry").reduce((s, r) => s + r.capped, 0), capMid: PACK.filter((r) => r.laps === 5 && r.wet === "mid").reduce((s, r) => s + r.capped, 0), capHeavy: PACK.filter((r) => r.laps === 5 && r.wet === "heavy").reduce((s, r) => s + r.capped, 0), @@ -345,7 +345,7 @@

    Build issues to file after the merge

    html += `
    LAP ${lap}${words}
    `; } document.getElementById("laps").innerHTML = html; - document.getElementById("seedline").textContent = `Seed ${seed}: rain on lap ${rain} of ${laps}. The lap rule is the proposal; the hash here only stands in for the sim's.`; + document.getElementById("seedline").textContent = `Seed ${seed}: rain on lap ${rain} of ${laps}. The hash here only stands in for the sim's.`; } document.querySelectorAll("#distance [data-v]").forEach((button) => button.addEventListener("click", () => { laps = +button.dataset.v; @@ -415,11 +415,11 @@

    Build issues to file after the merge

    const lift = (i * 37 % 11) / 11; ctx.fillStyle = `rgba(232,238,244,${alpha * wet * (1 - phase * 0.7)})`; ctx.beginPath(); - ctx.arc(x(p, u, side, lift, spread), p.y - u * tall * lift + u * phase * 0.3, u * (0.07 + phase * 0.16 * (spray === 1 ? 1 : 1.6)), 0, 7); + ctx.arc(plumeX(p, u, side, lift, spread), p.y - u * tall * lift + u * phase * 0.3, u * (0.07 + phase * 0.16 * (spray === 1 ? 1 : 1.6)), 0, 7); ctx.fill(); } } -function x(p, u, side, lift, spread) { return p.x + u * side + u * spread * (lift - 0.5); } +function plumeX(p, u, side, lift, spread) { return p.x + u * side + u * spread * (lift - 0.5); } function drawSmoke(k, time) { const p = project(k.depth, k.lane), u = p.s * 150; for (let i = 0; i < 9; i++) {