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.

[originally from svn r6088]
This commit is contained in:
Simon Tatham
2005-07-10 10:17:13 +00:00
parent 145301d0dc
commit 3d2c442bc4
17 changed files with 32 additions and 22 deletions

2
cube.c
View File

@ -1687,7 +1687,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -832,7 +832,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

2
flip.c
View File

@ -1239,7 +1239,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -1262,7 +1262,7 @@ static int game_wants_statusbar(void)
return FALSE; return FALSE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -237,7 +237,8 @@ void midend_set_params(midend_data *me, game_params *params)
static void midend_set_timer(midend_data *me) static void midend_set_timer(midend_data *me)
{ {
me->timing = (me->ourgame->is_timed && 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) if (me->timing || me->flash_time || me->anim_time)
activate_timer(me->frontend); activate_timer(me->frontend);
else else
@ -311,10 +312,10 @@ void midend_new_game(midend_data *me)
me->drawstate = me->ourgame->new_drawstate(me->states[0].state); me->drawstate = me->ourgame->new_drawstate(me->states[0].state);
midend_size_new_drawstate(me); midend_size_new_drawstate(me);
me->elapsed = 0.0F; me->elapsed = 0.0F;
midend_set_timer(me);
if (me->ui) if (me->ui)
me->ourgame->free_ui(me->ui); me->ourgame->free_ui(me->ui);
me->ui = me->ourgame->new_ui(me->states[0].state); me->ui = me->ourgame->new_ui(me->states[0].state);
midend_set_timer(me);
me->pressed_mouse_button = 0; me->pressed_mouse_button = 0;
} }

19
mines.c
View File

@ -2336,7 +2336,7 @@ struct game_ui {
int hx, hy, hradius; /* for mouse-down highlights */ int hx, hy, hradius; /* for mouse-down highlights */
int validradius; int validradius;
int flash_is_death; int flash_is_death;
int deaths; int deaths, completed;
}; };
static game_ui *new_ui(game_state *state) 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->hx = ui->hy = -1;
ui->hradius = ui->validradius = 0; ui->hradius = ui->validradius = 0;
ui->deaths = 0; ui->deaths = 0;
ui->completed = FALSE;
ui->flash_is_death = FALSE; /* *shrug* */ ui->flash_is_death = FALSE; /* *shrug* */
return ui; return ui;
} }
@ -2358,20 +2359,28 @@ static char *encode_ui(game_ui *ui)
{ {
char buf[80]; 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); sprintf(buf, "D%d", ui->deaths);
if (ui->completed)
strcat(buf, "C");
return dupstr(buf); return dupstr(buf);
} }
static void decode_ui(game_ui *ui, char *encoding) 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, static void game_changed_state(game_ui *ui, game_state *oldstate,
game_state *newstate) game_state *newstate)
{ {
if (newstate->won)
ui->completed = TRUE;
} }
struct game_drawstate { struct game_drawstate {
@ -3015,9 +3024,9 @@ static int game_wants_statusbar(void)
return TRUE; 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 FALSE;
return TRUE; return TRUE;
} }

2
net.c
View File

@ -2723,7 +2723,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -1776,7 +1776,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return FALSE; return FALSE;
} }

View File

@ -238,7 +238,7 @@ static int game_wants_statusbar(void)
return FALSE; return FALSE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -1159,7 +1159,7 @@ static int game_wants_statusbar(void)
return FALSE; return FALSE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

2
pegs.c
View File

@ -1174,7 +1174,7 @@ static int game_wants_statusbar(void)
return FALSE; return FALSE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -305,7 +305,7 @@ struct game {
game_ui *ui); game_ui *ui);
int (*wants_statusbar)(void); int (*wants_statusbar)(void);
int is_timed; int is_timed;
int (*timing_state)(game_state *state); int (*timing_state)(game_state *state, game_ui *ui);
int mouse_priorities; int mouse_priorities;
}; };

2
rect.c
View File

@ -2758,7 +2758,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -947,7 +947,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -1008,7 +1008,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

2
solo.c
View File

@ -2599,7 +2599,7 @@ static int game_wants_statusbar(void)
return FALSE; return FALSE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }

View File

@ -1175,7 +1175,7 @@ static int game_wants_statusbar(void)
return TRUE; return TRUE;
} }
static int game_timing_state(game_state *state) static int game_timing_state(game_state *state, game_ui *ui)
{ {
return TRUE; return TRUE;
} }