fixed bug with redrawing state changes for "game of life" style elements
authorHolger Schemel <info@artsoft.org>
Wed, 10 Oct 2018 17:51:04 +0000 (19:51 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 10 Oct 2018 17:58:33 +0000 (19:58 +0200)
The cause for this bug was checking the "Stop[][]" field for deciding
if a "game of life" style element has changed and needs to be redrawn,
but with the current implementation (which is in fact not correct), it
may happen that the same element changes twice in the same game frame,
causing the corresponding graphics not be updated again (and therefore
showing the wrong state).

Directly comparing the new with the old state fixes this problem.

src/game.c

index 467b9e440a490756c7f28e95bb6f3e549ebec6b5..fdb77eb3e9e2a139200e2d6d4741f9455b4603e6 100644 (file)
@@ -8916,6 +8916,7 @@ static void Life(int ax, int ay)
   for (y1 = -1; y1 < 2; y1++) for (x1 = -1; x1 < 2; x1++)
   {
     int xx = ax+x1, yy = ay+y1;
+    int old_element = Feld[xx][yy];
     int nachbarn = 0;
 
     if (!IN_LEV_FIELD(xx, yy))
@@ -8941,7 +8942,7 @@ static void Life(int ax, int ay)
          nachbarn > life_parameter[1])
       {
        Feld[xx][yy] = EL_EMPTY;
-       if (!Stop[xx][yy])
+       if (Feld[xx][yy] != old_element)
          TEST_DrawLevelField(xx, yy);
        Stop[xx][yy] = TRUE;
        changed = TRUE;
@@ -8954,7 +8955,7 @@ static void Life(int ax, int ay)
       {
        Feld[xx][yy] = element;
        MovDelay[xx][yy] = (element == EL_GAME_OF_LIFE ? 0 : life_time-1);
-       if (!Stop[xx][yy])
+       if (Feld[xx][yy] != old_element)
          TEST_DrawLevelField(xx, yy);
        Stop[xx][yy] = TRUE;
        changed = TRUE;