Introduce the concept of a `game_aux_info' structure. This is
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 2 May 2005 10:12:26 +0000 (10:12 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Mon, 2 May 2005 10:12:26 +0000 (10:12 +0000)
constructed at the same time as an internally generated game seed,
so that it can preserve any interesting information known by the
program at generation time but not physically contained within the
text of the game seed itself. (Such as, for example, the solution.)
Currently not used for anything yet, but it will be.

git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5729 cda61777-01e9-0310-a592-d414129be87e

13 files changed:
cube.c
fifteen.c
gtk.c
midend.c
net.c
netslide.c
nullgame.c
pattern.c
puzzles.h
rect.c
sixteen.c
solo.c
twiddle.c

diff --git a/cube.c b/cube.c
index d2ef882..33ef6d3 100644 (file)
--- 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,
index 8439faa..e31843d 100644 (file)
--- 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 (file)
--- 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;
index efe8111..dbbaad4 100644 (file)
--- 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 (file)
--- 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,
index 11ca2ef..a7c3292 100644 (file)
@@ -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,
index 9e2ea32..296e76e 100644 (file)
@@ -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,
index 6dda1f4..55f840f 100644 (file)
--- 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,
index d5c8924..1a4f10f 100644 (file)
--- 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 (file)
--- 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,
index 4611e3c..36c4281 100644 (file)
--- 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 (file)
--- 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,
index 162f68b..e296f48 100644 (file)
--- 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,