chiark / gitweb /
Introduce the concept of a `game_aux_info' structure. This is
authorSimon Tatham <anakin@pobox.com>
Mon, 2 May 2005 10:12:26 +0000 (10:12 +0000)
committerSimon Tatham <anakin@pobox.com>
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.

[originally from svn r5729]

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 d2ef882d175a7cbe84c9e87618569fb7c1e59bea..33ef6d362694499d4b1caa4ce9e7a02880882733 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 8439faa3a941a8c8527da7ab6a781e4176fb823e..e31843dcacaf10e7c5d9f38da3658209c5fe21a5 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 8c6a6340b7da6f96d2be8412d6fb0a102ef35ebd..66ee767aa9eb154563ea819738e1c9e546a68e85 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 efe8111c51b80e46008a800f645e5f0507d64326..dbbaad44679a92a02467a6cfea15354795807091 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 78df30d9af52cd0b6077366339ad9b526454c609..3d4daa7f68a3f80002f6f5acbd3dcb35d28b51a6 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 11ca2efdaa79538391ec8200b85fc76420a89f9c..a7c3292af55c0e3d9187ac7a3551badbd1215b5d 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 9e2ea323d3c4ac66a9a232b3c5b3622fbc23eecf..296e76efdd1fedc389e1b57a6a865b8e1965e573 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 6dda1f48499c4faa1d281c3091e9baa641564e17..55f840f36daf1af8c196368a58c26d14e52deef5 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 d5c8924c7d3ac9bfb56a29d30cf6174475ff9e72..1a4f10f37095c69a41cc6e58049cac29c40d763b 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 0a1a5223e563227a54e55b715eb210c9573ec292..c0606dd3a1130404b4e8f2bdc09a495e5bc44fc4 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 4611e3cfa10121ded72d6b7065179ce0b67ead80..36c42815239c7c1b3aa4d74ccef565a7007b203b 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 c453b26e8bc802590e74022426788c23a4216e22..4b4adea712151c70a816d7d07f88a608da847db5 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 162f68b98efa0e0216e49f13a0adc2a09638f724..e296f48ff41c76ecd77dfdb504ce7c7c11c44a89 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,