aboutsummaryrefslogtreecommitdiff
path: root/guess.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2011-06-19 13:43:35 +0000
committerSimon Tatham <anakin@pobox.com>2011-06-19 13:43:35 +0000
commit73daff393722196bf48244ca95dd4f64a351a473 (patch)
tree7ec80b64bd497a886d3e33bdd4d666e87937e042 /guess.c
parent8dcdb33b77ebbe56d0ad385285d21344df5ac5f9 (diff)
downloadpuzzles-73daff393722196bf48244ca95dd4f64a351a473.zip
puzzles-73daff393722196bf48244ca95dd4f64a351a473.tar.gz
puzzles-73daff393722196bf48244ca95dd4f64a351a473.tar.bz2
puzzles-73daff393722196bf48244ca95dd4f64a351a473.tar.xz
Changed my mind about midend_is_solved: I've now reprototyped it as
midend_status(), and given it three return codes for win, (permanent) loss and game-still-in-play. Depending on what the front end wants to use it for, it may find any or all of these three states worth distinguishing from each other. (I suppose a further enhancement might be to add _non_-permanent loss as a fourth distinct status, to describe situations in which you can't play further without pressing Undo but doing so is not completely pointless. That might reasonably include dead-end situations in Same Game and Pegs, and blown-self-up situations in Mines and Inertia. However, I haven't done this at present.) [originally from svn r9179]
Diffstat (limited to 'guess.c')
-rw-r--r--guess.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/guess.c b/guess.c
index 8cab1a4..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;
@@ -1273,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);
@@ -1313,14 +1313,13 @@ static float game_flash_length(game_state *oldstate, game_state *newstate,
return 0.0F;
}
-static int game_is_solved(game_state *state)
+static int game_status(game_state *state)
{
/*
- * We return true whenever the solution has been revealed, even
- * (on spoiler grounds) if it wasn't guessed correctly.
- *
- * However, in that situation, 'solved' is still true, so we don't
- * have to make any effort to arrange this.
+ * 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;
}
@@ -1373,7 +1372,7 @@ const struct game thegame = {
game_redraw,
game_anim_length,
game_flash_length,
- game_is_solved,
+ game_status,
FALSE, FALSE, game_print_size, game_print,
FALSE, /* wants_statusbar */
FALSE, game_timing_state,