Stop the analysis pass in Loopy's redraw routine from being
[sgt/puzzles] / samegame.c
index 08ac758..65ebef7 100644 (file)
@@ -1022,6 +1022,11 @@ static char *solve_game(game_state *state, game_state *currstate,
     return NULL;
 }
 
+static int game_can_format_as_text_now(game_params *params)
+{
+    return TRUE;
+}
+
 static char *game_text_format(game_state *state)
 {
     char *ret, *p;
@@ -1121,7 +1126,7 @@ static char *sel_movedesc(game_ui *ui, game_state *state)
        if (ui->tiles[i] & TILE_SELECTED) {
            sprintf(buf, "%s%d", sep, i);
            sep = ",";
-           if (retlen + strlen(buf) >= retsize) {
+           if (retlen + (int)strlen(buf) >= retsize) {
                retsize = retlen + strlen(buf) + 256;
                ret = sresize(ret, retsize, char);
            }
@@ -1262,7 +1267,7 @@ struct game_drawstate {
     int *tiles; /* contains colour and SELECTED. */
 };
 
-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 tx, ty;
@@ -1272,8 +1277,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
 
     if (button == RIGHT_BUTTON || button == LEFT_BUTTON) {
        tx = FROMCOORD(x); ty= FROMCOORD(y);
-    } else if (button == CURSOR_UP || button == CURSOR_DOWN ||
-              button == CURSOR_LEFT || button == CURSOR_RIGHT) {
+    } else if (IS_CURSOR_MOVE(button)) {
        int dx = 0, dy = 0;
        ui->displaysel = 1;
        dx = (button == CURSOR_LEFT) ? -1 : ((button == CURSOR_RIGHT) ? +1 : 0);
@@ -1281,8 +1285,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
        ui->xsel = (ui->xsel + state->params.w + dx) % state->params.w;
        ui->ysel = (ui->ysel + state->params.h + dy) % state->params.h;
        return ret;
-    } else if (button == CURSOR_SELECT || button == ' ' || button == '\r' ||
-              button == '\n') {
+    } else if (IS_CURSOR_SELECT(button)) {
        ui->displaysel = 1;
        tx = ui->xsel;
        ty = ui->ysel;
@@ -1294,7 +1297,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
     if (COL(state, tx, ty) == 0) return NULL;
 
     if (ISSEL(ui,tx,ty)) {
-       if (button == RIGHT_BUTTON)
+       if (button == RIGHT_BUTTON || button == CURSOR_SELECT2)
            sel_clear(ui, state);
        else
            ret = sel_movedesc(ui, state);
@@ -1416,9 +1419,9 @@ static float *game_colours(frontend *fe, int *ncolours)
     ret[COL_HIGHLIGHT * 3 + 1] = 1.0F;
     ret[COL_HIGHLIGHT * 3 + 2] = 1.0F;
 
-    ret[COL_LOWLIGHT * 3 + 0] = ret[COL_BACKGROUND * 3 + 0] * 2.0 / 3.0;
-    ret[COL_LOWLIGHT * 3 + 1] = ret[COL_BACKGROUND * 3 + 1] * 2.0 / 3.0;
-    ret[COL_LOWLIGHT * 3 + 2] = ret[COL_BACKGROUND * 3 + 2] * 2.0 / 3.0;
+    ret[COL_LOWLIGHT * 3 + 0] = ret[COL_BACKGROUND * 3 + 0] * 2.0F / 3.0F;
+    ret[COL_LOWLIGHT * 3 + 1] = ret[COL_BACKGROUND * 3 + 1] * 2.0F / 3.0F;
+    ret[COL_LOWLIGHT * 3 + 2] = ret[COL_BACKGROUND * 3 + 2] * 2.0F / 3.0F;
 
     *ncolours = NCOLOURS;
     return ret;
@@ -1608,9 +1611,13 @@ static float game_flash_length(game_state *oldstate, game_state *newstate,
        return 0.0F;
 }
 
-static int game_wants_statusbar(void)
+static int game_status(game_state *state)
 {
-    return TRUE;
+    /*
+     * Dead-end situations are assumed to be rescuable by Undo, so we
+     * don't bother to identify them and return -1.
+     */
+    return state->complete ? +1 : 0;
 }
 
 static int game_timing_state(game_state *state, game_ui *ui)
@@ -1631,7 +1638,7 @@ static void game_print(drawing *dr, game_state *state, int tilesize)
 #endif
 
 const struct game thegame = {
-    "Same Game", "games.samegame",
+    "Same Game", "games.samegame", "samegame",
     default_params,
     game_fetch_preset,
     decode_params,
@@ -1646,7 +1653,7 @@ const struct game thegame = {
     dup_game,
     free_game,
     FALSE, solve_game,
-    TRUE, game_text_format,
+    TRUE, game_can_format_as_text_now, game_text_format,
     new_ui,
     free_ui,
     encode_ui,
@@ -1661,8 +1668,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 */
 };