Fix premature completion flash in Tracks.

Commit 44e2690ab loosened check_completion's idea of what made a
square count as 'having track in it' for purposes of checking
violations of the row/column counts. Unfortunately, that loosened
notion also applied to the check for the game being complete - so the
game would announce a win as soon as you had every square shaded, even
if you hadn't actually laid all the exact track positions down.

Now we separately count up the number of track-ish squares and the
number of fully completed ones, and use the former for error checking
and the latter for completion checking.
This commit is contained in:
Simon Tatham
2015-10-23 19:33:52 +01:00
parent 3234912f92
commit ffe8639619

View File

@ -1517,7 +1517,7 @@ static void dsf_update_completion(game_state *state, int *loopclass,
static int check_completion(game_state *state, int mark) static int check_completion(game_state *state, int mark)
{ {
int w = state->p.w, h = state->p.h, x, y, i, target, ret = TRUE; int w = state->p.w, h = state->p.h, x, y, i, target, ret = TRUE;
int ntrack, nnotrack; int ntrack, nnotrack, ntrackcomplete;
int *dsf, loopclass, pathclass; int *dsf, loopclass, pathclass;
if (mark) { if (mark) {
@ -1533,14 +1533,20 @@ static int check_completion(game_state *state, int mark)
} }
} }
/* A cell is 'complete' if it has any edges marked as TRACK. */ /* A cell is 'complete', for the purposes of marking the game as
* finished, if it has two edges marked as TRACK. But it only has
* to have one edge marked as TRACK, or be filled in as trackful
* without any specific edges known, to count towards checking
* row/column clue errors. */
for (x = 0; x < w; x++) { for (x = 0; x < w; x++) {
target = state->numbers->numbers[x]; target = state->numbers->numbers[x];
ntrack = nnotrack = 0; ntrack = nnotrack = ntrackcomplete = 0;
for (y = 0; y < h; y++) { for (y = 0; y < h; y++) {
if (S_E_COUNT(state, x, y, E_TRACK) > 0 || if (S_E_COUNT(state, x, y, E_TRACK) > 0 ||
state->sflags[y*w+x] & S_TRACK) state->sflags[y*w+x] & S_TRACK)
ntrack++; ntrack++;
if (S_E_COUNT(state, x, y, E_TRACK) == 2)
ntrackcomplete++;
if (state->sflags[y*w+x] & S_NOTRACK) if (state->sflags[y*w+x] & S_NOTRACK)
nnotrack++; nnotrack++;
} }
@ -1551,16 +1557,18 @@ static int check_completion(game_state *state, int mark)
state->num_errors[x] = 1; state->num_errors[x] = 1;
} }
} }
if (ntrack != target) if (ntrackcomplete != target)
ret = FALSE; ret = FALSE;
} }
for (y = 0; y < h; y++) { for (y = 0; y < h; y++) {
target = state->numbers->numbers[w+y]; target = state->numbers->numbers[w+y];
ntrack = nnotrack = 0; ntrack = nnotrack = ntrackcomplete = 0;
for (x = 0; x < w; x++) { for (x = 0; x < w; x++) {
if (S_E_COUNT(state, x, y, E_TRACK) > 0 || if (S_E_COUNT(state, x, y, E_TRACK) > 0 ||
state->sflags[y*w+x] & S_TRACK) state->sflags[y*w+x] & S_TRACK)
ntrack++; ntrack++;
if (S_E_COUNT(state, x, y, E_TRACK) == 2)
ntrackcomplete++;
if (state->sflags[y*w+x] & S_NOTRACK) if (state->sflags[y*w+x] & S_NOTRACK)
nnotrack++; nnotrack++;
} }
@ -1571,7 +1579,7 @@ static int check_completion(game_state *state, int mark)
state->num_errors[w+y] = 1; state->num_errors[w+y] = 1;
} }
} }
if (ntrack != target) if (ntrackcomplete != target)
ret = FALSE; ret = FALSE;
} }