diff --git a/cube.c b/cube.c index d2ef882..33ef6d3 100644 --- a/cube.c +++ b/cube.c @@ -589,7 +589,8 @@ static void classify_grid_square_callback(void *ctx, struct grid_square *sq) data->squareindex++; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { struct grid_data data; int i, j, k, m, area, facesperclass; @@ -690,6 +691,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return seed; } +static void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static void add_grid_square_callback(void *ctx, struct grid_square *sq) { game_state *state = (game_state *)ctx; @@ -1546,6 +1552,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/fifteen.c b/fifteen.c index 8439faa..e31843d 100644 --- a/fifteen.c +++ b/fifteen.c @@ -152,7 +152,8 @@ static int perm_parity(int *perm, int n) return ret; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { int gap, n, i, x; int x1, x2, p1, p2, parity; @@ -267,6 +268,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return ret; } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { char *p, *err; @@ -776,6 +782,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/gtk.c b/gtk.c index 8c6a634..66ee767 100644 --- a/gtk.c +++ b/gtk.c @@ -1203,9 +1203,12 @@ int main(int argc, char **argv) parstr = thegame.encode_params(par); while (n-- > 0) { - char *seed = thegame.new_seed(par, rs); + game_aux_info *aux = NULL; + char *seed = thegame.new_seed(par, rs, &aux); printf("%s:%s\n", parstr, seed); sfree(seed); + if (aux) + thegame.free_aux_info(aux); } return 0; diff --git a/midend.c b/midend.c index efe8111..dbbaad4 100644 --- a/midend.c +++ b/midend.c @@ -17,6 +17,7 @@ struct midend_data { const game *ourgame; char *seed; + game_aux_info *aux_info; int fresh_seed; int nstates, statesize, statepos; @@ -58,6 +59,7 @@ midend_data *midend_new(frontend *fe, const game *ourgame) me->states = NULL; me->params = ourgame->default_params(); me->seed = NULL; + me->aux_info = NULL; me->fresh_seed = FALSE; me->drawstate = NULL; me->oldstate = NULL; @@ -79,6 +81,8 @@ void midend_free(midend_data *me) { sfree(me->states); sfree(me->seed); + if (me->aux_info) + me->ourgame->free_aux_info(me->aux_info); me->ourgame->free_params(me->params); sfree(me); } @@ -106,7 +110,11 @@ void midend_new_game(midend_data *me) if (!me->fresh_seed) { sfree(me->seed); - me->seed = me->ourgame->new_seed(me->params, me->random); + if (me->aux_info) + me->ourgame->free_aux_info(me->aux_info); + me->aux_info = NULL; + me->seed = me->ourgame->new_seed(me->params, me->random, + &me->aux_info); } else me->fresh_seed = FALSE; @@ -399,9 +407,12 @@ float *midend_colours(midend_data *me, int *ncolours) float *ret; if (me->nstates == 0) { - char *seed = me->ourgame->new_seed(me->params, me->random); + game_aux_info *aux = NULL; + char *seed = me->ourgame->new_seed(me->params, me->random, &aux); state = me->ourgame->new_game(me->params, seed); sfree(seed); + if (aux) + me->ourgame->free_aux_info(aux); } else state = me->states[0]; @@ -540,6 +551,9 @@ char *midend_game_id(midend_data *me, char *id, int def_seed) sfree(me->seed); me->seed = dupstr(seed); me->fresh_seed = TRUE; + if (me->aux_info) + me->ourgame->free_aux_info(me->aux_info); + me->aux_info = NULL; } return NULL; diff --git a/net.c b/net.c index 78df30d..3d4daa7 100644 --- a/net.c +++ b/net.c @@ -290,7 +290,8 @@ static char *validate_params(game_params *params) * Randomly select a new game seed. */ -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { /* * The full description of a Net game is far too large to @@ -308,6 +309,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return dupstr(buf); } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { /* @@ -1509,6 +1515,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/netslide.c b/netslide.c index 11ca2ef..a7c3292 100644 --- a/netslide.c +++ b/netslide.c @@ -308,7 +308,8 @@ static char *validate_params(game_params *params) * Randomly select a new game seed. */ -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { /* * The full description of a Net game is far too large to @@ -326,6 +327,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return dupstr(buf); } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { /* @@ -1533,6 +1539,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/nullgame.c b/nullgame.c index 9e2ea32..296e76e 100644 --- a/nullgame.c +++ b/nullgame.c @@ -88,11 +88,17 @@ static char *validate_params(game_params *params) return NULL; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { return dupstr("FIXME"); } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { return NULL; @@ -223,6 +229,7 @@ const struct game thegame = { FALSE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/pattern.c b/pattern.c index 6dda1f4..55f840f 100644 --- a/pattern.c +++ b/pattern.c @@ -476,7 +476,8 @@ static unsigned char *generate_soluble(random_state *rs, int w, int h) return grid; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { unsigned char *grid; int i, j, max, rowlen, *rowdata; @@ -540,6 +541,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return seed; } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { int i, n, rowspace; @@ -1030,6 +1036,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/puzzles.h b/puzzles.h index d5c8924..1a4f10f 100644 --- a/puzzles.h +++ b/puzzles.h @@ -52,6 +52,7 @@ typedef struct midend_data midend_data; typedef struct random_state random_state; typedef struct game_params game_params; typedef struct game_state game_state; +typedef struct game_aux_info game_aux_info; typedef struct game_ui game_ui; typedef struct game_drawstate game_drawstate; typedef struct game game; @@ -189,7 +190,9 @@ struct game { config_item *(*configure)(game_params *params); game_params *(*custom_params)(config_item *cfg); char *(*validate_params)(game_params *params); - char *(*new_seed)(game_params *params, random_state *rs); + char *(*new_seed)(game_params *params, random_state *rs, + game_aux_info **aux); + void (*free_aux_info)(game_aux_info *aux); char *(*validate_seed)(game_params *params, char *seed); game_state *(*new_game)(game_params *params, char *seed); game_state *(*dup_game)(game_state *state); diff --git a/rect.c b/rect.c index 0a1a522..c0606dd 100644 --- a/rect.c +++ b/rect.c @@ -386,7 +386,8 @@ static void display_grid(game_params *params, int *grid, int *numbers, int all) } #endif -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { int *grid, *numbers; struct rectlist *list; @@ -898,6 +899,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return seed; } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { int area = params->w * params->h; @@ -1703,6 +1709,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/sixteen.c b/sixteen.c index 4611e3c..36c4281 100644 --- a/sixteen.c +++ b/sixteen.c @@ -172,7 +172,8 @@ static int perm_parity(int *perm, int n) return ret; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { int stop, n, i, x; int x1, x2, p1, p2; @@ -278,6 +279,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return ret; } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { @@ -823,6 +829,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/solo.c b/solo.c index c453b26..4b4adea 100644 --- a/solo.c +++ b/solo.c @@ -1351,7 +1351,8 @@ static int symmetries(game_params *params, int x, int y, int *output, int s) return i; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { int c = params->c, r = params->r, cr = c*r; int area = cr*cr; @@ -1513,6 +1514,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return seed; } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { int area = params->r * params->r * params->c * params->c; @@ -1959,6 +1965,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game, diff --git a/twiddle.c b/twiddle.c index 162f68b..e296f48 100644 --- a/twiddle.c +++ b/twiddle.c @@ -291,7 +291,8 @@ static int grid_complete(int *grid, int wh, int orientable) return ok; } -static char *new_game_seed(game_params *params, random_state *rs) +static char *new_game_seed(game_params *params, random_state *rs, + game_aux_info **aux) { int *grid; int w = params->w, h = params->h, n = params->n, wh = w*h; @@ -358,6 +359,11 @@ static char *new_game_seed(game_params *params, random_state *rs) return ret; } +void game_free_aux_info(game_aux_info *aux) +{ + assert(!"Shouldn't happen"); +} + static char *validate_seed(game_params *params, char *seed) { char *p, *err; @@ -985,6 +991,7 @@ const struct game thegame = { TRUE, game_configure, custom_params, validate_params, new_game_seed, + game_free_aux_info, validate_seed, new_game, dup_game,