mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
Fix an instance generation hang in Signpost.
Also expand the set of permissible parameters (add 1xN, Nx1 and 2x2).
This commit is contained in:

committed by
Simon Tatham

parent
d442b830e4
commit
bda4a963f4
17
signpost.c
17
signpost.c
@ -422,11 +422,12 @@ static game_params *custom_params(const config_item *cfg)
|
|||||||
|
|
||||||
static char *validate_params(const game_params *params, int full)
|
static char *validate_params(const game_params *params, int full)
|
||||||
{
|
{
|
||||||
if (params->w < 2 || params->h < 2)
|
if (params->w < 1) return "Width must be at least one";
|
||||||
return "Width and height must both be at least two";
|
if (params->h < 1) return "Height must be at least one";
|
||||||
if (params->w == 2 && params->h == 2) /* leads to generation hang */
|
if (full && params->w == 1 && params->h == 1)
|
||||||
return "Width and height cannot both be two";
|
/* The UI doesn't let us move these from unsolved to solved,
|
||||||
|
* so we disallow generating (but not playing) them. */
|
||||||
|
return "Width and height cannot both be one";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -623,6 +624,7 @@ static int new_game_fill(game_state *state, random_state *rs,
|
|||||||
|
|
||||||
state->dirs[taili] = 0;
|
state->dirs[taili] = 0;
|
||||||
nfilled = 2;
|
nfilled = 2;
|
||||||
|
assert(state->n > 1);
|
||||||
|
|
||||||
while (nfilled < state->n) {
|
while (nfilled < state->n) {
|
||||||
/* Try and expand _from_ headi; keep going if there's only one
|
/* Try and expand _from_ headi; keep going if there's only one
|
||||||
@ -638,6 +640,8 @@ static int new_game_fill(game_state *state, random_state *rs,
|
|||||||
an = cell_adj(state, headi, aidx, adir);
|
an = cell_adj(state, headi, aidx, adir);
|
||||||
} while (an == 1);
|
} while (an == 1);
|
||||||
|
|
||||||
|
if (nfilled == state->n) break;
|
||||||
|
|
||||||
/* Try and expand _to_ taili; keep going if there's only one
|
/* Try and expand _to_ taili; keep going if there's only one
|
||||||
* place to go to. */
|
* place to go to. */
|
||||||
an = cell_adj(state, taili, aidx, adir);
|
an = cell_adj(state, taili, aidx, adir);
|
||||||
@ -801,6 +805,9 @@ static char *new_game_desc(const game_params *params, random_state *rs,
|
|||||||
char *ret;
|
char *ret;
|
||||||
int headi, taili;
|
int headi, taili;
|
||||||
|
|
||||||
|
/* this shouldn't happen (validate_params), but let's play it safe */
|
||||||
|
if (params->w == 1 && params->h == 1) return dupstr("1a");
|
||||||
|
|
||||||
generate:
|
generate:
|
||||||
blank_game_into(state);
|
blank_game_into(state);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user