aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cube.c9
-rw-r--r--fifteen.c9
-rw-r--r--gtk.c5
-rw-r--r--midend.c18
-rw-r--r--net.c9
-rw-r--r--netslide.c9
-rw-r--r--nullgame.c9
-rw-r--r--pattern.c9
-rw-r--r--puzzles.h5
-rw-r--r--rect.c9
-rw-r--r--sixteen.c9
-rw-r--r--solo.c9
-rw-r--r--twiddle.c9
13 files changed, 104 insertions, 14 deletions
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,