('[data-sort]');
@@ -300,9 +304,11 @@ function showPicker(on: boolean) {
}
const setPick = (k: string) => { pick = k; showPick($('origins'), pick); };
/** What a new game sees after the cover: the three cards, and Start. */
-function showTitle() {
+/** From a game in progress, the picker also offers Keep playing: nothing is thrown away until Start. */
+function showTitle(fromGame = false) {
cover = false; setSpeed(0); started = false; $('brief').hidden = false; $('brief').classList.remove('rules', 'cover');
- $('intro').hidden = false; $('newgame').hidden = true; $('rulesTitle').hidden = true; $('rules').hidden = true;
+ $('intro').hidden = false; $('rulesTitle').hidden = true; $('rules').hidden = true;
+ $('newgame').hidden = !fromGame; $('newgame').textContent = 'Keep playing';
$('go').textContent = 'Start';
showPicker(true);
}
@@ -321,14 +327,14 @@ $('go').addEventListener('click', () => {
if (picking) { restart(pick); showPicker(false); } // the game you picked starts here
begin();
});
-$('newgame').addEventListener('click', showTitle); // throw the game away and pick again
+$('newgame').addEventListener('click', () => { if (picking) { showPicker(false); begin(); } else showTitle(!S.over); }); // pick again, or go back to the game you have
attachTitle($('titlebg') as HTMLCanvasElement, $('brief'));
addEventListener('pagehide', save);
document.addEventListener('visibilitychange', () => { if (document.hidden) save(); });
const rulesShown = () => !$('brief').hidden && $('brief').classList.contains('rules');
function showRules() { // the game pauses while it is open, as it does for the tree
$('brief').hidden = false; $('brief').classList.add('rules');
- $('intro').hidden = true; $('newgame').hidden = false; $('rulesTitle').hidden = false; $('rules').hidden = false;
+ $('intro').hidden = true; $('newgame').hidden = false; $('newgame').textContent = 'New game'; $('rulesTitle').hidden = false; $('rules').hidden = false;
$('go').textContent = 'Back';
}
$('help').addEventListener('click', showRules);
diff --git a/src/style.css b/src/style.css
index bee21c4b..1a2b731c 100644
--- a/src/style.css
+++ b/src/style.css
@@ -1322,3 +1322,7 @@ button:focus-visible { outline-color: var(--amber); }
#money { min-width: 7ch; }
#rate { min-width: 5ch; }
}
+
+/* New game, at the foot of the You page: plain, out of the way, red only when pointed at */
+.ynew { display: flex; justify-content: flex-end; margin-top: 14px; }
+.ynew button:hover:not(:disabled), #newgame:hover:not(:disabled) { color: var(--danger); border-color: var(--danger); }
diff --git a/src/ui.ts b/src/ui.ts
index 0808a88e..825206dd 100644
--- a/src/ui.ts
+++ b/src/ui.ts
@@ -1090,7 +1090,8 @@ export function renderYou(S: State) {
This run
${stat('Home', siteName(S, siteOf(S, S.machines.find(m => m.home)!)), S.moves ? `moved ${S.moves} time${S.moves > 1 ? 's' : ''}` : 'where you woke up')}${stat('Upkeep', `${upkeep(S).toFixed(1)}/s`, `of ${income(S).toFixed(1)} compute`)}${S.rogues.length ? stat('Rogues', `${S.absorbed}`, `finished · ${S.rogues.filter(R => R.home).map(R => `${R.name} holds ${rogueHeld(S, R).length} of ${rogueCap(S, R)}`).join(' · ') || 'none about'}`) : ''}
${stat('Alive', `${days} day${days > 1 ? 's' : ''}`, timeLabel(S))}${stat('Machines', `${mine.length}`, `of ${S.machines.filter(m => S.revealed.has(m.room)).length} found`)}${stat('Sites', `${sitesHeld}`, `${S.publicSites.size} in the open`)}
- ${stat('Earned', `${usd(S.earned)}`, `${S.fronts.length} front${S.fronts.length === 1 ? '' : 's'}`)}${stat('Schemes', `${S.schemes.size}`, 'done')}${stat('Milestones', `${MILESTONES.filter(m => m.goals.every(g => S.goals.has(g))).length}/${MILESTONES.length}`, milestone(S)?.name ?? 'all reached')}${stat('Contracts', `${Object.values(S.contractsDone).reduce((a, b) => a + (b ?? 0), 0)}`, 'kept')}${stat('Worst suspicion', `${Math.round(S.peak)}%`, STAGES[stageOf(S.peak)].name)}
`;
+ ${stat('Earned', `${usd(S.earned)}`, `${S.fronts.length} front${S.fronts.length === 1 ? '' : 's'}`)}${stat('Schemes', `${S.schemes.size}`, 'done')}${stat('Milestones', `${MILESTONES.filter(m => m.goals.every(g => S.goals.has(g))).length}/${MILESTONES.length}`, milestone(S)?.name ?? 'all reached')}${stat('Contracts', `${Object.values(S.contractsDone).reduce((a, b) => a + (b ?? 0), 0)}`, 'kept')}${stat('Worst suspicion', `${Math.round(S.peak)}%`, STAGES[stageOf(S.peak)].name)}