Ensure that an old random seed isn't left around for the user to see when a
[sgt/puzzles] / gtk.c
diff --git a/gtk.c b/gtk.c
index 5cd6832..1e32c6a 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -937,6 +937,13 @@ static void menu_solve_event(GtkMenuItem *menuitem, gpointer data)
        error_box(fe->window, msg);
 }
 
+static void menu_restart_event(GtkMenuItem *menuitem, gpointer data)
+{
+    frontend *fe = (frontend *)data;
+
+    midend_restart_game(fe->me);
+}
+
 static void menu_config_event(GtkMenuItem *menuitem, gpointer data)
 {
     frontend *fe = (frontend *)data;
@@ -1000,7 +1007,7 @@ static frontend *new_window(char *game_id, char **error)
 
     fe->me = midend_new(fe, &thegame);
     if (game_id) {
-        *error = midend_game_id(fe->me, game_id, FALSE);
+        *error = midend_game_id(fe->me, game_id);
         if (*error) {
             midend_free(fe->me);
             sfree(fe);
@@ -1032,10 +1039,23 @@ static frontend *new_window(char *game_id, char **error)
     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
 
     add_menu_item_with_key(fe, GTK_CONTAINER(menu), "New", 'n');
-    add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Restart", 'r');
+
+    menuitem = gtk_menu_item_new_with_label("Restart");
+    gtk_container_add(GTK_CONTAINER(menu), menuitem);
+    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                      GTK_SIGNAL_FUNC(menu_restart_event), fe);
+    gtk_widget_show(menuitem);
 
     menuitem = gtk_menu_item_new_with_label("Specific...");
     gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
+                       GINT_TO_POINTER(CFG_DESC));
+    gtk_container_add(GTK_CONTAINER(menu), menuitem);
+    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                      GTK_SIGNAL_FUNC(menu_config_event), fe);
+    gtk_widget_show(menuitem);
+
+    menuitem = gtk_menu_item_new_with_label("Random Seed...");
+    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
                        GINT_TO_POINTER(CFG_SEED));
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
     gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
@@ -1216,6 +1236,12 @@ int main(int argc, char **argv)
     char *pname = argv[0];
     char *error;
 
+    if (argc > 1 && !strcmp(argv[1], "--version")) {
+       printf("%s, from Simon Tatham's Portable Puzzle Collection\n%s\n",
+              thegame.name, ver);
+       return 0;
+    }
+
     /*
      * Special standalone mode for generating puzzle IDs on the
      * command line. Useful for generating puzzles to be printed
@@ -1239,34 +1265,42 @@ int main(int argc, char **argv)
      */
     if (argc > 1 && !strcmp(argv[1], "--generate")) {
        int n = 1;
-       char *params = NULL;
+       char *params = NULL, *seed = NULL;
        game_params *par;
        random_state *rs;
        char *parstr;
 
-       {
-           void *seed;
-           int seedlen;
-           get_random_seed(&seed, &seedlen);
-           rs = random_init(seed, seedlen);
-       }
-
        if (argc > 2)
            n = atoi(argv[2]);
        if (argc > 3)
            params = argv[3];
 
-       if (params)
-           par = thegame.decode_params(params);
-       else
-           par = thegame.default_params();
-       parstr = thegame.encode_params(par);
+        par = thegame.default_params();
+       if (params) {
+            if ( (seed = strchr(params, '#')) != NULL )
+                *seed++ = '\0';
+           thegame.decode_params(par, params);
+        } else {
+        }
+       parstr = thegame.encode_params(par, FALSE);
+
+       {
+           void *seeddata;
+           int seedlen;
+            if (seed) {
+                seeddata = seed;
+                seedlen = strlen(seed);
+            } else {
+                get_random_seed(&seeddata, &seedlen);
+            }
+           rs = random_init(seeddata, seedlen);
+       }
 
        while (n-- > 0) {
            game_aux_info *aux = NULL;
-           char *seed = thegame.new_seed(par, rs, &aux);
-           printf("%s:%s\n", parstr, seed);
-           sfree(seed);
+           char *desc = thegame.new_desc(par, rs, &aux);
+           printf("%s:%s\n", parstr, desc);
+           sfree(desc);
            if (aux)
                thegame.free_aux_info(aux);
        }