From 2a9be2b89df3e6a07a1d90a06f8ac00a92d789e5 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Wed, 1 Feb 2023 20:12:29 +0000 Subject: [PATCH] Mines: Don't check if the player has won if they've already lost It can't happen in normal play, but if a save file had a "C" (clear around) move that set off a mine, Mines could end up hitting an assertion failure, "ncovered >= nmines". This was because it would check if the player had won by counting covered squares and mines, and of course an uncovered mine is no longer a covered square but is still a mine. Since winning after you're dead isn't possible (at least in Mines), we now skip the check entirely if the player has already died. This save file demonstrates the problem: SAVEFILE:41:Simon Tatham's Portable Puzzle Collection GAME :5:Mines PARAMS :1:7 CPARAMS :1:7 DESC :22:r31,u,0000C000d0000020 NSTATES :1:2 STATEPOS:1:1 MOVE :4:C6,2 --- mines.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mines.c b/mines.c index d40bb9f..16075aa 100644 --- a/mines.c +++ b/mines.c @@ -2146,6 +2146,8 @@ static int open_square(game_state *state, int x, int y) break; } + /* If the player has already lost, don't let them win as well. */ + if (state->dead) return 0; /* * Finally, scan the grid and see if exactly as many squares * are still covered as there are mines. If so, set the `won'