X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/b443c3812325e91d84887ba4b873bccdae7d587e..cbb5549e12c8edfd8b38b642b7b25c1fb8912c9b:/sixteen.c diff --git a/sixteen.c b/sixteen.c index 1b0b4ea..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; @@ -358,13 +383,22 @@ void free_game(game_state *state) sfree(state); } -game_state *make_move(game_state *from, int x, int y, int button) +game_ui *new_ui(game_state *state) +{ + return NULL; +} + +void free_ui(game_ui *ui) +{ +} + +game_state *make_move(game_state *from, game_ui *ui, int x, int y, int button) { int cx, cy; 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); @@ -380,6 +414,13 @@ game_state *make_move(game_state *from, 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 { @@ -534,7 +575,8 @@ 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, float animtime, float flashtime) + game_state *state, int dir, game_ui *ui, + float animtime, float flashtime) { int i, bgcolour; @@ -622,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]; @@ -708,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;