X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/0dc6df563b8adda28a305ff9c5276b05441a9753..b4b0a0ff28669d3677dc7d7e658bd473bb3de250:/guess.c diff --git a/guess.c b/guess.c index 38cdf25..a9fc134 100644 --- a/guess.c +++ b/guess.c @@ -43,7 +43,7 @@ struct game_state { pegrow solution; int next_go; /* from 0 to nguesses-1; if next_go == nguesses then they've lost. */ - int solved; + int solved; /* +1 = win, -1 = lose, 0 = still playing */ }; static game_params *default_params(void) @@ -790,7 +790,7 @@ static game_state *execute_move(game_state *from, char *move) if (!strcmp(move, "S")) { ret = dup_game(from); - ret->solved = 1; + ret->solved = -1; return ret; } else if (move[0] == 'G') { p = move+1; @@ -817,11 +817,11 @@ static game_state *execute_move(game_state *from, char *move) nc_place = mark_pegs(ret->guesses[from->next_go], ret->solution, ret->params.ncolours); if (nc_place == ret->solution->npegs) { - ret->solved = 1; /* win! */ + ret->solved = +1; /* win! */ } else { ret->next_go = from->next_go + 1; if (ret->next_go >= ret->params.nguesses) - ret->solved = 1; /* 'lose' so we show the pegs. */ + ret->solved = -1; /* lose, meaning we show the pegs. */ } return ret; @@ -1210,10 +1210,9 @@ static void game_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate, game_state *state, int dir, game_ui *ui, float animtime, float flashtime) { - int i, new_move, last_go; + int i, new_move; new_move = (state->next_go != ds->next_go) || !ds->started; - last_go = (state->next_go == state->params.nguesses-1); if (!ds->started) { draw_rect(dr, 0, 0, ds->w, ds->h, COL_BACKGROUND); @@ -1274,7 +1273,7 @@ static void game_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate, currmove_redraw(dr, ds, state->next_go, COL_HOLD); /* draw the solution (or the big rectangle) */ - if ((state->solved != ds->solved) || !ds->started) { + if ((!state->solved ^ !ds->solved) || !ds->started) { draw_rect(dr, SOLN_OX, SOLN_OY, SOLN_W, SOLN_H, state->solved ? COL_BACKGROUND : COL_EMPTY); draw_update(dr, SOLN_OX, SOLN_OY, SOLN_W, SOLN_H); @@ -1314,6 +1313,17 @@ static float game_flash_length(game_state *oldstate, game_state *newstate, return 0.0F; } +static int game_status(game_state *state) +{ + /* + * We return nonzero whenever the solution has been revealed, even + * (on spoiler grounds) if it wasn't guessed correctly. The + * correct return value from this function is already in + * state->solved. + */ + return state->solved; +} + static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; @@ -1362,6 +1372,7 @@ const struct game thegame = { game_redraw, game_anim_length, game_flash_length, + game_status, FALSE, FALSE, game_print_size, game_print, FALSE, /* wants_statusbar */ FALSE, game_timing_state,