X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/4496362fadb5f60b8ecf431fb220d26df7280f99..HEAD:/filling.c diff --git a/filling.c b/filling.c index 8b4a7c3..a0c9fc4 100644 --- a/filling.c +++ b/filling.c @@ -1036,7 +1036,7 @@ struct game_drawstate { int *dsf_scratch, *border_scratch; }; -static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds, +static char *interpret_move(game_state *state, game_ui *ui, const game_drawstate *ds, int x, int y, int button) { const int w = state->shared->params.w; @@ -1494,19 +1494,35 @@ static void draw_grid(drawing *dr, game_drawstate *ds, game_state *state, /* * Determine what we need to draw in this square. */ - int v = state->board[y*w+x]; + int i = y*w+x, v = state->board[i]; int flags = 0; if (flashy || !shading) { /* clear all background flags */ - } else if (ui && ui->sel && ui->sel[y*w+x]) { + } else if (ui && ui->sel && ui->sel[i]) { flags |= HIGH_BG; } else if (v) { - int size = dsf_size(ds->dsf_scratch, y*w+x); + int size = dsf_size(ds->dsf_scratch, i); if (size == v) flags |= CORRECT_BG; else if (size > v) flags |= ERROR_BG; + else { + int rt = dsf_canonify(ds->dsf_scratch, i), j; + for (j = 0; j < w*h; ++j) { + int k; + if (dsf_canonify(ds->dsf_scratch, j) != rt) continue; + for (k = 0; k < 4; ++k) { + const int xx = j % w + dx[k], yy = j / w + dy[k]; + if (xx >= 0 && xx < w && yy >= 0 && yy < h && + state->board[yy*w + xx] == EMPTY) + goto noflag; + } + } + flags |= ERROR_BG; + noflag: + ; + } } if (ui && ui->cur_visible && x == ui->cur_x && y == ui->cur_y) flags |= CURSOR_SQ; @@ -1617,9 +1633,9 @@ static float game_flash_length(game_state *oldstate, game_state *newstate, return 0.0F; } -static int game_is_solved(game_state *state) +static int game_status(game_state *state) { - return state->completed; + return state->completed ? +1 : 0; } static int game_timing_state(game_state *state, game_ui *ui) @@ -1720,7 +1736,7 @@ const struct game thegame = { game_redraw, game_anim_length, game_flash_length, - game_is_solved, + game_status, TRUE, FALSE, game_print_size, game_print, FALSE, /* wants_statusbar */ FALSE, game_timing_state,