D'oh, there's always one. Remove first-click stuff from the todo list.
[sgt/puzzles] / midend.c
index ce0a315..e31ce26 100644 (file)
--- a/midend.c
+++ b/midend.c
@@ -135,11 +135,16 @@ 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);
@@ -160,7 +165,8 @@ void midend_new_game(midend_data *me)
     }
 
     ensure(me);
-    me->states[me->nstates].state = me->ourgame->new_game(me->params, me->desc);
+    me->states[me->nstates].state =
+       me->ourgame->new_game(me, me->params, me->desc);
     me->states[me->nstates].special = TRUE;
     me->nstates++;
     me->statepos = 1;
@@ -207,7 +213,8 @@ static void midend_finish_move(midend_data *me)
        flashtime = me->ourgame->flash_length(me->oldstate ? me->oldstate :
                                              me->states[me->statepos-2].state,
                                              me->states[me->statepos-1].state,
-                                             me->oldstate ? me->dir : +1);
+                                             me->oldstate ? me->dir : +1,
+                                             me->ui);
        if (flashtime > 0) {
            me->flash_pos = 0.0F;
            me->flash_time = flashtime;
@@ -328,7 +335,7 @@ static int midend_really_process_key(midend_data *me, int x, int y, int button)
     } else {
         anim_time = me->ourgame->anim_length(oldstate,
                                              me->states[me->statepos-1].state,
-                                             me->dir);
+                                             me->dir, me->ui);
     }
 
     me->oldstate = oldstate;
@@ -489,7 +496,7 @@ float *midend_colours(midend_data *me, int *ncolours)
     if (me->nstates == 0) {
        game_aux_info *aux = NULL;
         char *desc = me->ourgame->new_desc(me->params, me->random, &aux);
-        state = me->ourgame->new_game(me->params, desc);
+        state = me->ourgame->new_game(me, me->params, desc);
         sfree(desc);
        if (aux)
            me->ourgame->free_aux_info(aux);
@@ -620,6 +627,12 @@ int midend_wants_statusbar(midend_data *me)
     return me->ourgame->wants_statusbar();
 }
 
+void midend_supersede_game_desc(midend_data *me, char *desc)
+{
+    sfree(me->desc);
+    me->desc = dupstr(desc);
+}
+
 config_item *midend_get_config(midend_data *me, int which, char **wintitle)
 {
     char *titlebuf, *parstr;
@@ -748,18 +761,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)
@@ -768,7 +786,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;
     }