shithub: puzzles

Download patch

ref: 90db70378ee4b977c23984a2e1807d4ecd76de42
parent: 9b870146f7912c0d28b299c6970f3b733d14e036
author: Simon Tatham <anakin@pobox.com>
date: Sat Apr 30 10:50:33 EDT 2005

Fix game IDs, which I broke in the orientability change. Also
introduce a sensible game ID notation for orientable games, and
finally (*blush*) turn the orientability triangles back the right
way up.

[originally from svn r5718]

--- a/twiddle.c
+++ b/twiddle.c
@@ -334,7 +334,9 @@
 
     /*
      * Now construct the game seed, by describing the grid as a
-     * simple sequence of comma-separated integers.
+     * simple sequence of integers. They're comma-separated, unless
+     * the puzzle is orientable in which case they're separated by
+     * orientation letters `u', `d', `l' and `r'.
      */
     ret = NULL;
     retlen = 0;
@@ -342,13 +344,15 @@
         char buf[80];
         int k;
 
-        k = sprintf(buf, "%d,", grid[i]);
+        k = sprintf(buf, "%d%c", grid[i] / 4,
+		    params->orientable ? "uldr"[grid[i] & 3] : ',');
 
         ret = sresize(ret, retlen + k + 1, char);
         strcpy(ret + retlen, buf);
         retlen += k;
     }
-    ret[retlen-1] = '\0';              /* delete last comma */
+    if (!params->orientable)
+	ret[retlen-1] = '\0';	       /* delete last comma */
 
     sfree(grid);
     return ret;
@@ -364,15 +368,17 @@
     err = NULL;
 
     for (i = 0; i < wh; i++) {
-	if (*p < '0' || *p > '9') {
+	if (*p < '0' || *p > '9')
 	    return "Not enough numbers in string";
-	}
 	while (*p >= '0' && *p <= '9')
 	    p++;
-	if (i < wh-1 && *p != ',') {
-	    return "Expected comma after number";
-	}
-	else if (i == wh-1 && *p) {
+	if (!params->orientable && i < wh-1) {
+	    if (*p != ',')
+		return "Expected comma after number";
+	} else if (params->orientable && i < wh) {
+	    if (*p != 'l' && *p != 'r' && *p != 'u' && *p != 'd')
+		return "Expected orientation letter after number";
+	} else if (i == wh-1 && *p) {
 	    return "Excess junk at end of string";
 	}
 
@@ -402,11 +408,19 @@
     p = seed;
 
     for (i = 0; i < wh; i++) {
-	state->grid[i] = atoi(p);
+	state->grid[i] = 4 * atoi(p);
 	while (*p >= '0' && *p <= '9')
 	    p++;
-
-	if (*p) p++;		       /* eat comma */
+	if (*p) {
+	    if (params->orientable) {
+		switch (*p) {
+		  case 'l': state->grid[i] |= 1; break;
+		  case 'd': state->grid[i] |= 2; break;
+		  case 'r': state->grid[i] |= 3; break;
+		}
+	    }
+	    p++;
+	}
     }
 
     return state;
@@ -685,14 +699,14 @@
 	displ = TILE_SIZE / 2 - HIGHLIGHT_WIDTH - 2;
 	displ2 = TILE_SIZE / 3 - HIGHLIGHT_WIDTH;
 
-	coords[0] = cx - displ * xdx - displ2 * ydx;
-	coords[1] = cy - displ * xdy - displ2 * ydy;
+	coords[0] = cx - displ * xdx + displ2 * ydx;
+	coords[1] = cy - displ * xdy + displ2 * ydy;
 	rotate(coords+0, rot);
-	coords[2] = cx + displ * xdx - displ2 * ydx;
-	coords[3] = cy + displ * xdy - displ2 * ydy;
+	coords[2] = cx + displ * xdx + displ2 * ydx;
+	coords[3] = cy + displ * xdy + displ2 * ydy;
 	rotate(coords+2, rot);
-	coords[4] = cx + displ * ydx;
-	coords[5] = cy + displ * ydy;
+	coords[4] = cx - displ * ydx;
+	coords[5] = cy - displ * ydy;
 	rotate(coords+4, rot);
 	draw_polygon(fe, coords, 3, TRUE, COL_LOWLIGHT_GENTLE);
 	draw_polygon(fe, coords, 3, FALSE, COL_LOWLIGHT_GENTLE);