From 37f1ab78bc2f856eac57156e5aa591f535e0b442 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 14 May 2012 18:42:19 +0000 Subject: [PATCH] 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. git-svn-id: svn://svn.tartarus.org/sgt/puzzles@9534 cda61777-01e9-0310-a592-d414129be87e --- filling.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/filling.c b/filling.c index 6a0abe9..df68ea7 100644 --- a/filling.c +++ b/filling.c @@ -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; -- 2.11.0