aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cube.c2
-rw-r--r--fifteen.c2
-rw-r--r--flip.c2
-rw-r--r--guess.c2
-rw-r--r--midend.c5
-rw-r--r--mines.c19
-rw-r--r--net.c2
-rw-r--r--netslide.c2
-rw-r--r--nullgame.c2
-rw-r--r--pattern.c2
-rw-r--r--pegs.c2
-rw-r--r--puzzles.h2
-rw-r--r--rect.c2
-rw-r--r--samegame.c2
-rw-r--r--sixteen.c2
-rw-r--r--solo.c2
-rw-r--r--twiddle.c2
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;
}