Stop the analysis pass in Loopy's redraw routine from being
[sgt/puzzles] / fifteen.c
index b9ff617..1a106e8 100644 (file)
--- a/fifteen.c
+++ b/fifteen.c
@@ -42,7 +42,6 @@ struct game_state {
     int *tiles;
     int gap_pos;
     int completed;
-    int just_used_solve;              /* used to suppress undo animation */
     int used_solve;                   /* used to suppress completion flash */
     int movecount;
 };
@@ -58,6 +57,11 @@ static game_params *default_params(void)
 
 static int game_fetch_preset(int i, char **name, game_params **params)
 {
+    if (i == 0) {
+       *params = default_params();
+       *name = dupstr("4x4");
+       return TRUE;
+    }
     return FALSE;
 }
 
@@ -345,7 +349,7 @@ static game_state *new_game(midend *me, game_params *params, char *desc)
     assert(state->tiles[state->gap_pos] == 0);
 
     state->completed = state->movecount = 0;
-    state->used_solve = state->just_used_solve = FALSE;
+    state->used_solve = FALSE;
 
     return state;
 }
@@ -363,7 +367,6 @@ static game_state *dup_game(game_state *state)
     ret->completed = state->completed;
     ret->movecount = state->movecount;
     ret->used_solve = state->used_solve;
-    ret->just_used_solve = state->just_used_solve;
 
     return ret;
 }
@@ -380,6 +383,11 @@ static char *solve_game(game_state *state, game_state *currstate,
     return dupstr("S");
 }
 
+static int game_can_format_as_text_now(game_params *params)
+{
+    return TRUE;
+}
+
 static char *game_text_format(game_state *state)
 {
     char *ret, *p, buf[80];
@@ -452,7 +460,7 @@ struct game_drawstate {
     int tilesize;
 };
 
-static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
+static char *interpret_move(game_state *state, game_ui *ui, const game_drawstate *ds,
                            int x, int y, int button)
 {
     int gx, gy, dx, dy;
@@ -509,7 +517,7 @@ static game_state *execute_move(game_state *from, char *move)
        for (i = 0; i < ret->n; i++)
            ret->tiles[i] = (i+1) % ret->n;
        ret->gap_pos = ret->n-1;
-       ret->used_solve = ret->just_used_solve = TRUE;
+       ret->used_solve = TRUE;
        ret->completed = ret->movecount = 1;
 
        return ret;
@@ -533,7 +541,6 @@ static game_state *execute_move(game_state *from, char *move)
     up = C(from, ux, uy);
 
     ret = dup_game(from);
-    ret->just_used_solve = FALSE;      /* zero this in a hurry */
 
     ret->gap_pos = C(from, dx, dy);
     assert(ret->gap_pos >= 0 && ret->gap_pos < ret->n);
@@ -810,11 +817,7 @@ static void game_redraw(drawing *dr, game_drawstate *ds, game_state *oldstate,
 static float game_anim_length(game_state *oldstate,
                              game_state *newstate, int dir, game_ui *ui)
 {
-    if ((dir > 0 && newstate->just_used_solve) ||
-       (dir < 0 && oldstate->just_used_solve))
-       return 0.0F;
-    else
-       return ANIM_TIME;
+    return ANIM_TIME;
 }
 
 static float game_flash_length(game_state *oldstate,
@@ -827,9 +830,9 @@ static float game_flash_length(game_state *oldstate,
         return 0.0F;
 }
 
-static int game_wants_statusbar(void)
+static int game_status(game_state *state)
 {
-    return TRUE;
+    return state->completed ? +1 : 0;
 }
 
 static int game_timing_state(game_state *state, game_ui *ui)
@@ -850,7 +853,7 @@ static void game_print(drawing *dr, game_state *state, int tilesize)
 #endif
 
 const struct game thegame = {
-    "Fifteen", "games.fifteen",
+    "Fifteen", "games.fifteen", "fifteen",
     default_params,
     game_fetch_preset,
     decode_params,
@@ -865,7 +868,7 @@ const struct game thegame = {
     dup_game,
     free_game,
     TRUE, solve_game,
-    TRUE, game_text_format,
+    TRUE, game_can_format_as_text_now, game_text_format,
     new_ui,
     free_ui,
     encode_ui,
@@ -880,8 +883,9 @@ const struct game thegame = {
     game_redraw,
     game_anim_length,
     game_flash_length,
+    game_status,
     FALSE, FALSE, game_print_size, game_print,
-    game_wants_statusbar,
+    TRUE,                             /* wants_statusbar */
     FALSE, game_timing_state,
     0,                                /* flags */
 };