X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/74a4e547b35f162350dcf205aa453fd32820d249..5b5c6b1255fb259a0aa0c33ad9ae46c46b86bc61:/sixteen.c diff --git a/sixteen.c b/sixteen.c index cce11d9..f6215bd 100644 --- a/sixteen.c +++ b/sixteen.c @@ -8,11 +8,13 @@ #include #include #include +#include #include #include "puzzles.h" const char *const game_name = "Sixteen"; +const char *const game_winhelp_topic = "games.sixteen"; const int game_can_configure = TRUE; #define TILE_SIZE 48 @@ -92,6 +94,29 @@ game_params *dup_params(game_params *params) return ret; } +game_params *decode_params(char const *string) +{ + game_params *ret = default_params(); + + ret->w = ret->h = atoi(string); + while (*string && isdigit(*string)) string++; + if (*string == 'x') { + string++; + ret->h = atoi(string); + } + + return ret; +} + +char *encode_params(game_params *params) +{ + char data[256]; + + sprintf(data, "%dx%d", params->w, params->h); + + return dupstr(data); +} + config_item *game_configure(game_params *params) { config_item *ret; @@ -373,7 +398,7 @@ game_state *make_move(game_state *from, game_ui *ui, int x, int y, int button) int dx, dy, tx, ty, n; game_state *ret; - if (button != LEFT_BUTTON) + if (button != LEFT_BUTTON && button != RIGHT_BUTTON) return NULL; cx = FROMCOORD(x); @@ -389,6 +414,13 @@ game_state *make_move(game_state *from, game_ui *ui, int x, int y, int button) else return NULL; /* invalid click location */ + /* reverse direction if right hand button is pressed */ + if (button == RIGHT_BUTTON) + { + dx = -dx; if (dx) cx = from->w - 1 - cx; + dy = -dy; if (dy) cy = from->h - 1 - cy; + } + ret = dup_game(from); do { @@ -543,7 +575,7 @@ static void draw_arrow(frontend *fe, int x, int y, int xdx, int xdy) } void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, - game_state *state, game_ui *ui, + game_state *state, int dir, game_ui *ui, float animtime, float flashtime) { int i, bgcolour; @@ -632,10 +664,12 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, float c; int sense; - if (oldstate && state->movecount < oldstate->movecount) + if (dir < 0) { + assert(oldstate); sense = -oldstate->last_movement_sense; - else + } else { sense = state->last_movement_sense; + } t = state->tiles[i]; @@ -718,12 +752,12 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, } } -float game_anim_length(game_state *oldstate, game_state *newstate) +float game_anim_length(game_state *oldstate, game_state *newstate, int dir) { return ANIM_TIME; } -float game_flash_length(game_state *oldstate, game_state *newstate) +float game_flash_length(game_state *oldstate, game_state *newstate, int dir) { if (!oldstate->completed && newstate->completed) return 2 * FLASH_FRAME;