X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/9d8d4f9f372324dabebabf17b376fd340ec576b6..91adb2c5aa2b24a5927ad9ff9b3b16e5efffb4b1:/tents.c diff --git a/tents.c b/tents.c index dc22467..de20300 100644 --- a/tents.c +++ b/tents.c @@ -415,8 +415,12 @@ static game_params *custom_params(config_item *cfg) static char *validate_params(game_params *params, int full) { - if (params->w < 2 || params->h < 2) - return "Width and height must both be at least two"; + /* + * Generating anything under 4x4 runs into trouble of one kind + * or another. + */ + if (params->w < 4 || params->h < 4) + return "Width and height must both be at least four"; return NULL; } @@ -916,7 +920,7 @@ static char *new_game_desc(game_params *params, random_state *rs, char *puzzle = snewn(w*h, char); int *numbers = snewn(w+h, int); char *soln = snewn(w*h, char); - int *temp = snewn(2*w*h, int), *itemp = temp + w*h; + int *temp = snewn(2*w*h, int); int maxedges = ntrees*4 + w*h; int *edges = snewn(2*maxedges, int); int *capacity = snewn(maxedges, int); @@ -962,9 +966,9 @@ static char *new_game_desc(game_params *params, random_state *rs, * The maxflow algorithm is not randomised, so employed naively * it would give rise to grids with clear structure and * directional bias. Hence, I assign the network nodes as seen - * by maxflow to be a _random_ permutation the squares of the - * grid, so that any bias shown by maxflow towards low-numbered - * nodes is turned into a random bias. + * by maxflow to be a _random_ permutation of the squares of + * the grid, so that any bias shown by maxflow towards + * low-numbered nodes is turned into a random bias. * * This generation strategy can fail at many points, including * as early as tent placement (if you get a bad random order in @@ -979,16 +983,16 @@ static char *new_game_desc(game_params *params, random_state *rs, * trouble. */ + if (params->diff > DIFF_EASY && params->w <= 4 && params->h <= 4) + params->diff = DIFF_EASY; /* downgrade to prevent tight loop */ + while (1) { /* - * Arrange the grid squares into a random order, and invert - * that order so we can find a square's index as well. + * Arrange the grid squares into a random order. */ for (i = 0; i < w*h; i++) temp[i] = i; shuffle(temp, w*h, sizeof(*temp), rs); - for (i = 0; i < w*h; i++) - itemp[temp[i]] = i; /* * The first `ntrees' entries in temp which we can get @@ -1562,7 +1566,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds, ymin = min(ui->dsy, ui->dey); ymax = max(ui->dsy, ui->dey); assert(0 <= xmin && xmin <= xmax && xmax < w); - assert(0 <= ymin && ymin <= ymax && ymax < w); + assert(0 <= ymin && ymin <= ymax && ymax < h); buflen = 0; bufsize = 256; @@ -1573,8 +1577,8 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds, int v = drag_xform(ui, x, y, state->grid[y*w+x]); if (state->grid[y*w+x] != v) { tmplen = sprintf(tmpbuf, "%s%c%d,%d", sep, - (v == BLANK ? 'B' : - v == TENT ? 'T' : 'N'), + (int)(v == BLANK ? 'B' : + v == TENT ? 'T' : 'N'), x, y); sep = ";"; @@ -1806,7 +1810,7 @@ static void game_set_size(drawing *dr, game_drawstate *ds, ds->tilesize = tilesize; } -static float *game_colours(frontend *fe, game_state *state, int *ncolours) +static float *game_colours(frontend *fe, int *ncolours) { float *ret = snewn(3 * NCOLOURS, float); @@ -1972,7 +1976,7 @@ static void int_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate, * marginally nicer not to have the drag effects * flickering on and off disconcertingly. */ - if (ui->drag_button >= 0) + if (ui && ui->drag_button >= 0) v = drag_xform(ui, x, y, v); if (flashing && (v == TREE || v == TENT)) @@ -2009,11 +2013,6 @@ static float game_flash_length(game_state *oldstate, game_state *newstate, return 0.0F; } -static int game_wants_statusbar(void) -{ - return FALSE; -} - static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; @@ -2054,7 +2053,7 @@ static void game_print(drawing *dr, game_state *state, int tilesize) #endif const struct game thegame = { - "Tents", "games.tents", + "Tents", "games.tents", "tents", default_params, game_fetch_preset, decode_params, @@ -2085,9 +2084,9 @@ const struct game thegame = { game_anim_length, game_flash_length, TRUE, FALSE, game_print_size, game_print, - game_wants_statusbar, + FALSE, /* wants_statusbar */ FALSE, game_timing_state, - 0, /* mouse_priorities */ + REQUIRE_RBUTTON, /* flags */ }; #ifdef STANDALONE_SOLVER