From 4d08de49555f22d1fcf2d9977a19591a0f465b2d Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 10 Jul 2005 10:17:13 +0000 Subject: [PATCH] game_timing_state() now has access to the game_ui. This means that whether the timer is currently going is no longer solely dependent on the current game_state: it can be dependent on more persistent information stored in the game_ui. In particular, Mines now freezes the timer permanently once you complete a grid for the first time, so that you can then backtrack through your solution process without destroying the information about how long it took you the first time through. git-svn-id: svn://svn.tartarus.org/sgt/puzzles@6088 cda61777-01e9-0310-a592-d414129be87e --- cube.c | 2 +- fifteen.c | 2 +- flip.c | 2 +- guess.c | 2 +- midend.c | 5 +++-- mines.c | 19 ++++++++++++++----- net.c | 2 +- netslide.c | 2 +- nullgame.c | 2 +- pattern.c | 2 +- pegs.c | 2 +- puzzles.h | 2 +- rect.c | 2 +- samegame.c | 2 +- sixteen.c | 2 +- solo.c | 2 +- twiddle.c | 2 +- 17 files changed, 32 insertions(+), 22 deletions(-) diff --git a/cube.c b/cube.c index 2003163..c1462e7 100644 --- a/cube.c +++ b/cube.c @@ -1687,7 +1687,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/fifteen.c b/fifteen.c index 3ce9611..c076350 100644 --- a/fifteen.c +++ b/fifteen.c @@ -832,7 +832,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/flip.c b/flip.c index 4125d6d..2ec16ba 100644 --- a/flip.c +++ b/flip.c @@ -1239,7 +1239,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/guess.c b/guess.c index fc82389..e9b0ca0 100644 --- a/guess.c +++ b/guess.c @@ -1262,7 +1262,7 @@ static int game_wants_statusbar(void) return FALSE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/midend.c b/midend.c index b5ce237..909368c 100644 --- a/midend.c +++ b/midend.c @@ -237,7 +237,8 @@ void midend_set_params(midend_data *me, game_params *params) static void midend_set_timer(midend_data *me) { me->timing = (me->ourgame->is_timed && - me->ourgame->timing_state(me->states[me->statepos-1].state)); + me->ourgame->timing_state(me->states[me->statepos-1].state, + me->ui)); if (me->timing || me->flash_time || me->anim_time) activate_timer(me->frontend); else @@ -311,10 +312,10 @@ void midend_new_game(midend_data *me) me->drawstate = me->ourgame->new_drawstate(me->states[0].state); midend_size_new_drawstate(me); me->elapsed = 0.0F; - midend_set_timer(me); if (me->ui) me->ourgame->free_ui(me->ui); me->ui = me->ourgame->new_ui(me->states[0].state); + midend_set_timer(me); me->pressed_mouse_button = 0; } diff --git a/mines.c b/mines.c index cf32064..f962dd6 100644 --- a/mines.c +++ b/mines.c @@ -2336,7 +2336,7 @@ struct game_ui { int hx, hy, hradius; /* for mouse-down highlights */ int validradius; int flash_is_death; - int deaths; + int deaths, completed; }; static game_ui *new_ui(game_state *state) @@ -2345,6 +2345,7 @@ static game_ui *new_ui(game_state *state) ui->hx = ui->hy = -1; ui->hradius = ui->validradius = 0; ui->deaths = 0; + ui->completed = FALSE; ui->flash_is_death = FALSE; /* *shrug* */ return ui; } @@ -2358,20 +2359,28 @@ static char *encode_ui(game_ui *ui) { char buf[80]; /* - * The deaths counter needs preserving across a serialisation. + * The deaths counter and completion status need preserving + * across a serialisation. */ sprintf(buf, "D%d", ui->deaths); + if (ui->completed) + strcat(buf, "C"); return dupstr(buf); } static void decode_ui(game_ui *ui, char *encoding) { - sscanf(encoding, "D%d", &ui->deaths); + int p; + sscanf(encoding, "D%d%n", &ui->deaths, &p); + if (encoding[p] == 'C') + ui->completed = TRUE; } static void game_changed_state(game_ui *ui, game_state *oldstate, game_state *newstate) { + if (newstate->won) + ui->completed = TRUE; } struct game_drawstate { @@ -3015,9 +3024,9 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { - if (state->dead || state->won || !state->layout->mines) + if (state->dead || state->won || ui->completed || !state->layout->mines) return FALSE; return TRUE; } diff --git a/net.c b/net.c index 4fada1c..a788d46 100644 --- a/net.c +++ b/net.c @@ -2723,7 +2723,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/netslide.c b/netslide.c index 12fabd7..1962d92 100644 --- a/netslide.c +++ b/netslide.c @@ -1776,7 +1776,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return FALSE; } diff --git a/nullgame.c b/nullgame.c index 8af76ce..212d5c2 100644 --- a/nullgame.c +++ b/nullgame.c @@ -238,7 +238,7 @@ static int game_wants_statusbar(void) return FALSE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/pattern.c b/pattern.c index f83746a..3f2d65e 100644 --- a/pattern.c +++ b/pattern.c @@ -1159,7 +1159,7 @@ static int game_wants_statusbar(void) return FALSE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/pegs.c b/pegs.c index ebc7085..5bb5de2 100644 --- a/pegs.c +++ b/pegs.c @@ -1174,7 +1174,7 @@ static int game_wants_statusbar(void) return FALSE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/puzzles.h b/puzzles.h index e35bece..e05a3e4 100644 --- a/puzzles.h +++ b/puzzles.h @@ -305,7 +305,7 @@ struct game { game_ui *ui); int (*wants_statusbar)(void); int is_timed; - int (*timing_state)(game_state *state); + int (*timing_state)(game_state *state, game_ui *ui); int mouse_priorities; }; diff --git a/rect.c b/rect.c index fbe5b79..f7aa10f 100644 --- a/rect.c +++ b/rect.c @@ -2758,7 +2758,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/samegame.c b/samegame.c index 6653799..810a8eb 100644 --- a/samegame.c +++ b/samegame.c @@ -947,7 +947,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/sixteen.c b/sixteen.c index 21c10c2..0e4f8a8 100644 --- a/sixteen.c +++ b/sixteen.c @@ -1008,7 +1008,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/solo.c b/solo.c index b85edeb..139fa00 100644 --- a/solo.c +++ b/solo.c @@ -2599,7 +2599,7 @@ static int game_wants_statusbar(void) return FALSE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } diff --git a/twiddle.c b/twiddle.c index 3e9e74e..2f33fb7 100644 --- a/twiddle.c +++ b/twiddle.c @@ -1175,7 +1175,7 @@ static int game_wants_statusbar(void) return TRUE; } -static int game_timing_state(game_state *state) +static int game_timing_state(game_state *state, game_ui *ui) { return TRUE; } -- 2.11.0