mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
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:
2
cube.c
2
cube.c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
2
flip.c
@ -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;
|
||||||
}
|
}
|
||||||
|
2
guess.c
2
guess.c
@ -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;
|
||||||
}
|
}
|
||||||
|
5
midend.c
5
midend.c
@ -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
19
mines.c
@ -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
2
net.c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
2
pegs.c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
2
rect.c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
2
solo.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user