Mention NetWalk and update comment
[sgt/puzzles] / midend.c
index 192d7e5..070f4f3 100644 (file)
--- a/midend.c
+++ b/midend.c
@@ -34,7 +34,7 @@ struct midend_data {
     char **preset_names;
     int npresets, presetsize;
 
-    game_params *params, *tmpparams;
+    game_params *params, *curparams;
     struct midend_state_entry *states;
     game_drawstate *drawstate;
     game_state *oldstate;
@@ -68,7 +68,7 @@ midend_data *midend_new(frontend *fe, const game *ourgame)
     me->nstates = me->statesize = me->statepos = 0;
     me->states = NULL;
     me->params = ourgame->default_params();
-    me->tmpparams = NULL;
+    me->curparams = NULL;
     me->desc = NULL;
     me->seedstr = NULL;
     me->aux_info = NULL;
@@ -98,8 +98,8 @@ void midend_free(midend_data *me)
     if (me->aux_info)
        me->ourgame->free_aux_info(me->aux_info);
     me->ourgame->free_params(me->params);
-    if (me->tmpparams)
-        me->ourgame->free_params(me->tmpparams);
+    if (me->curparams)
+        me->ourgame->free_params(me->curparams);
     sfree(me);
 }
 
@@ -135,14 +135,23 @@ void midend_new_game(midend_data *me)
             /*
              * Generate a new random seed. 15 digits comes to about
              * 48 bits, which should be more than enough.
+             * 
+             * I'll avoid putting a leading zero on the number,
+             * just in case it confuses anybody who thinks it's
+             * processed as an integer rather than a string.
              */
             char newseed[16];
             int i;
             newseed[15] = '\0';
-            for (i = 0; i < 15; i++)
+            newseed[0] = '1' + random_upto(me->random, 9);
+            for (i = 1; i < 15; i++)
                 newseed[i] = '0' + random_upto(me->random, 10);
             sfree(me->seedstr);
             me->seedstr = dupstr(newseed);
+
+           if (me->curparams)
+               me->ourgame->free_params(me->curparams);
+           me->curparams = me->ourgame->dup_params(me->params);
         }
 
        sfree(me->desc);
@@ -151,14 +160,8 @@ void midend_new_game(midend_data *me)
        me->aux_info = NULL;
 
         rs = random_init(me->seedstr, strlen(me->seedstr));
-        me->desc = me->ourgame->new_desc
-            (me->tmpparams ? me->tmpparams : me->params, rs, &me->aux_info);
+        me->desc = me->ourgame->new_desc(me->curparams, rs, &me->aux_info);
         random_free(rs);
-
-        if (me->tmpparams) {
-            me->ourgame->free_params(me->tmpparams);
-            me->tmpparams = NULL;
-        }
     }
 
     ensure(me);
@@ -585,6 +588,12 @@ int midend_num_presets(midend_data *me)
                 preset = me->ourgame->default_params();
                 me->ourgame->decode_params(preset, val);
 
+               if (me->ourgame->validate_params(preset)) {
+                   /* Drop this one from the list. */
+                   me->ourgame->free_params(preset);
+                   continue;
+               }
+
                 if (me->presetsize <= me->npresets) {
                     me->presetsize = me->npresets + 10;
                     me->presets = sresize(me->presets, me->presetsize,
@@ -651,7 +660,7 @@ config_item *midend_get_config(midend_data *me, int which, char **wintitle)
          * the former is likely to persist across many code
          * changes).
          */
-        parstr = me->ourgame->encode_params(me->params, which == CFG_SEED);
+        parstr = me->ourgame->encode_params(me->curparams, which == CFG_SEED);
         if (which == CFG_DESC) {
             ret[0].sval = snewn(strlen(parstr) + strlen(me->desc) + 2, char);
             sprintf(ret[0].sval, "%s:%s", parstr, me->desc);
@@ -731,9 +740,9 @@ static char *midend_game_id_int(midend_data *me, char *id, int defmode)
             me->ourgame->free_params(tmpparams);
             return error;
         }
-        if (me->tmpparams)
-            me->ourgame->free_params(me->tmpparams);
-        me->tmpparams = tmpparams;
+        if (me->curparams)
+            me->ourgame->free_params(me->curparams);
+        me->curparams = tmpparams;
 
         /*
          * Now filter only the persistent parts of this state into
@@ -744,18 +753,23 @@ static char *midend_game_id_int(midend_data *me, char *id, int defmode)
         if (seed || desc) {
             char *tmpstr = me->ourgame->encode_params(tmpparams, FALSE);
             me->ourgame->decode_params(me->params, tmpstr);
+            sfree(tmpstr);
         } else {
             me->ourgame->free_params(me->params);
             me->params = me->ourgame->dup_params(tmpparams);
         }
     }
 
+    sfree(me->desc);
+    me->desc = NULL;
+    sfree(me->seedstr);
+    me->seedstr = NULL;
+
     if (desc) {
         error = me->ourgame->validate_desc(me->params, desc);
         if (error)
             return error;
 
-        sfree(me->desc);
         me->desc = dupstr(desc);
         me->genmode = GOT_DESC;
        if (me->aux_info)
@@ -764,7 +778,6 @@ static char *midend_game_id_int(midend_data *me, char *id, int defmode)
     }
 
     if (seed) {
-        sfree(me->seedstr);
         me->seedstr = dupstr(seed);
         me->genmode = GOT_SEED;
     }