Patch from Jonas Koelker to improve Filling's error highlighting: as

well as marking a region as wrong if it has too many squares for the
number written in it, this patch now causes a region to be marked
wrong if it has too few squares _and no liberties_, so that it can't
just be one the user is intending to enlarge later.

[originally from svn r9534]
This commit is contained in:
Simon Tatham
2012-05-14 18:42:19 +00:00
parent 1e71966e75
commit 12cd1ee235

View File

@ -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. * 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; int flags = 0;
if (flashy || !shading) { if (flashy || !shading) {
/* clear all background flags */ /* 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; flags |= HIGH_BG;
} else if (v) { } else if (v) {
int size = dsf_size(ds->dsf_scratch, y*w+x); int size = dsf_size(ds->dsf_scratch, i);
if (size == v) if (size == v)
flags |= CORRECT_BG; flags |= CORRECT_BG;
else if (size > v) else if (size > v)
flags |= ERROR_BG; 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) if (ui && ui->cur_visible && x == ui->cur_x && y == ui->cur_y)
flags |= CURSOR_SQ; flags |= CURSOR_SQ;