shithub: puzzles

Download patch

ref: 9e240e45df4929f77b1a088cffbf7aaa6050ed03
parent: 3f9d88f3e742ead492a0f47062645f3c14654b1f
author: Simon Tatham <anakin@pobox.com>
date: Mon May 2 06:12:26 EDT 2005

Introduce the concept of a `game_aux_info' structure. This is
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]

--- a/cube.c
+++ b/cube.c
@@ -589,7 +589,8 @@
 	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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/fifteen.c
+++ b/fifteen.c
@@ -152,7 +152,8 @@
     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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/gtk.c
+++ b/gtk.c
@@ -1203,9 +1203,12 @@
 	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;
--- a/midend.c
+++ b/midend.c
@@ -17,6 +17,7 @@
     const game *ourgame;
 
     char *seed;
+    game_aux_info *aux_info;
     int fresh_seed;
     int nstates, statesize, statepos;
 
@@ -58,6 +59,7 @@
     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 @@
 {
     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 @@
 
     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 *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 @@
         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;
--- a/net.c
+++ b/net.c
@@ -290,7 +290,8 @@
  * 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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/netslide.c
+++ b/netslide.c
@@ -308,7 +308,8 @@
  * 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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/nullgame.c
+++ b/nullgame.c
@@ -88,11 +88,17 @@
     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 @@
     FALSE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/pattern.c
+++ b/pattern.c
@@ -476,7 +476,8 @@
     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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/puzzles.h
+++ b/puzzles.h
@@ -52,6 +52,7 @@
 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 @@
     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);
--- a/rect.c
+++ b/rect.c
@@ -386,7 +386,8 @@
 }
 #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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/sixteen.c
+++ b/sixteen.c
@@ -172,7 +172,8 @@
     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,7 +279,12 @@
     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;
@@ -823,6 +829,7 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/solo.c
+++ b/solo.c
@@ -1351,7 +1351,8 @@
     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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,
--- a/twiddle.c
+++ b/twiddle.c
@@ -291,7 +291,8 @@
     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 @@
     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 @@
     TRUE, game_configure, custom_params,
     validate_params,
     new_game_seed,
+    game_free_aux_info,
     validate_seed,
     new_game,
     dup_game,