added flag to level files for using "game of life" bugs
authorHolger Schemel <info@artsoft.org>
Wed, 10 Oct 2018 21:04:49 +0000 (23:04 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 10 Oct 2018 21:04:49 +0000 (23:04 +0200)
src/files.c
src/game.c
src/main.h

index 99713e19a4c4b19509a52e1ee029294dfca51fc4..605efc27af482bb4df72607829ea65fb6dcc2165 100644 (file)
@@ -668,6 +668,11 @@ static struct LevelFileConfigInfo chunk_config_ELEM[] =
     TYPE_INTEGER,                      CONF_VALUE_8_BIT(4),
     &li.game_of_life[3],               3
   },
+  {
+    EL_GAME_OF_LIFE,                   -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(5),
+    &li.use_life_bugs,                 FALSE
+  },
 
   {
     EL_BIOMAZE,                                -1,
@@ -6309,6 +6314,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level)
     level->extra_time_score = level->score[SC_TIME_BONUS];
   }
 
+  /* game logic of "game of life" and "biomaze" was buggy before 4.1.1.1 */
+  if (level->game_version < VERSION_IDENT(4,1,1,1))
+    level->use_life_bugs = TRUE;
+
   if (level->game_version < VERSION_IDENT(3,2,0,7))
   {
     /* default behaviour for snapping was "not continuous" before 3.2.0-7 */
index 18d020bdf802d695ae9d10429b854a4613916456..5fa57e59c47c5909ca261a30abff88bf539f2419 100644 (file)
@@ -8896,7 +8896,6 @@ static void Life(int ax, int ay)
   int *life_parameter = (element == EL_GAME_OF_LIFE ? level.game_of_life :
                         level.biomaze);
   boolean changed = FALSE;
-  boolean use_life_bugs = FALSE;
 
   if (IS_ANIMATED(graphic))
     DrawLevelGraphicAnimationIfNeeded(ax, ay, graphic);
@@ -8933,7 +8932,7 @@ static void Life(int ax, int ay)
       boolean is_player_cell = (element == EL_GAME_OF_LIFE && IS_PLAYER(x, y));
       boolean is_neighbour = FALSE;
 
-      if (use_life_bugs)
+      if (level.use_life_bugs)
        is_neighbour =
          (((Feld[x][y] == element || is_player_cell) && !Stop[x][y]) ||
           (IS_FREE(x, y)                             &&  Stop[x][y]));
@@ -8947,7 +8946,7 @@ static void Life(int ax, int ay)
 
     boolean is_free = FALSE;
 
-    if (use_life_bugs)
+    if (level.use_life_bugs)
       is_free = (IS_FREE(xx, yy));
     else
       is_free = (IS_FREE(xx, yy) && Last[xx][yy] == EL_EMPTY);
index 935d602069b8c46b660aac71ac2f977333d1c016..774306224669bcbcceeb6da8c3c3947c6c84cd8d 100644 (file)
@@ -3089,6 +3089,7 @@ struct LevelInfo
   boolean em_explodes_by_fire; /* EM style chain explosion behaviour */
   boolean use_spring_bug;      /* for compatibility with old levels */
   boolean use_time_orb_bug;    /* for compatibility with old levels */
+  boolean use_life_bugs;       /* for compatibility with old levels */
   boolean instant_relocation;  /* no visual delay when relocating player */
   boolean shifted_relocation;  /* no level centering when relocating player */
   boolean lazy_relocation;     /* only redraw off-screen player relocation */