changed prefix for all game elements only used by the native BD engine
[rocksndiamonds.git] / src / editor.c
index 941cc4da155f7aa18880e35c8592795302feac70..d17e9684b8c7b95de18bc5aed712c782b595c910 100644 (file)
@@ -625,8 +625,8 @@ enum
   GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
   GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
   GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
-  GADGET_ID_BD_AMOEBA_CONTENT_TOO_BIG,
-  GADGET_ID_BD_AMOEBA_CONTENT_ENCLOSED,
+  GADGET_ID_BD_AMOEBA_1_CONTENT_TOO_BIG,
+  GADGET_ID_BD_AMOEBA_1_CONTENT_ENCLOSED,
   GADGET_ID_BD_AMOEBA_2_CONTENT_TOO_BIG,
   GADGET_ID_BD_AMOEBA_2_CONTENT_ENCLOSED,
   GADGET_ID_BD_AMOEBA_2_CONTENT_EXPLODING,
@@ -648,9 +648,9 @@ enum
   GADGET_ID_BD_ROCK_TURNS_TO_ON_IMPACT,
   GADGET_ID_BD_DIAMOND_TURNS_TO_ON_FALLING,
   GADGET_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT,
-  GADGET_ID_BD_FIREFLY_EXPLODES_TO,
+  GADGET_ID_BD_FIREFLY_1_EXPLODES_TO,
   GADGET_ID_BD_FIREFLY_2_EXPLODES_TO,
-  GADGET_ID_BD_BUTTERFLY_EXPLODES_TO,
+  GADGET_ID_BD_BUTTERFLY_1_EXPLODES_TO,
   GADGET_ID_BD_BUTTERFLY_2_EXPLODES_TO,
   GADGET_ID_BD_STONEFLY_EXPLODES_TO,
   GADGET_ID_BD_DRAGONFLY_EXPLODES_TO,
@@ -680,6 +680,13 @@ enum
   GADGET_ID_LEVEL_AUTHOR,
   GADGET_ID_LEVELSET_NAME,
   GADGET_ID_LEVELSET_AUTHOR,
+  GADGET_ID_BD_COLOR_TEXT_B,
+  GADGET_ID_BD_COLOR_TEXT_0,
+  GADGET_ID_BD_COLOR_TEXT_1,
+  GADGET_ID_BD_COLOR_TEXT_2,
+  GADGET_ID_BD_COLOR_TEXT_3,
+  GADGET_ID_BD_COLOR_TEXT_4,
+  GADGET_ID_BD_COLOR_TEXT_5,
   GADGET_ID_ELEMENT_NAME,
 
   // text area identifiers
@@ -691,8 +698,16 @@ enum
   GADGET_ID_TIME_OR_STEPS,
   GADGET_ID_TIME_SCORE_BASE,
   GADGET_ID_GAME_ENGINE_TYPE,
-  GADGET_ID_BD_SCHEDULING_TYPE,
   GADGET_ID_LEVELSET_SAVE_MODE,
+  GADGET_ID_BD_SCHEDULING_TYPE,
+  GADGET_ID_BD_COLOR_TYPE,
+  GADGET_ID_BD_COLOR_C64_B,
+  GADGET_ID_BD_COLOR_C64_0,
+  GADGET_ID_BD_COLOR_C64_1,
+  GADGET_ID_BD_COLOR_C64_2,
+  GADGET_ID_BD_COLOR_C64_3,
+  GADGET_ID_BD_COLOR_C64_4,
+  GADGET_ID_BD_COLOR_C64_5,
   GADGET_ID_WIND_DIRECTION,
   GADGET_ID_PLAYER_SPEED,
   GADGET_ID_BD_GRAVITY_DIRECTION,
@@ -741,6 +756,7 @@ enum
   GADGET_ID_SAVE_LEVELSET,
   GADGET_ID_ADD_CHANGE_PAGE,
   GADGET_ID_DEL_CHANGE_PAGE,
+  GADGET_ID_BD_SET_RANDOM_COLORS,
 
   // graphicbutton identifiers
 
@@ -995,6 +1011,13 @@ enum
   ED_TEXTINPUT_ID_LEVEL_AUTHOR,
   ED_TEXTINPUT_ID_LEVELSET_NAME,
   ED_TEXTINPUT_ID_LEVELSET_AUTHOR,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_B,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_0,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_1,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_2,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_3,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_4,
+  ED_TEXTINPUT_ID_BD_COLOR_TEXT_5,
   ED_TEXTINPUT_ID_ELEMENT_NAME,
 
   ED_NUM_TEXTINPUT
@@ -1006,6 +1029,9 @@ enum
 #define ED_TEXTINPUT_ID_LEVELSET_FIRST ED_TEXTINPUT_ID_LEVELSET_NAME
 #define ED_TEXTINPUT_ID_LEVELSET_LAST  ED_TEXTINPUT_ID_LEVELSET_AUTHOR
 
+#define ED_TEXTINPUT_ID_COLORS_FIRST   ED_TEXTINPUT_ID_BD_COLOR_TEXT_B
+#define ED_TEXTINPUT_ID_COLORS_LAST    ED_TEXTINPUT_ID_BD_COLOR_TEXT_5
+
 // values for text area gadgets
 enum
 {
@@ -1023,8 +1049,16 @@ enum
   ED_SELECTBOX_ID_TIME_OR_STEPS,
   ED_SELECTBOX_ID_TIME_SCORE_BASE,
   ED_SELECTBOX_ID_GAME_ENGINE_TYPE,
-  ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
   ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
+  ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
+  ED_SELECTBOX_ID_BD_COLOR_TYPE,
+  ED_SELECTBOX_ID_BD_COLOR_C64_B,
+  ED_SELECTBOX_ID_BD_COLOR_C64_0,
+  ED_SELECTBOX_ID_BD_COLOR_C64_1,
+  ED_SELECTBOX_ID_BD_COLOR_C64_2,
+  ED_SELECTBOX_ID_BD_COLOR_C64_3,
+  ED_SELECTBOX_ID_BD_COLOR_C64_4,
+  ED_SELECTBOX_ID_BD_COLOR_C64_5,
   ED_SELECTBOX_ID_WIND_DIRECTION,
   ED_SELECTBOX_ID_PLAYER_SPEED,
   ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION,
@@ -1067,6 +1101,9 @@ enum
 #define ED_SELECTBOX_ID_ENGINE_FIRST   ED_SELECTBOX_ID_BD_SCHEDULING_TYPE
 #define ED_SELECTBOX_ID_ENGINE_LAST    ED_SELECTBOX_ID_BD_SCHEDULING_TYPE
 
+#define ED_SELECTBOX_ID_COLORS_FIRST   ED_SELECTBOX_ID_BD_COLOR_C64_B
+#define ED_SELECTBOX_ID_COLORS_LAST    ED_SELECTBOX_ID_BD_COLOR_C64_5
+
 #define ED_SELECTBOX_ID_CUSTOM1_FIRST  ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
 #define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION
 #define ED_SELECTBOX_ID_CUSTOM2_FIRST  ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN
@@ -1096,6 +1133,7 @@ enum
   ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1,
   ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE,
   ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE,
+  ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS,
 
   ED_NUM_TEXTBUTTONS
 };
@@ -1301,8 +1339,8 @@ enum
   ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
   ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
   ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
-  ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG,
-  ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED,
+  ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_TOO_BIG,
+  ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_ENCLOSED,
   ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_TOO_BIG,
   ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED,
   ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING,
@@ -1324,9 +1362,9 @@ enum
   ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT,
   ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_FALLING,
   ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT,
-  ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO,
+  ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO,
   ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO,
-  ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO,
+  ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO,
   ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO,
   ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO,
   ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO,
@@ -1627,6 +1665,25 @@ static boolean levelset_use_levelset_artwork = FALSE;
 static boolean levelset_copy_level_template = FALSE;
 static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 
+#define MAX_BD_COLORS                  7
+#define MAX_BD_COLOR_TEXT_LEN          10
+
+static boolean bd_color_type_changed = FALSE;
+static int bd_color_type_default = GD_COLOR_TYPE_RGB;
+static int bd_color_c64[MAX_BD_COLORS];
+static char bd_color_text[MAX_BD_COLORS][MAX_BD_COLOR_TEXT_LEN + 1];
+static int bd_color_default[MAX_BD_COLORS];
+static int *bd_color[MAX_BD_COLORS] =
+{
+  &level.bd_color_b,
+  &level.bd_color_0,
+  &level.bd_color_1,
+  &level.bd_color_2,
+  &level.bd_color_3,
+  &level.bd_color_4,
+  &level.bd_color_5,
+};
+
 static struct
 {
   int gadget_type_id;
@@ -2064,16 +2121,18 @@ static struct
   int gadget_id;
   int size;
   char *value;
-  char *text_above, *infotext;
+  char *text_above, *text_left, *text_right, *infotext;
 } textinput_info[ED_NUM_TEXTINPUT] =
 {
+  // ---------- level and editor settings -------------------------------------
+
   {
     ED_TEXTINPUT_ID_LEVEL_NAME,
     ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_LEVEL_NAME,
     MAX_LEVEL_NAME_LEN,
     level.name,
-    "Title:", "Title for this level"
+    "Title:", NULL, NULL,                      "Enter title for this level"
   },
   {
     ED_TEXTINPUT_ID_LEVEL_AUTHOR,
@@ -2081,7 +2140,7 @@ static struct
     GADGET_ID_LEVEL_AUTHOR,
     MAX_LEVEL_AUTHOR_LEN,
     level.author,
-    "Author:", "Author for this level"
+    "Author:", NULL, NULL,                     "Enter author for this level"
   },
   {
     ED_TEXTINPUT_ID_LEVELSET_NAME,
@@ -2089,7 +2148,7 @@ static struct
     GADGET_ID_LEVELSET_NAME,
     MAX_LEVEL_NAME_LEN,
     levelset_name,
-    "Title:", "Title for this or new level set"
+    "Title:", NULL, NULL,                      "Enter title for this or new level set"
   },
   {
     ED_TEXTINPUT_ID_LEVELSET_AUTHOR,
@@ -2097,15 +2156,77 @@ static struct
     GADGET_ID_LEVELSET_AUTHOR,
     MAX_LEVEL_AUTHOR_LEN,
     levelset_author,
-    "Author:", "Author for this or new level set"
+    "Author:", NULL, NULL,                     "Enter author for this or new level set"
+  },
+
+  // ---------- engine settings: colors ---------------------------------------
+
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_B,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(1),
+    GADGET_ID_BD_COLOR_TEXT_B,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[0],
+    NULL, "Border color:      ", NULL,         "Enter border color (not used)"
+  },
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_0,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(2),
+    GADGET_ID_BD_COLOR_TEXT_0,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[1],
+    NULL, "Background color:  ", NULL,         "Enter background color (C64 graphics)"
+  },
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_1,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
+    GADGET_ID_BD_COLOR_TEXT_1,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[2],
+    NULL, "Sand color:        ", NULL,         "Enter sand color (C64 graphics)"
+  },
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_2,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
+    GADGET_ID_BD_COLOR_TEXT_2,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[3],
+    NULL, "Steel wall color:  ", NULL,         "Enter steel wall color (C64 graphics)"
+  },
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_3,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(5),
+    GADGET_ID_BD_COLOR_TEXT_3,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[4],
+    NULL, "Wall color:        ", NULL,         "Enter wall color (C64 graphics)"
+  },
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_4,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(6),
+    GADGET_ID_BD_COLOR_TEXT_4,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[5],
+    NULL, "Amoeba color:      ", NULL,         "Enter amoeba color (C64 graphics)"
+  },
+  {
+    ED_TEXTINPUT_ID_BD_COLOR_TEXT_5,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(7),
+    GADGET_ID_BD_COLOR_TEXT_5,
+    MAX_BD_COLOR_TEXT_LEN,
+    bd_color_text[6],
+    NULL, "Slime color:       ", NULL,         "Enter slime color (C64 graphics)"
   },
+
+  // ---------- element settings: configure (several elements) ----------------
+
   {
     ED_TEXTINPUT_ID_ELEMENT_NAME,
     -1, -1,    // these values are not constant, but can change at runtime
     GADGET_ID_ELEMENT_NAME,
     MAX_ELEMENT_NAME_LEN - 2,                  // currently 2 chars less editable
     custom_element.description,
-    NULL, "Element name"
+    NULL, NULL, NULL,                          "Enter element name"
   }
 };
 
@@ -2848,6 +2969,38 @@ static struct ValueTextInfo options_bd_scheduling_type[] =
   { -1,                                          NULL                          }
 };
 
+static struct ValueTextInfo options_bd_color_type[] =
+{
+  { GD_COLOR_TYPE_RGB,                 "RGB colors"                    },
+  { GD_COLOR_TYPE_C64,                 "C64 colors"                    },
+  { GD_COLOR_TYPE_C64DTV,              "C64DTV colors"                 },
+  { GD_COLOR_TYPE_ATARI,               "Atari colors"                  },
+
+  { -1,                                          NULL                          }
+};
+
+static struct ValueTextInfo options_bd_color_c64_name[] =
+{
+  { GD_COLOR_INDEX_BLACK,              "Black"                         },
+  { GD_COLOR_INDEX_WHITE,              "White"                         },
+  { GD_COLOR_INDEX_RED,                        "Red"                           },
+  { GD_COLOR_INDEX_CYAN,               "Cyan"                          },
+  { GD_COLOR_INDEX_PURPLE,             "Purple"                        },
+  { GD_COLOR_INDEX_GREEN,              "Green"                         },
+  { GD_COLOR_INDEX_BLUE,               "Blue"                          },
+  { GD_COLOR_INDEX_YELLOW,             "Yellow"                        },
+  { GD_COLOR_INDEX_ORANGE,             "Orange"                        },
+  { GD_COLOR_INDEX_BROWN,              "Brown"                         },
+  { GD_COLOR_INDEX_LIGHTRED,           "Light red"                     },
+  { GD_COLOR_INDEX_GRAY1,              "Dark gray"                     },
+  { GD_COLOR_INDEX_GRAY2,              "Gray"                          },
+  { GD_COLOR_INDEX_LIGHTGREEN,         "Light green"                   },
+  { GD_COLOR_INDEX_LIGHTBLUE,          "Light blue"                    },
+  { GD_COLOR_INDEX_GRAY3,              "Light gray"                    },
+
+  { -1,                                          NULL                          }
+};
+
 static struct ValueTextInfo *action_arg_modes[] =
 {
   options_action_mode_none,
@@ -2931,6 +3084,18 @@ static struct
     &level.game_engine_type,
     NULL, "Game engine:", NULL,                        "Select game engine"
   },
+  {
+    ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
+    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(10),
+    GADGET_ID_LEVELSET_SAVE_MODE,              GADGET_ID_NONE,
+    -1,
+    options_levelset_save_mode,
+    &levelset_save_mode,
+    "Action:", NULL, NULL,                     "Select action when saving level set"
+  },
+
+  // ---------- engine settings: config ---------------------------------------
+
   {
     ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
     ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(1),
@@ -2940,14 +3105,81 @@ static struct
     &level.bd_scheduling_type,
     NULL, "Scheduling type:", NULL,            "Select level timing"
   },
+
+  // ---------- engine settings: colors ---------------------------------------
+
   {
-    ED_SELECTBOX_ID_LEVELSET_SAVE_MODE,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(10),
-    GADGET_ID_LEVELSET_SAVE_MODE,              GADGET_ID_NONE,
+    ED_SELECTBOX_ID_BD_COLOR_TYPE,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(0),
+    GADGET_ID_BD_COLOR_TYPE,                   GADGET_ID_NONE,
     -1,
-    options_levelset_save_mode,
-    &levelset_save_mode,
-    "Action:", NULL, NULL,                     "Select action when saving level set"
+    options_bd_color_type,
+    &level.bd_color_type,
+    "Boulder Dash level colors:",
+    "Color palette type:", NULL,               "Select color palette type"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_B,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(1),
+    GADGET_ID_BD_COLOR_C64_B,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[0],
+    NULL, "Border color:      ", NULL,         "Select border color (not used)"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_0,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(2),
+    GADGET_ID_BD_COLOR_C64_0,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[1],
+    NULL, "Background color:  ", NULL,         "Select background color (C64 graphics)"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_1,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
+    GADGET_ID_BD_COLOR_C64_1,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[2],
+    NULL, "Sand color:        ", NULL,         "Select sand color (C64 graphics)"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_2,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
+    GADGET_ID_BD_COLOR_C64_2,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[3],
+    NULL, "Steel wall color:  ", NULL,         "Select steel wall color (C64 graphics)"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_3,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(5),
+    GADGET_ID_BD_COLOR_C64_3,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[4],
+    NULL, "Wall color:        ", NULL,         "Select wall color (C64 graphics)"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_4,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(6),
+    GADGET_ID_BD_COLOR_C64_4,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[5],
+    NULL, "Amoeba color:      ", NULL,         "Select amoeba color (C64 graphics)"
+  },
+  {
+    ED_SELECTBOX_ID_BD_COLOR_C64_5,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(7),
+    GADGET_ID_BD_COLOR_C64_5,                  GADGET_ID_NONE,
+    -1,
+    options_bd_color_c64_name,
+    &bd_color_c64[6],
+    NULL, "Slime color:       ", NULL,         "Select slime color (C64 graphics)"
   },
 
   // ---------- element settings: configure (several elements) ----------------
@@ -3286,7 +3518,7 @@ static struct
     -1,                                                -1,
     GADGET_ID_ENGINECONFIG_COLORS,             GADGET_ID_ENGINECONFIG_CONFIG,
     8,                                         "Colors",
-    NULL, NULL, NULL,                          "Configure game engine colors"
+    NULL, NULL, NULL,                          "Configure level colors"
   },
 
   // ---------- element settings (tabs) ---------------------------------------
@@ -3369,6 +3601,16 @@ static struct
     -1,                                                "Delete",
     NULL, NULL, NULL,                          "Delete current change page"
   },
+
+  // ---------- engine settings (buttons) -------------------------------------
+
+  {
+    ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS,
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(8),
+    GADGET_ID_BD_SET_RANDOM_COLORS,            GADGET_ID_NONE,
+    -1,                                                "Set random colors",
+    NULL, NULL, NULL,                          "Create and set random level colors"
+  },
 };
 
 static struct
@@ -4641,23 +4883,23 @@ static struct
     "Changes flying rocks to:", NULL, NULL, NULL, "Element to turn flying rocks to"
   },
 
-  // ---------- BD amoeba content ---------------------------------------------
+  // ---------- BD amoeba 1 content -------------------------------------------
 
   {
-    ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG,
+    ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_TOO_BIG,
     ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(7),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
-    GADGET_ID_BD_AMOEBA_CONTENT_TOO_BIG,       GADGET_ID_NONE,
-    &level.bd_amoeba_content_too_big,          1, 1,
-    "If too big, changes to:", NULL, NULL, NULL, "BD amoeba content if too big"
+    GADGET_ID_BD_AMOEBA_1_CONTENT_TOO_BIG,     GADGET_ID_NONE,
+    &level.bd_amoeba_1_content_too_big,                1, 1,
+    "If too big, changes to:", NULL, NULL, NULL, "Amoeba 1 content if too big"
   },
   {
-    ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED,
+    ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_ENCLOSED,
     ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(8),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
-    GADGET_ID_BD_AMOEBA_CONTENT_ENCLOSED,      GADGET_ID_NONE,
-    &level.bd_amoeba_content_enclosed,         1, 1,
-    "If enclosed, changes to:", NULL, NULL, NULL, "BD amoeba content if enclosed"
+    GADGET_ID_BD_AMOEBA_1_CONTENT_ENCLOSED,    GADGET_ID_NONE,
+    &level.bd_amoeba_1_content_enclosed,       1, 1,
+    "If enclosed, changes to:", NULL, NULL, NULL, "Amoeba 1 content if enclosed"
   },
 
   // ---------- BD amoeba 2 content -------------------------------------------
@@ -4668,7 +4910,7 @@ static struct
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_AMOEBA_2_CONTENT_TOO_BIG,     GADGET_ID_NONE,
     &level.bd_amoeba_2_content_too_big,                1, 1,
-    "If too big, changes to:", NULL, NULL, NULL, "BD amoeba 2 content if too big"
+    "If too big, changes to:", NULL, NULL, NULL, "Amoeba 2 content if too big"
   },
   {
     ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED,
@@ -4676,7 +4918,7 @@ static struct
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_AMOEBA_2_CONTENT_ENCLOSED,    GADGET_ID_NONE,
     &level.bd_amoeba_2_content_enclosed,       1, 1,
-    "If enclosed, changes to:", NULL, NULL, NULL, "BD amoeba 2 content if enclosed"
+    "If enclosed, changes to:", NULL, NULL, NULL, "Amoeba 2 content if enclosed"
   },
   {
     ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING,
@@ -4684,7 +4926,7 @@ static struct
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_AMOEBA_2_CONTENT_EXPLODING,   GADGET_ID_NONE,
     &level.bd_amoeba_2_content_exploding,      1, 1,
-    "If exploding, changes to:", NULL, NULL, NULL, "BD amoeba 2 content if exploding"
+    "If exploding, changes to:", NULL, NULL, NULL, "Amoeba 2 content if exploding"
   },
   {
     ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE,
@@ -4692,7 +4934,7 @@ static struct
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE,  GADGET_ID_NONE,
     &level.bd_amoeba_2_content_looks_like,     1, 1,
-    "Use graphic of element:", NULL, NULL, NULL, "BD amoeba 2 looks like this element"
+    "Use graphic of element:", NULL, NULL, NULL, "Amoeba 2 looks like this element"
   },
   {
     ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1,
@@ -4831,11 +5073,11 @@ static struct
     "Turns to on impact:", NULL, NULL, NULL,   "Changes to this when falling stops"
   },
   {
-    ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO,
+    ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO,
     ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
-    GADGET_ID_BD_FIREFLY_EXPLODES_TO,          GADGET_ID_NONE,
-    &level.bd_firefly_explodes_to,             1, 1,
+    GADGET_ID_BD_FIREFLY_1_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_firefly_1_explodes_to,           1, 1,
     "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
   },
   {
@@ -4847,11 +5089,11 @@ static struct
     "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
   },
   {
-    ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO,
+    ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO,
     ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(0),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
-    GADGET_ID_BD_BUTTERFLY_EXPLODES_TO,                GADGET_ID_NONE,
-    &level.bd_butterfly_explodes_to,           1, 1,
+    GADGET_ID_BD_BUTTERFLY_1_EXPLODES_TO,      GADGET_ID_NONE,
+    &level.bd_butterfly_1_explodes_to,         1, 1,
     "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
   },
   {
@@ -5157,7 +5399,6 @@ static boolean getDrawModeHiRes(void);
 static int getTabulatorBarWidth(void);
 static int getTabulatorBarHeight(void);
 static Pixel getTabulatorBarColor(void);
-static void getEditorGraphicAndFrame(int, int *, int *, boolean);
 static int numHiresTiles(int);
 
 static int num_editor_gadgets = 0;     // dynamically determined
@@ -5236,7 +5477,7 @@ static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash);
 
 static int editor_hl_boulderdash_native[] =
 {
-  EL_INTERNAL_CASCADE_BD_NATIVE_ACTIVE,
+  EL_INTERNAL_CASCADE_BDX_ACTIVE,
   EL_CHAR('B'),
   EL_CHAR('D'),
   EL_EMPTY,
@@ -5245,167 +5486,167 @@ static int editor_hl_boulderdash_native[] =
 static int editor_el_boulderdash_native[] =
 {
   EL_EMPTY,
-  EL_BD_SAND,
-  EL_BD_ROCK,
-  EL_BD_DIAMOND,
-
-  EL_BD_INBOX,
-  EL_BD_STEELWALL,
-  EL_BD_WALL,
-  EL_BD_MAGIC_WALL,
-
-  EL_BD_AMOEBA,
-  EL_BD_BUTTERFLY_UP,
-  EL_BD_FIREFLY_UP,
-  EL_BD_EXIT_CLOSED,
-
-  EL_BD_BUTTERFLY_LEFT,
-  EL_BD_FIREFLY_LEFT,
-  EL_BD_BUTTERFLY_RIGHT,
-  EL_BD_FIREFLY_RIGHT,
-
-  EL_BD_SAND_2,
-  EL_BD_BUTTERFLY_DOWN,
-  EL_BD_FIREFLY_DOWN,
-  EL_BD_EXIT_OPEN,
-
-  EL_BD_AMOEBA_2,
-  EL_BD_BUTTERFLY_2_UP,
-  EL_BD_FIREFLY_2_UP,
-  EL_BD_SLIME,
-
-  EL_BD_BUTTERFLY_2_LEFT,
-  EL_BD_FIREFLY_2_LEFT,
-  EL_BD_BUTTERFLY_2_RIGHT,
-  EL_BD_FIREFLY_2_RIGHT,
-
-  EL_BD_BOMB,
-  EL_BD_BUTTERFLY_2_DOWN,
-  EL_BD_FIREFLY_2_DOWN,
-  EL_BD_FLYING_DIAMOND,
-
-  EL_BD_NITRO_PACK,
-  EL_BD_DRAGONFLY_UP,
-  EL_BD_STONEFLY_UP,
-  EL_BD_DIAMOND_GLUED,
-
-  EL_BD_DRAGONFLY_LEFT,
-  EL_BD_STONEFLY_LEFT,
-  EL_BD_DRAGONFLY_RIGHT,
-  EL_BD_STONEFLY_RIGHT,
-
-  EL_BD_NUT,
-  EL_BD_DRAGONFLY_DOWN,
-  EL_BD_STONEFLY_DOWN,
+  EL_BDX_SAND_1,
+  EL_BDX_ROCK,
+  EL_BDX_DIAMOND,
+
+  EL_BDX_INBOX,
+  EL_BDX_STEELWALL,
+  EL_BDX_WALL,
+  EL_BDX_MAGIC_WALL,
+
+  EL_BDX_AMOEBA_1,
+  EL_BDX_BUTTERFLY_1_UP,
+  EL_BDX_FIREFLY_1_UP,
+  EL_BDX_EXIT_CLOSED,
+
+  EL_BDX_BUTTERFLY_1_LEFT,
+  EL_BDX_FIREFLY_1_LEFT,
+  EL_BDX_BUTTERFLY_1_RIGHT,
+  EL_BDX_FIREFLY_1_RIGHT,
+
+  EL_BDX_SAND_2,
+  EL_BDX_BUTTERFLY_1_DOWN,
+  EL_BDX_FIREFLY_1_DOWN,
+  EL_BDX_EXIT_OPEN,
+
+  EL_BDX_AMOEBA_2,
+  EL_BDX_BUTTERFLY_2_UP,
+  EL_BDX_FIREFLY_2_UP,
+  EL_BDX_SLIME,
+
+  EL_BDX_BUTTERFLY_2_LEFT,
+  EL_BDX_FIREFLY_2_LEFT,
+  EL_BDX_BUTTERFLY_2_RIGHT,
+  EL_BDX_FIREFLY_2_RIGHT,
+
+  EL_BDX_BOMB,
+  EL_BDX_BUTTERFLY_2_DOWN,
+  EL_BDX_FIREFLY_2_DOWN,
+  EL_BDX_FLYING_DIAMOND,
+
+  EL_BDX_NITRO_PACK,
+  EL_BDX_DRAGONFLY_UP,
+  EL_BDX_STONEFLY_UP,
+  EL_BDX_DIAMOND_GLUED,
+
+  EL_BDX_DRAGONFLY_LEFT,
+  EL_BDX_STONEFLY_LEFT,
+  EL_BDX_DRAGONFLY_RIGHT,
+  EL_BDX_STONEFLY_RIGHT,
+
+  EL_BDX_NUT,
+  EL_BDX_DRAGONFLY_DOWN,
+  EL_BDX_STONEFLY_DOWN,
   EL_EMPTY,
 
-  EL_BD_BITER_SWITCH_1,
-  EL_BD_BITER_UP,
-  EL_BD_COW_UP,
+  EL_BDX_BITER_SWITCH_1,
+  EL_BDX_BITER_UP,
+  EL_BDX_COW_UP,
   EL_EMPTY,
 
-  EL_BD_BITER_LEFT,
-  EL_BD_COW_LEFT,
-  EL_BD_BITER_RIGHT,
-  EL_BD_COW_RIGHT,
-
-  EL_BD_VOODOO_DOLL,
-  EL_BD_BITER_DOWN,
-  EL_BD_COW_DOWN,
-  EL_BD_GHOST,
-
-  EL_BD_SAND_GLUED,
-  EL_BD_SAND_BALL,
-  EL_BD_SAND_LOOSE,
-  EL_BD_WALL_NON_SLOPED,
-
-  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_ROCK,
-  EL_BD_ROCK_GLUED,
-  EL_BD_STEELWALL_SLOPED_UP_LEFT,
-  EL_BD_STEELWALL_SLOPED_UP_RIGHT,
-
-  EL_BD_WAITING_ROCK,
-  EL_BD_CHASING_ROCK,
-  EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
-  EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
-
-  EL_BD_MEGA_ROCK,
-  EL_BD_SWEET,
-  EL_BD_INVISIBLE_EXIT_CLOSED,
-  EL_BD_INVISIBLE_EXIT_OPEN,
-
-  EL_BD_STEELWALL_EXPLODABLE,
-  EL_BD_STEELWALL_DIGGABLE,
-  EL_BD_WALL_DIGGABLE,
-  EL_BD_FALLING_WALL,
-
-  EL_BD_EXPANDABLE_WALL_HORIZONTAL,
-  EL_BD_EXPANDABLE_WALL_VERTICAL,
-  EL_BD_EXPANDABLE_WALL_ANY,
-  EL_BD_EXPANDABLE_WALL_SWITCH,
-
-  EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL,
-  EL_BD_EXPANDABLE_STEELWALL_VERTICAL,
-  EL_BD_EXPANDABLE_STEELWALL_ANY,
-  EL_BD_CREATURE_SWITCH,
-
-  EL_BD_BLADDER,
-  EL_BD_BLADDER_SPENDER,
-  EL_BD_REPLICATOR,
-  EL_BD_REPLICATOR_SWITCH,
-
-  EL_BD_CONVEYOR_LEFT,
-  EL_BD_CONVEYOR_RIGHT,
-  EL_BD_CONVEYOR_SWITCH,
-  EL_BD_CONVEYOR_DIR_SWITCH,
-
-  EL_BD_CLOCK,
-  EL_BD_TIME_PENALTY,
-  EL_BD_GRAVESTONE,
-  EL_BD_SKELETON,
-
-  EL_BD_WATER,
-  EL_BD_ACID,
-  EL_BD_LAVA,
-  EL_BD_BOX,
-
-  EL_BD_GATE_1,
-  EL_BD_GATE_2,
-  EL_BD_GATE_3,
-  EL_BD_TRAPPED_DIAMOND,
-
-  EL_BD_KEY_1,
-  EL_BD_KEY_2,
-  EL_BD_KEY_3,
-  EL_BD_DIAMOND_KEY,
-
-  EL_BD_WALL_KEY_1,
-  EL_BD_WALL_KEY_2,
-  EL_BD_WALL_KEY_3,
-  EL_BD_WALL_DIAMOND,
-
-  EL_BD_POT,
-  EL_BD_GRAVITY_SWITCH,
-  EL_BD_PNEUMATIC_HAMMER,
-  EL_BD_TELEPORTER,
-
-  EL_BD_PLAYER,
-  EL_BD_PLAYER_WITH_BOMB,
-  EL_BD_PLAYER_WITH_ROCKET_LAUNCHER,
-  EL_BD_ROCKET_LAUNCHER,
-
-  EL_BD_PLAYER_GLUED,
-  EL_BD_PLAYER_STIRRING,
+  EL_BDX_BITER_LEFT,
+  EL_BDX_COW_LEFT,
+  EL_BDX_BITER_RIGHT,
+  EL_BDX_COW_RIGHT,
+
+  EL_BDX_VOODOO_DOLL,
+  EL_BDX_BITER_DOWN,
+  EL_BDX_COW_DOWN,
+  EL_BDX_GHOST,
+
+  EL_BDX_SAND_GLUED,
+  EL_BDX_SAND_BALL,
+  EL_BDX_SAND_LOOSE,
+  EL_BDX_WALL_NON_SLOPED,
+
+  EL_BDX_SAND_SLOPED_UP_LEFT,
+  EL_BDX_SAND_SLOPED_UP_RIGHT,
+  EL_BDX_WALL_SLOPED_UP_LEFT,
+  EL_BDX_WALL_SLOPED_UP_RIGHT,
+
+  EL_BDX_SAND_SLOPED_DOWN_LEFT,
+  EL_BDX_SAND_SLOPED_DOWN_RIGHT,
+  EL_BDX_WALL_SLOPED_DOWN_LEFT,
+  EL_BDX_WALL_SLOPED_DOWN_RIGHT,
+
+  EL_BDX_FLYING_ROCK,
+  EL_BDX_ROCK_GLUED,
+  EL_BDX_STEELWALL_SLOPED_UP_LEFT,
+  EL_BDX_STEELWALL_SLOPED_UP_RIGHT,
+
+  EL_BDX_WAITING_ROCK,
+  EL_BDX_CHASING_ROCK,
+  EL_BDX_STEELWALL_SLOPED_DOWN_LEFT,
+  EL_BDX_STEELWALL_SLOPED_DOWN_RIGHT,
+
+  EL_BDX_MEGA_ROCK,
+  EL_BDX_SWEET,
+  EL_BDX_INVISIBLE_EXIT_CLOSED,
+  EL_BDX_INVISIBLE_EXIT_OPEN,
+
+  EL_BDX_STEELWALL_EXPLODABLE,
+  EL_BDX_STEELWALL_DIGGABLE,
+  EL_BDX_WALL_DIGGABLE,
+  EL_BDX_FALLING_WALL,
+
+  EL_BDX_EXPANDABLE_WALL_HORIZONTAL,
+  EL_BDX_EXPANDABLE_WALL_VERTICAL,
+  EL_BDX_EXPANDABLE_WALL_ANY,
+  EL_BDX_EXPANDABLE_WALL_SWITCH,
+
+  EL_BDX_EXPANDABLE_STEELWALL_HORIZONTAL,
+  EL_BDX_EXPANDABLE_STEELWALL_VERTICAL,
+  EL_BDX_EXPANDABLE_STEELWALL_ANY,
+  EL_BDX_CREATURE_SWITCH,
+
+  EL_BDX_BLADDER,
+  EL_BDX_BLADDER_SPENDER,
+  EL_BDX_REPLICATOR,
+  EL_BDX_REPLICATOR_SWITCH,
+
+  EL_BDX_CONVEYOR_LEFT,
+  EL_BDX_CONVEYOR_RIGHT,
+  EL_BDX_CONVEYOR_SWITCH,
+  EL_BDX_CONVEYOR_DIR_SWITCH,
+
+  EL_BDX_CLOCK,
+  EL_BDX_TIME_PENALTY,
+  EL_BDX_GRAVESTONE,
+  EL_BDX_SKELETON,
+
+  EL_BDX_WATER,
+  EL_BDX_ACID,
+  EL_BDX_LAVA,
+  EL_BDX_BOX,
+
+  EL_BDX_GATE_1,
+  EL_BDX_GATE_2,
+  EL_BDX_GATE_3,
+  EL_BDX_TRAPPED_DIAMOND,
+
+  EL_BDX_KEY_1,
+  EL_BDX_KEY_2,
+  EL_BDX_KEY_3,
+  EL_BDX_DIAMOND_KEY,
+
+  EL_BDX_WALL_KEY_1,
+  EL_BDX_WALL_KEY_2,
+  EL_BDX_WALL_KEY_3,
+  EL_BDX_WALL_DIAMOND,
+
+  EL_BDX_POT,
+  EL_BDX_GRAVITY_SWITCH,
+  EL_BDX_PNEUMATIC_HAMMER,
+  EL_BDX_TELEPORTER,
+
+  EL_BDX_PLAYER,
+  EL_BDX_PLAYER_WITH_BOMB,
+  EL_BDX_PLAYER_WITH_ROCKET_LAUNCHER,
+  EL_BDX_ROCKET_LAUNCHER,
+
+  EL_BDX_PLAYER_GLUED,
+  EL_BDX_PLAYER_STIRRING,
   EL_EMPTY,
   EL_EMPTY,
 };
@@ -5416,7 +5657,7 @@ static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_n
 
 static int editor_hl_boulderdash_effects[] =
 {
-  EL_INTERNAL_CASCADE_BD_EFFECTS_ACTIVE,
+  EL_INTERNAL_CASCADE_BDX_EFFECTS_ACTIVE,
   EL_CHAR('B'),
   EL_CHAR('D'),
   EL_CHAR('E'),
@@ -5424,125 +5665,125 @@ static int editor_hl_boulderdash_effects[] =
 
 static int editor_el_boulderdash_effects[] =
 {
-  EL_BD_DIAMOND_FALLING,
-  EL_BD_ROCK_FALLING,
-  EL_BD_MEGA_ROCK_FALLING,
-  EL_BD_FLYING_DIAMOND_FLYING,
-
-  EL_BD_FALLING_WALL_FALLING,
-  EL_BD_NITRO_PACK_FALLING,
-  EL_BD_NUT_FALLING,
-  EL_BD_FLYING_ROCK_FLYING,
-
-  EL_BD_PLAYER_GROWING_1,
-  EL_BD_PLAYER_GROWING_2,
-  EL_BD_PLAYER_GROWING_3,
-  EL_BD_PLAYER,
-
-  EL_BD_PLAYER_WITH_BOMB,
-  EL_BD_PLAYER_STIRRING,
-  EL_BD_EXIT_OPEN,
-  EL_BD_INVISIBLE_EXIT_OPEN,
-
-  EL_BD_BLADDER_1,
-  EL_BD_BLADDER_2,
-  EL_BD_BLADDER_3,
-  EL_BD_BLADDER_4,
-
-  EL_BD_BLADDER_5,
-  EL_BD_BLADDER_6,
-  EL_BD_BLADDER_7,
-  EL_BD_BLADDER_8,
-
-  EL_BD_SAND_2,
-  EL_BD_COW_ENCLOSED_1,
-  EL_BD_COW_ENCLOSED_2,
-  EL_BD_COW_ENCLOSED_3,
-
-  EL_BD_COW_ENCLOSED_4,
-  EL_BD_COW_ENCLOSED_5,
-  EL_BD_COW_ENCLOSED_6,
-  EL_BD_COW_ENCLOSED_7,
-
-  EL_BD_WATER_1,
-  EL_BD_WATER_2,
-  EL_BD_WATER_3,
-  EL_BD_WATER_4,
-
-  EL_BD_WATER_5,
-  EL_BD_WATER_6,
-  EL_BD_WATER_7,
-  EL_BD_WATER_8,
-
-  EL_BD_WATER_9,
-  EL_BD_WATER_10,
-  EL_BD_WATER_11,
-  EL_BD_WATER_12,
-
-  EL_BD_WATER_13,
-  EL_BD_WATER_14,
-  EL_BD_WATER_15,
-  EL_BD_WATER_16,
-
-  EL_BD_BOMB_TICKING_1,
-  EL_BD_BOMB_TICKING_2,
-  EL_BD_BOMB_TICKING_3,
-  EL_BD_BOMB_TICKING_4,
-
-  EL_BD_BOMB_TICKING_5,
-  EL_BD_BOMB_TICKING_6,
-  EL_BD_BOMB_TICKING_7,
+  EL_BDX_DIAMOND_FALLING,
+  EL_BDX_ROCK_FALLING,
+  EL_BDX_MEGA_ROCK_FALLING,
+  EL_BDX_FLYING_DIAMOND_FLYING,
+
+  EL_BDX_FALLING_WALL_FALLING,
+  EL_BDX_NITRO_PACK_FALLING,
+  EL_BDX_NUT_FALLING,
+  EL_BDX_FLYING_ROCK_FLYING,
+
+  EL_BDX_PLAYER_GROWING_1,
+  EL_BDX_PLAYER_GROWING_2,
+  EL_BDX_PLAYER_GROWING_3,
+  EL_BDX_PLAYER,
+
+  EL_BDX_PLAYER_WITH_BOMB,
+  EL_BDX_PLAYER_STIRRING,
+  EL_BDX_EXIT_OPEN,
+  EL_BDX_INVISIBLE_EXIT_OPEN,
+
+  EL_BDX_BLADDER_1,
+  EL_BDX_BLADDER_2,
+  EL_BDX_BLADDER_3,
+  EL_BDX_BLADDER_4,
+
+  EL_BDX_BLADDER_5,
+  EL_BDX_BLADDER_6,
+  EL_BDX_BLADDER_7,
+  EL_BDX_BLADDER_8,
+
+  EL_BDX_SAND_2,
+  EL_BDX_COW_ENCLOSED_1,
+  EL_BDX_COW_ENCLOSED_2,
+  EL_BDX_COW_ENCLOSED_3,
+
+  EL_BDX_COW_ENCLOSED_4,
+  EL_BDX_COW_ENCLOSED_5,
+  EL_BDX_COW_ENCLOSED_6,
+  EL_BDX_COW_ENCLOSED_7,
+
+  EL_BDX_WATER_1,
+  EL_BDX_WATER_2,
+  EL_BDX_WATER_3,
+  EL_BDX_WATER_4,
+
+  EL_BDX_WATER_5,
+  EL_BDX_WATER_6,
+  EL_BDX_WATER_7,
+  EL_BDX_WATER_8,
+
+  EL_BDX_WATER_9,
+  EL_BDX_WATER_10,
+  EL_BDX_WATER_11,
+  EL_BDX_WATER_12,
+
+  EL_BDX_WATER_13,
+  EL_BDX_WATER_14,
+  EL_BDX_WATER_15,
+  EL_BDX_WATER_16,
+
+  EL_BDX_BOMB_TICKING_1,
+  EL_BDX_BOMB_TICKING_2,
+  EL_BDX_BOMB_TICKING_3,
+  EL_BDX_BOMB_TICKING_4,
+
+  EL_BDX_BOMB_TICKING_5,
+  EL_BDX_BOMB_TICKING_6,
+  EL_BDX_BOMB_TICKING_7,
   EL_EMPTY,
 
-  EL_BD_BOMB_EXPLODING_1,
-  EL_BD_BOMB_EXPLODING_2,
-  EL_BD_BOMB_EXPLODING_3,
-  EL_BD_BOMB_EXPLODING_4,
-
-  EL_BD_NUT_BREAKING_1,
-  EL_BD_NUT_BREAKING_2,
-  EL_BD_NUT_BREAKING_3,
-  EL_BD_NUT_BREAKING_4,
-
-  EL_BD_EXPLODING_1,
-  EL_BD_EXPLODING_2,
-  EL_BD_EXPLODING_3,
-  EL_BD_EXPLODING_4,
-
-  EL_BD_EXPLODING_5,
-  EL_BD_TIME_PENALTY,
-  EL_BD_DIAMOND_GROWING_1,
-  EL_BD_DIAMOND_GROWING_2,
-
-  EL_BD_DIAMOND_GROWING_3,
-  EL_BD_DIAMOND_GROWING_4,
-  EL_BD_DIAMOND_GROWING_5,
-  EL_BD_NITRO_PACK_EXPLODING,
-
-  EL_BD_NITRO_PACK_EXPLODING_1,
-  EL_BD_NITRO_PACK_EXPLODING_2,
-  EL_BD_NITRO_PACK_EXPLODING_3,
-  EL_BD_NITRO_PACK_EXPLODING_4,
-
-  EL_BD_ROCK_GROWING_1,
-  EL_BD_ROCK_GROWING_2,
-  EL_BD_ROCK_GROWING_3,
-  EL_BD_ROCK_GROWING_4,
-
-  EL_BD_STEELWALL_GROWING_1,
-  EL_BD_STEELWALL_GROWING_2,
-  EL_BD_STEELWALL_GROWING_3,
-  EL_BD_STEELWALL_GROWING_4,
-
-  EL_BD_CLOCK_GROWING_1,
-  EL_BD_CLOCK_GROWING_2,
-  EL_BD_CLOCK_GROWING_3,
-  EL_BD_CLOCK_GROWING_4,
-
-  EL_BD_GHOST_EXPLODING_1,
-  EL_BD_GHOST_EXPLODING_2,
-  EL_BD_GHOST_EXPLODING_3,
-  EL_BD_GHOST_EXPLODING_4,
+  EL_BDX_BOMB_EXPLODING_1,
+  EL_BDX_BOMB_EXPLODING_2,
+  EL_BDX_BOMB_EXPLODING_3,
+  EL_BDX_BOMB_EXPLODING_4,
+
+  EL_BDX_NUT_BREAKING_1,
+  EL_BDX_NUT_BREAKING_2,
+  EL_BDX_NUT_BREAKING_3,
+  EL_BDX_NUT_BREAKING_4,
+
+  EL_BDX_EXPLODING_1,
+  EL_BDX_EXPLODING_2,
+  EL_BDX_EXPLODING_3,
+  EL_BDX_EXPLODING_4,
+
+  EL_BDX_EXPLODING_5,
+  EL_BDX_TIME_PENALTY,
+  EL_BDX_DIAMOND_GROWING_1,
+  EL_BDX_DIAMOND_GROWING_2,
+
+  EL_BDX_DIAMOND_GROWING_3,
+  EL_BDX_DIAMOND_GROWING_4,
+  EL_BDX_DIAMOND_GROWING_5,
+  EL_BDX_NITRO_PACK_EXPLODING,
+
+  EL_BDX_NITRO_PACK_EXPLODING_1,
+  EL_BDX_NITRO_PACK_EXPLODING_2,
+  EL_BDX_NITRO_PACK_EXPLODING_3,
+  EL_BDX_NITRO_PACK_EXPLODING_4,
+
+  EL_BDX_ROCK_GROWING_1,
+  EL_BDX_ROCK_GROWING_2,
+  EL_BDX_ROCK_GROWING_3,
+  EL_BDX_ROCK_GROWING_4,
+
+  EL_BDX_STEELWALL_GROWING_1,
+  EL_BDX_STEELWALL_GROWING_2,
+  EL_BDX_STEELWALL_GROWING_3,
+  EL_BDX_STEELWALL_GROWING_4,
+
+  EL_BDX_CLOCK_GROWING_1,
+  EL_BDX_CLOCK_GROWING_2,
+  EL_BDX_CLOCK_GROWING_3,
+  EL_BDX_CLOCK_GROWING_4,
+
+  EL_BDX_GHOST_EXPLODING_1,
+  EL_BDX_GHOST_EXPLODING_2,
+  EL_BDX_GHOST_EXPLODING_3,
+  EL_BDX_GHOST_EXPLODING_4,
 };
 static int *editor_hl_boulderdash_effects_ptr = editor_hl_boulderdash_effects;
 static int *editor_el_boulderdash_effects_ptr = editor_el_boulderdash_effects;
@@ -7009,13 +7250,13 @@ editor_elements_info[] =
   },
   {
     &setup_editor_el_boulderdash_native,
-    &setup.editor_cascade.el_bd_native,
+    &setup.editor_cascade.el_bdx,
     &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native,
     &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native
   },
   {
     &setup_editor_el_boulderdash_effects,
-    &setup.editor_cascade.el_bd_effects,
+    &setup.editor_cascade.el_bdx_effects,
     &editor_hl_boulderdash_effects_ptr,        &num_editor_hl_boulderdash_effects,
     &editor_el_boulderdash_effects_ptr,        &num_editor_el_boulderdash_effects
   },
@@ -7815,7 +8056,7 @@ static void DrawDrawingArea(int id)
       int graphic;
       int frame;
 
-      getEditorGraphicAndFrame(element, &graphic, &frame, TRUE);
+      el2edimg_with_frame(element, &graphic, &frame);
 
       DrawSizedGraphicExt(drawto,
                          gi->x + x * tilesize,
@@ -7856,45 +8097,13 @@ static void ScrollEditorLevel(int from_x, int from_y, int scroll)
   BackToFront();
 }
 
-static void getEditorGraphicAndFrame(int element, int *graphic, int *frame, boolean use_editor_gfx)
-{
-  if (use_editor_gfx)
-  {
-    *graphic = el2edimg(element);
-    *frame = 0;
-  }
-  else
-  {
-    *graphic = el2img(element);
-    *frame = (ANIM_MODE(*graphic) == ANIM_CE_VALUE ?
-             custom_element.ce_value_fixed_initial :
-             ANIM_MODE(*graphic) == ANIM_CE_SCORE ?
-             custom_element.collect_score_initial : FrameCounter);
-  }
-
-  if (*graphic == IMG_UNKNOWN)
-  {
-    // no graphic defined -- if BD style, try to get runtime ("effect") element graphics
-    // (normal BD style elements have graphics, but runtime ("effects") elements do not)
-    int element_bd = map_element_RND_to_BD_cave(element);
-
-    if (element_bd != O_UNKNOWN)
-    {
-      struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[element_bd][0];
-
-      *graphic = g_bd->graphic;
-      *frame   = g_bd->frame;
-    }
-  }
-}
-
 static void getEditorGraphicSource(int element, int tile_size, Bitmap **bitmap,
                                   int *x, int *y)
 {
   int graphic;
   int frame;
 
-  getEditorGraphicAndFrame(element, &graphic, &frame, TRUE);
+  el2edimg_with_frame(element, &graphic, &frame);
 
   getSizedGraphicSource(graphic, frame, tile_size, bitmap, x, y);
 }
@@ -8414,7 +8623,11 @@ static void CreateTextInputGadgets(void)
       y = ED_SETTINGS_Y(textinput_info[i].y);
     }
 
-    sprintf(infotext, "Enter %s", textinput_info[i].infotext);
+    // determine horizontal offset for leading text
+    if (textinput_info[i].text_left != NULL)
+      x += getTextWidthForGadget(textinput_info[i].text_left);
+
+    sprintf(infotext, "%s", textinput_info[i].infotext);
     infotext[max_infotext_len] = '\0';
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
@@ -9165,12 +9378,23 @@ static void MapTextInputGadget(int id)
   int font_nr = FONT_TEXT_1;
   int font_height = getFontHeight(font_nr);
   struct GadgetInfo *gi = level_editor_gadget[textinput_info[id].gadget_id];
+  int xoffset_left = getTextWidthForGadget(textinput_info[id].text_left);
+  int xoffset_right = ED_GADGET_TEXT_DISTANCE;
   int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
-  int x_above = ED_SETTINGS_X(textinput_info[id].x);
-  int y_above = ED_SETTINGS_Y(textinput_info[id].y) - yoffset_above;
+  int yoffset = (gi->height - font_height) / 2;
+  int x_left = gi->x - xoffset_left;
+  int x_right = gi->x + gi->width + xoffset_right;
+  int y_above = gi->y - yoffset_above;
+  int y = gi->y + yoffset;
 
   if (textinput_info[id].text_above)
-    DrawTextS(x_above, y_above, font_nr, textinput_info[id].text_above);
+    DrawText(x_left, y_above, textinput_info[id].text_above, font_nr);
+
+  if (textinput_info[id].text_left)
+    DrawText(x_left, y, textinput_info[id].text_left, font_nr);
+
+  if (textinput_info[id].text_right)
+    DrawText(x_right, y, textinput_info[id].text_right, font_nr);
 
   ModifyGadget(gi, GDI_TEXT_VALUE, textinput_info[id].value, GDI_END);
 
@@ -9210,11 +9434,10 @@ static void MapSelectboxGadget(int id)
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
   int y_above = gi->y - yoffset_above;
-  int x = gi->x;
   int y = gi->y + yoffset;
 
   if (selectbox_info[id].text_above)
-    DrawText(x, y_above, selectbox_info[id].text_above, font_nr);
+    DrawText(x_left, y_above, selectbox_info[id].text_above, font_nr);
 
   if (selectbox_info[id].text_left)
     DrawText(x_left, y, selectbox_info[id].text_left, font_nr);
@@ -10346,30 +10569,10 @@ static void InitDrawingElements(void)
   if (level.game_engine_type == game_engine_type_last)
     return;
 
-  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;
-    new_element3 = EL_SP_BASE;
-  }
-  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
-  {
-    new_element1 = EL_MM_MIRROR_START;
-    new_element2 = EL_EMPTY;
-    new_element3 = EL_MM_WOODEN_WALL;
-  }
-  else
-  {
-    new_element1 = EL_WALL;
-    new_element2 = EL_EMPTY;
-    new_element3 = EL_SAND;
-  }
+  // select drawing elements according to game engine type
+  new_element1 = getDrawingElement(EL_WALL);
+  new_element2 = getDrawingElement(EL_EMPTY);
+  new_element3 = getDrawingElement(EL_SAND);
 
   game_engine_type_last = level.game_engine_type;
 }
@@ -11168,9 +11371,135 @@ static void DrawEngineConfigConfig(void)
     MapSelectboxGadget(i);
 }
 
+static int GetCommonColorType_BD(void)
+{
+  int bd_color_type = *bd_color[0] >> 24;
+  int i;
+
+  // check if all colors have the same color type
+  for (i = 1; i < MAX_BD_COLORS; i++)
+    if ((*bd_color[i] >> 24) != bd_color_type)
+      return GD_COLOR_TYPE_RGB;
+
+  return bd_color_type;
+}
+
+void SetDefaultLevelColorType_BD(void)
+{
+  bd_color_type_default = GetCommonColorType_BD();
+
+  level.bd_color_type = bd_color_type_default;
+}
+
+void SetDefaultLevelColors_BD(void)
+{
+  int i;
+
+  for (i = 0; i < MAX_BD_COLORS; i++)
+    bd_color_default[i] = *bd_color[i];
+}
+
+void SetRandomLevelColors_BD(int bd_color_type)
+{
+  struct LevelInfo_BD *level_bd = level.native_bd_level;
+  GdCave *cave = level_bd->cave;
+
+  // create random cave colors
+  gd_cave_set_random_colors(cave, bd_color_type);
+
+  // copy colors to level editor
+  level.bd_color_b = cave->colorb;
+  level.bd_color_0 = cave->color0;
+  level.bd_color_1 = cave->color1;
+  level.bd_color_2 = cave->color2;
+  level.bd_color_3 = cave->color3;
+  level.bd_color_4 = cave->color4;
+  level.bd_color_5 = cave->color5;
+}
+
+static void DrawColorBox_BD(int nr)
+{
+  int id = ED_SELECTBOX_ID_COLORS_FIRST + nr;
+  struct GadgetInfo *gi = level_editor_gadget[selectbox_info[id].gadget_id];
+  int graphic = IMG_EDITOR_CHECKBOX;
+  struct GraphicInfo *gd = &graphic_info[graphic];
+  int offset = ED_GADGET_TEXT_DISTANCE;
+  int x1 = gi->x - offset - gd->width;
+  int y1 = gi->y;
+  int x2 = x1 + offset;
+  int y2 = y1 + offset;
+  int xsize1 = gd->width;
+  int ysize1 = gd->height;
+  int xsize2 = xsize1 - 2 * offset;
+  int ysize2 = ysize1 - 2 * offset;
+  int bd_color_x = *bd_color[nr];
+  int r = gd_color_get_r(bd_color_x);
+  int g = gd_color_get_g(bd_color_x);
+  int b = gd_color_get_b(bd_color_x);
+  Pixel color = SDL_MapRGB(drawto->surface->format, r, g, b);
+
+  BlitBitmap(gd->bitmap, drawto, gd->src_x, gd->src_y, xsize1, ysize1, x1, y1);
+  FillRectangle(drawto, x2, y2, xsize2, ysize2, color);
+}
+
 static void DrawEngineConfigColors(void)
 {
-  // (no settings yet)
+  int i;
+
+  if (bd_color_type_changed)
+  {
+    if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD())
+    {
+      // color type switched to non-RGB colors, but using different color type => reset colors
+
+      if (level.bd_color_type == bd_color_type_default)
+      {
+       // color type switched to same color type as default colors => reset to defaults
+       for (i = 0; i < MAX_BD_COLORS; i++)
+         *bd_color[i] = bd_color_default[i];
+      }
+      else
+      {
+       // color type switched to different color type as default colors => use random colors
+       SetRandomLevelColors_BD(level.bd_color_type);
+      }
+    }
+
+    bd_color_type_changed = FALSE;
+  }
+
+  // copy level colors to either C64-style color index or color text
+  for (i = 0; i < MAX_BD_COLORS; i++)
+  {
+    int bd_color_x = (level.bd_color_type == GD_COLOR_TYPE_C64 ? *bd_color[i] & 0x0f :
+                     level.bd_color_type == GD_COLOR_TYPE_RGB ? gd_color_get_rgb(*bd_color[i]) :
+                     *bd_color[i]);
+
+    if (level.bd_color_type == GD_COLOR_TYPE_C64)
+      bd_color_c64[i] = bd_color_x;
+    else
+      snprintf(bd_color_text[i], sizeof(bd_color_text[i]), "%s", gd_color_get_string(bd_color_x));
+  }
+
+  MapSelectboxGadget(ED_SELECTBOX_ID_BD_COLOR_TYPE);
+
+  if (level.bd_color_type == GD_COLOR_TYPE_C64)
+  {
+    // draw selectbox gadgets
+    for (i = ED_SELECTBOX_ID_COLORS_FIRST; i <= ED_SELECTBOX_ID_COLORS_LAST; i++)
+      MapSelectboxGadget(i);
+  }
+  else
+  {
+    // draw text input gadgets
+    for (i = ED_TEXTINPUT_ID_COLORS_FIRST; i <= ED_TEXTINPUT_ID_COLORS_LAST; i++)
+      MapTextInputGadget(i);
+  }
+
+  for (i = 0; i < MAX_BD_COLORS; i++)
+    DrawColorBox_BD(i);
+
+  MapTextbuttonGadget(ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS);
 }
 
 static void DrawLevelConfigEngine(void)
@@ -11191,6 +11520,11 @@ static void DrawLevelConfigWindow(void)
 
   stick_element_properties_window = FALSE;
 
+  // make sure that previous level config edit mode exists for this level
+  if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE &&
+      level.game_engine_type != GAME_ENGINE_TYPE_BD)
+    edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL;
+
   SetAutomaticNumberOfGemsNeeded();
 
   UnmapLevelEditorFieldGadgets();
@@ -11616,33 +11950,38 @@ static void DrawPropertiesInfo(void)
 
   ypos += 2 * MAX(font1_height, font2_height);
 
-  // ----- print standard properties of this element
+  // ----- print standard properties of this element (only for certain game engines)
 
-  DrawTextS(xpos, ypos, font1_nr, properties_text);
+  if (level.game_engine_type == GAME_ENGINE_TYPE_RND ||
+      level.game_engine_type == GAME_ENGINE_TYPE_EM ||
+      level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    DrawTextS(xpos, ypos, font1_nr, properties_text);
 
-  ypos += line1_height;
+    ypos += line1_height;
 
-  for (i = 0; properties[i].value != -1; i++)
-  {
-    if (!HAS_PROPERTY(properties_element, properties[i].value))
-      continue;
+    for (i = 0; properties[i].value != -1; i++)
+    {
+      if (!HAS_PROPERTY(properties_element, properties[i].value))
+       continue;
 
-    DrawTextS(xpos, ypos, font2_nr, properties[i].text);
+      DrawTextS(xpos, ypos, font2_nr, properties[i].text);
 
-    ypos += font2_height;
+      ypos += font2_height;
 
-    num_standard_properties++;
-  }
+      num_standard_properties++;
+    }
 
-  if (num_standard_properties == 0)
-  {
-    DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset,
-             font2_nr, none_text);
+    if (num_standard_properties == 0)
+    {
+      DrawTextS(xpos + properties_text_len, ypos - line1_height + font2_yoffset,
+               font2_nr, none_text);
 
-    ypos -= (line1_height - font1_height);
-  }
+      ypos -= (line1_height - font1_height);
+    }
 
-  ypos += MAX(font1_height, font2_height);
+    ypos += MAX(font1_height, font2_height);
+  }
 
   // ----- print special description of this element
 
@@ -11703,7 +12042,8 @@ static struct
 {
   { EL_EMERALD,                        &level.score[SC_EMERALD],               TEXT_COLLECTING         },
   { EL_BD_DIAMOND,             &level.score[SC_EMERALD],               TEXT_COLLECTING         },
-  { EL_BD_DIAMOND,             &level.score[SC_DIAMOND_EXTRA],         TEXT_COLLECTING_EXTRA   },
+  { EL_BDX_DIAMOND,            &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_BDX_DIAMOND,            &level.score[SC_DIAMOND_EXTRA],         TEXT_COLLECTING_EXTRA   },
   { EL_EMERALD_YELLOW,         &level.score[SC_EMERALD],               TEXT_COLLECTING         },
   { EL_EMERALD_RED,            &level.score[SC_EMERALD],               TEXT_COLLECTING         },
   { EL_EMERALD_PURPLE,         &level.score[SC_EMERALD],               TEXT_COLLECTING         },
@@ -11781,21 +12121,22 @@ static struct
   { EL_AMOEBA_FULL,            &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
   { EL_BD_AMOEBA,              &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
   { EL_EMC_DRIPPER,            &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
-  { EL_BD_AMOEBA,              &level.bd_amoeba_threshold_too_big,     TEXT_AMOEBA_THRESHOED   },
-  { EL_BD_AMOEBA,              &level.bd_amoeba_slow_growth_time,      TEXT_AMOEBA_SLOW_TIME   },
-  { EL_BD_AMOEBA,              &level.bd_amoeba_slow_growth_rate,      TEXT_AMOEBA_SLOW_RATE,
+  { EL_BDX_AMOEBA_1,           &level.bd_amoeba_1_threshold_too_big,   TEXT_AMOEBA_THRESHOED   },
+  { EL_BDX_AMOEBA_1,           &level.bd_amoeba_1_slow_growth_time,    TEXT_AMOEBA_SLOW_TIME   },
+  { EL_BDX_AMOEBA_2,           &level.bd_amoeba_1_slow_growth_rate,    TEXT_AMOEBA_SLOW_RATE,
                                0, 100                                                          },
-  { EL_BD_AMOEBA,              &level.bd_amoeba_fast_growth_rate,      TEXT_AMOEBA_FAST_RATE,
+  { EL_BDX_AMOEBA_1,           &level.bd_amoeba_1_fast_growth_rate,    TEXT_AMOEBA_FAST_RATE,
                                0, 100                                                          },
-  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_threshold_too_big,   TEXT_AMOEBA_THRESHOED   },
-  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_slow_growth_time,    TEXT_AMOEBA_SLOW_TIME   },
-  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_slow_growth_rate,    TEXT_AMOEBA_SLOW_RATE,
+  { EL_BDX_AMOEBA_2,           &level.bd_amoeba_2_threshold_too_big,   TEXT_AMOEBA_THRESHOED   },
+  { EL_BDX_AMOEBA_2,           &level.bd_amoeba_2_slow_growth_time,    TEXT_AMOEBA_SLOW_TIME   },
+  { EL_BDX_AMOEBA_2,           &level.bd_amoeba_2_slow_growth_rate,    TEXT_AMOEBA_SLOW_RATE,
                                0, 100                                                          },
-  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_fast_growth_rate,    TEXT_AMOEBA_FAST_RATE,
+  { EL_BDX_AMOEBA_2,           &level.bd_amoeba_2_fast_growth_rate,    TEXT_AMOEBA_FAST_RATE,
                                0, 100                                                          },
   { EL_MAGIC_WALL,             &level.time_magic_wall,                 TEXT_DURATION           },
-  { EL_BD_MAGIC_WALL,          &level.time_magic_wall,                 TEXT_DURATION           },
   { EL_DC_MAGIC_WALL,          &level.time_magic_wall,                 TEXT_DURATION           },
+  { EL_BD_MAGIC_WALL,          &level.time_magic_wall,                 TEXT_DURATION           },
+  { EL_BDX_MAGIC_WALL,         &level.bd_magic_wall_time,              TEXT_DURATION           },
   { EL_ROBOT_WHEEL,            &level.time_wheel,                      TEXT_DURATION           },
   { EL_TIMEGATE_SWITCH,                &level.time_timegate,                   TEXT_DURATION           },
   { EL_DC_TIMEGATE_SWITCH,     &level.time_timegate,                   TEXT_DURATION           },
@@ -11803,42 +12144,42 @@ static struct
   { EL_LIGHT_SWITCH_ACTIVE,    &level.time_light,                      TEXT_DURATION           },
   { EL_SHIELD_NORMAL,          &level.shield_normal_time,              TEXT_DURATION           },
   { EL_SHIELD_DEADLY,          &level.shield_deadly_time,              TEXT_DURATION           },
-  { EL_BD_CLOCK,               &level.bd_clock_extra_time,             TEXT_TIME_BONUS,
+  { EL_BDX_CLOCK,              &level.bd_clock_extra_time,             TEXT_TIME_BONUS,
                                -100, 100                                                       },
-  { EL_BD_VOODOO_DOLL,         &level.bd_voodoo_penalty_time,          TEXT_TIME_PENALTY,
+  { EL_BDX_VOODOO_DOLL,                &level.bd_voodoo_penalty_time,          TEXT_TIME_PENALTY,
                                0, 100                                                          },
-  { EL_BD_SLIME,               &level.bd_slime_permeability_rate,      TEXT_PERMEABILITY_RATE,
+  { EL_BDX_SLIME,              &level.bd_slime_permeability_rate,      TEXT_PERMEABILITY_RATE,
                                0, 100                                                          },
-  { EL_BD_SLIME,               &level.bd_slime_permeability_bits_c64,  TEXT_PERMEABILITY_BITS,
+  { EL_BDX_SLIME,              &level.bd_slime_permeability_bits_c64,  TEXT_PERMEABILITY_BITS,
                                0, 255                                                          },
-  { EL_BD_SLIME,               &level.bd_slime_random_seed_c64,        TEXT_RANDOM_SEED,
+  { EL_BDX_SLIME,              &level.bd_slime_random_seed_c64,        TEXT_RANDOM_SEED,
                                -1, 65535                                                       },
-  { EL_BD_ACID,                        &level.bd_acid_spread_rate,             TEXT_ACID_SPREAD_RATE,
+  { EL_BDX_ACID,               &level.bd_acid_spread_rate,             TEXT_ACID_SPREAD_RATE,
                                0, 100                                                          },
-  { EL_BD_BITER,               &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
+  { EL_BDX_BITER,              &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
                                0, 3                                                            },
-  { EL_BD_BITER_RIGHT,         &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
+  { EL_BDX_BITER_RIGHT,                &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
                                0, 3                                                            },
-  { EL_BD_BITER_UP,            &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
+  { EL_BDX_BITER_UP,           &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
                                0, 3                                                            },
-  { EL_BD_BITER_LEFT,          &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
+  { EL_BDX_BITER_LEFT,         &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
                                0, 3                                                            },
-  { EL_BD_BITER_DOWN,          &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
+  { EL_BDX_BITER_DOWN,         &level.bd_biter_move_delay,             TEXT_BITER_MOVE_DELAY,
                                0, 3                                                            },
-  { EL_BD_REPLICATOR,          &level.bd_replicator_create_delay,      TEXT_REPLICATION_DELAY,
+  { EL_BDX_REPLICATOR,         &level.bd_replicator_create_delay,      TEXT_REPLICATION_DELAY,
                                0, 100                                                          },
-  { EL_BD_PNEUMATIC_HAMMER,    &level.bd_hammer_walls_break_delay,     TEXT_HAMMER_BREAK_DELAY,
+  { EL_BDX_PNEUMATIC_HAMMER,   &level.bd_hammer_walls_break_delay,     TEXT_HAMMER_BREAK_DELAY,
                                1, 100                                                          },
-  { EL_BD_PNEUMATIC_HAMMER,    &level.bd_hammer_walls_reappear_delay,  TEXT_HAMMER_REAPPEAR_DELAY,
+  { EL_BDX_PNEUMATIC_HAMMER,   &level.bd_hammer_walls_reappear_delay,  TEXT_HAMMER_REAPPEAR_DELAY,
                                1, 200                                                          },
-  { EL_BD_POT,                 &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED,
+  { EL_BDX_POT,                        &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED,
                                0, 50                                                           },
-  { EL_BD_SKELETON,            &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED,
+  { EL_BDX_SKELETON,           &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED,
                                0, 50                                                           },
-  { EL_BD_SKELETON,            &level.bd_skeleton_worth_num_diamonds,  TEXT_SKELETONS_WORTH,
+  { EL_BDX_SKELETON,           &level.bd_skeleton_worth_num_diamonds,  TEXT_SKELETONS_WORTH,
                                0, 10                                                           },
-  { EL_BD_CREATURE_SWITCH,     &level.bd_creatures_auto_turn_delay,    TEXT_AUTO_TURN_DELAY    },
-  { EL_BD_GRAVITY_SWITCH,      &level.bd_gravity_switch_delay,         TEXT_GRAVITY_DELAY,
+  { EL_BDX_CREATURE_SWITCH,    &level.bd_creatures_auto_turn_delay,    TEXT_AUTO_TURN_DELAY    },
+  { EL_BDX_GRAVITY_SWITCH,     &level.bd_gravity_switch_delay,         TEXT_GRAVITY_DELAY,
                                1, 60                                                           },
   { EL_EXTRA_TIME,             &level.extra_time,                      TEXT_TIME_BONUS         },
   { EL_TIME_ORB_FULL,          &level.time_orb_time,                   TEXT_TIME_BONUS         },
@@ -11877,10 +12218,6 @@ static boolean checkPropertiesConfig(int element)
   if (element == EL_EMPTY_SPACE && level.game_engine_type != GAME_ENGINE_TYPE_RND)
     return FALSE;
 
-  // special case: BD style rock customization only available in BD game engine
-  if (element == EL_BD_ROCK && level.game_engine_type != GAME_ENGINE_TYPE_BD)
-    return FALSE;
-
   if (IS_GEM(element) ||
       IS_CUSTOM_ELEMENT(element) ||
       IS_GROUP_ELEMENT(element) ||
@@ -11891,32 +12228,34 @@ static boolean checkPropertiesConfig(int element)
       IS_MM_MCDUFFIN(element) ||
       IS_DF_LASER(element) ||
       IS_PLAYER_ELEMENT(element) ||
-      IS_BD_PLAYER_ELEMENT(element) ||
+      IS_BDX_PLAYER_ELEMENT(element) ||
       IS_BD_FIREFLY(properties_element) ||
-      IS_BD_FIREFLY_2(properties_element) ||
+      IS_BDX_FIREFLY_1(properties_element) ||
+      IS_BDX_FIREFLY_2(properties_element) ||
       IS_BD_BUTTERFLY(properties_element) ||
-      IS_BD_BUTTERFLY_2(properties_element) ||
-      IS_BD_STONEFLY(properties_element) ||
-      IS_BD_DRAGONFLY(properties_element) ||
-      IS_BD_EXPANDABLE_WALL(properties_element) ||
-      IS_BD_EXPANDABLE_STEELWALL(properties_element) ||
-      IS_BD_CONVEYOR_BELT(properties_element) ||
-      IS_BD_CONVEYOR_BELT_SWITCH(properties_element) ||
+      IS_BDX_BUTTERFLY_1(properties_element) ||
+      IS_BDX_BUTTERFLY_2(properties_element) ||
+      IS_BDX_STONEFLY(properties_element) ||
+      IS_BDX_DRAGONFLY(properties_element) ||
+      IS_BDX_EXPANDABLE_WALL(properties_element) ||
+      IS_BDX_EXPANDABLE_STEELWALL(properties_element) ||
+      IS_BDX_CONVEYOR_BELT(properties_element) ||
+      IS_BDX_CONVEYOR_BELT_SWITCH(properties_element) ||
       IS_SOKOBAN_OBJECT_OR_FIELD(element) ||
       HAS_EDITOR_CONTENT(element) ||
       CAN_GROW(element) ||
       COULD_MOVE_INTO_ACID(element) ||
       MAYBE_DONT_COLLIDE_WITH(element) ||
-      element == EL_BD_SAND ||
-      element == EL_BD_ROCK ||
-      element == EL_BD_MEGA_ROCK ||
-      element == EL_BD_BOMB ||
-      element == EL_BD_ROCKET_LAUNCHER ||
-      element == EL_BD_NITRO_PACK ||
-      element == EL_BD_SWEET ||
-      element == EL_BD_VOODOO_DOLL ||
-      element == EL_BD_WATER ||
-      element == EL_BD_GRAVITY_SWITCH)
+      element == EL_BDX_SAND_1 ||
+      element == EL_BDX_ROCK ||
+      element == EL_BDX_MEGA_ROCK ||
+      element == EL_BDX_BOMB ||
+      element == EL_BDX_ROCKET_LAUNCHER ||
+      element == EL_BDX_NITRO_PACK ||
+      element == EL_BDX_SWEET ||
+      element == EL_BDX_VOODOO_DOLL ||
+      element == EL_BDX_WATER ||
+      element == EL_BDX_GRAVITY_SWITCH)
   {
     return TRUE;
   }
@@ -11952,6 +12291,7 @@ static void SetAutomaticNumberOfGemsNeeded(void)
        case EL_EMERALD_RED:
        case EL_EMERALD_PURPLE:
        case EL_BD_DIAMOND:
+       case EL_BDX_DIAMOND:
        case EL_WALL_EMERALD:
        case EL_WALL_EMERALD_YELLOW:
        case EL_WALL_EMERALD_RED:
@@ -12011,59 +12351,27 @@ static void DrawPropertiesConfig(void)
     if (elements_with_counter[i].element != properties_element)
       continue;
 
-    // special case: score for extra diamonds only available in BD game engine
-    if (elements_with_counter[i].element == EL_BD_DIAMOND &&
-       elements_with_counter[i].value == &level.score[SC_DIAMOND_EXTRA] &&
-       level.game_engine_type != GAME_ENGINE_TYPE_BD)
-      continue;
-
-    // special case: some amoeba counters only available in BD game engine
-    if (elements_with_counter[i].element == EL_BD_AMOEBA &&
-       elements_with_counter[i].value != &level.amoeba_speed &&
-       level.game_engine_type != GAME_ENGINE_TYPE_BD)
-      continue;
-
-    // special case: score for smashing only available in R'n'D game engine
-    if ((IS_BD_FIREFLY(elements_with_counter[i].element) ||
-        IS_BD_BUTTERFLY(elements_with_counter[i].element)) &&
-       (elements_with_counter[i].value == &level.score[SC_BUG] ||
-        elements_with_counter[i].value == &level.score[SC_SPACESHIP]) &&
-       level.game_engine_type == GAME_ENGINE_TYPE_BD)
-      continue;
-
-    // special case: some amoeba counters only available in R'n'D game engine
-    if (elements_with_counter[i].element == EL_BD_AMOEBA &&
-       elements_with_counter[i].value == &level.amoeba_speed &&
-       level.game_engine_type == GAME_ENGINE_TYPE_BD)
-      continue;
-
     int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters;
 
     counterbutton_info[counter_id].y =
-      ED_ELEMENT_SETTINGS_YPOS((HAS_EDITOR_CONTENT(properties_element)      ? 1 : 0) +
-                              (CAN_GROW(properties_element)                ? 1 : 0) +
-                              (COULD_MOVE_INTO_ACID(properties_element)    ? 1 : 0) +
-                              (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) +
-                              (properties_element == EL_BD_VOODOO_DOLL     ? 4 : 0) +
-                              (properties_element == EL_BD_SLIME           ? 1 : 0) +
-                              (properties_element == EL_BD_ACID            ? 1 : 0) +
-                              (properties_element == EL_BD_REPLICATOR      ? 1 : 0) +
-                              (properties_element == EL_BD_CREATURE_SWITCH ? 1 : 0) +
-                              (properties_element == EL_BD_GRAVITY_SWITCH  ? 2 : 0) +
-                              (properties_element == EL_EMC_MAGIC_BALL     ? 2 : 0) +
+      ED_ELEMENT_SETTINGS_YPOS((HAS_EDITOR_CONTENT(properties_element)         ? 1 : 0) +
+                              (CAN_GROW(properties_element)                    ? 1 : 0) +
+                              (COULD_MOVE_INTO_ACID(properties_element)        ? 1 : 0) +
+                              (MAYBE_DONT_COLLIDE_WITH(properties_element)     ? 1 : 0) +
+                              (properties_element == EL_BDX_AMOEBA_1           ? 3 : 0) +
+                              (properties_element == EL_BDX_AMOEBA_2           ? 3 : 0) +
+                              (properties_element == EL_BDX_MAGIC_WALL         ? 1 : 0) +
+                              (properties_element == EL_BDX_VOODOO_DOLL        ? 4 : 0) +
+                              (properties_element == EL_BDX_SLIME              ? 1 : 0) +
+                              (properties_element == EL_BDX_ACID               ? 1 : 0) +
+                              (properties_element == EL_BDX_REPLICATOR         ? 1 : 0) +
+                              (properties_element == EL_BDX_CREATURE_SWITCH    ? 1 : 0) +
+                              (properties_element == EL_BDX_GRAVITY_SWITCH     ? 2 : 0) +
+                              (properties_element == EL_EMC_MAGIC_BALL         ? 2 : 0) +
                               num_element_counters);
 
-    // special case: set magic wall counter for BD game engine separately
-    if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD)
-      counterbutton_info[counter_id].y = ED_ELEMENT_SETTINGS_YPOS(1);
-
-    // special case: set amoeba counters for BD game engine separately
-    if ((properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD) ||
-       (properties_element == EL_BD_AMOEBA_2))
-      counterbutton_info[counter_id].y = ED_ELEMENT_SETTINGS_YPOS(3 + num_element_counters);
-
     // special case: set position for delay counter for reappearing hammered walls
-    if (properties_element == EL_BD_PNEUMATIC_HAMMER && num_element_counters > 0)
+    if (properties_element == EL_BDX_PNEUMATIC_HAMMER && num_element_counters > 0)
       counterbutton_info[counter_id].y += 1;
 
     counterbutton_info[counter_id].value      = elements_with_counter[i].value;
@@ -12082,7 +12390,7 @@ static void DrawPropertiesConfig(void)
       break;
   }
 
-  if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  if (properties_element == EL_BDX_MAGIC_WALL)
   {
     // draw stickybutton gadget
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
@@ -12106,15 +12414,15 @@ static void DrawPropertiesConfig(void)
     // draw stickybutton gadget
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
-    if (properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    if (properties_element == EL_BDX_AMOEBA_1)
     {
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY);
 
-      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG);
-      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED);
+      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_TOO_BIG);
+      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_1_CONTENT_ENCLOSED);
     }
-    else if (properties_element == EL_BD_AMOEBA_2)
+    else if (properties_element == EL_BDX_AMOEBA_2)
     {
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING);
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY);
@@ -12129,16 +12437,16 @@ static void DrawPropertiesConfig(void)
     {
       MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
     }
-    else if (properties_element == EL_BD_ACID)
+    else if (properties_element == EL_BDX_ACID)
     {
       MapDrawingArea(ED_DRAWING_ID_BD_ACID_EATS_ELEMENT);
       MapDrawingArea(ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT);
     }
-    else if (IS_BD_BITER(properties_element))
+    else if (IS_BDX_BITER(properties_element))
     {
       MapDrawingArea(ED_DRAWING_ID_BD_BITER_EATS_ELEMENT);
     }
-    else if (properties_element == EL_BD_BLADDER)
+    else if (properties_element == EL_BDX_BLADDER)
     {
       MapDrawingArea(ED_DRAWING_ID_BD_BLADDER_CONVERTS_BY_ELEMENT);
     }
@@ -12245,7 +12553,7 @@ static void DrawPropertiesConfig(void)
     }
   }
 
-  if (IS_BD_PLAYER_ELEMENT(properties_element))
+  if (IS_BDX_PLAYER_ELEMENT(properties_element))
   {
     counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
       ED_ELEMENT_SETTINGS_YPOS(2);
@@ -12267,12 +12575,12 @@ static void DrawPropertiesConfig(void)
     MapDrawingArea(ED_DRAWING_ID_BD_SNAP_ELEMENT);
   }
 
-  if (properties_element == EL_BD_SAND)
+  if (properties_element == EL_BDX_SAND_1)
   {
     MapDrawingArea(ED_DRAWING_ID_BD_SAND_LOOKS_LIKE);
   }
 
-  if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  if (properties_element == EL_BDX_ROCK)
   {
     counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
       ED_ELEMENT_SETTINGS_YPOS(0);
@@ -12286,7 +12594,7 @@ static void DrawPropertiesConfig(void)
     MapDrawingArea(ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT);
   }
 
-  if (properties_element == EL_BD_DIAMOND && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  if (properties_element == EL_BDX_DIAMOND)
   {
     MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_FALLING);
     MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT);
@@ -12294,47 +12602,47 @@ static void DrawPropertiesConfig(void)
 
   if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
   {
-    if (IS_BD_FIREFLY(properties_element))
+    if (IS_BDX_FIREFLY_1(properties_element))
     {
-      MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO);
       MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
     }
-    else if (IS_BD_FIREFLY_2(properties_element))
+    else if (IS_BDX_FIREFLY_2(properties_element))
     {
       MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_2_EXPLODES_TO);
       MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
     }
-    else if (IS_BD_BUTTERFLY(properties_element))
+    else if (IS_BDX_BUTTERFLY_1(properties_element))
     {
-      MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO);
       MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO);
     }
-    else if (IS_BD_BUTTERFLY_2(properties_element))
+    else if (IS_BDX_BUTTERFLY_2(properties_element))
     {
       MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_2_EXPLODES_TO);
       MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO);
     }
-    else if (IS_BD_STONEFLY(properties_element))
+    else if (IS_BDX_STONEFLY(properties_element))
     {
       MapDrawingArea(ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO);
     }
-    else if (IS_BD_DRAGONFLY(properties_element))
+    else if (IS_BDX_DRAGONFLY(properties_element))
     {
       MapDrawingArea(ED_DRAWING_ID_BD_DRAGONFLY_EXPLODES_TO);
       MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
     }
-    else if (properties_element == EL_BD_BOMB)
+    else if (properties_element == EL_BDX_BOMB)
     {
       MapDrawingArea(ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO);
     }
-    else if (properties_element == EL_BD_NITRO_PACK)
+    else if (properties_element == EL_BDX_NITRO_PACK)
     {
       MapDrawingArea(ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_TO);
     }
   }
 
-  if (properties_element == EL_BD_MEGA_ROCK ||
-      properties_element == EL_BD_SWEET)
+  if (properties_element == EL_BDX_MEGA_ROCK ||
+      properties_element == EL_BDX_SWEET)
   {
     counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
       ED_ELEMENT_SETTINGS_YPOS(0);
@@ -12345,7 +12653,7 @@ static void DrawPropertiesConfig(void)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
   }
 
-  if (properties_element == EL_BD_VOODOO_DOLL)
+  if (properties_element == EL_BDX_VOODOO_DOLL)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_COLLECTS_DIAMONDS);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_HURT_KILLS_PLAYER);
@@ -12353,7 +12661,7 @@ static void DrawPropertiesConfig(void)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_VANISH_BY_EXPLOSION);
   }
 
-  if (properties_element == EL_BD_SLIME)
+  if (properties_element == EL_BDX_SLIME)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE);
 
@@ -12365,49 +12673,49 @@ static void DrawPropertiesConfig(void)
     MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3);
   }
 
-  if (IS_BD_EXPANDABLE_WALL(properties_element) ||
-      IS_BD_EXPANDABLE_STEELWALL(properties_element))
+  if (IS_BDX_EXPANDABLE_WALL(properties_element) ||
+      IS_BDX_EXPANDABLE_STEELWALL(properties_element))
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CHANGE_EXPANDING_WALL);
 
-    if (IS_BD_EXPANDABLE_WALL(properties_element))
+    if (IS_BDX_EXPANDABLE_WALL(properties_element))
       MapDrawingArea(ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE);
   }
 
-  if (properties_element == EL_BD_REPLICATOR)
+  if (properties_element == EL_BDX_REPLICATOR)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_REPLICATORS_ACTIVE);
   }
 
-  if (IS_BD_CONVEYOR_BELT(properties_element) ||
-      IS_BD_CONVEYOR_BELT_SWITCH(properties_element))
+  if (IS_BDX_CONVEYOR_BELT(properties_element) ||
+      IS_BDX_CONVEYOR_BELT_SWITCH(properties_element))
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED);
   }
 
-  if (properties_element == EL_BD_WATER)
+  if (properties_element == EL_BDX_WATER)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN);
   }
 
-  if (properties_element == EL_BD_PNEUMATIC_HAMMER)
+  if (properties_element == EL_BDX_PNEUMATIC_HAMMER)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR);
   }
 
-  if (properties_element == EL_BD_ROCKET_LAUNCHER)
+  if (properties_element == EL_BDX_ROCKET_LAUNCHER)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS);
   }
 
-  if (properties_element == EL_BD_CREATURE_SWITCH)
+  if (properties_element == EL_BDX_CREATURE_SWITCH)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING);
   }
 
-  if (properties_element == EL_BD_GRAVITY_SWITCH)
+  if (properties_element == EL_BDX_GRAVITY_SWITCH)
   {
     MapSelectboxGadget(ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION);
 
@@ -12415,7 +12723,7 @@ static void DrawPropertiesConfig(void)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL);
   }
 
-  if (properties_element == EL_BD_NUT)
+  if (properties_element == EL_BDX_NUT)
   {
     MapDrawingArea(ED_DRAWING_ID_BD_NUT_CONTENT);
   }
@@ -12706,9 +13014,22 @@ static void DrawEditorElementAnimation(int x, int y)
   int graphic;
   int frame;
 
-  getEditorGraphicAndFrame(properties_element, &graphic, &frame, FALSE);
+  if (IS_BDX_RUNTIME_ELEMENT(properties_element))
+  {
+    el2edimg_with_frame(properties_element, &graphic, &frame);
+
+    DrawFixedGraphicExt(drawto, x, y, graphic, frame);
+  }
+  else
+  {
+    graphic = el2img(properties_element);
+    frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ?
+            custom_element.ce_value_fixed_initial :
+            ANIM_MODE(graphic) == ANIM_CE_SCORE ?
+            custom_element.collect_score_initial : FrameCounter);
 
-  DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+    DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+  }
 }
 
 static void DrawEditorElementName(int x, int y, int font_nr)
@@ -13637,6 +13958,7 @@ static void SetElementIntelliDraw(int x, int y, int dx, int dy, int new_element,
       { EL_EMERALD_PURPLE,             EL_WALL_EMERALD_PURPLE          },
       { EL_DIAMOND,                    EL_WALL_DIAMOND                 },
       { EL_BD_DIAMOND,                 EL_WALL_BD_DIAMOND              },
+      { EL_BDX_DIAMOND,                        EL_BDX_WALL_DIAMOND             },
       { EL_GATE_1,                     EL_GATE_1_GRAY                  },
       { EL_GATE_2,                     EL_GATE_2_GRAY                  },
       { EL_GATE_3,                     EL_GATE_3_GRAY                  },
@@ -15981,6 +16303,15 @@ static void HandleTextInputGadgets(struct GadgetInfo *gi)
 
     ModifyEditorElementList(); // update changed button info text
   }
+  else if (type_id >= ED_TEXTINPUT_ID_COLORS_FIRST &&
+          type_id <= ED_TEXTINPUT_ID_COLORS_LAST)
+  {
+    int pos = type_id - ED_TEXTINPUT_ID_COLORS_FIRST;
+
+    *bd_color[pos] = gd_color_get_from_string(bd_color_text[pos]);
+
+    DrawColorBox_BD(pos);
+  }
 
   // do not mark level as modified for certain non-level-changing gadgets
   if (type_id >= ED_TEXTINPUT_ID_LEVELSET_FIRST &&
@@ -16050,6 +16381,37 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     // update BD cycle delay counter gadgets depending on BD scheduling type
     DrawLevelConfigWindow();
   }
+  else if (type_id == ED_SELECTBOX_ID_BD_COLOR_TYPE)
+  {
+    bd_color_type_changed = TRUE;
+
+    if (level.bd_color_type != GD_COLOR_TYPE_RGB && level.bd_color_type != GetCommonColorType_BD())
+    {
+      // color type switched to non-RGB colors, but using different color type => reset colors
+      char *message = (level.bd_color_type == bd_color_type_default ?
+                      "This will reset colors to defaults! Continue?" :
+                      "This will reset colors to random colors! Continue?");
+
+      if (!Request(message, REQ_ASK))
+      {
+       // keep current RGB colors
+       level.bd_color_type = GD_COLOR_TYPE_RGB;
+       bd_color_type_changed = FALSE;
+      }
+    }
+
+    // update BD color palette gadgets depending on BD color type
+    DrawLevelConfigWindow();
+  }
+  else if (type_id >= ED_SELECTBOX_ID_COLORS_FIRST &&
+          type_id <= ED_SELECTBOX_ID_COLORS_LAST)
+  {
+    int pos = type_id - ED_SELECTBOX_ID_COLORS_FIRST;
+
+    *bd_color[pos] = gd_c64_color(bd_color_c64[pos]);
+
+    DrawColorBox_BD(pos);
+  }
 
   // do not mark level as modified for certain non-level-changing gadgets
   if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE ||
@@ -16212,6 +16574,13 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
 
     level.changed = TRUE;
   }
+  else if (type_id == ED_TEXTBUTTON_ID_BD_SET_RANDOM_COLORS)
+  {
+    SetRandomLevelColors_BD(level.bd_color_type);
+
+    // update BD color palette gadgets after setting random colors
+    DrawLevelConfigWindow();
+  }
 }
 
 static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi)