diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-06-28 11:14:09 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-06-28 11:14:09 +0000 |
| commit | 89fdc09c29f1219a7660ad6d1839cc914a009c02 (patch) | |
| tree | c9e9e95e109aa01df1a0ca8d310467929cf3049b /netslide.c | |
| parent | 6c9beb697bd61c7e8d0eac8b7fce54cde134d9c9 (diff) | |
| download | puzzles-89fdc09c29f1219a7660ad6d1839cc914a009c02.zip puzzles-89fdc09c29f1219a7660ad6d1839cc914a009c02.tar.gz puzzles-89fdc09c29f1219a7660ad6d1839cc914a009c02.tar.bz2 puzzles-89fdc09c29f1219a7660ad6d1839cc914a009c02.tar.xz | |
More serialisation changes: the game_aux_info structure has now been
retired, and replaced with a simple string. Most of the games which
use it simply encode the string in the same way that the Solve move
will also be encoded, i.e. solve_game() simply returns
dupstr(aux_info). Again, this is a better approach than writing
separate game_aux_info serialise/deserialise functions because doing
it this way is self-testing (the strings are created and parsed
during the course of any Solve operation at all).
[originally from svn r6029]
Diffstat (limited to 'netslide.c')
| -rw-r--r-- | netslide.c | 51 |
1 files changed, 16 insertions, 35 deletions
@@ -82,11 +82,6 @@ struct game_params { int movetarget; }; -struct game_aux_info { - int width, height; - unsigned char *tiles; -}; - struct game_state { int width, height, cx, cy, wrapping, completed; int used_solve, just_used_solve; @@ -330,7 +325,7 @@ static char *validate_params(game_params *params) */ static char *new_game_desc(game_params *params, random_state *rs, - game_aux_info **aux, int interactive) + char **aux, int interactive) { tree234 *possibilities, *barriertree; int w, h, x, y, cx, cy, nbarriers; @@ -535,19 +530,22 @@ static char *new_game_desc(game_params *params, random_state *rs, } /* - * Save the unshuffled grid. We do this using a separate - * reference-counted structure since it's a large chunk of - * memory which we don't want to have to replicate in every - * game state while playing. + * Save the unshuffled grid in aux. */ { - game_aux_info *solution; + char *solution; + int i; + + /* + * String format is exactly the same as a solve move, so we + * can just dupstr this in solve_game(). + */ - solution = snew(game_aux_info); - solution->width = w; - solution->height = h; - solution->tiles = snewn(w * h, unsigned char); - memcpy(solution->tiles, tiles, w * h); + solution = snewn(w * h + 2, char); + solution[0] = 'S'; + for (i = 0; i < w * h; i++) + solution[i+1] = "0123456789abcdef"[tiles[i] & 0xF]; + solution[w*h+1] = '\0'; *aux = solution; } @@ -698,12 +696,6 @@ static char *new_game_desc(game_params *params, random_state *rs, return desc; } -static void game_free_aux_info(game_aux_info *aux) -{ - sfree(aux->tiles); - sfree(aux); -} - static char *validate_desc(game_params *params, char *desc) { int w = params->width, h = params->height; @@ -894,24 +886,14 @@ static void free_game(game_state *state) } static char *solve_game(game_state *state, game_state *currstate, - game_aux_info *aux, char **error) + char *aux, char **error) { - char *ret; - int i; - if (!aux) { *error = "Solution not known for this puzzle"; return NULL; } - assert(aux->width == state->width); - assert(aux->height == state->height); - ret = snewn(aux->width * aux->height + 2, char); - ret[0] = 'S'; - for (i = 0; i < aux->width * aux->height; i++) - ret[i+1] = "0123456789abcdef"[aux->tiles[i] & 0xF]; - ret[i+1] = '\0'; - return ret; + return dupstr(aux); } static char *game_text_format(game_state *state) @@ -1822,7 +1804,6 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_desc, - game_free_aux_info, validate_desc, new_game, dup_game, |