rnd-20040621-1-src
authorHolger Schemel <info@artsoft.org>
Mon, 21 Jun 2004 07:40:58 +0000 (09:40 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:47:34 +0000 (10:47 +0200)
* fixed engine change that broke 3.0.8 levels like "Walpurgis Gardens"
* fixed the above fix because it broke level set "machine" (*sigh*)
* fixed random element placement in level editor to work as expected
* fixed undefined graphic of runtime element "EL_AMOEBA_TO_DIAMOND"

ChangeLog
src/conftime.h
src/editor.c
src/files.c
src/game.c
src/init.c
src/main.h

index 877fded1f2e64a7fe1beb5fc96b01a9d4f31767b..6888cd7ba3769bc8d40d450c9bcee0cdd7f1d1d1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-06-20
+       * fixed engine change that broke 3.0.8 levels like "Walpurgis Gardens"
+       * fixed the above fix because it broke level set "machine" (*sigh*)
+       * fixed random element placement in level editor to work as expected
+       * fixed undefined graphic of runtime element "EL_AMOEBA_TO_DIAMOND"
+
 2004-06-15
        * re-recorded tape for BD2K3, level 010 (broken due to bugfix)
 
index ebd1d098c311d36364b0a05ae6b53118b957822d..bf22a8e74763445e67a24755db80b30f9ffa146b 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2004-06-14 00:25]"
+#define COMPILE_DATE_STRING "[2004-06-21 01:39]"
index e8a4d64563d91239dddd5737d6762645046c8fe4..5dc75613970142144db6e289a234b90550988c35 100644 (file)
@@ -7996,37 +7996,38 @@ static void CopyLevelToUndoBuffer(int mode)
 static void RandomPlacement(int new_element)
 {
   static boolean free_position[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-  int num_free_positions;
-  int num_percentage;
-  int num_elements;
+  int num_free_positions = 0;
+  int num_percentage, num_elements;
   int x, y;
 
-  /* determine number of free positions for the new elements */
-  /* (maybe this statement should be formatted a bit more readable...) */
-  num_free_positions = 0;
-  for (x = 0; x < lev_fieldx; x++)
-    for (y = 0; y < lev_fieldy; y++)
-      if ((free_position[x][y] =
-          ((random_placement_background_restricted &&
-            Feld[x][y] == random_placement_background_element) ||
-           (!random_placement_background_restricted &&
-            Feld[x][y] != new_element))) == TRUE)
-       num_free_positions++;
+  /* determine number of free positions for randomly placing the new element */
+  for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++)
+  {
+    free_position[x][y] =
+      (random_placement_background_restricted ?
+       Feld[x][y] == random_placement_background_element :
+       Feld[x][y] != new_element);
+
+    if (free_position[x][y])
+      num_free_positions++;
+  }
 
   /* determine number of new elements to place there */
   num_percentage = num_free_positions * random_placement_value / 100;
   num_elements = (random_placement_method == RANDOM_USE_PERCENTAGE ?
                  num_percentage : random_placement_value);
 
-  /* if not more free positions than elements to place, fill whole level */
-  if (num_elements >= num_free_positions)
+  /* if less free positions than elements to place, fill all these positions */
+  if (num_free_positions < num_elements)
   {
     for (x = 0; x < lev_fieldx; x++)
       for (y = 0; y < lev_fieldy; y++)
-       Feld[x][y] = new_element;
+       if (free_position[x][y])
+         Feld[x][y] = new_element;
 
     DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
     CopyLevelToUndoBuffer(UNDO_IMMEDIATE);
+
     return;
   }
 
index 7280860bbe8fd48029be0765ed5dbe0375f9170d..b6a462e6fd637e8a34196a7a3f735d7cfc697277 100644 (file)
@@ -3606,6 +3606,8 @@ void DumpTape(struct TapeInfo *tape)
   printf_line("-", 79);
   printf("Tape of Level %03d (file version %08d, game version %08d)\n",
         tape->level_nr, tape->file_version, tape->game_version);
+  printf("                  (effective engine version %08d)\n",
+        tape->engine_version);
   printf("Level series identifier: '%s'\n", tape->level_identifier);
   printf_line("-", 79);
 
index 9645f08e391bd6eeb903c2a46b712e4534ad3417..bf9b3892aa42200833396a0e620a41f2b41b3425 100644 (file)
@@ -37,6 +37,8 @@
 #define USE_NEW_SP_SLIPPERY    TRUE    * USE_NEW_STUFF         * 1
 #define USE_NEW_RANDOMIZE      TRUE    * USE_NEW_STUFF         * 1
 
+#define USE_PUSH_BUGFIX                TRUE    * 1
+
 /* for DigField() */
 #define DF_NO_PUSH             0
 #define DF_DIG                 1
@@ -1194,6 +1196,40 @@ static void InitGameEngine()
   game.engine_version = (tape.playing ? tape.engine_version :
                         level.game_version);
 
+  /* ---------------------------------------------------------------------- */
+  /* set flags for bugs and changes according to active game engine version */
+  /* ---------------------------------------------------------------------- */
+
+  /*
+    Type of bug/change:
+    Before 3.1.0, custom elements that "change when pushing" changed directly
+    after the player started pushing them (until then handled in "DigField()").
+    Since 3.1.0, these custom elements are not changed until the "pushing"
+    move of the element is finished (now handled in "ContinueMoving()").
+
+    Affected levels/tapes:
+    The first condition is generally needed for all levels/tapes before version
+    3.1.0, which might use the old behaviour before it was changed; known tapes
+    that are affected are some tapes from the level set "Walpurgis Gardens" by
+    Jamie Cullen.
+    The second condition is an exception from the above case and is needed for
+    the special case of tapes recorded with game (not engine!) version 3.1.0 or
+    above (including some development versions of 3.1.0), but before it was
+    known that this change would break tapes like the above and was fixed in
+    3.1.1, so that the changed behaviour was active although the engine version
+    while recording maybe was before 3.1.0. There is at least one tape that is
+    affected by this exception, which is the tape for the one-level set "Bug
+    Machine" by Juergen Bonhagen.
+  */
+
+  game.use_bug_change_when_pushing =
+    (game.engine_version < VERSION_IDENT(3,1,0,0) &&
+     !(tape.playing &&
+       tape.game_version >= VERSION_IDENT(3,1,0,0) &&
+       tape.game_version <  VERSION_IDENT(3,1,1,0)));
+
+  /* ---------------------------------------------------------------------- */
+
   /* dynamically adjust element properties according to game engine version */
   InitElementPropertiesEngine(game.engine_version);
 
@@ -4636,7 +4672,7 @@ inline static void TurnRoundExt(int x, int y)
     yy = y + move_xy[MovDir[x][y]].y;
 
 #if 1
-    /* !!! this bugfix breaks at least BD2K3, level 010 !!! */
+    /* !!! this bugfix breaks at least BD2K3, level 010 !!! [re-recorded] */
     if (!IN_LEV_FIELD(xx, yy) ||
         (!IS_FREE(xx, yy) && !IS_FOOD_PIG(Feld[xx][yy])))
       MovDir[x][y] = old_move_dir;
@@ -6492,7 +6528,17 @@ void ContinueMoving(int x, int y)
 #endif
 
 #if 1
+
+#if USE_PUSH_BUGFIX
+#if 1
+  if (pushed_by_player && !game.use_bug_change_when_pushing)
+#else
+  if (pushed_by_player && game.engine_version >= VERSION_IDENT(3,1,0,0))
+#endif
+#else
   if (pushed_by_player)
+#endif
+
   {
 #if 1
     int dig_side = MV_DIR_OPPOSITE(direction);
@@ -8652,7 +8698,7 @@ void GameActions()
 #endif
 
 #if 1
-  /* for downwards compatibility, the following code emulates a fixed bug that
+  /* for backwards compatibility, the following code emulates a fixed bug that
      occured when pushing elements (causing elements that just made their last
      pushing step to already (if possible) make their first falling step in the
      same game frame, which is bad); this code is also needed to use the famous
@@ -11701,12 +11747,28 @@ int DigField(struct PlayerInfo *player,
        else
          player->push_delay_value = -1;        /* get new value later */
 
+#if USE_PUSH_BUGFIX
+       /* now: check for element change _after_ element has been pushed! */
+#if 1
+       if (game.use_bug_change_when_pushing)
+#else
+       if (game.engine_version < VERSION_IDENT(3,1,0,0))
+#endif
+       {
+         CheckElementChangeByPlayer(x, y, element, CE_PUSHED_BY_PLAYER,
+                                    player->index_bit, dig_side);
+         CheckTriggeredElementChangeByPlayer(x,y,element,CE_OTHER_GETS_PUSHED,
+                                             player->index_bit, dig_side);
+       }
+
+#else
+
 #if 1
        /* check for element change _after_ element has been pushed! */
 #else
 
 #if 1
-      /* !!! TEST ONLY !!! */
+       /* !!! TEST ONLY !!! */
        CheckElementChangeByPlayer(x, y, element, CE_PUSHED_BY_PLAYER,
                                   player->index_bit, dig_side);
        CheckTriggeredElementChangeByPlayer(x, y, element,CE_OTHER_GETS_PUSHED,
@@ -11717,6 +11779,8 @@ int DigField(struct PlayerInfo *player,
        CheckElementChangeByPlayer(x, y, element, CE_PUSHED_BY_PLAYER,
                                   player->index_bit, dig_side);
 #endif
+#endif
+
 #endif
 
        break;
index c62b8c4efef0bc60588cac72a48bd38897a0907c..0e69d6621f79242720e0a9d991e8f07dff14dab3 100644 (file)
@@ -560,6 +560,11 @@ void InitElementGraphicInfo()
     }
   }
 
+#if 1
+  /* set hardcoded definitions for some runtime elements without graphic */
+  element_info[EL_AMOEBA_TO_DIAMOND].graphic[ACTION_DEFAULT] = IMG_AMOEBA_DEAD;
+#endif
+
 #if 1
   /* now set all undefined/invalid graphics to -1 to set to default after it */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
@@ -646,6 +651,7 @@ void InitElementGraphicInfo()
        default_action_crumbled = element_info[EL_SB_DEFAULT].crumbled[act];
 
 #if 1
+      /* !!! needed because EL_EMPTY_SPACE treated as IS_SP_ELEMENT !!! */
       /* !!! make this better !!! */
       if (i == EL_EMPTY_SPACE)
       {
index 506fecb570fa0e10e140349b6e14a3286df218ac..7b6b6f5d0cdc167da9ba03021c8fb38f6c631d6a 100644 (file)
@@ -1580,6 +1580,10 @@ struct GameInfo
   int initial_move_delay_value;
   int initial_push_delay_value;
 
+  /* flags to handle bugs in and changes between different engine versions */
+  /* (for the latest engine version, these flags should always be "FALSE") */
+  boolean use_bug_change_when_pushing;
+
   /* variable within running game */
   int yamyam_content_nr;
   boolean magic_wall_active;