From ef29354ca2a5a9d8ec5a36cd80b28467aca9608c Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 12 May 2004 12:32:27 +0000 Subject: [PATCH] Flash on completion. Two people actually complained! :-) git-svn-id: svn://svn.tartarus.org/sgt/puzzles@4218 cda61777-01e9-0310-a592-d414129be87e --- rect.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/rect.c b/rect.c index 35d7c25..7992598 100644 --- a/rect.c +++ b/rect.c @@ -76,6 +76,8 @@ struct game_params { #define TILE_SIZE 24 #define BORDER 18 +#define FLASH_TIME 0.13F + #define COORD(x) ( (x) * TILE_SIZE + BORDER ) #define FROMCOORD(x) ( ((x) - BORDER) / TILE_SIZE ) @@ -84,6 +86,7 @@ struct game_state { int *grid; /* contains the numbers */ unsigned char *vedge; /* (w+1) x h */ unsigned char *hedge; /* w x (h+1) */ + int completed; }; game_params *default_params(void) @@ -716,6 +719,7 @@ game_state *new_game(game_params *params, char *seed) state->grid = snewn(area, int); state->vedge = snewn(area, unsigned char); state->hedge = snewn(area, unsigned char); + state->completed = FALSE; i = 0; while (*seed) { @@ -756,6 +760,8 @@ game_state *dup_game(game_state *state) ret->hedge = snewn(state->w * state->h, unsigned char); ret->grid = snewn(state->w * state->h, int); + ret->completed = state->completed; + memcpy(ret->grid, state->grid, state->w * state->h * sizeof(int)); memcpy(ret->vedge, state->vedge, state->w*state->h*sizeof(unsigned char)); memcpy(ret->hedge, state->hedge, state->w*state->h*sizeof(unsigned char)); @@ -1032,6 +1038,26 @@ game_state *make_move(game_state *from, game_ui *ui, int x, int y, int button) free_game(ret); ret = NULL; } + + /* + * We've made a real change to the grid. Check to see + * if the game has been completed. + */ + if (!ret->completed) { + int x, y, ok; + unsigned char *correct = get_correct(ret); + + ok = TRUE; + for (x = 0; x < ret->w; x++) + for (y = 0; y < ret->h; y++) + if (!index(ret, correct, x, y)) + ok = FALSE; + + sfree(correct); + + if (ok) + ret->completed = TRUE; + } } ui->drag_start_x = -1; @@ -1239,7 +1265,7 @@ void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, c |= index(state,vedge,x,y) << 4; if (VRANGE(state,x,y+1)) c |= index(state,vedge,x,y+1) << 6; - if (index(state, correct, x, y)) + if (index(state, correct, x, y) && !flashtime) c |= CORRECT; if (index(ds,ds->visible,x,y) != c) { @@ -1263,6 +1289,8 @@ float game_anim_length(game_state *oldstate, game_state *newstate) float game_flash_length(game_state *oldstate, game_state *newstate) { + if (!oldstate->completed && newstate->completed) + return FLASH_TIME; return 0.0F; } -- 2.11.0