removed unused image file for native Boulder Dash graphics
[rocksndiamonds.git] / src / tools.c
index b92cf01b747cd3dbd61a90c4d85790f88f2b7001..39976f9d9522949cc221b0234f69950c968b4e08 100644 (file)
@@ -3465,11 +3465,27 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y)
   redraw_mask |= REDRAW_FIELD;
 }
 
+static int getPreviewLevelWidth(void)
+{
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    return (level.native_bd_level->cave->x2 - level.native_bd_level->cave->x1 + 1);
+
+  return lev_fieldx;
+}
+
+static int getPreviewLevelHeight(void)
+{
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    return (level.native_bd_level->cave->y2 - level.native_bd_level->cave->y1 + 1);
+
+  return lev_fieldy;
+}
+
 static void DrawPreviewLevelPlayfield(int from_x, int from_y)
 {
   boolean show_level_border = (BorderElement != EL_EMPTY);
-  int level_xsize = lev_fieldx + (show_level_border ? 2 : 0);
-  int level_ysize = lev_fieldy + (show_level_border ? 2 : 0);
+  int level_xsize = getPreviewLevelWidth()  + (show_level_border ? 2 : 0);
+  int level_ysize = getPreviewLevelHeight() + (show_level_border ? 2 : 0);
   int tile_size = preview.tile_size;
   int preview_width  = preview.xsize * tile_size;
   int preview_height = preview.ysize * tile_size;
@@ -5499,6 +5515,10 @@ unsigned int MoveDoor(unsigned int door_state)
       }
     }
 
+    SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+
+    game.any_door_active = TRUE;
+
     for (k = start; k < num_move_steps; k++)
     {
       int last_frame = num_move_steps - 1;     // last frame of this "for" loop
@@ -5564,8 +5584,8 @@ unsigned int MoveDoor(unsigned int door_state)
 
        if (!door_panel_drawn[door_index])
        {
-         ClearRectangle(drawto, door_rect->x, door_rect->y,
-                        door_rect->width, door_rect->height);
+         ClearRectangleOnBackground(drawto, door_rect->x, door_rect->y,
+                                    door_rect->width, door_rect->height);
 
          door_panel_drawn[door_index] = TRUE;
        }
@@ -5693,6 +5713,8 @@ unsigned int MoveDoor(unsigned int door_state)
        BackToFront();
       }
     }
+
+    game.any_door_active = FALSE;
   }
 
   if (door_state & DOOR_ACTION_1)
@@ -5990,6 +6012,88 @@ static void HandleToolButtons(struct GadgetInfo *gi)
   request_gadget_id = gi->custom_id;
 }
 
+static int getEngineElement_Ext(int element, int game_engine_type, boolean is_drawing_element)
+{
+  int el_empty;
+  int el_player;
+  int el_sand;
+  int el_wall;
+  int el_steelwall;
+  int el_exit_closed;
+
+  if (game_engine_type == -1)
+    game_engine_type = level.game_engine_type;
+
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_BD_PLAYER;
+    el_sand            = EL_BD_SAND;
+    el_wall            = EL_BD_WALL;
+    el_steelwall       = EL_BD_STEELWALL;
+    el_exit_closed     = EL_BD_EXIT_CLOSED;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_PLAYER_1;
+    el_sand            = EL_SAND;
+    el_wall            = EL_WALL;
+    el_steelwall       = EL_STEELWALL;
+    el_exit_closed     = EL_EM_EXIT_CLOSED;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_SP_MURPHY;
+    el_sand            = EL_SP_BASE;
+    el_wall            = EL_SP_CHIP_SINGLE;
+    el_steelwall       = EL_SP_HARDWARE_GRAY;
+    el_exit_closed     = EL_SP_EXIT_CLOSED;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_MM_MCDUFFIN_DOWN;
+    el_sand            = EL_EMPTY;
+    el_wall            = EL_MM_WOODEN_WALL;
+    el_steelwall       = EL_MM_STEEL_WALL;
+    el_exit_closed     = EL_MM_EXIT_CLOSED;
+
+    if (is_drawing_element)
+    {
+      el_wall          = EL_MM_MIRROR_START;
+      el_sand          = EL_MM_WOODEN_WALL;
+    }
+  }
+  else
+  {
+    el_empty           = EL_EMPTY;
+    el_player          = EL_PLAYER_1;
+    el_sand            = EL_SAND;
+    el_wall            = EL_WALL;
+    el_steelwall       = EL_STEELWALL;
+    el_exit_closed     = EL_EXIT_CLOSED;
+  }
+
+  return (element == EL_EMPTY          ? el_empty :
+         element == EL_PLAYER_1        ? el_player :
+         element == EL_SAND            ? el_sand :
+         element == EL_WALL            ? el_wall :
+         element == EL_STEELWALL       ? el_steelwall :
+         element == EL_EXIT_CLOSED     ? el_exit_closed : EL_EMPTY);
+}
+
+int getEngineElement(int element)
+{
+  return getEngineElement_Ext(element, -1, FALSE);
+}
+
+int getDrawingElement(int element)
+{
+  return getEngineElement_Ext(element, -1, TRUE);
+}
+
 static struct Mapping_BD_to_RND_object
 {
   int element_bd;
@@ -6001,7 +6105,7 @@ static struct Mapping_BD_to_RND_object
 }
 bd_object_mapping_list[] =
 {
-  // additional RND style elements mapped to BD style elements must be listed first
+  // additional RND style elements mapped to BD style elements (must be listed first)
 
   {
     O_DIRT,                                    TRUE,
@@ -6074,6 +6178,10 @@ bd_object_mapping_list[] =
     O_DIRT_BALL,                               TRUE,
     EL_BD_SAND_BALL,                           -1, -1
   },
+  {
+    O_DIRT_BALL_F,                             TRUE,
+    EL_BD_SAND_BALL_FALLING,                   -1, -1
+  },
   {
     O_DIRT_BALL_F,                             FALSE,
     EL_BD_SAND_BALL,                           ACTION_FALLING, -1
@@ -6082,6 +6190,10 @@ bd_object_mapping_list[] =
     O_DIRT_LOOSE,                              TRUE,
     EL_BD_SAND_LOOSE,                          -1, -1
   },
+  {
+    O_DIRT_LOOSE_F,                            TRUE,
+    EL_BD_SAND_LOOSE_FALLING,                  -1, -1
+  },
   {
     O_DIRT_LOOSE_F,                            FALSE,
     EL_BD_SAND_LOOSE,                          ACTION_FALLING, -1
@@ -6170,6 +6282,10 @@ bd_object_mapping_list[] =
     O_STONE,                                   TRUE,
     EL_BD_ROCK,                                        -1, -1
   },
+  {
+    O_STONE_F,                                 TRUE,
+    EL_BD_ROCK_FALLING,                                -1, -1
+  },
   {
     O_STONE_F,                                 FALSE,
     EL_BD_ROCK,                                        ACTION_FALLING, -1
@@ -6178,14 +6294,22 @@ bd_object_mapping_list[] =
     O_FLYING_STONE,                            TRUE,
     EL_BD_FLYING_ROCK,                         -1, -1
   },
+  {
+    O_FLYING_STONE_F,                          TRUE,
+    EL_BD_FLYING_ROCK_FLYING,                  -1, -1
+  },
   {
     O_FLYING_STONE_F,                          FALSE,
-    EL_BD_FLYING_ROCK,                         ACTION_FALLING, -1
+    EL_BD_FLYING_ROCK,                         ACTION_FLYING, -1
   },
   {
     O_MEGA_STONE,                              TRUE,
     EL_BD_MEGA_ROCK,                           -1, -1
   },
+  {
+    O_MEGA_STONE_F,                            TRUE,
+    EL_BD_MEGA_ROCK_FALLING,                   -1, -1
+  },
   {
     O_MEGA_STONE_F,                            FALSE,
     EL_BD_MEGA_ROCK,                           ACTION_FALLING, -1
@@ -6194,6 +6318,10 @@ bd_object_mapping_list[] =
     O_DIAMOND,                                 TRUE,
     EL_BD_DIAMOND,                             -1, -1
   },
+  {
+    O_DIAMOND_F,                               TRUE,
+    EL_BD_DIAMOND_FALLING,                     -1, -1
+  },
   {
     O_DIAMOND_F,                               FALSE,
     EL_BD_DIAMOND,                             ACTION_FALLING, -1
@@ -6202,14 +6330,22 @@ bd_object_mapping_list[] =
     O_FLYING_DIAMOND,                          TRUE,
     EL_BD_FLYING_DIAMOND,                      -1, -1
   },
+  {
+    O_FLYING_DIAMOND_F,                                TRUE,
+    EL_BD_FLYING_DIAMOND_FLYING,               -1, -1
+  },
   {
     O_FLYING_DIAMOND_F,                                FALSE,
-    EL_BD_FLYING_DIAMOND,                      ACTION_FALLING, -1
+    EL_BD_FLYING_DIAMOND,                      ACTION_FLYING, -1
   },
   {
     O_NUT,                                     TRUE,
     EL_BD_NUT,                                 -1, -1
   },
+  {
+    O_NUT_F,                                   TRUE,
+    EL_BD_NUT_FALLING,                         -1, -1
+  },
   {
     O_NUT_F,                                   FALSE,
     EL_BD_NUT,                                 ACTION_FALLING, -1
@@ -6248,7 +6384,7 @@ bd_object_mapping_list[] =
   },
   {
     O_EXPANDING_WALL_SWITCH,                   TRUE,
-    EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,   -1, -1
+    EL_BD_EXPANDABLE_WALL_SWITCH,              -1, -1
   },
   {
     O_CREATURE_SWITCH,                         TRUE,
@@ -6268,7 +6404,7 @@ bd_object_mapping_list[] =
   },
   {
     O_CONVEYOR_DIR_SWITCH,                     TRUE,
-    EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,           -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH,                 -1, -1
   },
   {
     O_ACID,                                    TRUE,
@@ -6278,6 +6414,10 @@ bd_object_mapping_list[] =
     O_FALLING_WALL,                            TRUE,
     EL_BD_FALLING_WALL,                                -1, -1
   },
+  {
+    O_FALLING_WALL_F,                          TRUE,
+    EL_BD_FALLING_WALL_FALLING,                        -1, -1
+  },
   {
     O_FALLING_WALL_F,                          FALSE,
     EL_BD_FALLING_WALL,                                ACTION_FALLING, -1
@@ -6366,66 +6506,130 @@ bd_object_mapping_list[] =
     O_WATER,                                   TRUE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_1,                                 TRUE,
+    EL_BD_WATER_1,                             -1, -1
+  },
   {
     O_WATER_1,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_2,                                 TRUE,
+    EL_BD_WATER_2,                             -1, -1
+  },
   {
     O_WATER_2,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_3,                                 TRUE,
+    EL_BD_WATER_3,                             -1, -1
+  },
   {
     O_WATER_3,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_4,                                 TRUE,
+    EL_BD_WATER_4,                             -1, -1
+  },
   {
     O_WATER_4,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_5,                                 TRUE,
+    EL_BD_WATER_5,                             -1, -1
+  },
   {
     O_WATER_5,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_6,                                 TRUE,
+    EL_BD_WATER_6,                             -1, -1
+  },
   {
     O_WATER_6,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_7,                                 TRUE,
+    EL_BD_WATER_7,                             -1, -1
+  },
   {
     O_WATER_7,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_8,                                 TRUE,
+    EL_BD_WATER_8,                             -1, -1
+  },
   {
     O_WATER_8,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_9,                                 TRUE,
+    EL_BD_WATER_9,                             -1, -1
+  },
   {
     O_WATER_9,                                 FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_10,                                        TRUE,
+    EL_BD_WATER_10,                            -1, -1
+  },
   {
     O_WATER_10,                                        FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_11,                                        TRUE,
+    EL_BD_WATER_11,                            -1, -1
+  },
   {
     O_WATER_11,                                        FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_12,                                        TRUE,
+    EL_BD_WATER_12,                            -1, -1
+  },
   {
     O_WATER_12,                                        FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_13,                                        TRUE,
+    EL_BD_WATER_13,                            -1, -1
+  },
   {
     O_WATER_13,                                        FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_14,                                        TRUE,
+    EL_BD_WATER_14,                            -1, -1
+  },
   {
     O_WATER_14,                                        FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_15,                                        TRUE,
+    EL_BD_WATER_15,                            -1, -1
+  },
   {
     O_WATER_15,                                        FALSE,
     EL_BD_WATER,                               -1, -1
   },
+  {
+    O_WATER_16,                                        TRUE,
+    EL_BD_WATER_16,                            -1, -1
+  },
   {
     O_WATER_16,                                        FALSE,
     EL_BD_WATER,                               -1, -1
@@ -6446,30 +6650,58 @@ bd_object_mapping_list[] =
     O_COW_4,                                   TRUE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_1,                          TRUE,
+    EL_BD_COW_ENCLOSED_1,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_1,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_2,                          TRUE,
+    EL_BD_COW_ENCLOSED_2,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_2,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_3,                          TRUE,
+    EL_BD_COW_ENCLOSED_3,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_3,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_4,                          TRUE,
+    EL_BD_COW_ENCLOSED_4,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_4,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_5,                          TRUE,
+    EL_BD_COW_ENCLOSED_5,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_5,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_6,                          TRUE,
+    EL_BD_COW_ENCLOSED_6,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_6,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
   },
+  {
+    O_COW_ENCLOSED_7,                          TRUE,
+    EL_BD_COW_ENCLOSED_7,                      -1, -1
+  },
   {
     O_COW_ENCLOSED_7,                          FALSE,
     EL_BD_COW_DOWN,                            -1, -1
@@ -6530,34 +6762,66 @@ bd_object_mapping_list[] =
     O_BLADDER,                                 TRUE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_1,                               TRUE,
+    EL_BD_BLADDER_1,                           -1, -1
+  },
   {
     O_BLADDER_1,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_2,                               TRUE,
+    EL_BD_BLADDER_2,                           -1, -1
+  },
   {
     O_BLADDER_2,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_3,                               TRUE,
+    EL_BD_BLADDER_3,                           -1, -1
+  },
   {
     O_BLADDER_3,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_4,                               TRUE,
+    EL_BD_BLADDER_4,                           -1, -1
+  },
   {
     O_BLADDER_4,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_5,                               TRUE,
+    EL_BD_BLADDER_5,                           -1, -1
+  },
   {
     O_BLADDER_5,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_6,                               TRUE,
+    EL_BD_BLADDER_6,                           -1, -1
+  },
   {
     O_BLADDER_6,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_7,                               TRUE,
+    EL_BD_BLADDER_7,                           -1, -1
+  },
   {
     O_BLADDER_7,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
   },
+  {
+    O_BLADDER_8,                               TRUE,
+    EL_BD_BLADDER_8,                           -1, -1
+  },
   {
     O_BLADDER_8,                               FALSE,
     EL_BD_BLADDER,                             -1, -1
@@ -6686,14 +6950,26 @@ bd_object_mapping_list[] =
     O_DRAGONFLY_4,                             TRUE,
     EL_BD_DRAGONFLY_DOWN,                      -1, -1
   },
+  {
+    O_PRE_PL_1,                                        TRUE,
+    EL_BD_PLAYER_GROWING_1,                    -1, -1
+  },
   {
     O_PRE_PL_1,                                        FALSE,
     EL_BD_PLAYER,                              ACTION_GROWING, -1
   },
+  {
+    O_PRE_PL_2,                                        TRUE,
+    EL_BD_PLAYER_GROWING_2,                    -1, -1
+  },
   {
     O_PRE_PL_2,                                        FALSE,
     EL_BD_PLAYER,                              ACTION_GROWING, -1
   },
+  {
+    O_PRE_PL_3,                                        TRUE,
+    EL_BD_PLAYER_GROWING_3,                    -1, -1
+  },
   {
     O_PRE_PL_3,                                        FALSE,
     EL_BD_PLAYER,                              ACTION_GROWING, -1
@@ -6706,6 +6982,10 @@ bd_object_mapping_list[] =
     O_PLAYER_BOMB,                             TRUE,
     EL_BD_PLAYER_WITH_BOMB,                    -1, -1
   },
+  {
+    O_PLAYER_ROCKET_LAUNCHER,                  TRUE,
+    EL_BD_PLAYER_WITH_ROCKET_LAUNCHER,         -1, -1
+  },
   {
     O_PLAYER_GLUED,                            TRUE,
     EL_BD_PLAYER_GLUED,                                -1, -1
@@ -6714,34 +6994,82 @@ bd_object_mapping_list[] =
     O_PLAYER_STIRRING,                         TRUE,
     EL_BD_PLAYER_STIRRING,                     -1, -1
   },
+  {
+    O_ROCKET_LAUNCHER,                         TRUE,
+    EL_BD_ROCKET_LAUNCHER,                     -1, -1
+  },
+  {
+    O_ROCKET_1,                                        TRUE,
+    EL_BD_ROCKET_RIGHT,                                -1, -1
+  },
+  {
+    O_ROCKET_2,                                        TRUE,
+    EL_BD_ROCKET_UP,                           -1, -1
+  },
+  {
+    O_ROCKET_3,                                        TRUE,
+    EL_BD_ROCKET_LEFT,                         -1, -1
+  },
+  {
+    O_ROCKET_4,                                        TRUE,
+    EL_BD_ROCKET_DOWN,                         -1, -1
+  },
   {
     O_BOMB,                                    TRUE,
     EL_BD_BOMB,                                        -1, -1
   },
+  {
+    O_BOMB_TICK_1,                             TRUE,
+    EL_BD_BOMB_TICKING_1,                      -1, -1
+  },
   {
     O_BOMB_TICK_1,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
   },
+  {
+    O_BOMB_TICK_2,                             TRUE,
+    EL_BD_BOMB_TICKING_2,                      -1, -1
+  },
   {
     O_BOMB_TICK_2,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
   },
+  {
+    O_BOMB_TICK_3,                             TRUE,
+    EL_BD_BOMB_TICKING_3,                      -1, -1
+  },
   {
     O_BOMB_TICK_3,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
   },
+  {
+    O_BOMB_TICK_4,                             TRUE,
+    EL_BD_BOMB_TICKING_4,                      -1, -1
+  },
   {
     O_BOMB_TICK_4,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
   },
+  {
+    O_BOMB_TICK_5,                             TRUE,
+    EL_BD_BOMB_TICKING_5,                      -1, -1
+  },
   {
     O_BOMB_TICK_5,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
   },
+  {
+    O_BOMB_TICK_6,                             TRUE,
+    EL_BD_BOMB_TICKING_6,                      -1, -1
+  },
   {
     O_BOMB_TICK_6,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
   },
+  {
+    O_BOMB_TICK_7,                             TRUE,
+    EL_BD_BOMB_TICKING_7,                      -1, -1
+  },
   {
     O_BOMB_TICK_7,                             FALSE,
     EL_BD_BOMB,                                        ACTION_ACTIVE, -1
@@ -6750,178 +7078,354 @@ bd_object_mapping_list[] =
     O_NITRO_PACK,                              TRUE,
     EL_BD_NITRO_PACK,                          -1, -1
   },
+  {
+    O_NITRO_PACK_F,                            TRUE,
+    EL_BD_NITRO_PACK_FALLING,                  -1, -1
+  },
   {
     O_NITRO_PACK_F,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_FALLING, -1
   },
   {
-    O_NITRO_PACK_EXPLODE,                      FALSE,
-    EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
+    O_PRE_CLOCK_1,                             TRUE,
+    EL_BD_CLOCK_GROWING_1,                     -1, -1
   },
   {
     O_PRE_CLOCK_1,                             FALSE,
     EL_BD_CLOCK,                               ACTION_GROWING, -1
   },
+  {
+    O_PRE_CLOCK_2,                             TRUE,
+    EL_BD_CLOCK_GROWING_2,                     -1, -1
+  },
   {
     O_PRE_CLOCK_2,                             FALSE,
     EL_BD_CLOCK,                               ACTION_GROWING, -1
   },
+  {
+    O_PRE_CLOCK_3,                             TRUE,
+    EL_BD_CLOCK_GROWING_3,                     -1, -1
+  },
   {
     O_PRE_CLOCK_3,                             FALSE,
     EL_BD_CLOCK,                               ACTION_GROWING, -1
   },
+  {
+    O_PRE_CLOCK_4,                             TRUE,
+    EL_BD_CLOCK_GROWING_4,                     -1, -1
+  },
   {
     O_PRE_CLOCK_4,                             FALSE,
     EL_BD_CLOCK,                               ACTION_GROWING, -1
   },
+  {
+    O_PRE_DIA_1,                               TRUE,
+    EL_BD_DIAMOND_GROWING_1,                   -1, -1
+  },
   {
     O_PRE_DIA_1,                               FALSE,
     EL_BD_DIAMOND,                             ACTION_GROWING, -1
   },
+  {
+    O_PRE_DIA_2,                               TRUE,
+    EL_BD_DIAMOND_GROWING_2,                   -1, -1
+  },
   {
     O_PRE_DIA_2,                               FALSE,
     EL_BD_DIAMOND,                             ACTION_GROWING, -1
   },
+  {
+    O_PRE_DIA_3,                               TRUE,
+    EL_BD_DIAMOND_GROWING_3,                   -1, -1
+  },
   {
     O_PRE_DIA_3,                               FALSE,
     EL_BD_DIAMOND,                             ACTION_GROWING, -1
   },
+  {
+    O_PRE_DIA_4,                               TRUE,
+    EL_BD_DIAMOND_GROWING_4,                   -1, -1
+  },
   {
     O_PRE_DIA_4,                               FALSE,
     EL_BD_DIAMOND,                             ACTION_GROWING, -1
   },
+  {
+    O_PRE_DIA_5,                               TRUE,
+    EL_BD_DIAMOND_GROWING_5,                   -1, -1
+  },
   {
     O_PRE_DIA_5,                               FALSE,
     EL_BD_DIAMOND,                             ACTION_GROWING, -1
   },
+  {
+    O_EXPLODE_1,                               TRUE,
+    EL_BD_EXPLODING_1,                         -1, -1
+  },
   {
     O_EXPLODE_1,                               FALSE,
     EL_DEFAULT,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_EXPLODE_2,                               TRUE,
+    EL_BD_EXPLODING_2,                         -1, -1
+  },
   {
     O_EXPLODE_2,                               FALSE,
     EL_DEFAULT,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_EXPLODE_3,                               TRUE,
+    EL_BD_EXPLODING_3,                         -1, -1
+  },
   {
     O_EXPLODE_3,                               FALSE,
     EL_DEFAULT,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_EXPLODE_4,                               TRUE,
+    EL_BD_EXPLODING_4,                         -1, -1
+  },
   {
     O_EXPLODE_4,                               FALSE,
     EL_DEFAULT,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_EXPLODE_5,                               TRUE,
+    EL_BD_EXPLODING_5,                         -1, -1
+  },
   {
     O_EXPLODE_5,                               FALSE,
     EL_DEFAULT,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_PRE_STONE_1,                             TRUE,
+    EL_BD_ROCK_GROWING_1,                      -1, -1
+  },
   {
     O_PRE_STONE_1,                             FALSE,
     EL_BD_ROCK,                                        ACTION_GROWING, -1
   },
+  {
+    O_PRE_STONE_2,                             TRUE,
+    EL_BD_ROCK_GROWING_2,                      -1, -1
+  },
   {
     O_PRE_STONE_2,                             FALSE,
     EL_BD_ROCK,                                        ACTION_GROWING, -1
   },
+  {
+    O_PRE_STONE_3,                             TRUE,
+    EL_BD_ROCK_GROWING_3,                      -1, -1
+  },
   {
     O_PRE_STONE_3,                             FALSE,
     EL_BD_ROCK,                                        ACTION_GROWING, -1
   },
+  {
+    O_PRE_STONE_4,                             TRUE,
+    EL_BD_ROCK_GROWING_4,                      -1, -1
+  },
   {
     O_PRE_STONE_4,                             FALSE,
     EL_BD_ROCK,                                        ACTION_GROWING, -1
   },
+  {
+    O_PRE_STEEL_1,                             TRUE,
+    EL_BD_STEELWALL_GROWING_1,                 -1, -1
+  },
   {
     O_PRE_STEEL_1,                             FALSE,
     EL_BD_STEELWALL,                           ACTION_GROWING, -1
   },
+  {
+    O_PRE_STEEL_2,                             TRUE,
+    EL_BD_STEELWALL_GROWING_2,                 -1, -1
+  },
   {
     O_PRE_STEEL_2,                             FALSE,
     EL_BD_STEELWALL,                           ACTION_GROWING, -1
   },
+  {
+    O_PRE_STEEL_3,                             TRUE,
+    EL_BD_STEELWALL_GROWING_3,                 -1, -1
+  },
   {
     O_PRE_STEEL_3,                             FALSE,
     EL_BD_STEELWALL,                           ACTION_GROWING, -1
   },
+  {
+    O_PRE_STEEL_4,                             TRUE,
+    EL_BD_STEELWALL_GROWING_4,                 -1, -1
+  },
   {
     O_PRE_STEEL_4,                             FALSE,
     EL_BD_STEELWALL,                           ACTION_GROWING, -1
   },
+  {
+    O_GHOST_EXPL_1,                            TRUE,
+    EL_BD_GHOST_EXPLODING_1,                   -1, -1
+  },
   {
     O_GHOST_EXPL_1,                            FALSE,
     EL_BD_GHOST,                               ACTION_EXPLODING, -1
   },
+  {
+    O_GHOST_EXPL_2,                            TRUE,
+    EL_BD_GHOST_EXPLODING_2,                   -1, -1
+  },
   {
     O_GHOST_EXPL_2,                            FALSE,
     EL_BD_GHOST,                               ACTION_EXPLODING, -1
   },
+  {
+    O_GHOST_EXPL_3,                            TRUE,
+    EL_BD_GHOST_EXPLODING_3,                   -1, -1
+  },
   {
     O_GHOST_EXPL_3,                            FALSE,
     EL_BD_GHOST,                               ACTION_EXPLODING, -1
   },
+  {
+    O_GHOST_EXPL_4,                            TRUE,
+    EL_BD_GHOST_EXPLODING_4,                   -1, -1
+  },
   {
     O_GHOST_EXPL_4,                            FALSE,
     EL_BD_GHOST,                               ACTION_EXPLODING, -1
   },
+  {
+    O_BOMB_EXPL_1,                             TRUE,
+    EL_BD_BOMB_EXPLODING_1,                    -1, -1
+  },
   {
     O_BOMB_EXPL_1,                             FALSE,
     EL_BD_BOMB,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_BOMB_EXPL_2,                             TRUE,
+    EL_BD_BOMB_EXPLODING_2,                    -1, -1
+  },
   {
     O_BOMB_EXPL_2,                             FALSE,
     EL_BD_BOMB,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_BOMB_EXPL_3,                             TRUE,
+    EL_BD_BOMB_EXPLODING_3,                    -1, -1
+  },
   {
     O_BOMB_EXPL_3,                             FALSE,
     EL_BD_BOMB,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_BOMB_EXPL_4,                             TRUE,
+    EL_BD_BOMB_EXPLODING_4,                    -1, -1
+  },
   {
     O_BOMB_EXPL_4,                             FALSE,
     EL_BD_BOMB,                                        ACTION_EXPLODING, -1
   },
+  {
+    O_NITRO_EXPL_1,                            TRUE,
+    EL_BD_NITRO_PACK_EXPLODING_1,              -1, -1
+  },
   {
     O_NITRO_EXPL_1,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
   },
+  {
+    O_NITRO_EXPL_2,                            TRUE,
+    EL_BD_NITRO_PACK_EXPLODING_2,              -1, -1
+  },
   {
     O_NITRO_EXPL_2,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
   },
+  {
+    O_NITRO_EXPL_3,                            TRUE,
+    EL_BD_NITRO_PACK_EXPLODING_3,              -1, -1
+  },
   {
     O_NITRO_EXPL_3,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
   },
+  {
+    O_NITRO_EXPL_4,                            TRUE,
+    EL_BD_NITRO_PACK_EXPLODING_4,              -1, -1
+  },
   {
     O_NITRO_EXPL_4,                            FALSE,
     EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
   },
+  {
+    O_NITRO_PACK_EXPLODE,                      TRUE,
+    EL_BD_NITRO_PACK_EXPLODING,                        -1, -1
+  },
+  {
+    O_NITRO_PACK_EXPLODE,                      FALSE,
+    EL_BD_NITRO_PACK,                          ACTION_EXPLODING, -1
+  },
+  {
+    O_AMOEBA_2_EXPL_1,                         TRUE,
+    EL_BD_AMOEBA_2_EXPLODING_1,                        -1, -1
+  },
   {
     O_AMOEBA_2_EXPL_1,                         FALSE,
     EL_BD_AMOEBA_2,                            ACTION_EXPLODING, -1
   },
+  {
+    O_AMOEBA_2_EXPL_2,                         TRUE,
+    EL_BD_AMOEBA_2_EXPLODING_2,                        -1, -1
+  },
   {
     O_AMOEBA_2_EXPL_2,                         FALSE,
     EL_BD_AMOEBA_2,                            ACTION_EXPLODING, -1
   },
+  {
+    O_AMOEBA_2_EXPL_3,                         TRUE,
+    EL_BD_AMOEBA_2_EXPLODING_3,                        -1, -1
+  },
   {
     O_AMOEBA_2_EXPL_3,                         FALSE,
     EL_BD_AMOEBA_2,                            ACTION_EXPLODING, -1
   },
+  {
+    O_AMOEBA_2_EXPL_4,                         TRUE,
+    EL_BD_AMOEBA_2_EXPLODING_4,                        -1, -1
+  },
   {
     O_AMOEBA_2_EXPL_4,                         FALSE,
     EL_BD_AMOEBA_2,                            ACTION_EXPLODING, -1
   },
+  {
+    O_NUT_EXPL_1,                              TRUE,
+    EL_BD_NUT_BREAKING_1,                      -1, -1
+  },
   {
     O_NUT_EXPL_1,                              FALSE,
     EL_BD_NUT,                                 ACTION_BREAKING, -1
   },
+  {
+    O_NUT_EXPL_2,                              TRUE,
+    EL_BD_NUT_BREAKING_2,                      -1, -1
+  },
   {
     O_NUT_EXPL_2,                              FALSE,
     EL_BD_NUT,                                 ACTION_BREAKING, -1
   },
+  {
+    O_NUT_EXPL_3,                              TRUE,
+    EL_BD_NUT_BREAKING_3,                      -1, -1
+  },
   {
     O_NUT_EXPL_3,                              FALSE,
     EL_BD_NUT,                                 ACTION_BREAKING, -1
   },
+  {
+    O_NUT_EXPL_4,                              TRUE,
+    EL_BD_NUT_BREAKING_4,                      -1, -1
+  },
   {
     O_NUT_EXPL_4,                              FALSE,
     EL_BD_NUT,                                 ACTION_BREAKING, -1
@@ -6935,11 +7439,11 @@ bd_object_mapping_list[] =
     EL_BD_PLAYER,                              ACTION_HITTING, MV_BIT_RIGHT
   },
   {
-    O_PNEUMATIC_ACTIVE_LEFT,                   TRUE,
+    O_PNEUMATIC_ACTIVE_LEFT,                   FALSE,
     EL_BD_PNEUMATIC_HAMMER,                    ACTION_HITTING, MV_BIT_LEFT
   },
   {
-    O_PNEUMATIC_ACTIVE_RIGHT,                  TRUE,
+    O_PNEUMATIC_ACTIVE_RIGHT,                  FALSE,
     EL_BD_PNEUMATIC_HAMMER,                    ACTION_HITTING, MV_BIT_RIGHT
   },
 
@@ -6977,6 +7481,14 @@ bd_object_mapping_list[] =
     O_PLAYER_RIGHT,                            FALSE,
     EL_BD_PLAYER,                              ACTION_MOVING, MV_BIT_RIGHT
   },
+  {
+    O_PLAYER_UP,                               FALSE,
+    EL_BD_PLAYER,                              ACTION_MOVING, MV_BIT_UP
+  },
+  {
+    O_PLAYER_DOWN,                             FALSE,
+    EL_BD_PLAYER,                              ACTION_MOVING, MV_BIT_DOWN
+  },
   {
     O_PLAYER_BLINK,                            FALSE,
     EL_BD_PLAYER,                              ACTION_BORING_1, -1
@@ -6989,17 +7501,25 @@ bd_object_mapping_list[] =
     O_PLAYER_TAP_BLINK,                                FALSE,
     EL_BD_PLAYER,                              ACTION_BORING_3, -1
   },
+  {
+    O_PLAYER_PUSH_LEFT,                                FALSE,
+    EL_BD_PLAYER,                              ACTION_PUSHING, MV_BIT_LEFT
+  },
+  {
+    O_PLAYER_PUSH_RIGHT,                       FALSE,
+    EL_BD_PLAYER,                              ACTION_PUSHING, MV_BIT_RIGHT
+  },
   {
     O_CREATURE_SWITCH_ON,                      FALSE,
     EL_BD_CREATURE_SWITCH_ACTIVE,              -1, -1
   },
   {
     O_EXPANDING_WALL_SWITCH_HORIZ,             FALSE,
-    EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,   -1, -1
+    EL_BD_EXPANDABLE_WALL_SWITCH,              -1, -1
   },
   {
     O_EXPANDING_WALL_SWITCH_VERT,              FALSE,
-    EL_BD_EXPANDABLE_WALL_SWITCH_VERTICAL,     -1, -1
+    EL_BD_EXPANDABLE_WALL_SWITCH_ACTIVE,       -1, -1
   },
   {
     O_GRAVITY_SWITCH_ACTIVE,                   FALSE,
@@ -7015,11 +7535,11 @@ bd_object_mapping_list[] =
   },
   {
     O_CONVEYOR_DIR_NORMAL,                     FALSE,
-    EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,           -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH,                 -1, -1
   },
   {
     O_CONVEYOR_DIR_CHANGED,                    FALSE,
-    EL_BD_CONVEYOR_DIR_SWITCH_LEFT,            -1, -1
+    EL_BD_CONVEYOR_DIR_SWITCH_ACTIVE,          -1, -1
   },
   {
     O_CONVEYOR_SWITCH_OFF,                     FALSE,
@@ -7068,7 +7588,7 @@ bd_object_mapping_list[] =
   }
 };
 
-int map_element_RND_to_BD(int element_rnd)
+int map_element_RND_to_BD_cave(int element_rnd)
 {
   static unsigned short mapping_RND_to_BD[NUM_FILE_ELEMENTS];
   static boolean mapping_initialized = FALSE;
@@ -7099,7 +7619,82 @@ int map_element_RND_to_BD(int element_rnd)
   return mapping_RND_to_BD[element_rnd];
 }
 
-int map_element_BD_to_RND(int element_bd)
+int map_element_RND_to_BD_effect(int element_rnd, int action)
+{
+  static unsigned short mapping_RND_to_BD[NUM_FILE_ELEMENTS][NUM_ACTIONS];
+  static boolean mapping_initialized = FALSE;
+
+  if (!mapping_initialized)
+  {
+    int i, j;
+
+    // return "O_UNKNOWN" for all undefined elements in mapping array
+    for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+      for (j = 0; j < NUM_ACTIONS; j++)
+       mapping_RND_to_BD[i][j] = O_UNKNOWN;
+
+    for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+    {
+      int element_rnd = bd_object_mapping_list[i].element_rnd;
+      int element_bd  = bd_object_mapping_list[i].element_bd;
+      int action      = bd_object_mapping_list[i].action;
+
+      if (action != -1)
+       mapping_RND_to_BD[element_rnd][action] = element_bd;
+    }
+
+    mapping_initialized = TRUE;
+  }
+
+  if (element_rnd < 0 || element_rnd >= NUM_FILE_ELEMENTS)
+  {
+    Warn("invalid RND element %d", element_rnd);
+
+    return O_UNKNOWN;
+  }
+
+  if (action < 0 || action >= NUM_ACTIONS)
+  {
+    Warn("invalid action %d", action);
+
+    return O_UNKNOWN;
+  }
+
+  return mapping_RND_to_BD[element_rnd][action];
+}
+
+int map_element_BD_to_RND_cave(int element_bd)
+{
+  static unsigned short mapping_BD_to_RND[O_MAX_ALL];
+  static boolean mapping_initialized = FALSE;
+
+  if (!mapping_initialized)
+  {
+    int i;
+
+    // return "EL_UNKNOWN" for all undefined elements in mapping array
+    for (i = 0; i < O_MAX_ALL; i++)
+      mapping_BD_to_RND[i] = EL_UNKNOWN;
+
+    for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+      if (bd_object_mapping_list[i].is_rnd_to_bd_mapping)
+       mapping_BD_to_RND[bd_object_mapping_list[i].element_bd] =
+         bd_object_mapping_list[i].element_rnd;
+
+    mapping_initialized = TRUE;
+  }
+
+  if (element_bd < 0 || element_bd >= O_MAX_ALL)
+  {
+    Warn("invalid BD element %d", element_bd);
+
+    return EL_UNKNOWN;
+  }
+
+  return mapping_BD_to_RND[element_bd];
+}
+
+int map_element_BD_to_RND_game(int element_bd)
 {
   static unsigned short mapping_BD_to_RND[O_MAX_ALL];
   static boolean mapping_initialized = FALSE;
@@ -10155,6 +10750,9 @@ void InitGraphicInfo_BD(void)
       g_bd->src_y  = src_y;
       g_bd->width  = TILEX;
       g_bd->height = TILEY;
+
+      g_bd->graphic = graphic;
+      g_bd->frame = frame;
     }
   }
 
@@ -10171,6 +10769,9 @@ void InitGraphicInfo_BD(void)
   g_bd->src_y  = src_y;
   g_bd->width  = TILEX;
   g_bd->height = TILEY;
+
+  g_bd->graphic = graphic;
+  g_bd->frame = 0;
 }
 
 void InitGraphicInfo_EM(void)