added Makefile targets to clean up header dependency files
[rocksndiamonds.git] / src / editor.c
index c01689237136127918ef39267e0e587b895e1c9f..ac2bb22020495f36f4cd2d40783eaf2e3ee05867 100644 (file)
@@ -1794,6 +1794,7 @@ static struct ValueTextInfo options_time_score_base[] =
 static struct ValueTextInfo options_game_engine_type[] =
 {
   { GAME_ENGINE_TYPE_RND,      "Rocks'n'Diamonds"              },
+  { GAME_ENGINE_TYPE_BD,       "Boulder Dash"                  },
   { GAME_ENGINE_TYPE_EM,       "Emerald Mine"                  },
   { GAME_ENGINE_TYPE_SP,       "Supaplex"                      },
   { GAME_ENGINE_TYPE_MM,       "Mirror Magic"                  },
@@ -2465,6 +2466,7 @@ static struct ValueTextInfo options_group_choice_mode[] =
   { ANIM_LINEAR,               "linear"                        },
   { ANIM_PINGPONG,             "pingpong"                      },
   { ANIM_PINGPONG2,            "pingpong 2"                    },
+  { ANIM_LEVEL_NR,             "level number"                  },
 
   { -1,                                NULL                            }
 };
@@ -4048,6 +4050,206 @@ static int *editor_el_boulderdash_ptr = editor_el_boulderdash;
 static int num_editor_hl_boulderdash = ARRAY_SIZE(editor_hl_boulderdash);
 static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash);
 
+static int editor_hl_boulderdash_native[] =
+{
+  EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE,
+  EL_CHAR('B'),
+  EL_CHAR('D'),
+  EL_EMPTY,
+};
+
+static int editor_el_boulderdash_native[] =
+{
+  EL_EMPTY,
+  EL_BD_SAND,
+  EL_BD_ROCK,
+  EL_BD_DIAMOND,
+
+  EL_BD_STEELWALL,
+  EL_BD_WALL,
+  EL_EMPTY,
+  EL_BD_MAGIC_WALL,
+
+  EL_BD_AMOEBA,
+  EL_BD_BUTTERFLY_UP,
+  EL_BD_FIREFLY_UP,
+  EL_EXIT_CLOSED,
+
+  EL_BD_BUTTERFLY_LEFT,
+  EL_BD_FIREFLY_LEFT,
+  EL_BD_BUTTERFLY_RIGHT,
+  EL_BD_FIREFLY_RIGHT,
+
+  EL_BD_INBOX,
+  EL_BD_BUTTERFLY_DOWN,
+  EL_BD_FIREFLY_DOWN,
+  EL_EXIT_OPEN,
+
+  EL_BD_AMOEBA_2,
+  EL_BD_BUTTERFLY_2_UP,
+  EL_BD_FIREFLY_2_UP,
+  EL_EMPTY,
+
+  EL_BD_BUTTERFLY_2_LEFT,
+  EL_BD_FIREFLY_2_LEFT,
+  EL_BD_BUTTERFLY_2_RIGHT,
+  EL_BD_FIREFLY_2_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_BUTTERFLY_2_DOWN,
+  EL_BD_FIREFLY_2_DOWN,
+  EL_EMPTY,
+
+  EL_EMPTY,
+  EL_BD_DRAGONFLY_UP,
+  EL_BD_STONEFLY_UP,
+  EL_EMPTY,
+
+  EL_BD_DRAGONFLY_LEFT,
+  EL_BD_STONEFLY_LEFT,
+  EL_BD_DRAGONFLY_RIGHT,
+  EL_BD_STONEFLY_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_DRAGONFLY_DOWN,
+  EL_BD_STONEFLY_DOWN,
+  EL_EMPTY,
+
+  EL_EMPTY,
+  EL_BD_BITER_UP,
+  EL_BD_COW_UP,
+  EL_EMPTY,
+
+  EL_BD_BITER_LEFT,
+  EL_BD_COW_LEFT,
+  EL_BD_BITER_RIGHT,
+  EL_BD_COW_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_BITER_DOWN,
+  EL_BD_COW_DOWN,
+  EL_EMPTY,
+
+  EL_EMPTY,
+  EL_BD_SAND,
+  EL_BD_SAND_BALL,
+  EL_BD_SAND_LOOSE,
+
+  EL_BD_SAND_SLOPED_UP_LEFT,
+  EL_BD_SAND_SLOPED_UP_RIGHT,
+  EL_BD_WALL_SLOPED_UP_LEFT,
+  EL_BD_WALL_SLOPED_UP_RIGHT,
+
+  EL_BD_SAND_SLOPED_DOWN_LEFT,
+  EL_BD_SAND_SLOPED_DOWN_RIGHT,
+  EL_BD_WALL_SLOPED_DOWN_LEFT,
+  EL_BD_WALL_SLOPED_DOWN_RIGHT,
+
+  EL_BD_FLYING_DIAMOND,
+  EL_BD_FLYING_ROCK,
+  EL_BD_STEELWALL_SLOPED_UP_LEFT,
+  EL_BD_STEELWALL_SLOPED_UP_RIGHT,
+
+  EL_BD_NUT,
+  EL_BD_MEGA_ROCK,
+  EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
+  EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
+
+  EL_BD_SAND_2,
+  EL_BD_WALL_NON_SLOPED,
+  EL_BD_WALL,
+  EL_BD_MAGIC_WALL,
+
+  EL_BD_EXIT_CLOSED,
+  EL_BD_EXIT_OPEN,
+  EL_BD_INVISIBLE_EXIT_CLOSED,
+  EL_BD_INVISIBLE_EXIT_OPEN,
+
+  EL_BD_STEELWALL,
+  EL_BD_STEELWALL_EXPLODABLE,
+  EL_BD_STEELWALL_DIGGABLE,
+  EL_BD_WALL_DIGGABLE,
+
+  EL_BD_EXPANDABLE_WALL_HORIZONTAL,
+  EL_BD_EXPANDABLE_WALL_VERTICAL,
+  EL_BD_EXPANDABLE_WALL_ANY,
+  EL_BD_CREATURE_SWITCH,
+
+  EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL,
+  EL_BD_EXPANDABLE_STEELWALL_VERTICAL,
+  EL_BD_EXPANDABLE_STEELWALL_ANY,
+  EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,
+
+  EL_BD_BITER_SWITCH_1,
+  EL_BD_REPLICATOR_SWITCH,
+  EL_BD_CONVEYOR_SWITCH,
+  EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,
+
+  EL_BD_ACID,
+  EL_BD_FALLING_WALL,
+  EL_BD_BOX,
+  EL_BD_TIME_PENALTY,
+
+  EL_BD_GRAVESTONE,
+  EL_BD_ROCK_GLUED,
+  EL_BD_DIAMOND_GLUED,
+  EL_BD_DIAMOND_KEY,
+
+  EL_BD_TRAPPED_DIAMOND,
+  EL_BD_CLOCK,
+  EL_BD_SAND_GLUED,
+  EL_BD_WATER,
+
+  EL_BD_KEY_1,
+  EL_BD_KEY_2,
+  EL_BD_KEY_3,
+  EL_EMPTY,
+
+  EL_BD_WALL_KEY_1,
+  EL_BD_WALL_KEY_2,
+  EL_BD_WALL_KEY_3,
+  EL_BD_WALL_DIAMOND,
+
+  EL_BD_GATE_1,
+  EL_BD_GATE_2,
+  EL_BD_GATE_3,
+  EL_BD_POT,
+
+  EL_BD_GRAVITY_SWITCH,
+  EL_BD_PNEUMATIC_HAMMER,
+  EL_BD_TELEPORTER,
+  EL_BD_SKELETON,
+
+  EL_BD_AMOEBA,
+  EL_BD_AMOEBA_2,
+  EL_BD_REPLICATOR,
+  EL_BD_BLADDER_SPENDER,
+
+  EL_BD_CONVEYOR_LEFT,
+  EL_BD_CONVEYOR_RIGHT,
+  EL_BD_BOMB,
+  EL_BD_NITRO_PACK,
+
+  EL_BD_LAVA,
+  EL_BD_SWEET,
+  EL_BD_VOODOO_DOLL,
+  EL_BD_SLIME,
+
+  EL_BD_BLADDER,
+  EL_BD_WAITING_ROCK,
+  EL_BD_CHASING_ROCK,
+  EL_BD_GHOST,
+
+  EL_BD_PLAYER,
+  EL_BD_PLAYER_WITH_BOMB,
+  EL_BD_PLAYER_GLUED,
+  EL_BD_PLAYER_STIRRING,
+};
+static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native;
+static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native;
+static int num_editor_hl_boulderdash_native = ARRAY_SIZE(editor_hl_boulderdash_native);
+static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_native);
+
 static int editor_hl_emerald_mine[] =
 {
   EL_INTERNAL_CASCADE_EM_ACTIVE,
@@ -4713,7 +4915,12 @@ static int editor_el_deflektor[] =
   EL_DF_STEEL_WALL,
   EL_DF_WOODEN_WALL,
   EL_DF_REFRACTOR,
-  EL_DF_MINE
+  EL_DF_MINE,
+
+  EL_DF_SLOPE_1,
+  EL_DF_SLOPE_2,
+  EL_DF_SLOPE_3,
+  EL_DF_SLOPE_4
 };
 static int *editor_hl_deflektor_ptr = editor_hl_deflektor;
 static int *editor_el_deflektor_ptr = editor_el_deflektor;
@@ -5453,6 +5660,7 @@ static boolean setup_editor_cascade_never = FALSE;
 
 static boolean setup_editor_el_players                 = TRUE;
 static boolean setup_editor_el_boulderdash             = TRUE;
+static boolean setup_editor_el_boulderdash_native      = TRUE;
 static boolean setup_editor_el_emerald_mine            = TRUE;
 static boolean setup_editor_el_emerald_mine_club       = TRUE;
 static boolean setup_editor_el_more                    = TRUE;
@@ -5499,6 +5707,12 @@ editor_elements_info[] =
     &editor_hl_boulderdash_ptr,                &num_editor_hl_boulderdash,
     &editor_el_boulderdash_ptr,                &num_editor_el_boulderdash
   },
+  {
+    &setup_editor_el_boulderdash_native,
+    &setup.editor_cascade.el_bd_native,
+    &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native,
+    &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native
+  },
   {
     &setup_editor_el_emerald_mine,
     &setup.editor_cascade.el_em,
@@ -5798,6 +6012,7 @@ static void ReinitializeElementList_EnableSections(void)
 
   setup_editor_el_players              = TRUE;
   setup_editor_el_boulderdash          = TRUE;
+  setup_editor_el_boulderdash_native   = TRUE;
   setup_editor_el_emerald_mine         = TRUE;
   setup_editor_el_emerald_mine_club    = TRUE;
   setup_editor_el_more                 = TRUE;
@@ -5820,6 +6035,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -5850,12 +6066,32 @@ static void ReinitializeElementList_EnableSections(void)
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
   {
+    setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_mirror_magic       = FALSE;
+    setup_editor_el_deflektor          = FALSE;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    setup_editor_el_players            = FALSE;
+    setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_emerald_mine       = FALSE;
+    setup_editor_el_emerald_mine_club  = FALSE;
+    setup_editor_el_more               = FALSE;
+    setup_editor_el_sokoban            = FALSE;
+    setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
+    setup_editor_el_dx_boulderdash     = FALSE;
     setup_editor_el_mirror_magic       = FALSE;
     setup_editor_el_deflektor          = FALSE;
+    setup_editor_el_chars              = FALSE;
+    setup_editor_el_steel_chars                = FALSE;
+
+    setup_editor_el_custom             = FALSE;
   }
   else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
   {
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_more               = FALSE;
     setup_editor_el_sokoban            = FALSE;
     setup_editor_el_supaplex           = FALSE;
@@ -5871,6 +6107,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -5888,6 +6125,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_boulderdash_native = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -7619,7 +7857,7 @@ static void MapGraphicbuttonGadget(int id)
 {
   int font_nr = FONT_TEXT_1;
   int font_height = getFontHeight(font_nr);
-  struct GadgetInfo *gi= level_editor_gadget[graphicbutton_info[id].gadget_id];
+  struct GadgetInfo *gi = level_editor_gadget[graphicbutton_info[id].gadget_id];
   int xoffset_left = getTextWidthForGadget(graphicbutton_info[id].text_left);
   int xoffset_right = ED_GADGET_TEXT_DISTANCE;
   int yoffset = (gi->height - font_height) / 2;
@@ -8702,7 +8940,13 @@ static void InitDrawingElements(void)
   if (level.game_engine_type == game_engine_type_last)
     return;
 
-  if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    new_element1 = EL_BD_WALL;
+    new_element2 = EL_EMPTY;
+    new_element3 = EL_BD_SAND;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
   {
     new_element1 = EL_SP_CHIP_SINGLE;
     new_element2 = EL_EMPTY;
@@ -8912,8 +9156,8 @@ static void AdjustDrawingAreaGadgets(void)
 
   if (suppressBorderElement())
   {
-    ed_xsize = max_ed_fieldx;
-    ed_ysize = max_ed_fieldy;
+    ed_xsize = lev_fieldx;
+    ed_ysize = lev_fieldy;
   }
 
   // check if we need any scrollbars
@@ -10192,7 +10436,7 @@ static void DrawPropertiesConfig(void)
                num_element_counters);
 
       counterbutton_info[counter_id].value = elements_with_counter[i].value;
-      counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
+      counterbutton_info[counter_id].text_right = elements_with_counter[i].text;
 
       if (properties_element == EL_GAME_OF_LIFE ||
          properties_element == EL_BIOMAZE)
@@ -11702,6 +11946,12 @@ static void SetElementIntelliDraw(int x, int y, int dx, int dy, int new_element,
        EL_DF_RECEIVER_DOWN,
        EL_DF_RECEIVER_LEFT
       },
+      {
+       EL_DF_SLOPE_1,
+       EL_DF_SLOPE_4,
+       EL_DF_SLOPE_3,
+       EL_DF_SLOPE_2
+      },
 
       {
        -1,
@@ -12043,19 +12293,10 @@ static boolean isHiresDrawElement(int element)
 
 static int numHiresTiles(int element)
 {
-  if (!IS_MM_WALL(element))
-    return 1;
-
-  int bits = MM_WALL_BITS(element);
-  int num_bits = 0;
-
-  while (bits)
-  {
-    bits &= bits - 1;
-    num_bits++;
-  }
+  if (IS_MM_WALL(element))
+    return get_number_of_bits(MM_WALL_BITS(element));
 
-  return num_bits;
+  return 1;
 }
 
 static void SetDrawModeHiRes(int element)
@@ -12356,280 +12597,144 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y,
                                 MAX_CB_NUM_LINES *     \
                                 MAX_CB_PART_SIZE)
 
-static int getFlippedTileX(int element)
+static int getFlippedTileExt(int map[], int element)
 {
-  switch (element)
-  {
-    case EL_BD_BUTTERFLY_LEFT:         return EL_BD_BUTTERFLY_RIGHT;
-    case EL_BD_BUTTERFLY_RIGHT:                return EL_BD_BUTTERFLY_LEFT;
-
-    case EL_BD_FIREFLY_LEFT:           return EL_BD_FIREFLY_RIGHT;
-    case EL_BD_FIREFLY_RIGHT:          return EL_BD_FIREFLY_LEFT;
-
-    case EL_BUG_LEFT:                  return EL_BUG_RIGHT;
-    case EL_BUG_RIGHT:                 return EL_BUG_LEFT;
-
-    case EL_SPACESHIP_LEFT:            return EL_SPACESHIP_RIGHT;
-    case EL_SPACESHIP_RIGHT:           return EL_SPACESHIP_LEFT;
-
-    case EL_PACMAN_LEFT:               return EL_PACMAN_RIGHT;
-    case EL_PACMAN_RIGHT:              return EL_PACMAN_LEFT;
-
-    case EL_ARROW_LEFT:                        return EL_ARROW_RIGHT;
-    case EL_ARROW_RIGHT:               return EL_ARROW_LEFT;
-
-    case EL_MOLE_LEFT:                 return EL_MOLE_RIGHT;
-    case EL_MOLE_RIGHT:                        return EL_MOLE_LEFT;
-
-    case EL_BALLOON_SWITCH_LEFT:       return EL_BALLOON_SWITCH_RIGHT;
-    case EL_BALLOON_SWITCH_RIGHT:      return EL_BALLOON_SWITCH_LEFT;
-
-    case EL_YAMYAM_LEFT:               return EL_YAMYAM_RIGHT;
-    case EL_YAMYAM_RIGHT:              return EL_YAMYAM_LEFT;
-
-    case EL_SP_PORT_LEFT:              return EL_SP_PORT_RIGHT;
-    case EL_SP_PORT_RIGHT:             return EL_SP_PORT_LEFT;
-
-    case EL_SP_GRAVITY_PORT_LEFT:      return EL_SP_GRAVITY_PORT_RIGHT;
-    case EL_SP_GRAVITY_PORT_RIGHT:     return EL_SP_GRAVITY_PORT_LEFT;
-
-    case EL_SP_GRAVITY_ON_PORT_LEFT:   return EL_SP_GRAVITY_ON_PORT_RIGHT;
-    case EL_SP_GRAVITY_ON_PORT_RIGHT:  return EL_SP_GRAVITY_ON_PORT_LEFT;
-
-    case EL_SP_GRAVITY_OFF_PORT_LEFT:  return EL_SP_GRAVITY_OFF_PORT_RIGHT;
-    case EL_SP_GRAVITY_OFF_PORT_RIGHT: return EL_SP_GRAVITY_OFF_PORT_LEFT;
-
-    case EL_CONVEYOR_BELT_1_LEFT:      return EL_CONVEYOR_BELT_1_RIGHT;
-    case EL_CONVEYOR_BELT_1_RIGHT:     return EL_CONVEYOR_BELT_1_LEFT;
-
-    case EL_CONVEYOR_BELT_2_LEFT:      return EL_CONVEYOR_BELT_2_RIGHT;
-    case EL_CONVEYOR_BELT_2_RIGHT:     return EL_CONVEYOR_BELT_2_LEFT;
-
-    case EL_CONVEYOR_BELT_3_LEFT:      return EL_CONVEYOR_BELT_3_RIGHT;
-    case EL_CONVEYOR_BELT_3_RIGHT:     return EL_CONVEYOR_BELT_3_LEFT;
-
-    case EL_CONVEYOR_BELT_4_LEFT:      return EL_CONVEYOR_BELT_4_RIGHT;
-    case EL_CONVEYOR_BELT_4_RIGHT:     return EL_CONVEYOR_BELT_4_LEFT;
-
-    case EL_SPRING_LEFT:               return EL_SPRING_RIGHT;
-    case EL_SPRING_RIGHT:              return EL_SPRING_LEFT;
-
-    case EL_SP_CHIP_LEFT:              return EL_SP_CHIP_RIGHT;
-    case EL_SP_CHIP_RIGHT:             return EL_SP_CHIP_LEFT;
-
-    case EL_TUBE_VERTICAL_LEFT:                return EL_TUBE_VERTICAL_RIGHT;
-    case EL_TUBE_VERTICAL_RIGHT:       return EL_TUBE_VERTICAL_LEFT;
-    case EL_TUBE_LEFT_UP:              return EL_TUBE_RIGHT_UP;
-    case EL_TUBE_LEFT_DOWN:            return EL_TUBE_RIGHT_DOWN;
-    case EL_TUBE_RIGHT_UP:             return EL_TUBE_LEFT_UP;
-    case EL_TUBE_RIGHT_DOWN:           return EL_TUBE_LEFT_DOWN;
-
-    case EL_DC_STEELWALL_1_LEFT:       return EL_DC_STEELWALL_1_RIGHT;
-    case EL_DC_STEELWALL_1_RIGHT:      return EL_DC_STEELWALL_1_LEFT;
-    case EL_DC_STEELWALL_1_TOPLEFT:    return EL_DC_STEELWALL_1_TOPRIGHT;
-    case EL_DC_STEELWALL_1_TOPRIGHT:   return EL_DC_STEELWALL_1_TOPLEFT;
-    case EL_DC_STEELWALL_1_BOTTOMLEFT: return EL_DC_STEELWALL_1_BOTTOMRIGHT;
-    case EL_DC_STEELWALL_1_BOTTOMRIGHT:        return EL_DC_STEELWALL_1_BOTTOMLEFT;
-    case EL_DC_STEELWALL_1_TOPLEFT_2:  return EL_DC_STEELWALL_1_TOPRIGHT_2;
-    case EL_DC_STEELWALL_1_TOPRIGHT_2: return EL_DC_STEELWALL_1_TOPLEFT_2;
-    case EL_DC_STEELWALL_1_BOTTOMLEFT_2: return EL_DC_STEELWALL_1_BOTTOMRIGHT_2;
-    case EL_DC_STEELWALL_1_BOTTOMRIGHT_2: return EL_DC_STEELWALL_1_BOTTOMLEFT_2;
-
-    case EL_DC_STEELWALL_2_LEFT:       return EL_DC_STEELWALL_2_RIGHT;
-    case EL_DC_STEELWALL_2_RIGHT:      return EL_DC_STEELWALL_2_LEFT;
+  int i;
 
-    case EL_ACID_POOL_TOPLEFT:         return EL_ACID_POOL_TOPRIGHT;
-    case EL_ACID_POOL_TOPRIGHT:                return EL_ACID_POOL_TOPLEFT;
-    case EL_ACID_POOL_BOTTOMLEFT:      return EL_ACID_POOL_BOTTOMRIGHT;
-    case EL_ACID_POOL_BOTTOMRIGHT:     return EL_ACID_POOL_BOTTOMLEFT;
-  }
+  for (i = 0; map[i] != -1; i++)
+    if (map[i] == element)
+      return map[i ^ 1];       // get flipped element by flipping LSB of index
 
   return element;
 }
 
-static int getFlippedTileY(int element)
+static int getFlippedTileX(int element)
 {
-  switch (element)
-  {
-    case EL_BD_BUTTERFLY_UP:           return EL_BD_BUTTERFLY_DOWN;
-    case EL_BD_BUTTERFLY_DOWN:         return EL_BD_BUTTERFLY_UP;
-
-    case EL_BD_FIREFLY_UP:             return EL_BD_FIREFLY_DOWN;
-    case EL_BD_FIREFLY_DOWN:           return EL_BD_FIREFLY_UP;
-
-    case EL_BUG_UP:                    return EL_BUG_DOWN;
-    case EL_BUG_DOWN:                  return EL_BUG_UP;
-
-    case EL_SPACESHIP_UP:              return EL_SPACESHIP_DOWN;
-    case EL_SPACESHIP_DOWN:            return EL_SPACESHIP_UP;
-
-    case EL_PACMAN_UP:                 return EL_PACMAN_DOWN;
-    case EL_PACMAN_DOWN:               return EL_PACMAN_UP;
-
-    case EL_ARROW_UP:                  return EL_ARROW_DOWN;
-    case EL_ARROW_DOWN:                        return EL_ARROW_UP;
-
-    case EL_MOLE_UP:                   return EL_MOLE_DOWN;
-    case EL_MOLE_DOWN:                 return EL_MOLE_UP;
-
-    case EL_BALLOON_SWITCH_UP:         return EL_BALLOON_SWITCH_DOWN;
-    case EL_BALLOON_SWITCH_DOWN:       return EL_BALLOON_SWITCH_UP;
-
-    case EL_YAMYAM_UP:                 return EL_YAMYAM_DOWN;
-    case EL_YAMYAM_DOWN:               return EL_YAMYAM_UP;
-
-    case EL_SP_PORT_UP:                        return EL_SP_PORT_DOWN;
-    case EL_SP_PORT_DOWN:              return EL_SP_PORT_UP;
-
-    case EL_SP_GRAVITY_PORT_UP:                return EL_SP_GRAVITY_PORT_DOWN;
-    case EL_SP_GRAVITY_PORT_DOWN:      return EL_SP_GRAVITY_PORT_UP;
-
-    case EL_SP_GRAVITY_ON_PORT_UP:     return EL_SP_GRAVITY_ON_PORT_DOWN;
-    case EL_SP_GRAVITY_ON_PORT_DOWN:   return EL_SP_GRAVITY_ON_PORT_UP;
-
-    case EL_SP_GRAVITY_OFF_PORT_UP:    return EL_SP_GRAVITY_OFF_PORT_DOWN;
-    case EL_SP_GRAVITY_OFF_PORT_DOWN:  return EL_SP_GRAVITY_OFF_PORT_UP;
-
-    case EL_SP_CHIP_TOP:               return EL_SP_CHIP_BOTTOM;
-    case EL_SP_CHIP_BOTTOM:            return EL_SP_CHIP_TOP;
-
-    case EL_TUBE_HORIZONTAL_UP:                return EL_TUBE_HORIZONTAL_DOWN;
-    case EL_TUBE_HORIZONTAL_DOWN:      return EL_TUBE_HORIZONTAL_UP;
-    case EL_TUBE_LEFT_UP:              return EL_TUBE_LEFT_DOWN;
-    case EL_TUBE_LEFT_DOWN:            return EL_TUBE_LEFT_UP;
-    case EL_TUBE_RIGHT_UP:             return EL_TUBE_RIGHT_DOWN;
-    case EL_TUBE_RIGHT_DOWN:           return EL_TUBE_RIGHT_UP;
-
-    case EL_DC_STEELWALL_1_TOP:                return EL_DC_STEELWALL_1_BOTTOM;
-    case EL_DC_STEELWALL_1_BOTTOM:     return EL_DC_STEELWALL_1_TOP;
-    case EL_DC_STEELWALL_1_TOPLEFT:    return EL_DC_STEELWALL_1_BOTTOMLEFT;
-    case EL_DC_STEELWALL_1_TOPRIGHT:   return EL_DC_STEELWALL_1_BOTTOMRIGHT;
-    case EL_DC_STEELWALL_1_BOTTOMLEFT: return EL_DC_STEELWALL_1_TOPLEFT;
-    case EL_DC_STEELWALL_1_BOTTOMRIGHT:        return EL_DC_STEELWALL_1_TOPRIGHT;
-    case EL_DC_STEELWALL_1_TOPLEFT_2:  return EL_DC_STEELWALL_1_BOTTOMLEFT_2;
-    case EL_DC_STEELWALL_1_TOPRIGHT_2: return EL_DC_STEELWALL_1_BOTTOMRIGHT_2;
-    case EL_DC_STEELWALL_1_BOTTOMLEFT_2: return EL_DC_STEELWALL_1_TOPLEFT_2;
-    case EL_DC_STEELWALL_1_BOTTOMRIGHT_2: return EL_DC_STEELWALL_1_TOPRIGHT_2;
+  int map[] =
+  {
+    EL_BD_BUTTERFLY_LEFT,              EL_BD_BUTTERFLY_RIGHT,
+    EL_BD_FIREFLY_LEFT,                        EL_BD_FIREFLY_RIGHT,
+    EL_BUG_LEFT,                       EL_BUG_RIGHT,
+    EL_SPACESHIP_LEFT,                 EL_SPACESHIP_RIGHT,
+    EL_PACMAN_LEFT,                    EL_PACMAN_RIGHT,
+    EL_ARROW_LEFT,                     EL_ARROW_RIGHT,
+    EL_MOLE_LEFT,                      EL_MOLE_RIGHT,
+    EL_BALLOON_SWITCH_LEFT,            EL_BALLOON_SWITCH_RIGHT,
+    EL_YAMYAM_LEFT,                    EL_YAMYAM_RIGHT,
+    EL_SP_PORT_LEFT,                   EL_SP_PORT_RIGHT,
+    EL_SP_GRAVITY_PORT_LEFT,           EL_SP_GRAVITY_PORT_RIGHT,
+    EL_SP_GRAVITY_ON_PORT_LEFT,                EL_SP_GRAVITY_ON_PORT_RIGHT,
+    EL_SP_GRAVITY_OFF_PORT_LEFT,       EL_SP_GRAVITY_OFF_PORT_RIGHT,
+    EL_CONVEYOR_BELT_1_LEFT,           EL_CONVEYOR_BELT_1_RIGHT,
+    EL_CONVEYOR_BELT_2_LEFT,           EL_CONVEYOR_BELT_2_RIGHT,
+    EL_CONVEYOR_BELT_3_LEFT,           EL_CONVEYOR_BELT_3_RIGHT,
+    EL_CONVEYOR_BELT_4_LEFT,           EL_CONVEYOR_BELT_4_RIGHT,
+    EL_SPRING_LEFT,                    EL_SPRING_RIGHT,
+    EL_SP_CHIP_LEFT,                   EL_SP_CHIP_RIGHT,
+    EL_TUBE_VERTICAL_LEFT,             EL_TUBE_VERTICAL_RIGHT,
+    EL_TUBE_LEFT_UP,                   EL_TUBE_RIGHT_UP,
+    EL_TUBE_LEFT_DOWN,                 EL_TUBE_RIGHT_DOWN,
+    EL_DC_STEELWALL_1_LEFT,            EL_DC_STEELWALL_1_RIGHT,
+    EL_DC_STEELWALL_1_TOPLEFT,         EL_DC_STEELWALL_1_TOPRIGHT,
+    EL_DC_STEELWALL_1_BOTTOMLEFT,      EL_DC_STEELWALL_1_BOTTOMRIGHT,
+    EL_DC_STEELWALL_1_TOPLEFT_2,       EL_DC_STEELWALL_1_TOPRIGHT_2,
+    EL_DC_STEELWALL_1_BOTTOMLEFT_2,    EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
+    EL_DC_STEELWALL_2_LEFT,            EL_DC_STEELWALL_2_RIGHT,
+    EL_ACID_POOL_TOPLEFT,              EL_ACID_POOL_TOPRIGHT,
+    EL_ACID_POOL_BOTTOMLEFT,           EL_ACID_POOL_BOTTOMRIGHT,
+
+    -1
+  };
 
-    case EL_DC_STEELWALL_2_TOP:                return EL_DC_STEELWALL_2_BOTTOM;
-    case EL_DC_STEELWALL_2_BOTTOM:     return EL_DC_STEELWALL_2_TOP;
+  return getFlippedTileExt(map, element);
+}
 
-    case EL_EMC_WALL_1:                        return EL_EMC_WALL_3;
-    case EL_EMC_WALL_3:                        return EL_EMC_WALL_1;
-  }
+static int getFlippedTileY(int element)
+{
+  int map[] =
+  {
+    EL_BD_BUTTERFLY_UP,                        EL_BD_BUTTERFLY_DOWN,
+    EL_BD_FIREFLY_UP,                  EL_BD_FIREFLY_DOWN,
+    EL_BUG_UP,                         EL_BUG_DOWN,
+    EL_SPACESHIP_UP,                   EL_SPACESHIP_DOWN,
+    EL_PACMAN_UP,                      EL_PACMAN_DOWN,
+    EL_ARROW_UP,                       EL_ARROW_DOWN,
+    EL_MOLE_UP,                                EL_MOLE_DOWN,
+    EL_BALLOON_SWITCH_UP,              EL_BALLOON_SWITCH_DOWN,
+    EL_YAMYAM_UP,                      EL_YAMYAM_DOWN,
+    EL_SP_PORT_UP,                     EL_SP_PORT_DOWN,
+    EL_SP_GRAVITY_PORT_UP,             EL_SP_GRAVITY_PORT_DOWN,
+    EL_SP_GRAVITY_ON_PORT_UP,          EL_SP_GRAVITY_ON_PORT_DOWN,
+    EL_SP_GRAVITY_OFF_PORT_UP,         EL_SP_GRAVITY_OFF_PORT_DOWN,
+    EL_SP_CHIP_TOP,                    EL_SP_CHIP_BOTTOM,
+    EL_TUBE_HORIZONTAL_UP,             EL_TUBE_HORIZONTAL_DOWN,
+    EL_TUBE_LEFT_UP,                   EL_TUBE_LEFT_DOWN,
+    EL_TUBE_RIGHT_UP,                  EL_TUBE_RIGHT_DOWN,
+    EL_DC_STEELWALL_1_TOP,             EL_DC_STEELWALL_1_BOTTOM,
+    EL_DC_STEELWALL_1_TOPLEFT,         EL_DC_STEELWALL_1_BOTTOMLEFT,
+    EL_DC_STEELWALL_1_TOPRIGHT,                EL_DC_STEELWALL_1_BOTTOMRIGHT,
+    EL_DC_STEELWALL_1_TOPLEFT_2,       EL_DC_STEELWALL_1_BOTTOMLEFT_2,
+    EL_DC_STEELWALL_1_TOPRIGHT_2,      EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
+    EL_DC_STEELWALL_2_TOP,             EL_DC_STEELWALL_2_BOTTOM,
+    EL_EMC_WALL_1,                     EL_EMC_WALL_3,
+
+    -1
+  };
 
-  return element;
+  return getFlippedTileExt(map, element);
 }
 
 static int getFlippedTileXY(int element)
 {
-  switch (element)
-  {
-    case EL_BD_BUTTERFLY_LEFT:         return EL_BD_BUTTERFLY_UP;
-    case EL_BD_BUTTERFLY_RIGHT:                return EL_BD_BUTTERFLY_DOWN;
-    case EL_BD_BUTTERFLY_UP:           return EL_BD_BUTTERFLY_LEFT;
-    case EL_BD_BUTTERFLY_DOWN:         return EL_BD_BUTTERFLY_RIGHT;
-
-    case EL_BD_FIREFLY_LEFT:           return EL_BD_FIREFLY_UP;
-    case EL_BD_FIREFLY_RIGHT:          return EL_BD_FIREFLY_DOWN;
-    case EL_BD_FIREFLY_UP:             return EL_BD_FIREFLY_LEFT;
-    case EL_BD_FIREFLY_DOWN:           return EL_BD_FIREFLY_RIGHT;
-
-    case EL_BUG_LEFT:                  return EL_BUG_UP;
-    case EL_BUG_RIGHT:                 return EL_BUG_DOWN;
-    case EL_BUG_UP:                    return EL_BUG_LEFT;
-    case EL_BUG_DOWN:                  return EL_BUG_RIGHT;
-
-    case EL_SPACESHIP_LEFT:            return EL_SPACESHIP_UP;
-    case EL_SPACESHIP_RIGHT:           return EL_SPACESHIP_DOWN;
-    case EL_SPACESHIP_UP:              return EL_SPACESHIP_LEFT;
-    case EL_SPACESHIP_DOWN:            return EL_SPACESHIP_RIGHT;
-
-    case EL_PACMAN_LEFT:               return EL_PACMAN_UP;
-    case EL_PACMAN_RIGHT:              return EL_PACMAN_DOWN;
-    case EL_PACMAN_UP:                 return EL_PACMAN_LEFT;
-    case EL_PACMAN_DOWN:               return EL_PACMAN_RIGHT;
-
-    case EL_ARROW_LEFT:                        return EL_ARROW_UP;
-    case EL_ARROW_RIGHT:               return EL_ARROW_DOWN;
-    case EL_ARROW_UP:                  return EL_ARROW_LEFT;
-    case EL_ARROW_DOWN:                        return EL_ARROW_RIGHT;
-
-    case EL_MOLE_LEFT:                 return EL_MOLE_UP;
-    case EL_MOLE_RIGHT:                        return EL_MOLE_DOWN;
-    case EL_MOLE_UP:                   return EL_MOLE_LEFT;
-    case EL_MOLE_DOWN:                 return EL_MOLE_RIGHT;
-
-    case EL_BALLOON_SWITCH_LEFT:       return EL_BALLOON_SWITCH_UP;
-    case EL_BALLOON_SWITCH_RIGHT:      return EL_BALLOON_SWITCH_DOWN;
-    case EL_BALLOON_SWITCH_UP:         return EL_BALLOON_SWITCH_LEFT;
-    case EL_BALLOON_SWITCH_DOWN:       return EL_BALLOON_SWITCH_RIGHT;
-
-    case EL_YAMYAM_LEFT:               return EL_YAMYAM_UP;
-    case EL_YAMYAM_RIGHT:              return EL_YAMYAM_DOWN;
-    case EL_YAMYAM_UP:                 return EL_YAMYAM_LEFT;
-    case EL_YAMYAM_DOWN:               return EL_YAMYAM_RIGHT;
-
-    case EL_SP_PORT_LEFT:              return EL_SP_PORT_UP;
-    case EL_SP_PORT_RIGHT:             return EL_SP_PORT_DOWN;
-    case EL_SP_PORT_UP:                        return EL_SP_PORT_LEFT;
-    case EL_SP_PORT_DOWN:              return EL_SP_PORT_RIGHT;
-
-    case EL_SP_GRAVITY_PORT_LEFT:      return EL_SP_GRAVITY_PORT_UP;
-    case EL_SP_GRAVITY_PORT_RIGHT:     return EL_SP_GRAVITY_PORT_DOWN;
-    case EL_SP_GRAVITY_PORT_UP:                return EL_SP_GRAVITY_PORT_LEFT;
-    case EL_SP_GRAVITY_PORT_DOWN:      return EL_SP_GRAVITY_PORT_RIGHT;
-
-    case EL_SP_GRAVITY_ON_PORT_LEFT:   return EL_SP_GRAVITY_ON_PORT_UP;
-    case EL_SP_GRAVITY_ON_PORT_RIGHT:  return EL_SP_GRAVITY_ON_PORT_DOWN;
-    case EL_SP_GRAVITY_ON_PORT_UP:     return EL_SP_GRAVITY_ON_PORT_LEFT;
-    case EL_SP_GRAVITY_ON_PORT_DOWN:   return EL_SP_GRAVITY_ON_PORT_RIGHT;
-
-    case EL_SP_GRAVITY_OFF_PORT_LEFT:  return EL_SP_GRAVITY_OFF_PORT_UP;
-    case EL_SP_GRAVITY_OFF_PORT_RIGHT: return EL_SP_GRAVITY_OFF_PORT_DOWN;
-    case EL_SP_GRAVITY_OFF_PORT_UP:    return EL_SP_GRAVITY_OFF_PORT_LEFT;
-    case EL_SP_GRAVITY_OFF_PORT_DOWN:  return EL_SP_GRAVITY_OFF_PORT_RIGHT;
-
-    case EL_SP_CHIP_LEFT:              return EL_SP_CHIP_TOP;
-    case EL_SP_CHIP_RIGHT:             return EL_SP_CHIP_BOTTOM;
-    case EL_SP_CHIP_TOP:               return EL_SP_CHIP_LEFT;
-    case EL_SP_CHIP_BOTTOM:            return EL_SP_CHIP_RIGHT;
-
-    case EL_TUBE_VERTICAL:             return EL_TUBE_HORIZONTAL;
-    case EL_TUBE_HORIZONTAL:           return EL_TUBE_VERTICAL;
-    case EL_TUBE_VERTICAL_LEFT:                return EL_TUBE_HORIZONTAL_UP;
-    case EL_TUBE_VERTICAL_RIGHT:       return EL_TUBE_HORIZONTAL_DOWN;
-    case EL_TUBE_HORIZONTAL_UP:                return EL_TUBE_VERTICAL_LEFT;
-    case EL_TUBE_HORIZONTAL_DOWN:      return EL_TUBE_VERTICAL_RIGHT;
-    case EL_TUBE_LEFT_DOWN:            return EL_TUBE_RIGHT_UP;
-    case EL_TUBE_RIGHT_UP:             return EL_TUBE_LEFT_DOWN;
-
-    case EL_DC_STEELWALL_1_LEFT:       return EL_DC_STEELWALL_1_TOP;
-    case EL_DC_STEELWALL_1_RIGHT:      return EL_DC_STEELWALL_1_BOTTOM;
-    case EL_DC_STEELWALL_1_TOP:                return EL_DC_STEELWALL_1_LEFT;
-    case EL_DC_STEELWALL_1_BOTTOM:     return EL_DC_STEELWALL_1_RIGHT;
-    case EL_DC_STEELWALL_1_HORIZONTAL: return EL_DC_STEELWALL_1_VERTICAL;
-    case EL_DC_STEELWALL_1_VERTICAL:   return EL_DC_STEELWALL_1_HORIZONTAL;
-    case EL_DC_STEELWALL_1_TOPRIGHT:   return EL_DC_STEELWALL_1_BOTTOMLEFT;
-    case EL_DC_STEELWALL_1_BOTTOMLEFT: return EL_DC_STEELWALL_1_TOPRIGHT;
-    case EL_DC_STEELWALL_1_TOPRIGHT_2: return EL_DC_STEELWALL_1_BOTTOMLEFT_2;
-    case EL_DC_STEELWALL_1_BOTTOMLEFT_2: return EL_DC_STEELWALL_1_TOPRIGHT_2;
-
-    case EL_DC_STEELWALL_2_LEFT:       return EL_DC_STEELWALL_2_TOP;
-    case EL_DC_STEELWALL_2_RIGHT:      return EL_DC_STEELWALL_2_BOTTOM;
-    case EL_DC_STEELWALL_2_TOP:                return EL_DC_STEELWALL_2_LEFT;
-    case EL_DC_STEELWALL_2_BOTTOM:     return EL_DC_STEELWALL_2_RIGHT;
-    case EL_DC_STEELWALL_2_HORIZONTAL: return EL_DC_STEELWALL_2_VERTICAL;
-    case EL_DC_STEELWALL_2_VERTICAL:   return EL_DC_STEELWALL_2_HORIZONTAL;
-
-    case EL_EXPANDABLE_WALL_HORIZONTAL:        return EL_EXPANDABLE_WALL_VERTICAL;
-    case EL_EXPANDABLE_WALL_VERTICAL:  return EL_EXPANDABLE_WALL_HORIZONTAL;
-
-    case EL_EXPANDABLE_STEELWALL_HORIZONTAL:   return EL_EXPANDABLE_STEELWALL_VERTICAL;
-    case EL_EXPANDABLE_STEELWALL_VERTICAL:     return EL_EXPANDABLE_STEELWALL_HORIZONTAL;
-  }
+  int map[] =
+  {
+    EL_BD_BUTTERFLY_LEFT,              EL_BD_BUTTERFLY_UP,
+    EL_BD_BUTTERFLY_RIGHT,             EL_BD_BUTTERFLY_DOWN,
+    EL_BD_FIREFLY_LEFT,                        EL_BD_FIREFLY_UP,
+    EL_BD_FIREFLY_RIGHT,               EL_BD_FIREFLY_DOWN,
+    EL_BUG_LEFT,                       EL_BUG_UP,
+    EL_BUG_RIGHT,                      EL_BUG_DOWN,
+    EL_SPACESHIP_LEFT,                 EL_SPACESHIP_UP,
+    EL_SPACESHIP_RIGHT,                        EL_SPACESHIP_DOWN,
+    EL_PACMAN_LEFT,                    EL_PACMAN_UP,
+    EL_PACMAN_RIGHT,                   EL_PACMAN_DOWN,
+    EL_ARROW_LEFT,                     EL_ARROW_UP,
+    EL_ARROW_RIGHT,                    EL_ARROW_DOWN,
+    EL_MOLE_LEFT,                      EL_MOLE_UP,
+    EL_MOLE_RIGHT,                     EL_MOLE_DOWN,
+    EL_BALLOON_SWITCH_LEFT,            EL_BALLOON_SWITCH_UP,
+    EL_BALLOON_SWITCH_RIGHT,           EL_BALLOON_SWITCH_DOWN,
+    EL_YAMYAM_LEFT,                    EL_YAMYAM_UP,
+    EL_YAMYAM_RIGHT,                   EL_YAMYAM_DOWN,
+    EL_SP_PORT_LEFT,                   EL_SP_PORT_UP,
+    EL_SP_PORT_RIGHT,                  EL_SP_PORT_DOWN,
+    EL_SP_GRAVITY_PORT_LEFT,           EL_SP_GRAVITY_PORT_UP,
+    EL_SP_GRAVITY_PORT_RIGHT,          EL_SP_GRAVITY_PORT_DOWN,
+    EL_SP_GRAVITY_ON_PORT_LEFT,                EL_SP_GRAVITY_ON_PORT_UP,
+    EL_SP_GRAVITY_ON_PORT_RIGHT,       EL_SP_GRAVITY_ON_PORT_DOWN,
+    EL_SP_GRAVITY_OFF_PORT_LEFT,       EL_SP_GRAVITY_OFF_PORT_UP,
+    EL_SP_GRAVITY_OFF_PORT_RIGHT,      EL_SP_GRAVITY_OFF_PORT_DOWN,
+    EL_SP_CHIP_LEFT,                   EL_SP_CHIP_TOP,
+    EL_SP_CHIP_RIGHT,                  EL_SP_CHIP_BOTTOM,
+    EL_TUBE_VERTICAL,                  EL_TUBE_HORIZONTAL,
+    EL_TUBE_VERTICAL_LEFT,             EL_TUBE_HORIZONTAL_UP,
+    EL_TUBE_VERTICAL_RIGHT,            EL_TUBE_HORIZONTAL_DOWN,
+    EL_TUBE_LEFT_DOWN,                 EL_TUBE_RIGHT_UP,
+    EL_DC_STEELWALL_1_LEFT,            EL_DC_STEELWALL_1_TOP,
+    EL_DC_STEELWALL_1_RIGHT,           EL_DC_STEELWALL_1_BOTTOM,
+    EL_DC_STEELWALL_1_HORIZONTAL,      EL_DC_STEELWALL_1_VERTICAL,
+    EL_DC_STEELWALL_1_TOPRIGHT,                EL_DC_STEELWALL_1_BOTTOMLEFT,
+    EL_DC_STEELWALL_1_TOPRIGHT_2,      EL_DC_STEELWALL_1_BOTTOMLEFT_2,
+    EL_DC_STEELWALL_2_LEFT,            EL_DC_STEELWALL_2_TOP,
+    EL_DC_STEELWALL_2_RIGHT,           EL_DC_STEELWALL_2_BOTTOM,
+    EL_DC_STEELWALL_2_HORIZONTAL,      EL_DC_STEELWALL_2_VERTICAL,
+    EL_EXPANDABLE_WALL_HORIZONTAL,     EL_EXPANDABLE_WALL_VERTICAL,
+    EL_EXPANDABLE_STEELWALL_HORIZONTAL,        EL_EXPANDABLE_STEELWALL_VERTICAL,
+
+    -1
+  };
 
-  return element;
+  return getFlippedTileExt(map, element);
 }
 
 static int getFlippedTile(int element, int mode)
@@ -12899,6 +13004,7 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
       lev_fieldx = level.fieldx = brush_width;
       lev_fieldy = level.fieldy = brush_height;
 
+      boolean use_bd_engine = TRUE;
       boolean use_em_engine = TRUE;
       boolean use_sp_engine = TRUE;
       boolean use_mm_engine = TRUE;
@@ -12909,6 +13015,9 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
        {
          int element = Tile[x][y];
 
+         if (!IS_BD_ELEMENT(element) && !IS_PLAYER_ELEMENT(element))
+           use_bd_engine = FALSE;
+
          if (!IS_EM_ELEMENT(element) && !IS_PLAYER_ELEMENT(element))
            use_em_engine = FALSE;
 
@@ -12920,7 +13029,8 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
        }
       }
 
-      level.game_engine_type = (use_em_engine ? GAME_ENGINE_TYPE_EM :
+      level.game_engine_type = (use_bd_engine ? GAME_ENGINE_TYPE_BD :
+                               use_em_engine ? GAME_ENGINE_TYPE_EM :
                                use_sp_engine ? GAME_ENGINE_TYPE_SP :
                                use_mm_engine ? GAME_ENGINE_TYPE_MM :
                                GAME_ENGINE_TYPE_RND);
@@ -13440,7 +13550,8 @@ static void WrapLevel(int dx, int dy)
   CopyLevelToUndoBuffer(UNDO_ACCUMULATE);
 }
 
-static void DrawAreaElementHighlight(boolean highlighted)
+static void DrawAreaElementHighlight(boolean highlighted,
+                                    boolean highlighted_similar)
 {
   DrawEditorLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
 
@@ -13453,26 +13564,69 @@ static void DrawAreaElementHighlight(boolean highlighted)
   {
     for (y = 0; y < ed_fieldy; y++)
     {
+      boolean highlight = FALSE;
       int lx = x + level_xpos;
       int ly = y + level_ypos;
 
       if (!IN_LEV_FIELD(lx, ly))
        continue;
 
-      if (Tile[lx][ly] != new_element1)
+      // check if element is the same
+      if (Tile[lx][ly] == new_element1)
+       highlight = TRUE;
+
+      // check if element is similar
+      if (highlighted_similar &&
+         strEqual(element_info[Tile[lx][ly]].class_name,
+                  element_info[new_element1].class_name))
+       highlight = TRUE;
+
+      // check if element is matching MM style wall
+      if (IS_MM_WALL(Tile[lx][ly]) &&
+         map_mm_wall_element(Tile[lx][ly]) == new_element1)
+       highlight = TRUE;
+
+      if (!highlight)
        continue;
 
-      int sx = SX + x * ed_tilesize;
-      int sy = SY + y * ed_tilesize;
-      int from_sx = sx;
-      int from_sy = sy;
-      int to_sx = sx + ed_tilesize - 1;
-      int to_sy = sy + ed_tilesize - 1;
-
-      DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx,   from_sy);
-      DrawSimpleWhiteLine(drawto, to_sx,   from_sy, to_sx,   to_sy);
-      DrawSimpleWhiteLine(drawto, to_sx,   to_sy,   from_sx, to_sy);
-      DrawSimpleWhiteLine(drawto, from_sx, to_sy,   from_sx, from_sy);
+      if (IS_MM_WALL(Tile[lx][ly]) && !highlighted_similar)
+      {
+       int i;
+
+       for (i = 0; i < 4; i++)
+       {
+         if (!(MM_WALL_BITS(Tile[lx][ly]) & (1 << i)))
+           continue;
+
+         int xx = x * 2 + (i % 2);
+         int yy = y * 2 + (i / 2);
+         int sx = SX + xx * ed_tilesize / 2;
+         int sy = SY + yy * ed_tilesize / 2;
+         int from_sx = sx;
+         int from_sy = sy;
+         int to_sx = sx + ed_tilesize / 2 - 1;
+         int to_sy = sy + ed_tilesize / 2 - 1;
+
+         DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx,   from_sy);
+         DrawSimpleWhiteLine(drawto, to_sx,   from_sy, to_sx,   to_sy);
+         DrawSimpleWhiteLine(drawto, to_sx,   to_sy,   from_sx, to_sy);
+         DrawSimpleWhiteLine(drawto, from_sx, to_sy,   from_sx, from_sy);
+       }
+      }
+      else
+      {
+       int sx = SX + x * ed_tilesize;
+       int sy = SY + y * ed_tilesize;
+       int from_sx = sx;
+       int from_sy = sy;
+       int to_sx = sx + ed_tilesize - 1;
+       int to_sy = sy + ed_tilesize - 1;
+
+       DrawSimpleWhiteLine(drawto, from_sx, from_sy, to_sx,   from_sy);
+       DrawSimpleWhiteLine(drawto, to_sx,   from_sy, to_sx,   to_sy);
+       DrawSimpleWhiteLine(drawto, to_sx,   to_sy,   from_sx, to_sy);
+       DrawSimpleWhiteLine(drawto, from_sx, to_sy,   from_sx, from_sy);
+      }
     }
   }
 }
@@ -14827,8 +14981,8 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
          for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
          {
-           int *cascade_element= &(*editor_elements_info[i].headline_list)[0];
-           boolean *cascade_value=editor_elements_info[i].setup_cascade_value;
+           int *cascade_element = &(*editor_elements_info[i].headline_list)[0];
+           boolean *cascade_value = editor_elements_info[i].setup_cascade_value;
 
            if (*cascade_element == new_element)
            {
@@ -15095,16 +15249,20 @@ static void HandleLevelEditorIdle_Properties(void)
 static void HandleLevelEditorIdle_Drawing(void)
 {
   static boolean last_highlighted = FALSE;
+  static boolean last_highlighted_similar = FALSE;
   boolean highlighted = (GetKeyModState() & KMOD_Alt);
+  boolean highlighted_similar = (GetKeyModState() & KMOD_Shift);
 
-  if (highlighted != last_highlighted)
+  if (highlighted != last_highlighted ||
+      (highlighted && highlighted_similar != last_highlighted_similar))
   {
-    DrawAreaElementHighlight(highlighted);
-
-    last_highlighted = highlighted;
+    DrawAreaElementHighlight(highlighted, highlighted_similar);
 
     redraw_mask |= REDRAW_FIELD;
   }
+
+  last_highlighted = highlighted;
+  last_highlighted_similar = highlighted_similar;
 }
 
 void HandleLevelEditorIdle(void)
@@ -15368,7 +15526,7 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed,
        vp_door_2->height == VYSIZE)
       CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
     else
-      SetDoorState(DOOR_CLOSE_2);
+      SetDoorState(DOOR_CLOSE_ALL);
 
     BackToFront();