diff --git a/gameplay.js b/gameplay.js index 32cf1d5..13efeee 100644 --- a/gameplay.js +++ b/gameplay.js @@ -683,26 +683,29 @@ export function deliverTin() { icon: WEAPONS[id].icon, color: UI.warm, t: TUNE.tinCardT }; } -// ---- TEST MODE. Triple-tap the scoreboard. A sandbox for trying the new content without playing -// twenty games to reach it: a steady medium wave and every barrel weapon on the rack, topped back up -// as you spend it. It does NOT stop the run — games, duels and bosses all still happen underneath; -// it only overrides the difficulty dials and keeps the rack stocked. +// ---- TEST MODE, the back room's WEAPON TEST (five taps on the splash logo — it used to be a +// triple-tap on the scoreboard). A sandbox for trying the new content without playing twenty games +// to reach it: a steady medium wave and EVERY weapon on the rack, topped back up as you spend it. +// It does NOT stop the run — games, duels and bosses all still happen underneath; it only overrides +// the difficulty dials and keeps the rack stocked. export function toggleTestMode() { G.testMode = !G.testMode; if (!G.testMode) { G.flash = { text: 'TEST MODE OFF', t: 1.4 }; return false; } if (G.mode === 'tennis') forceZombies(); // no zombies to test against in a tennis match stockTestRack(); G.flash = { text: 'TEST MODE', t: 1.6 }; - showModal({ title: 'TEST MODE', color: UI.pink, - body: ['A STEADY CROWD, MEDIUM SPEED', 'EVERY BARREL WEAPON, KEPT FULL', - '', 'TRIPLE-TAP THE SCOREBOARD AGAIN TO STOP'] }); + showModal({ title: 'WEAPON TEST', color: UI.pink, + body: ['A STEADY CROWD, MEDIUM SPEED', 'EVERY WEAPON, KEPT FULL', + '', 'IT RUNS UNTIL THE RUN DOES'] }); return true; } -// every barrel weapon on the rack at full stock. Called on entry and then kept topped up in update, -// so a burst you commit (which spends the whole tin) is available again a moment later. +// EVERY weapon on the rack at full stock — the four tins as well as the four barrel weapons, which +// is eight of the nine slots. It stocked only the barrel weapons before, on a screen called the +// weapon test. Called on entry and then kept topped up in update, so a burst you commit (which +// spends the whole tin) is available again a moment later. function stockTestRack() { - for (const id of Object.keys(BARREL_WEAPONS)) { + for (const id of Object.keys(WEAPONS)) { const have = G.rack.find(e => e.id === id); if (have) have.n = Math.max(have.n, WEAPONS[id].tin); else if (G.rack.length < RACK_MAX) G.rack.push({ id, n: WEAPONS[id].tin }); diff --git a/index.html b/index.html index 70ec242..df2f806 100644 --- a/index.html +++ b/index.html @@ -118,13 +118,15 @@ /* ONE overlay, four panels, swapped by #intro[data-stage]. Keeping the backdrop and the card frame alive across every screen is the point — a screen that unmounts the whole overlay flashes the court through between menus. */ - #splash, #setup, #stats, #ranks, #newbest { display: none; } + #splash, #setup, #stats, #ranks, #newbest, #secret, #bosses { display: none; } #intro[data-stage="splash"] #splash { display: flex; flex-direction: column; flex: 1; } /* flex COLUMN, not block: it is what lets the footer's margin-top:auto reach the bottom of a screen whose content does not fill it */ #intro[data-stage="setup"] #setup, #intro[data-stage="stats"] #stats, #intro[data-stage="ranks"] #ranks, + #intro[data-stage="secret"] #secret, + #intro[data-stage="bosses"] #bosses, #intro[data-stage="newbest"] #newbest { display: flex; flex-direction: column; flex: 1; animation: drop 0.3s ease-out; } /* the overlay is HIDDEN during play, not removed: a restart puts it straight back, and the @@ -180,6 +182,19 @@ #tours button.on { border-color: var(--acid); background: rgba(188,212,85,0.09); } #tours img { height: 88px; width: auto; display: block; image-rendering: pixelated; } #tours b { font: 400 11px Silkscreen, monospace; color: var(--cream); letter-spacing: 0.5px; } + /* THE BOSS PICKER (back room). Two columns of portraits, because you pick a boss by looking at + him — the tile is mostly art. Same plate as the tour tiles above; the grid is what makes ten + of them fit on a phone. */ + #bossList { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding-bottom: 14px; } + #bossList button { display: flex; flex-direction: column; align-items: center; gap: 5px; + padding: 8px 6px 10px; background: var(--panel); border: 2px solid var(--line); + color: inherit; font: inherit; cursor: pointer; + -webkit-tap-highlight-color: transparent; } + #bossList img { height: 78px; width: auto; display: block; image-rendering: pixelated; } + #bossList b { font: 400 9px Silkscreen, monospace; color: var(--cream); letter-spacing: 0.5px; + text-align: center; line-height: 1.35; } + #bossList i { font: 400 8px Silkscreen, monospace; color: var(--dim); font-style: normal; + letter-spacing: 1px; } /* a row, not a stacked tile: three 3:2 tiles stacked fill a phone twice over, and the art still reads at this size. -webkit-tap-highlight-color kills iOS's blue flash over the pixel art. */ #courtList button.court { display: flex; align-items: center; gap: 11px; width: 100%; @@ -343,6 +358,23 @@