mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
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:
46
twiddle.c
46
twiddle.c
@ -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);
|
||||||
|
Reference in New Issue
Block a user