chiark / gitweb /
game_timing_state() now has access to the game_ui. This means that
authorSimon Tatham <anakin@pobox.com>
Sun, 10 Jul 2005 10:17:13 +0000 (10:17 +0000)
committerSimon Tatham <anakin@pobox.com>
Sun, 10 Jul 2005 10:17:13 +0000 (10:17 +0000)
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.

[originally from svn r6088]

17 files changed:
cube.c
fifteen.c
flip.c
guess.c
midend.c
mines.c
net.c
netslide.c
nullgame.c
pattern.c
pegs.c
puzzles.h
rect.c
samegame.c
sixteen.c
solo.c
twiddle.c

diff --git a/cube.c b/cube.c
index 200316338e15b3d437230707dc0b86d0c317754e..c1462e79f67f759e357ae126a7465f471eeb8806 100644 (file)
--- 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;
 }
index 3ce96119efe6f43774b6b54d479b6a71165d8636..c076350a5bab20be5e35cec165b8e1d4fdb05d9e 100644 (file)
--- 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 4125d6ddc04b49e5e9d45414ab20fb9369c5cfe1..2ec16bae9b551c3bb5bb190c8d69a766d0a6ab5b 100644 (file)
--- 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 fc82389b312623d741ff8305734c2276600119f6..e9b0ca07c6e2e3957b4f264c9888c9dd35084187 100644 (file)
--- 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;
 }
index b5ce237561197c6b3ba7cd9c56f277b854305dcd..909368cb80e3426061cc35a4fdd92ecd3cfb5fa4 100644 (file)
--- 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 cf32064867796b30ae643d21f6d6ece803b583df..f962dd649b55310d46a796b20f23ed9bba494535 100644 (file)
--- 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 4fada1c4b34e9ccb181507954c309d117653a7de..a788d4692cd65fa8745390c656e3094665278afb 100644 (file)
--- 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;
 }
index 12fabd7af1f27f82dc369c77cc07276062db7aea..1962d92cdea44693777fa130d2fe62ac916dbef9 100644 (file)
@@ -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;
 }
index 8af76ce00671b6bbe52a99d38532953b31f04398..212d5c274b3d42ec70624a4cb1aebabe78328b79 100644 (file)
@@ -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;
 }
index f83746ae2981fc4c6bdc9b6bf05c8612d99a7075..3f2d65e78883291593e1f19bef02d1b8c8aa28bc 100644 (file)
--- 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 ebc70853d4338277fc036a556745882b48d6e89c..5bb5de23e0d5ab9ec163676cf95886dc747be277 100644 (file)
--- 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;
 }
index e35beceb3ff8c3b898b9b1a889f2a59976fef24e..e05a3e489daab83df7724877bae2bfd18a5be003 100644 (file)
--- 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 fbe5b7958b98beb47950e9b4c3102d78dbc2140c..f7aa10f300cfef014b70027bc509351c6acd0ea6 100644 (file)
--- 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;
 }
index 6653799e5424d1fef4654d1dc0c8e0bdd62f519f..810a8ebd426651edc15ef7f0c7d4cdae6043743f 100644 (file)
@@ -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;
 }
index 21c10c2856a80e4635d00ec5910fb60df8236b0e..0e4f8a8cc66d306bbc586c7d624d24c1a0cc6273 100644 (file)
--- 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 b85edeb9ceac98183dc64927e65b7ffa0c588c3e..139fa00063304371ce9b27d53044b38b5abf9cae 100644 (file)
--- 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;
 }
index 3e9e74e6f2450e398ad5733c6a40b8a6ad122ed6..2f33fb7a1d09f7451158bc4eed2d92de1580d13d 100644 (file)
--- 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;
 }