The save warning, the buttons, and a claim that was simply false

- The save warning is a warning: 15px, weight 500, bright amber on a
  deeper ground with a 5px rule down the side. (What Jesse was looking
  at is v0.7.8, where this line is still the small grey .ng-note —
  none of 0.7.9 has been deployed.)

- The buttons read the same on both screens: "Continue saved game" and
  "Create new game". Solitaire said "Continue Existing Saved Game" and
  "Deal New Game", the lobby said "Create game" — three phrasings for
  two actions.

- "Off in every game type" is deleted from the Optional rules note
  because it was not true. Checked against the presets rather than
  taken on trust: discardTimetabled (§6.2, a Timetabled train may be
  discarded) ships ON in all four types, not just Co-op. The note now
  says only what holds for all of them.

Stays in the unshipped v0.7.9. 877 tests pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AdG46Ja2PEDBkpqiDazMoX
This commit is contained in:
Jesse.Markowitz
2026-08-30 09:26:56 -04:00
co-authored by Claude Sonnet 5
parent a70b7f88f3
commit 788e5f2eec
3 changed files with 33 additions and 14 deletions
+17
View File
@@ -218,6 +218,23 @@ the state the outcome was decided in — and stripped of markup, since it lands
console line. The drift test that compared this string against the engine now maps `win`/`loss` to console line. The drift test that compared this string against the engine now maps `win`/`loss` to
`won`/`lost`, so it still checks the two agree rather than that they are spelled alike. `won`/`lost`, so it still checks the two agree rather than that they are spelled alike.
### The save warning, the buttons, and a claim that was simply false
Three more from Jesse reading the two screens side by side.
- **The save warning is a warning.** "That's a warning, not an 'oh by the way'." It had already moved
off `.ng-note` earlier in this release; it is larger and heavier again now — 15px, weight 500,
bright amber on a deeper ground with a 5px rule down the side. Worth noting what he was actually
looking at: `phoenix.local` runs v0.7.8, where this line is still the small grey `.ng-note`. None
of this release has been deployed.
- **The buttons read the same on both screens**: **Continue saved game** and **Create new game**.
Solitaire said "Continue Existing Saved Game" and "Deal New Game"; the lobby said "Create game".
Three phrasings for two actions.
- **"Off in every game type" is deleted from the Optional rules note, because it was not true.**
Checked against the presets rather than taken on trust: `discardTimetabled` — §6.2's "a Timetabled
train may be discarded" — ships **on** in all four types, not just Co-op. The note now says only
what is true of all of them: "Each one changes how the game plays."
### Three wording and layout fixes ### Three wording and layout fixes
- **The collision entries** on all three screens now read "The game ends immediately and results in - **The collision entries** on all three screens now read "The game ends immediately and results in
+2 -2
View File
@@ -2152,14 +2152,14 @@ function commitNewGame(wired: WiredGameType, seedFieldValue: string): void {
* to the screen that already asks these questions properly. * to the screen that already asks these questions properly.
* *
* Nothing is lost on the way: `render()` calls `save()` every frame, so the game in progress is * Nothing is lost on the way: `render()` calls `save()` every frame, so the game in progress is
* always on disk, and the setup screen offers "Continue Existing Saved Game" to come back to it. * always on disk, and the setup screen offers "Continue saved game" to come back to it.
*/ */
const newBtn = document.getElementById('newgame'); const newBtn = document.getElementById('newgame');
if (newBtn) { if (newBtn) {
newBtn.onclick = () => { newBtn.onclick = () => {
showScreen('solitairesetup'); showScreen('solitairesetup');
// IN PLACE, not a navigation: the live session stays in memory, so the fields can open on the // IN PLACE, not a navigation: the live session stays in memory, so the fields can open on the
// rules actually being played and "Continue Existing Saved Game" is just showing the board // rules actually being played and "Continue saved game" is just showing the board
// again rather than a reload and a replay. // again rather than a reload and a replay.
runSolitaireSetup(new URLSearchParams(), true, session.view()); runSolitaireSetup(new URLSearchParams(), true, session.view());
}; };
+14 -12
View File
@@ -81,9 +81,11 @@ dialog input:focus{outline:none;border-color:#4d6fa8}
where the eye has already learned there is nothing to act on. Sized and coloured to be read where the eye has already learned there is nothing to act on. Sized and coloured to be read
(Jesse, 2026-08-30). Amber rather than red: losing a saved game is a real cost, not a danger, and (Jesse, 2026-08-30). Amber rather than red: losing a saved game is a real cost, not a danger, and
red here would outrank the actual rules of the game sitting above it. */ red here would outrank the actual rules of the game sitting above it. */
#ss-saved-note{font-size:14px;line-height:1.5;color:#f0c674;background:#2e2718; #ss-saved-note{font-size:15px;font-weight:500;line-height:1.55;color:#ffcf70;background:#332a15;
border:1px solid #7a6320;border-left-width:4px;border-radius:5px;padding:10px 12px;margin:16px 0 0} border:1px solid #b8912c;border-left:5px solid #e0a83c;border-radius:5px;padding:12px 14px;
/* Two live choices, so neither is the quiet one: `Deal New Game` keeps the primary blue it has when margin:18px 0 0}
#ss-saved-note b{color:#ffe3a6}
/* Two live choices, so neither is the quiet one: `Create new game` keeps the primary blue it has when
it is the only button, and `Continue` is given the same weight rather than reading as a cancel. */ it is the only button, and `Continue` is given the same weight rather than reading as a cancel. */
#ss-deal{background:#31527f;border-color:#4d6fa8} #ss-deal{background:#31527f;border-color:#4d6fa8}
#ss-resume{background:#2f5340;border-color:#4f8a68} #ss-resume{background:#2f5340;border-color:#4f8a68}
@@ -534,7 +536,7 @@ ul.blocked li{padding:2px 0}
<div class="set-group"> <div class="set-group">
<h3>Optional rules</h3> <h3>Optional rules</h3>
<p class="ng-note">Off in every game type; each one changes how the game plays.</p> <p class="ng-note">Each one changes how the game plays.</p>
<div class="set-row" id="lb-visibility-row"> <div class="set-row" id="lb-visibility-row">
<label class="ng-num"><span>Reduced Visibility — five switching Moves instead of six in the <label class="ng-num"><span>Reduced Visibility — five switching Moves instead of six in the
night Stages (1&ndash;3 and 11&ndash;12)</span> night Stages (1&ndash;3 and 11&ndash;12)</span>
@@ -567,7 +569,7 @@ ul.blocked li{padding:2px 0}
</details> </details>
<div class="lb-span"> <div class="lb-span">
<button id="lb-create" type="button">Create game</button> <button id="lb-create" type="button">Create new game</button>
<p class="lb-error" id="lb-create-err" role="alert"></p> <p class="lb-error" id="lb-create-err" role="alert"></p>
</div> </div>
</div> </div>
@@ -761,7 +763,7 @@ ul.blocked li{padding:2px 0}
<div class="set-group"> <div class="set-group">
<h3>Optional rules</h3> <h3>Optional rules</h3>
<p class="ng-note">Off in every game type; each one changes how the game plays.</p> <p class="ng-note">Each one changes how the game plays.</p>
<div class="set-row" id="ss-visibility-row"> <div class="set-row" id="ss-visibility-row">
<label class="ng-num"><span>Reduced Visibility — five switching Moves instead of six in the <label class="ng-num"><span>Reduced Visibility — five switching Moves instead of six in the
night Stages (1&ndash;3 and 11&ndash;12)</span> night Stages (1&ndash;3 and 11&ndash;12)</span>
@@ -795,13 +797,13 @@ ul.blocked li{padding:2px 0}
save (`commitNewGame` calls `clearSave`), so without a way back the door would be a way to save (`commitNewGame` calls `clearSave`), so without a way back the door would be a way to
lose a game in progress — and the door is reached by clicking "Play solitaire", which nobody lose a game in progress — and the door is reached by clicking "Play solitaire", which nobody
reads as "discard what I was playing". --> reads as "discard what I was playing". -->
<p id="ss-saved-note" hidden><b>You have a solitaire game in progress.</b> Dealing a new game <p id="ss-saved-note" hidden><b>You have a solitaire game in progress.</b> Creating a new game
replaces it permanently &mdash; there is no undo. Choose <b>Continue Existing Saved Game</b> replaces it permanently &mdash; there is no undo. Choose <b>Continue saved game</b> to pick it
to pick it up where you left off.</p> up where you left off.</p>
<menu class="ng-buttons"> <menu class="ng-buttons">
<button id="ss-resume" type="button" hidden>Continue Existing Saved Game</button> <button id="ss-resume" type="button" hidden>Continue saved game</button>
<button id="ss-deal" type="button">Deal New Game</button> <button id="ss-deal" type="button">Create new game</button>
</menu> </menu>
</section> </section>
</div> </div>
@@ -928,7 +930,7 @@ ul.blocked li{padding:2px 0}
Deleting it removes the drift rather than re-wording it. Deleting it removes the drift rather than re-wording it.
Nothing is lost by navigating away mid-game: `render()` calls `save()` on every frame, so the Nothing is lost by navigating away mid-game: `render()` calls `save()` on every frame, so the
game in progress is always on disk, and the setup screen offers "Continue Existing Saved Game" game in progress is always on disk, and the setup screen offers "Continue saved game"
to come straight back to it. --> to come straight back to it. -->
</div><!-- /gameui --> </div><!-- /gameui -->