Null-terminate generated Net/Netslide descriptive game IDs.
[sgt/puzzles] / gtk.c
diff --git a/gtk.c b/gtk.c
index 5cd6832..24b2cca 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -1000,7 +1000,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);
@@ -1036,6 +1036,14 @@ static frontend *new_window(char *game_id, char **error)
 
     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",
@@ -1123,9 +1131,24 @@ static frontend *new_window(char *game_id, char **error)
         fe->ncolours = ncolours;
         fe->colours = snewn(ncolours, GdkColor);
         for (i = 0; i < ncolours; i++) {
-            fe->colours[i].red = colours[i*3] * 0xFFFF;
-            fe->colours[i].green = colours[i*3+1] * 0xFFFF;
-            fe->colours[i].blue = colours[i*3+2] * 0xFFFF;
+            /*
+             * Just for Gareth: if you dislike any of the standard
+             * colours, here's your chance to configure them in a
+             * really hacky way. 
+             */
+            char buf[80], *e;
+            unsigned int r, g, b;
+            sprintf(buf, "PUZZLE_COLOUR_%d", i);
+            if ((e = getenv(buf)) != NULL &&
+                sscanf(e, "%2x%2x%2x", &r, &g, &b) == 3) {
+                fe->colours[i].red = r * 0x101;
+                fe->colours[i].green = g * 0x101;
+                fe->colours[i].blue = b * 0x101;
+            } else {
+                fe->colours[i].red = colours[i*3] * 0xFFFF;
+                fe->colours[i].green = colours[i*3+1] * 0xFFFF;
+                fe->colours[i].blue = colours[i*3+2] * 0xFFFF;
+            }
         }
         success = snewn(ncolours, gboolean);
         gdk_colormap_alloc_colors(fe->colmap, fe->colours, ncolours,
@@ -1239,34 +1262,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);
        }