The umpire reads a list, and the bibs come out to meet it

The late game is repetitive because the optimal move never changes: kill the
nearest thing, now. This is the first swing at a mode where it does — a
coaching drill where the umpire CALLS a colour sequence aloud while bibbed
bodies take their marks, and you must put them down in that order while they
walk at you. Uncalled colours are decoys you have to ignore. Two faults is a
double fault and the round is theirs.

Back room only (DRILL TEST, or #drill): this is a feel-test for one question —
tense, or just noisy? — so it keeps its own round count and touches neither
tennis scoring nor the run.

- voiceSeq: voice() drops a line that would start while the umpire is still
  talking, which is fatal for a list. Decode first, queue at accumulated
  offsets, and the anti-overlap rule is satisfied instead of fought.
- Four colours with PIPS as well as hue — red/green alone makes the mode
  unplayable for ~8% of men.
- drawBib is a ponytail-marked overlay that knowingly breaks the sprite rule;
  it is the thing to delete if the mode survives.
- BOTH target pickers snap (flickTarget and zombieTarget). Snapping only the
  slingshot left fifteen tap-serves in a row scoring nothing.
- Contact costs the point, not the run — permadeath stays in the gore mode.
- startDrill disarms the ordinary schedule; updateDrill redeals and logs an
  INVARIANT if anything empties its court.

Eight new tests (24 total) pin the ownership contract both ways, the call
beat, the win, the double fault, the un-winnable-round guard and the death.
PROJECT.md carries the four open questions for the playtest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-11 18:01:33 +02:00
1 parent c659b6882f
commit 22df96cc1d
17 files changed
+556 -19

No files matched your search

+18
View File
@@ -345,6 +345,24 @@ 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.
drillBodies: 4, // bibs on court. Capped by DRILL_COLS — four hues is what reads at phone scale
drillSeq: 3, // colours CALLED in round one; the rest of the 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 should keep getting harder
// is the GEOMETRY — 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
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
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