X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/23e8c9fdb7d4aa0ee81226b92540e84225c03d9e..61072f7be9d1ab83c459ec1eabc0f9503b57fac6:/twiddle.c diff --git a/twiddle.c b/twiddle.c index 9ac4a3a..8000780 100644 --- a/twiddle.c +++ b/twiddle.c @@ -14,7 +14,8 @@ #include "puzzles.h" -#define TILE_SIZE 48 +#define PREFERRED_TILE_SIZE 48 +#define TILE_SIZE (ds->tilesize) #define BORDER (TILE_SIZE / 2) #define HIGHLIGHT_WIDTH (TILE_SIZE / 20) #define COORD(x) ( (x) * TILE_SIZE + BORDER ) @@ -362,7 +363,14 @@ static char *new_game_desc(game_params *params, random_state *rs, */ oldtotal = prevmoves[y*rw+x]; newtotal = oldtotal + r; - } while (abs(newtotal) < abs(oldtotal) || abs(newtotal) > 2); + + /* + * Special case here for w==h==n, in which case + * there is actually no way to _avoid_ all moves + * repeating or undoing previous ones. + */ + } while ((w != n || h != n) && + (abs(newtotal) < abs(oldtotal) || abs(newtotal) > 2)); do_rotate(grid, w, h, n, params->orientable, x, y, r); @@ -538,8 +546,8 @@ static int compare_int(const void *av, const void *bv) return 0; } -static game_state *solve_game(game_state *state, game_aux_info *aux, - char **error) +static game_state *solve_game(game_state *state, game_state *currstate, + game_aux_info *aux, char **error) { game_state *ret = dup_game(state); int i; @@ -616,6 +624,18 @@ static void free_ui(game_ui *ui) { } +static void game_changed_state(game_ui *ui, game_state *oldstate, + game_state *newstate) +{ +} + +struct game_drawstate { + int started; + int w, h, bgcolour; + int *grid; + int tilesize; +}; + static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, int x, int y, int button) { @@ -701,14 +721,23 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, * Drawing routines. */ -struct game_drawstate { - int started; - int w, h, bgcolour; - int *grid; -}; - -static void game_size(game_params *params, int *x, int *y) +static void game_size(game_params *params, game_drawstate *ds, + int *x, int *y, int expand) { + int tsx, tsy, ts; + /* + * Each window dimension equals the tile size times one more + * than the grid dimension (the border is half the width of the + * tiles). + */ + tsx = *x / (params->w + 1); + tsy = *y / (params->h + 1); + ts = min(tsx, tsy); + if (expand) + ds->tilesize = ts; + else + ds->tilesize = min(ts, PREFERRED_TILE_SIZE); + *x = TILE_SIZE * params->w + 2 * BORDER; *y = TILE_SIZE * params->h + 2 * BORDER; } @@ -756,6 +785,7 @@ static game_drawstate *game_new_drawstate(game_state *state) ds->h = state->h; ds->bgcolour = COL_BACKGROUND; ds->grid = snewn(ds->w*ds->h, int); + ds->tilesize = 0; /* haven't decided yet */ for (i = 0; i < ds->w*ds->h; i++) ds->grid[i] = -1; @@ -789,8 +819,9 @@ static void rotate(int *xy, struct rotation *rot) } } -static void draw_tile(frontend *fe, game_state *state, int x, int y, - int tile, int flash_colour, struct rotation *rot) +static void draw_tile(frontend *fe, game_drawstate *ds, game_state *state, + int x, int y, int tile, int flash_colour, + struct rotation *rot) { int coords[8]; char str[40]; @@ -1105,7 +1136,7 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, ds->grid[i] != t || ds->grid[i] == -1 || t == -1) { int x = COORD(tx), y = COORD(ty); - draw_tile(fe, state, x, y, state->grid[i], bgcolour, rot); + draw_tile(fe, ds, state, x, y, state->grid[i], bgcolour, rot); ds->grid[i] = t; } } @@ -1174,6 +1205,7 @@ const struct game thegame = { TRUE, game_text_format, new_ui, free_ui, + game_changed_state, make_move, game_size, game_colours,