The staff learn your habits, the walk-on waits for your tap, and the club opens a practice court
Four answers to one phone report: - THE READ: repeat a lane and the opponent anticipates it; break the habit and it is wrong-footed for that ball — scaled by rung, so surprise is the weapon that opens the ladder past the HEAD COACH (TUNE block THE READ). - The opponent walk-on is a real modal now (head, punchline, tap to dismiss) in arcade, tournament and training — readable without a clock. - THE TRAINING COURT: third card under ZOMBIE TENNIS, pick any rung, one game at a time, the felled body walks straight back on, nothing banks, bleeding out is a popup instead of a death. mode_train.png rolled in the banner style. - MOVEMENT READS: sprinting feet kick per-court dust and fast bodies leave a two-ghost speed streak (trailMin gates both; feel verdict pending). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a42dc6fc81
commit
43784c5b33
9 files changed
+360
-43
No files matched your search
+26
-1
@@ -599,6 +599,28 @@ export const TUNE = {
|
||||
matchRingSweet: 2.7, // m — contact distance where the rings kiss (the 30-tapped-points benchmark
|
||||
// lands hits tapping at 2.2..3.2 m, so the sweet spot is its centre)
|
||||
matchRingBand: 0.5, // m either side of sweet that draws gold — the plausible window, made visible
|
||||
// ---- THE READ (2026-08-28, Oliver: past the HEAD COACH "the opponents are very fast and barely
|
||||
// make mistakes any more — we need a twist"). The dead staff LEARN YOUR PATTERNS: land the same
|
||||
// lane readHabit times in a row and the opponent has the habit — an EXPECTED ball is anticipated
|
||||
// (its bounce-read climbs toward perfect, so spam feeds the machine), while BREAKING the habit
|
||||
// wrong-foots it for that one ball: the read collapses, the legs slow, the whiff climbs. Both
|
||||
// effects scale with the RUNG ((opp-1)/(LADDER-1)), so the shambler never learns anything and
|
||||
// the champion — "HE RETURNS EVERYTHING" — is exactly the one you beat by setting a habit and
|
||||
// breaking it on the big point. Skill, not grind, is what opens the ladder past the coach.
|
||||
// Rally lanes only (doHit's aimed player shots); serves keep their own game. Solo match only.
|
||||
readHabit: 3, // same-lane returns in a row before the opponent has learned the pattern
|
||||
readAnticipate: 0.97,// what aiRead climbs toward on an EXPECTED ball at the top rung
|
||||
surpRead: 0.85, // fraction of aiRead a wrong-footed opponent loses (x rung scale)
|
||||
surpSlow: 0.45, // fraction of chase speed it loses on the surprise ball (x rung scale)
|
||||
surpFlub: 0.35, // whiff ADDED at contact on the surprise ball at the top rung
|
||||
// ---- MOVEMENT READS (2026-08-28): the sprites run, the court answers. Two cheap effects, both
|
||||
// live-tunable: feet kick the surface's own dust once a body crosses trailMin, and a body moving
|
||||
// that fast leaves a two-ghost speed streak behind it (the modal masthead's own trick, sampled
|
||||
// back along the velocity). Procedural register only — dust and afterimage, never painted into
|
||||
// a sprite, and nothing draws at walking pace: trailMin sits above every shamble.
|
||||
trailMin: 3.6, // m/s of ground speed before a body earns dust + ghosts (0 = both off)
|
||||
trailK: 0.05, // s each ghost trails behind along the velocity (two samples: 1x and 2x)
|
||||
runDustEvery: 0.5, // m of ground covered per dust puff while sprinting
|
||||
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
|
||||
@@ -765,6 +787,9 @@ export const MODES = [
|
||||
{ id: 'classic', name: 'CLASSIC TENNIS', sub: 'REAL TENNIS · BEST OF THREE SETS', art: 'mode_classic' },
|
||||
{ id: 'zombie', name: 'ARCADE', sub: 'ONE GAME PER OPPONENT · BLOOD ONLY', art: 'mode_arcade' },
|
||||
{ id: 'cup', name: 'THE TOURNAMENT', sub: 'FOUR ROUNDS · THE CHAMPION WAITS', art: 'mode_cup' },
|
||||
// TRAINING (2026-08-28): pick any rung, play it one game at a time, nothing is banked. The same
|
||||
// match machinery with the ladder parked — see startMatch's train parameter.
|
||||
{ id: 'train', name: 'TRAINING', sub: 'PICK A BODY · ONE GAME · GO AGAIN', art: 'mode_train' },
|
||||
// ...and gore no longer opens on a game of tennis (see gameplay.startGore), so its blurb stopped
|
||||
// promising one: the match already turned, you just arrived late
|
||||
{ id: 'gore', name: 'SPLATTER GORE', sub: 'NO WARM-UP · SURVIVE THE DEAD CLUB', art: 'mode_gore' },
|
||||
@@ -776,7 +801,7 @@ export const MODES = [
|
||||
// (`mode`) or carries its own card and the MODES ids it fans out to (`kids`).
|
||||
export const MENU = [
|
||||
{ mode: 'classic', diffs: true },
|
||||
{ name: 'ZOMBIE TENNIS', sub: 'THE DEAD CLUB PLAYS YOU', art: 'mode_zombie', kids: ['zombie', 'cup'] },
|
||||
{ name: 'ZOMBIE TENNIS', sub: 'THE DEAD CLUB PLAYS YOU', art: 'mode_zombie', kids: ['zombie', 'cup', 'train'] },
|
||||
{ mode: 'gore' },
|
||||
// NETPLAY (prototype): a poster with no run mode of its own — its second step is HOST / JOIN,
|
||||
// and either chip starts classic tennis against the other phone (beats.startNetVs + src/net.js)
|
||||
|
||||
Reference in new issue
Block a user