X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/ac9f41c4c8ccbf9364a5d351e4cb134812a9926b..550742c19aa64ef9033f2b796c5ecd7fa135962d:/mines.c diff --git a/mines.c b/mines.c index 49702ff..e0e6eb0 100644 --- a/mines.c +++ b/mines.c @@ -22,6 +22,7 @@ enum { COL_1, COL_2, COL_3, COL_4, COL_5, COL_6, COL_7, COL_8, COL_MINE, COL_BANG, COL_CROSS, COL_FLAG, COL_FLAGBASE, COL_QUERY, COL_HIGHLIGHT, COL_LOWLIGHT, + COL_WRONGNUMBER, NCOLOURS }; @@ -58,7 +59,7 @@ struct mine_layout { struct game_state { int w, h, n, dead, won; - int used_solve, just_used_solve; + int used_solve; struct mine_layout *layout; /* real mine positions */ signed char *grid; /* player knowledge */ /* @@ -2169,7 +2170,7 @@ static game_state *new_game(midend *me, game_params *params, char *desc) state->h = params->h; state->n = params->n; state->dead = state->won = FALSE; - state->used_solve = state->just_used_solve = FALSE; + state->used_solve = FALSE; wh = state->w * state->h; @@ -2274,7 +2275,6 @@ static game_state *dup_game(game_state *state) ret->dead = state->dead; ret->won = state->won; ret->used_solve = state->used_solve; - ret->just_used_solve = state->just_used_solve; ret->layout = state->layout; ret->layout->refcount++; ret->grid = snewn(ret->w * ret->h, signed char); @@ -2575,13 +2575,12 @@ static game_state *execute_move(game_state *from, char *move) ret->grid[yy*ret->w+xx] = v; } } - ret->used_solve = ret->just_used_solve = TRUE; + ret->used_solve = TRUE; ret->won = TRUE; return ret; } else { ret = dup_game(from); - ret->just_used_solve = FALSE; while (*move) { if (move[0] == 'F' && @@ -2712,6 +2711,10 @@ static float *game_colours(frontend *fe, int *ncolours) ret[COL_LOWLIGHT * 3 + 1] = ret[COL_BACKGROUND * 3 + 1] * 2.0 / 3.0; ret[COL_LOWLIGHT * 3 + 2] = ret[COL_BACKGROUND * 3 + 2] * 2.0 / 3.0; + ret[COL_WRONGNUMBER * 3 + 0] = 1.0F; + ret[COL_WRONGNUMBER * 3 + 1] = 0.6F; + ret[COL_WRONGNUMBER * 3 + 2] = 0.6F; + *ncolours = NCOLOURS; return ret; } @@ -2816,6 +2819,10 @@ static void draw_tile(drawing *dr, game_drawstate *ds, * Exception is that for value 65 (mine we've just trodden * on), we clear the square to COL_BANG. */ + if (v & 32) { + bg = COL_WRONGNUMBER; + v &= ~32; + } draw_rect(dr, x, y, TILE_SIZE, TILE_SIZE, (v == 65 ? COL_BANG : bg == COL_BACKGROUND ? COL_BACKGROUND2 : bg)); @@ -2962,6 +2969,26 @@ static void game_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate, if (state->layout->mines && state->layout->mines[y*ds->w+x]) mines++; + if (v >= 0 && v <= 8) { + /* + * Count up the flags around this tile, and if + * there are too _many_, highlight the tile. + */ + int dx, dy, flags = 0; + + for (dy = -1; dy <= +1; dy++) + for (dx = -1; dx <= +1; dx++) { + int nx = x+dx, ny = y+dy; + if (nx >= 0 && nx < ds->w && + ny >= 0 && ny < ds->h && + state->grid[ny*ds->w+nx] == -1) + flags++; + } + + if (flags > v) + v |= 32; + } + if ((v == -2 || v == -3) && (abs(x-ui->hx) <= ui->hradius && abs(y-ui->hy) <= ui->hradius)) v -= 20;