struct game_state {
int width, height, wrapping, completed;
int last_rotate_x, last_rotate_y, last_rotate_dir;
- int used_solve, just_used_solve;
+ int used_solve;
unsigned char *tiles;
unsigned char *barriers;
};
* classes) by finding the representative of each tile and
* setting equivalence[one]=the_other.
*/
- equivalence = snewn(w * h, int);
- for (i = 0; i < w*h; i++)
- equivalence[i] = i; /* initially all distinct */
+ equivalence = snew_dsf(w * h);
/*
* On a non-wrapping grid, we instantly know that all the edges
perim2 = snewn(nperim, struct xyd);
memcpy(perim2, perimeter, nperim * sizeof(struct xyd));
/* Shuffle the perimeter, so as to search it without directional bias. */
- for (i = nperim; --i ;) {
- int j = random_upto(rs, i+1);
- struct xyd t;
-
- t = perim2[j];
- perim2[j] = perim2[i];
- perim2[i] = t;
- }
+ shuffle(perim2, nperim, sizeof(*perim2), rs);
for (i = 0; i < nperim; i++) {
int x2, y2;
h = state->height = params->height;
state->wrapping = params->wrapping;
state->last_rotate_dir = state->last_rotate_x = state->last_rotate_y = 0;
- state->completed = state->used_solve = state->just_used_solve = FALSE;
+ state->completed = state->used_solve = FALSE;
state->tiles = snewn(state->width * state->height, unsigned char);
memset(state->tiles, 0, state->width * state->height);
state->barriers = snewn(state->width * state->height, unsigned char);
ret->wrapping = state->wrapping;
ret->completed = state->completed;
ret->used_solve = state->used_solve;
- ret->just_used_solve = state->just_used_solve;
ret->last_rotate_dir = state->last_rotate_dir;
ret->last_rotate_x = state->last_rotate_x;
ret->last_rotate_y = state->last_rotate_y;
ui->cur_y = ui->cy = state->height / 2;
ui->cur_visible = FALSE;
get_random_seed(&seed, &seedsize);
- ui->rs = random_init(seed, seedsize);
+ ui->rs = random_new(seed, seedsize);
sfree(seed);
return ui;
int tx, ty, n, noanim, orig;
ret = dup_game(from);
- ret->just_used_solve = FALSE;
if (move[0] == 'J' || move[0] == 'S') {
if (move[0] == 'S')
- ret->just_used_solve = ret->used_solve = TRUE;
+ ret->used_solve = TRUE;
move++;
if (*move == ';')
ds->tilesize = tilesize;
}
-static float *game_colours(frontend *fe, game_state *state, int *ncolours)
+static float *game_colours(frontend *fe, int *ncolours)
{
float *ret;
int last_rotate_dir;
/*
- * Don't animate an auto-solve move.
- */
- if ((dir > 0 && newstate->just_used_solve) ||
- (dir < 0 && oldstate->just_used_solve))
- return 0.0F;
-
- /*
* Don't animate if last_rotate_dir is zero.
*/
last_rotate_dir = dir==-1 ? oldstate->last_rotate_dir :
return 0.0F;
}
-static int game_wants_statusbar(void)
-{
- return TRUE;
-}
-
static int game_timing_state(game_state *state, game_ui *ui)
{
return TRUE;
/* Ick: fake up `ds->tilesize' for macro expansion purposes */
game_drawstate ads, *ds = &ads;
- ads.tilesize = tilesize;
+ game_set_size(dr, ds, NULL, tilesize);
/*
* Border.
#endif
const struct game thegame = {
- "Net", "games.net",
+ "Net", "games.net", "net",
default_params,
game_fetch_preset,
decode_params,
game_anim_length,
game_flash_length,
TRUE, FALSE, game_print_size, game_print,
- game_wants_statusbar,
+ TRUE, /* wants_statusbar */
FALSE, game_timing_state,
- 0, /* mouse_priorities */
+ 0, /* flags */
};