X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=galaxies.c;h=53d6fab2db1bf519229805cdfdca4db102edc21e;hb=3234912f921916a1b8da164fd61dc75579358577;hp=84debc7b82db023099077f0735e2809973e9a0fd;hpb=83318d4218c6eca6535e70f136dd68ff60702eb0;p=sgt-puzzles.git diff --git a/galaxies.c b/galaxies.c index 84debc7..53d6fab 100644 --- a/galaxies.c +++ b/galaxies.c @@ -152,8 +152,9 @@ static int check_complete(const game_state *state, int *dsf, int *colours); static int solver_state(game_state *state, int maxdiff); static int solver_obvious(game_state *state); static int solver_obvious_dot(game_state *state, space *dot); -static space *space_opposite_dot(game_state *state, space *sp, space *dot); -static space *tile_opposite(game_state *state, space *sp); +static space *space_opposite_dot(const game_state *state, const space *sp, + const space *dot); +static space *tile_opposite(const game_state *state, const space *sp); /* ---------------------------------------------------------- * Game parameters and presets @@ -350,6 +351,7 @@ static void add_assoc(const game_state *state, space *tile, space *dot) { } static void add_assoc_with_opposite(game_state *state, space *tile, space *dot) { + int *colors; space *opposite = space_opposite_dot(state, tile, dot); if (opposite == NULL) { @@ -359,7 +361,21 @@ static void add_assoc_with_opposite(game_state *state, space *tile, space *dot) return; } + colors = snewn(state->w * state->h, int); + check_complete(state, NULL, colors); + if (colors[(tile->y - 1)/2 * state->w + (tile->x - 1)/2]) { + sfree(colors); + return; + } + if (colors[(opposite->y - 1)/2 * state->w + (opposite->x - 1)/2]) { + sfree(colors); + return; + } + + sfree(colors); + remove_assoc_with_opposite(state, tile); add_assoc(state, tile, dot); + remove_assoc_with_opposite(state, opposite); add_assoc(state, opposite, dot); } @@ -539,7 +555,8 @@ static int edges_into_vertex(game_state *state, } #endif -static space *space_opposite_dot(game_state *state, space *sp, space *dot) +static space *space_opposite_dot(const game_state *state, const space *sp, + const space *dot) { int dx, dy, tx, ty; space *sp2; @@ -555,7 +572,7 @@ static space *space_opposite_dot(game_state *state, space *sp, space *dot) return sp2; } -static space *tile_opposite(game_state *state, space *sp) +static space *tile_opposite(const game_state *state, const space *sp) { space *dot; @@ -1284,6 +1301,8 @@ generate: game_update_dots(state); + if (state->ndots == 1) goto generate; + #ifdef DEBUGGING { char *tmp = encode_game(state); @@ -2574,7 +2593,7 @@ static char *interpret_move(const game_state *state, game_ui *ui, if (INUI(state, px, py)) { sp = &SPACE(state, px, py); - if (!(sp->flags & F_DOT) && !(sp->flags & F_TILE_ASSOC)) + if (!(sp->flags & F_DOT)) sprintf(buf + strlen(buf), "%sA%d,%d,%d,%d", sep, px, py, ui->dotx, ui->doty); } @@ -3248,7 +3267,7 @@ static void game_redraw(drawing *dr, game_drawstate *ds, for (x = 0; x < w; x++) { unsigned long flags = 0; int ddx = 0, ddy = 0; - space *sp; + space *sp, *opp; int dx, dy; /* @@ -3286,6 +3305,11 @@ static void game_redraw(drawing *dr, game_drawstate *ds, * everything goes briefly back to background colour. */ sp = &SPACE(state, x*2+1, y*2+1); + if (sp->flags & F_TILE_ASSOC) { + opp = tile_opposite(state, sp); + } else { + opp = NULL; + } if (ds->colour_scratch[y*w+x] && !flashing) { flags |= (ds->colour_scratch[y*w+x] == 2 ? DRAW_BLACK : DRAW_WHITE); @@ -3301,7 +3325,9 @@ static void game_redraw(drawing *dr, game_drawstate *ds, */ if ((sp->flags & F_TILE_ASSOC) && !ds->colour_scratch[y*w+x]) { if (ui->dragging && ui->srcx == x*2+1 && ui->srcy == y*2+1) { - /* don't do it */ + /* tile is the source, don't do it */ + } else if (ui->dragging && opp && ui->srcx == opp->x && ui->srcy == opp->y) { + /* opposite tile is the source, don't do it */ } else if (sp->doty != y*2+1 || sp->dotx != x*2+1) { flags |= DRAW_ARROW; ddy = sp->doty - (y*2+1);