Tune AI bot behavior without riding. Runs the server's race-preview engine and plays the
result back at 1×–50× with scrub. Set a seat to 🧍 Player to stand in for a real person
— the bots target and race that bike (the whole point is a fun race for the human).
Checking access…
Setup
Each bike has two seats; two riders on one bike ride as a tandem — their watts add.
Each seat is a 🤖 Bot, the 🧍 Player (the human stand-in the bots race),
or a 🪞 Mirror (a teammate that echoes its partner on the same bike).
wattageW — per-rider base watts (the rider's ability).
Every knob below is a 0–1 amplitude expressed as a fraction of W, so the same
knob means a bigger swing on a stronger rider.
variabilityv — a slow sine wander, watts = W·(1 ± v)
over a ~22 s cycle. 0.0 → dead steady; 0.2 → ±20% of W;
1.0 → swings between 0 and 2·W.
surges — repeating bursts of up to +s·W for
~9 s out of every ~45 s, then back to base. 0.0 → no surges;
0.5 → bursts to +50% of W; 1.0 → bursts to +100% (double).
finishKickk — a ramp over the final lap only,
from +0 at the bell to +k·W at the line. 0.0 → no kick;
0.5 → +50% of W by the finish; 1.0 → +100% (a doubling
sprint).
chasec — rubber-bands toward the target bike: adds up to
+1.2·c·W when behind or being dropped (covering its attacks), and eases down to
−0.7·c·W when ahead. 0.0 → ignores rivals; 1.0 → max
stickiness. (bot seats only)
attacka — opportunistic bursts of up to +a·W,
but only while sitting on a target that isn't escaping (you pounce when it
coasts). 0.0 → never attacks; 1.0 → full-power pounces.
(bot seats only)
chase & attack only act when there's a Player bike to target (the nearest one);
Player and Mirror seats don't use them.
📐 Exact formulas:
server/bot-behavior.js
(the pure bot brain — open it in your editor to read/tweak the response curves).