The menu grows a second step, classic learns difficulty, and the rally feel unifies
Oliver's restructure: mode first, then what the mode asks — classic deals
EASY / MEDIUM / HARD chips, ZOMBIE TENNIS deals two sub-mode posters (ARCADE,
the exhibition ladder as was, and THE TOURNAMENT), and SPLATTER GORE stands
alone as the third top card. config.MENU is the grouping, MODES stays the four
run modes, and pickedMode stays the run-mode id — start(), stats and the
summary never learn the menu got taller. The sub-row sits inset under the
posters; sub-cards are the poster at 2/3 height centred on their scene.
DIFFICULTY is the one real gameplay addition: config.DIFFS scales the three
dials the classic CPU already reads (flub, quality cap, aiSpeed), MEDIUM
pinned by test to the shipped classicFlub/classicQualityMax so the middle chip
IS yesterday's game. Rides on G.diff next to G.classic, so restarts keep it.
AND THE FEEL SPLIT OLIVER REPORTED IS REAL: "in classic tennis I tend to miss
balls way more often" — the match's three contact helpers (matchReach 1.35,
the matchAssist floor, the short-ball chase) were all G.match-gated, so
classic played with a 35% smaller racket and no rescue on the dying drop
shot. rallyFeel() = match || classic now carries all three; gore's opener
keeps the old prologue feel on purpose.
The ARCADE poster took two rolls: the first came back a flat sticker line-up
("very constructed, not artsy"), the second anchors on the zombie poster
itself as a MOOD reference — one challenger lit at the net, the queue receding
into purple haze. Rolls in _refcheck/modebtn. The cup's stats mapping also
joins MODE_MATCH (it banks through endRun as MATCH and read back as GORE).
SPRV 117, main.js v233, 66 tests.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d3bbd8e157
commit
e4c917e23d
7 files changed
+141
-34
No files matched your search
+21
-1
@@ -635,11 +635,31 @@ export const COURTS = [
|
||||
// baked in — the button's own name/sub render over a scrim, so the caption stays crisp.
|
||||
export const MODES = [
|
||||
{ id: 'classic', name: 'CLASSIC TENNIS', sub: 'REAL TENNIS · BEST OF THREE SETS', art: 'mode_classic' },
|
||||
{ id: 'zombie', name: 'ZOMBIE TENNIS', sub: 'ONE GAME PER OPPONENT · BLOOD ONLY', art: 'mode_zombie' },
|
||||
{ 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' },
|
||||
{ id: 'gore', name: 'SPLATTER GORE', sub: 'THE MATCH TURNS · SURVIVE IT', art: 'mode_gore' },
|
||||
];
|
||||
|
||||
// THE SETUP SCREEN'S TOP ROW (Oliver's two-step menu, 2026-08-14): three posters, and picking one
|
||||
// opens its own second step — classic deals the difficulty chips, zombie tennis deals its two
|
||||
// sub-mode cards (arcade / the cup), gore just IS gore. A row either points at a run mode in 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'] },
|
||||
{ mode: 'gore' },
|
||||
];
|
||||
|
||||
// CLASSIC's difficulty, the one thing the modes screen adds to gameplay: a scaling on the three
|
||||
// dials the classic CPU already reads (flub = error rate, quality = shot cap, speed = aiSpeed
|
||||
// multiplier). MEDIUM is the game exactly as it shipped — classicFlub/classicQualityMax repeated
|
||||
// here so the middle chip can never drift from what "no difficulty" used to play like.
|
||||
export const DIFFS = [
|
||||
{ id: 'easy', name: 'EASY', flub: 0.22, quality: 0.72, speed: 0.88 },
|
||||
{ id: 'medium', name: 'MEDIUM', flub: 0.10, quality: 0.86, speed: 1.0 },
|
||||
{ id: 'hard', name: 'HARD', flub: 0.04, quality: 0.95, speed: 1.12 },
|
||||
];
|
||||
|
||||
// THE TOURNAMENT (Oliver's pick over the endless ladder, 2026-08-13): four rounds up the club's
|
||||
// dead hierarchy, each round DRAWING one rung from its band so runs differ, the final always THE
|
||||
// CHAMPION. `need` is games to take the round — round one is a single game so a run opens fast —
|
||||
|
||||
Reference in new issue
Block a user