The rounds stay, the seams go: one continuous stream

Oliver: "daniel announcing is maximum annoying" / "don't let the rush in
position just let them coming from the back in steady speed.. try to space
them not too close" / "when one combination is done just let the new one in..
in a continuous stream that increases in speed and difficulty" / "the rounds
can stay, they should be continuous".

The round survives as the unit. Every seam around it is deleted: no walk-on
to a mark, no announcement beat, no between-rounds pause, no deal. Bodies
walk in from the far baseline forever and a round is drawn from whoever is on
court — finish one and the next is drawn in the same frame, off the same
rolling population. The bodies you were ignoring a second ago are the ones
being called now.

- Daniel is gone from this mode. Each colour has a pitch; a round announces
  itself as a four-note figure in half a second (blip()). drillTones 0 mutes
  it. The recordings stay in assets.
- PLACEMENTS is deleted with the marks — nothing rushes anywhere and nothing
  stops, so there are no shapes to place.
- A DRILL BODY HOLDS ITS LANE. updateZombies homes bodies onto the player's x
  past the net, so they arrived spread and bunched into a knot right in front
  of you; spawn spacing cannot survive that. Their lane is the puzzle here.
- One ramp on TIME SURVIVED drives speed, spawn gap and round length. Speed
  is stamped per body at spawn, so the ramp reads as newcomers outpacing the
  ones already walking, not the court accelerating under you.
- The empty-court watchdog is gone and nothing replaced it: with a stream
  there is no state to be stuck in. One line covers every case.

27 tests, rewritten around the stream.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-11 19:06:48 +02:00
1 parent 435a470ec7
commit 1d49c4343b
9 files changed
+286 -287

No files matched your search

+20 -21
View File
@@ -345,28 +345,27 @@ export const TUNE = {
barrelRoll: 2.6, // m/s it trundles across the far court — fast enough to have to be led
barrelHp: 1, // anything pops it: ball, pellet, bomb, flame, swish. It is a target, not a body
barrelH: 1.15, // drawn height (a body is 1.8)
// ---- THE COACHING DRILL (src/drill.js) — the cognitive mode, currently a feel-test prototype.
// The umpire calls a colour sequence while bibbed bodies take their marks; you put them down in
// that order. Uncalled colours are decoys. Two faults and they take the point.
drillBodiesMin: 3,// bibs on court: a RANGE, drawn per round out of the six-colour palette. Fixed at
drillBodies: 5, // four out of four, every round dealt every colour and only the order changed —
// three quarters of the round was known before the umpire opened his mouth.
// Capped by DRILL_COLS. Above five the court stops reading at phone scale.
drillSeq: 3, // colours CALLED in round one; whatever is left on court is decoys
drillSeqMax: 4, // ...and the ceiling it climbs to (+1 every 3 rounds). Deliberately low: a longer
// list is a memory test and memory tests fatigue. What keeps getting harder is
// the GEOMETRY — the PLACEMENTS table in drill.js, and how badly the called order
// fights the order they reach you in.
drillCallT: 4.2, // s of walk-on while the umpire reads the list. No serving during it
drillWalkOn: 3.4, // m/s they jog out to their marks (a walk-on is brisk; the approach is not)
drillMarkZ: 5.0, // near edge of the band they line up in...
drillMarkSpread: 6.5, // ...and how deep that band runs, so they never arrive as a flat rank
// ---- THE COACHING DRILL (src/drill.js) — the cognitive mode. SECOND DESIGN: a continuous
// stream. Bodies walk in from the far baseline forever; a ROUND is a colour combination drawn from
// whoever is on court, and finishing one draws the next on the spot. No walk-on, no announcement
// beat, no pause between rounds — every seam Oliver found is gone, the round itself stays.
drillMaxOnCourt: 6, // bibs on court at once. Hard-capped by DRILL_COLS (a colour appears once)
drillSeed: 4, // bodies placed at the start so the first round is callable immediately
drillSeedGap: 2.2,// m of depth between those seeded bodies — strung out, not a rank abreast
drillSpawnZ: 0.6, // z they enter at (the far baseline is 0)
drillNearZ: 9.0, // spacing is measured against bodies nearer than this — the ones still bunched
drillSpread: 3.4, // m either side of the centre line the lanes fan across
drillSpeed: 0.95, // m/s they advance once the call is over
drillSpeedPerRound: 0.06, // ...climbing per round survived
drillRush: 1.9, // speed multiplier for drillRushT after a FAULT — the punishment is tempo, and
drillRushT: 1.6, // it has to be felt in the body, not read off a scoreline
drillBeat: 2.0, // s between rounds
drillSeq: 3, // colours in a round at the start of the ramp...
drillSeqMax: 5, // ...and at the top of it
drillSpawnEvery: 3.4, // s between arrivals at the start...
drillSpawnMin: 1.2, // ...and at the top. THE difficulty dial: the court fills faster than you clear
drillSpeed: 0.80, // m/s they walk at the start...
drillSpeedMax: 1.9,// ...and at the top. Stamped per body AT SPAWN, so the ramp shows up as new
// arrivals outpacing the ones already walking, not as the court accelerating
drillRampT: 210, // s to go from the bottom of every curve above to the top. Time survived, not
// rounds won — a round-counted ramp cannot escalate while you stand still
drillCaughtBack: 45, // s of ramp handed back when one reaches you. The setback is real but not a reset
drillTones: 1, // volume of the colour arpeggio (0 = silent). It replaced the spoken call
fps: 60, // frame cap — 30 halves battery/heat but Oliver felt it; smoothness wins (0 = uncapped)
lowPower: 1, // >= 0.5 caps RES at 3 (−44% of pixels painted per frame) — the battery saver,
// flippable live from the T panel. DEFAULT ON since 2026-08-08: Oliver judged