The cup board: the league ranks, the level breaks the tie

Oliver wanted to rank the level a league was taken at. The challenge held: xp
comes only from playing, so a board that rewards a low level rewards not
playing — it would pay you to avoid the three rooms the season leans on. It
also inverts every other number in the game, freezes after five entries, and
makes the player who played more look worse.

So the league ranks and the level decides between everyone who got equally far,
where "lower is better" reads naturally. BOARDS.u carries subLow; server
rank_key is the other half, and the same key decides whether a submission beats
the row already standing. The level is written once at the promotion — before
the league moves, because it is the level that WON the cup — mirrored like the
rest of the profile, and inscribed under the shield it belongs to. Earned
shields smoulder while they are on screen: five CSS embers each, no loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-31 15:51:38 +02:00
1 parent e96b4374d8
commit 80eb60d181
8 files changed
+226 -40

No files matched your search

+17 -1
View File
@@ -117,7 +117,7 @@ function freshSplatter() {
prof.prof.lg = 1; prof.prof.ch = 0; prof.prof.xp = 0; prof.takePromo();
// THE SEASON: the cup record is written by a real cup ending, so it leaks between tests exactly
// the way the promotion did — the training court reads `out`, and a stale one reorders its list
prof.prof.cups = {}; prof.prof.out = 0;
prof.prof.cups = {}; prof.prof.at = {}; prof.prof.out = 0;
G.mode = 'splatter';
G.everTransitioned = true;
setupPoint();
@@ -1292,6 +1292,22 @@ test('THE SEASON: a cup exit is recorded, forward only, and names who put you ou
assert.equal(prof.prof.out, out, 'a training rep is a rep, not a cup attempt');
});
test('THE CUP BOARD: the league ranks, the level it was taken at breaks the tie', () => {
// the inscription is written at the promotion and never again — a league is taken once
prof.prof.lg = 2; prof.prof.xp = prof.xpFor(9);
prof.recordCupWin(1, prof.levelAt(prof.prof.xp));
assert.equal(prof.cupAt(1), 9, 'the level that won the cup is the one inscribed');
prof.recordCupWin(1, 3);
assert.equal(prof.cupAt(1), 9, '...and a later write never overwrites it');
assert.equal(prof.cupAt(2), 0, 'a league not yet taken carries no inscription');
// the board itself: league is the score, the level the tie-break, and it is the ONE board whose
// second column is better LOW (server.py's rank_key is the other half of this)
const B = statsMod.BOARDS[statsMod.MODE_CUP];
assert.equal(B.score({ k: 4, g: 22 }), 4, 'the league ranks');
assert.equal(B.sub({ k: 4, g: 22 }), 22, 'the level rides along');
assert.ok(B.subLow, 'and lower is better on it');
});
test('THE CUP CLIMBS: rounds run easy to hard, deterministic, the final the top of the band', () => {
// the shuffle retired with the draw screen (Oliver: "warum sollten wir noch mischen?") — a bad
// roll paired the strongest challenger with the shortest round, inverting the tuned curve