Story: the cup's tableau between rounds, a brighter act card (v388)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5.5 committed 2026-10-16 15:32:35 +02:00
1 parent 0576f24614
commit 0c67d32519
5 files changed
+67 -5

No files matched your search

+1
View File
@@ -940,6 +940,7 @@ function cupGameWon(zb, banked = false) {
else d.mopT = 0.6;
G.interlude = { introT: d.mopT + 1.6 };
cupDraw(); // the next round's rung -> d.opp
if (G.story && storyUI.show) storyUI.show('draw', { act: G.story.act, round: cup.round }); // the tableau, stamped
score.server = other(score.server);
G.phase = 'over'; G.overT = d.mopT + 2.2; // d.ending stays true until the walk-on tick
};
+22 -1
View File
@@ -3,7 +3,7 @@
// Module map: config (tuning/constants) · state (mutable game state) · gameplay (logic/update)
// render (camera/drawing) · input (keys/touch) · audio (sfx/umpire) · panel (T tuning UI)
import { TUNE, COURTS, TOURS, KITS, SKINS, MODES, MENU, DIFFS, EATEN_RESTART, DONE_RESTART, WEAPONS, bossArt, LEAGUES, leagueOf, cupRoundsFor, cupFixture, cupRoundName, matchFoe, LADDER , storyFixture, storyAct , STORY, ROMAN, storyBossArt , STORY_HELP, STORE } from './config.js';
import { TUNE, COURTS, TOURS, KITS, SKINS, MODES, MENU, DIFFS, EATEN_RESTART, DONE_RESTART, WEAPONS, bossArt, LEAGUES, leagueOf, cupRoundsFor, cupFixture, cupRoundName, matchFoe, LADDER , storyFixture, storyRounds, storyAct , STORY, ROMAN, storyBossArt , STORY_HELP, STORE } from './config.js';
import { P, O, ball, score, G, setupPoint, sendBoy, selectCourt, selectTour, selectKit, selectSkin } from './state.js';
import { update, restartRun, keyPressed, solveShot, inServeBox, inCourt, forceZombies, startGore, splatPoint, deliverTin, selectWeapon, grantWeapon, showModal, dismissModal, flickTarget, dragServe, toggleTestMode } from './gameplay.js';
import { startDuel, resolveInterlude, startHorde, startBossFight, endBossFight, startDrill, endDrill, startMatch, endMatch, startBench, endBench, FALL, benchFall, startNetVs, endNetVs , startStory , storyUI } from './beats.js';
@@ -784,6 +784,25 @@ function storyScreen(kind, d) {
<div class="lab tap">TAP</div>
</div>`;
whoosh(0.3); at(0.3, () => boom(0.45)); // the court flies in, ACT n lands
} else if (kind === 'draw') {
// THE TOURNAMENT TABLEAU (storyboard 03): the cup's rounds up the league, the final the act boss's
// body. After the act card it is the checkpoint (⚑ — a loss throws you back here); between rounds
// it stamps the round just won and points at the next face.
auto = 3.2;
glow = '#1a2030';
const R = storyRounds(act), last = R.length - 1;
html = `<div class="bgc dim" style="background-image:url(${art(court.tile)})"></div><div class="col">
<div class="lab gold r">ACT ${ROMAN[act]} · THE CUP${d.round ? '' : ' · ⚑ SAVED'}</div>
<div class="big r" ${delay(1)}>${['', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE'][R.length]} ROUNDS</div>
<div class="draw">${R.map((r, i) => { const f = matchFoe(r.band[0]);
const st = i < d.round ? '<span class="won">WON</span>' : i === d.round ? '<span class="gold tap">NEXT</span>' : '';
return `<div class="r${i === last ? ' fin' : ''}${i < d.round ? ' done' : ''}" ${delay(2 + i)}>
<img src="${foeArt(f)}" alt=""><div><div class="lab${i === last ? ' gold' : ''}">${r.name}</div>
<div class="mid">${f.name}</div></div><div class="lab st">${st}</div></div>`; }).join('')}</div>
<div class="lab tap">TAP</div>
</div>`;
R.forEach((_, i) => at(0.3 + (2 + i) * 0.15, () => pock(0.4, 600 + i * 120)));
if (d.round) at(0.3 + (1 + d.round) * 0.15 + 0.3, () => boom(0.3)); // the WON stamp
} else if (kind === 'loot') {
const xd = profile.runDelta(), mid = storyBossArt(act, 'mid').name;
html = `<div class="col">
@@ -852,6 +871,8 @@ sty.addEventListener('click', e => {
if (b) styClose(b.dataset.door); else if (!styDoors) styClose('tap');
});
storyUI.show = (kind, d) => storyScreen(kind, d).then(door => {
// the act card opens onto the cup's tableau — the checkpoint the cup starts from
if (kind === 'act') return storyScreen('draw', { act: d.act, round: 0 });
if (kind !== 'clear') return;
// the act card IS the act's ending: the run closes here, and the story picks up where it now stands
restartRun(); profile.push(); refreshSplash();