Move the colour configuration into midend.c so that it becomes
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 18 May 2005 09:04:47 +0000 (09:04 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 18 May 2005 09:04:47 +0000 (09:04 +0000)
cross-platform, and rename the environment variables so that they
follow the puzzle name. Should allow a static environment
configuration for each puzzle. Also introduced a <game>_PRESETS
variable for people whose favourite configuration isn't on the Type
menu by default.

git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5801 cda61777-01e9-0310-a592-d414129be87e

gtk.c
midend.c

diff --git a/gtk.c b/gtk.c
index 6de9fcf..55bc179 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -1143,24 +1143,9 @@ static frontend *new_window(char *game_id, char **error)
         fe->ncolours = ncolours;
         fe->colours = snewn(ncolours, GdkColor);
         for (i = 0; i < ncolours; i++) {
-            /*
-             * 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;
-            }
+            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,
index d35ad7c..192d7e5 100644 (file)
--- a/midend.c
+++ b/midend.c
@@ -8,6 +8,8 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <stdlib.h>
+#include <ctype.h>
 
 #include "puzzles.h"
 
@@ -498,6 +500,32 @@ float *midend_colours(midend_data *me, int *ncolours)
 
     ret = me->ourgame->colours(me->frontend, state, ncolours);
 
+    {
+        int i;
+
+        /*
+         * Allow environment-based overrides for the standard
+         * colours by defining variables along the lines of
+         * `NET_COLOUR_4=6000c0'.
+         */
+
+        for (i = 0; i < *ncolours; i++) {
+            char buf[80], *e;
+            unsigned int r, g, b;
+            int j;
+
+            sprintf(buf, "%s_COLOUR_%d", me->ourgame->name, i);
+            for (j = 0; buf[j]; j++)
+                buf[j] = toupper((unsigned char)buf[j]);
+            if ((e = getenv(buf)) != NULL &&
+                sscanf(e, "%2x%2x%2x", &r, &g, &b) == 3) {
+                ret[i*3 + 0] = r / 255.0;
+                ret[i*3 + 1] = g / 255.0;
+                ret[i*3 + 2] = b / 255.0;
+            }
+        }
+    }
+
     if (me->nstates == 0)
         me->ourgame->free_game(state);
 
@@ -525,6 +553,53 @@ int midend_num_presets(midend_data *me)
         }
     }
 
+    {
+        /*
+         * Allow environment-based extensions to the preset list by
+         * defining a variable along the lines of `SOLO_PRESETS=2x3
+         * Advanced:2x3da'. Colon-separated list of items,
+         * alternating between textual titles in the menu and
+         * encoded parameter strings.
+         */
+        char buf[80], *e, *p;
+        int j;
+
+        sprintf(buf, "%s_PRESETS", me->ourgame->name);
+        for (j = 0; buf[j]; j++)
+            buf[j] = toupper((unsigned char)buf[j]);
+
+        if ((e = getenv(buf)) != NULL) {
+            p = e = dupstr(e);
+
+            while (*p) {
+                char *name, *val;
+                game_params *preset;
+
+                name = p;
+                while (*p && *p != ':') p++;
+                if (*p) *p++ = '\0';
+                val = p;
+                while (*p && *p != ':') p++;
+                if (*p) *p++ = '\0';
+
+                preset = me->ourgame->default_params();
+                me->ourgame->decode_params(preset, val);
+
+                if (me->presetsize <= me->npresets) {
+                    me->presetsize = me->npresets + 10;
+                    me->presets = sresize(me->presets, me->presetsize,
+                                          game_params *);
+                    me->preset_names = sresize(me->preset_names,
+                                               me->presetsize, char *);
+                }
+
+                me->presets[me->npresets] = preset;
+                me->preset_names[me->npresets] = name;
+                me->npresets++;
+            }
+        }
+    }
+
     return me->npresets;
 }