Redraw glitch: tiles marked black (at game-over time) were not
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 19 Jun 2005 14:33:06 +0000 (14:33 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 19 Jun 2005 14:33:06 +0000 (14:33 +0000)
redrawn as non-black on undo. Introduce a new flag TILE_IMPOSSIBLE,
so that information about those black markers is cached in the
drawstate and we know when we have to erase them.

In the process I've removed the game_state argument completely from
the subfunction tile_redraw(), which gives me some confidence that
it isn't getting any _more_ privileged information out of it.

git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5979 cda61777-01e9-0310-a592-d414129be87e

samegame.c

index 6294a3d..c066258 100644 (file)
@@ -49,6 +49,7 @@ struct game_params {
 #define TILE_JOINDOWN   0x0400 /* used in drawstate */
 #define TILE_JOINDIAG   0x0800 /* used in drawstate */
 #define TILE_HASSEL     0x1000 /* used in drawstate */
+#define TILE_IMPOSSIBLE 0x2000 /* used in drawstate */
 
 #define TILE(gs,x,y) ((gs)->tiles[(gs)->params.w*(y)+(x)])
 #define COL(gs,x,y) (TILE(gs,x,y) & TILE_COLMASK)
@@ -746,12 +747,12 @@ static void game_free_drawstate(game_drawstate *ds)
 
 static void tile_redraw(frontend *fe, game_drawstate *ds,
                        int x, int y, int dright, int dbelow,
-                        int tile, game_state *state, int bgcolour)
+                        int tile, int bgcolour)
 {
     int outer = bgcolour, inner = outer, col = tile & TILE_COLMASK;
 
     if (col) {
-       if (state->impossible) {
+       if (tile & TILE_IMPOSSIBLE) {
            outer = col;
            inner = COL_IMPOSSIBLE;
        } else if (tile & TILE_SELECTED) {
@@ -843,6 +844,8 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
            int dbelow = (y+1 < state->params.h);
 
            tile |= ISSEL(ui,x,y);
+           if (state->impossible)
+               tile |= TILE_IMPOSSIBLE;
            if (dright && COL(state,x+1,y) == col)
                tile |= TILE_JOINRIGHT;
            if (dbelow && COL(state,x,y+1) == col)
@@ -861,8 +864,7 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate,
                (flashtime > 0.0) ||
                (ds->bgcolour != bgcolour) ||
                (tile != ds->tiles[i])) {
-               tile_redraw(fe, ds, x, y, dright, dbelow,
-                           tile, state, bgcolour);
+               tile_redraw(fe, ds, x, y, dright, dbelow, tile, bgcolour);
                ds->tiles[i] = tile;
            }
        }