mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
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:
20
tracks.c
20
tracks.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user