diff --git a/mines.c b/mines.c index 42543cc..6ecdc95 100644 --- a/mines.c +++ b/mines.c @@ -2142,22 +2142,11 @@ static int open_square(game_state *state, int x, int y) if (state->layout->mines[y*w+x]) { /* - * The player has landed on a mine. Bad luck. Expose all - * the mines. + * The player has landed on a mine. Bad luck. Expose the + * mine that killed them, but not the rest (in case they + * want to Undo and carry on playing). */ state->dead = TRUE; - for (yy = 0; yy < h; yy++) - for (xx = 0; xx < w; xx++) { - if (state->layout->mines[yy*w+xx] && - (state->grid[yy*w+xx] == -2 || - state->grid[yy*w+xx] == -3)) { - state->grid[yy*w+xx] = 64; - } - if (!state->layout->mines[yy*w+xx] && - state->grid[yy*w+xx] == -1) { - state->grid[yy*w+xx] = 66; - } - } state->grid[y*w+x] = 65; return -1; } @@ -2439,6 +2428,7 @@ static char *game_text_format(game_state *state) struct game_ui { int hx, hy, hradius; /* for mouse-down highlights */ int flash_is_death; + int deaths; }; static game_ui *new_ui(game_state *state) @@ -2446,6 +2436,7 @@ static game_ui *new_ui(game_state *state) game_ui *ui = snew(game_ui); ui->hx = ui->hy = -1; ui->hradius = 0; + ui->deaths = 0; ui->flash_is_death = FALSE; /* *shrug* */ return ui; } @@ -2522,6 +2513,8 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, ret = dup_game(from); ret->just_used_solve = FALSE; open_square(ret, cx, cy); + if (ret->dead) + ui->deaths++; return ret; } @@ -2554,6 +2547,8 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, (ret->grid[(cy+dy)*ret->w+(cx+dx)] == -2 || ret->grid[(cy+dy)*ret->w+(cx+dx)] == -3)) open_square(ret, cx+dx, cy+dy); + if (ret->dead) + ui->deaths++; return ret; } } @@ -2931,15 +2926,18 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, { char statusbar[512]; if (state->dead) { - sprintf(statusbar, "GAME OVER!"); + sprintf(statusbar, "DEAD!"); } else if (state->won) { if (state->used_solve) sprintf(statusbar, "Auto-solved."); else sprintf(statusbar, "COMPLETED!"); } else { - sprintf(statusbar, "Mines marked: %d / %d", markers, mines); + sprintf(statusbar, "Marked: %d / %d", markers, mines); } + if (ui->deaths) + sprintf(statusbar + strlen(statusbar), + " Deaths: %d", ui->deaths); status_bar(fe, statusbar); } } diff --git a/puzzles.but b/puzzles.but index 544dfde..e171c7f 100644 --- a/puzzles.but +++ b/puzzles.but @@ -880,9 +880,19 @@ turn, and so on if any of them also has no surrounding mines. This will be done for you automatically; so sometimes when you uncover a square, a whole new area will open up to be explored. -(All the actions described in \k{common-actions} are also available. +All the actions described in \k{common-actions} are also available. + Even Undo is available, although you might consider it cheating to -use it!) +use it. If you step on a mine, the program will only reveal the mine +in question (unlike most other implementations, which reveal all of +them). You can then Undo your fatal move and continue playing if you +like. The program will track the number of times you died (and Undo +will not reduce that counter), so when you get to the end of the +game you know whether or not you did it without making any errors. + +(If you really want to know the full layout of the grid, which other +implementations will show you after you die, you can always use the +Solve menu option.) \H{mines-parameters} \I{parameters, for Mines}Mines parameters