ref: 2a9be2b89df3e6a07a1d90a06f8ac00a92d789e5
parent: 17364455186ae61e015d0f0de3f09423f78d0727
author: Ben Harris <bjh21@bjh21.me.uk>
date: Wed Feb 1 15:12:29 EST 2023
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
--- a/mines.c
+++ b/mines.c
@@ -2146,6 +2146,8 @@
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'