The cup climbs: easy to hard, deterministic — the shuffle retires with its screen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-29 16:49:36 +02:00
1 parent dbfd085493
commit a5a681f9f2
5 files changed
+47 -57

No files matched your search

+14 -14
View File
@@ -917,22 +917,22 @@ export const leagueOf = lg => LEAGUES[Math.min(LEAGUES.length, Math.max(1, lg |
export const leagueOfRung = n => LEAGUES.find(l => n <= l.band[1]) || LEAGUES[LEAGUES.length - 1];
// The tournament, PER LEAGUE. Same shape CUP_ROUNDS always had (name/band/need) — round one is a
// single game so a run opens fast, and the drawn body's pool still scales with `need`
// (matchOpponent). The rounds ride ON the cup object (beats.startMatch stamps them), so every
// consumer reads cup.rounds and the full-ladder constant is gone.
// A league band is 3-4 rungs, so the draw is WITHOUT REPLACEMENT: every non-final round carries
// the whole sub-band and the run deals each body at most once (cup.played / buildBracket's used
// set), the final is always the band's top rung — "only the finale is settled", still. A 4-rung
// league is four rounds (a shuffle of three challengers), a 3-rung league is three.
// single game so a run opens fast, and the body's pool still scales with `need` (matchOpponent).
// The rounds ride ON the cup object (beats.startMatch stamps them).
// EASY TO HARD, DETERMINISTIC (2026-08-29, Oliver: "warum sollten wir noch mischen?"): each round
// is exactly one position of the band, ascending, the final the band's top. The shuffle was the
// deleted draw screen's ceremony — without the screen it only ever risked pairing the strongest
// challenger with the shortest round, inverting the curve the whole game is tuned around. The
// setup's league panel is now, incidentally, an exact preview of the tournament order.
export const cupRoundsFor = lg => {
const [lo, hi] = leagueOf(lg).band;
const open = [];
for (let r = lo; r < hi; r++) open.push(r);
const names = open.length >= 3 ? ['ROUND ONE', 'QUARTER-FINAL', 'SEMI-FINAL']
: ['ROUND ONE', 'SEMI-FINAL'];
return open.map((_, i) => ({ name: names[i] || 'ROUND ' + (i + 1), band: open.slice(),
need: i ? 2 : 1 }))
.concat([{ name: 'THE FINAL', band: [hi], need: 2 }]);
const names = hi - lo >= 3 ? ['ROUND ONE', 'QUARTER-FINAL', 'SEMI-FINAL']
: ['ROUND ONE', 'SEMI-FINAL'];
const rounds = [];
for (let r = lo; r < hi; r++)
rounds.push({ name: names[rounds.length] || 'ROUND ' + (rounds.length + 1),
band: [r], need: rounds.length ? 2 : 1 });
return rounds.concat([{ name: 'THE FINAL', band: [hi], need: 2 }]);
};
export const TOURS = [