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]
This commit is contained in:
Simon Tatham
2005-04-30 14:50:33 +00:00
parent 9b870146f7
commit 90db70378e

View File

@ -334,7 +334,9 @@ static char *new_game_seed(game_params *params, random_state *rs)
/* /*
* Now construct the game seed, by describing the grid as a * 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; ret = NULL;
retlen = 0; retlen = 0;
@ -342,12 +344,14 @@ static char *new_game_seed(game_params *params, random_state *rs)
char buf[80]; char buf[80];
int k; 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); ret = sresize(ret, retlen + k + 1, char);
strcpy(ret + retlen, buf); strcpy(ret + retlen, buf);
retlen += k; retlen += k;
} }
if (!params->orientable)
ret[retlen-1] = '\0'; /* delete last comma */ ret[retlen-1] = '\0'; /* delete last comma */
sfree(grid); sfree(grid);
@ -364,15 +368,17 @@ static char *validate_seed(game_params *params, char *seed)
err = NULL; err = NULL;
for (i = 0; i < wh; i++) { for (i = 0; i < wh; i++) {
if (*p < '0' || *p > '9') { if (*p < '0' || *p > '9')
return "Not enough numbers in string"; return "Not enough numbers in string";
}
while (*p >= '0' && *p <= '9') while (*p >= '0' && *p <= '9')
p++; p++;
if (i < wh-1 && *p != ',') { if (!params->orientable && i < wh-1) {
if (*p != ',')
return "Expected comma after number"; return "Expected comma after number";
} } else if (params->orientable && i < wh) {
else if (i == wh-1 && *p) { 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"; return "Excess junk at end of string";
} }
@ -402,11 +408,19 @@ static game_state *new_game(game_params *params, char *seed)
p = seed; p = seed;
for (i = 0; i < wh; i++) { for (i = 0; i < wh; i++) {
state->grid[i] = atoi(p); state->grid[i] = 4 * atoi(p);
while (*p >= '0' && *p <= '9') while (*p >= '0' && *p <= '9')
p++; p++;
if (*p) {
if (*p) p++; /* eat comma */ 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; return state;
@ -685,14 +699,14 @@ static void draw_tile(frontend *fe, game_state *state, int x, int y,
displ = TILE_SIZE / 2 - HIGHLIGHT_WIDTH - 2; displ = TILE_SIZE / 2 - HIGHLIGHT_WIDTH - 2;
displ2 = TILE_SIZE / 3 - HIGHLIGHT_WIDTH; displ2 = TILE_SIZE / 3 - HIGHLIGHT_WIDTH;
coords[0] = cx - displ * xdx - displ2 * ydx; coords[0] = cx - displ * xdx + displ2 * ydx;
coords[1] = cy - displ * xdy - displ2 * ydy; coords[1] = cy - displ * xdy + displ2 * ydy;
rotate(coords+0, rot); rotate(coords+0, rot);
coords[2] = cx + displ * xdx - displ2 * ydx; coords[2] = cx + displ * xdx + displ2 * ydx;
coords[3] = cy + displ * xdy - displ2 * ydy; coords[3] = cy + displ * xdy + displ2 * ydy;
rotate(coords+2, rot); rotate(coords+2, rot);
coords[4] = cx + displ * ydx; coords[4] = cx - displ * ydx;
coords[5] = cy + displ * ydy; coords[5] = cy - displ * ydy;
rotate(coords+4, rot); rotate(coords+4, rot);
draw_polygon(fe, coords, 3, TRUE, COL_LOWLIGHT_GENTLE); draw_polygon(fe, coords, 3, TRUE, COL_LOWLIGHT_GENTLE);
draw_polygon(fe, coords, 3, FALSE, COL_LOWLIGHT_GENTLE); draw_polygon(fe, coords, 3, FALSE, COL_LOWLIGHT_GENTLE);