cleanup of unnecessarily convoluted function call
[rocksndiamonds.git] / src / editor.c
index 95d6f633bc7a9f0967715fa5377a6e5c1c72887b..77f8d3289653c47ab389602b9d0d668ea8ea5679 100644 (file)
 
 #define ED_SETTINGS_LEVEL_TABS_X       (editor.settings.tabs.x)
 #define ED_SETTINGS_LEVEL_TABS_Y       (editor.settings.tabs.y)
+#define ED_SETTINGS_ENGINE_TABS_X      (editor.settings.tabs.x)
+#define ED_SETTINGS_ENGINE_TABS_Y      (editor.settings.tabs.y +       \
+                                        ED_TABBUTTON_YSIZE +           \
+                                        ED_GADGET_TINY_DISTANCE +      \
+                                        ED_TAB_BAR_HEIGHT +            \
+                                        ED_GADGET_TEXT_DISTANCE)
 #define ED_SETTINGS_ELEMENT_TABS_X     (editor.settings.tabs.x)
 #define ED_SETTINGS_ELEMENT_TABS_Y     (editor.settings.tabs.y +       \
                                         editor.settings.tabs.yoffset2)
                                         ED_SETTINGS_TABS_YOFFSET +     \
                                         getFontHeight(FONT_TEXT_1) +   \
                                         ED_GADGET_TEXT_DISTANCE)
+#define ED_ENGINE_TABS_XSTART          (ED_SETTINGS_ENGINE_TABS_X)
+#define ED_ENGINE_TABS_YSTART          (ED_SETTINGS_ENGINE_TABS_Y)
+#define ED_ENGINE_SETTINGS_XSTART      (ED_SETTINGS_ENGINE_TABS_X +    \
+                                        ED_SETTINGS_TABS_XOFFSET)
+#define ED_ENGINE_SETTINGS_YSTART      (ED_SETTINGS_ENGINE_TABS_Y +    \
+                                        ED_TABBUTTON_YSIZE +           \
+                                        ED_GADGET_TINY_DISTANCE +      \
+                                        ED_TAB_BAR_HEIGHT +            \
+                                        ED_SETTINGS_TABS_YOFFSET +     \
+                                        getFontHeight(FONT_TEXT_1) +   \
+                                        ED_GADGET_TEXT_DISTANCE)
 #define ED_ELEMENT_TABS_XSTART         (ED_SETTINGS_ELEMENT_TABS_X)
 #define ED_ELEMENT_TABS_YSTART         (ED_SETTINGS_ELEMENT_TABS_Y)
 #define ED_ELEMENT_SETTINGS_XSTART     (ED_SETTINGS_ELEMENT_TABS_X +   \
 #define ED_POS_LEVEL_TABS_LAST         (2 * ED_POS_RANGE - 1)
 #define ED_POS_LEVEL_SETTINGS_FIRST    (2 * ED_POS_RANGE)
 #define ED_POS_LEVEL_SETTINGS_LAST     (3 * ED_POS_RANGE - 1)
-#define ED_POS_ELEMENT_TABS_FIRST      (3 * ED_POS_RANGE)
-#define ED_POS_ELEMENT_TABS_LAST       (4 * ED_POS_RANGE - 1)
-#define ED_POS_ELEMENT_SETTINGS_FIRST  (4 * ED_POS_RANGE)
-#define ED_POS_ELEMENT_SETTINGS_LAST   (5 * ED_POS_RANGE - 1)
+#define ED_POS_ENGINE_TABS_FIRST       (3 * ED_POS_RANGE)
+#define ED_POS_ENGINE_TABS_LAST                (4 * ED_POS_RANGE - 1)
+#define ED_POS_ENGINE_SETTINGS_FIRST   (4 * ED_POS_RANGE)
+#define ED_POS_ENGINE_SETTINGS_LAST    (5 * ED_POS_RANGE - 1)
+#define ED_POS_ELEMENT_TABS_FIRST      (5 * ED_POS_RANGE)
+#define ED_POS_ELEMENT_TABS_LAST       (6 * ED_POS_RANGE - 1)
+#define ED_POS_ELEMENT_SETTINGS_FIRST  (6 * ED_POS_RANGE)
+#define ED_POS_ELEMENT_SETTINGS_LAST   (7 * ED_POS_RANGE - 1)
 
 #define ED_LEVEL_TABS_XPOS(n)          (ED_POS_LEVEL_TABS_FIRST + (n))
 #define ED_LEVEL_TABS_YPOS(n)          (ED_POS_LEVEL_TABS_FIRST + (n))
 #define ED_LEVEL_SETTINGS_XPOS(n)      (ED_POS_LEVEL_SETTINGS_FIRST + (n))
 #define ED_LEVEL_SETTINGS_YPOS(n)      (ED_POS_LEVEL_SETTINGS_FIRST + (n))
 
+#define ED_ENGINE_TABS_XPOS(n)         (ED_POS_ENGINE_TABS_FIRST + (n))
+#define ED_ENGINE_TABS_YPOS(n)         (ED_POS_ENGINE_TABS_FIRST + (n))
+
+#define ED_ENGINE_SETTINGS_XPOS(n)     (ED_POS_ENGINE_SETTINGS_FIRST + (n))
+#define ED_ENGINE_SETTINGS_YPOS(n)     (ED_POS_ENGINE_SETTINGS_FIRST + (n))
+
 #define ED_ELEMENT_TABS_XPOS(n)                (ED_POS_ELEMENT_TABS_FIRST + (n))
 #define ED_ELEMENT_TABS_YPOS(n)                (ED_POS_ELEMENT_TABS_FIRST + (n))
 
                                       (n) <= ED_POS_LEVEL_TABS_LAST)
 #define IS_POS_LEVEL_SETTINGS(n)      ((n) >= ED_POS_LEVEL_SETTINGS_FIRST && \
                                       (n) <= ED_POS_LEVEL_SETTINGS_LAST)
+#define IS_POS_ENGINE_TABS(n)        ((n) >= ED_POS_ENGINE_TABS_FIRST && \
+                                      (n) <= ED_POS_ENGINE_TABS_LAST)
+#define IS_POS_ENGINE_SETTINGS(n)     ((n) >= ED_POS_ENGINE_SETTINGS_FIRST && \
+                                      (n) <= ED_POS_ENGINE_SETTINGS_LAST)
 #define IS_POS_ELEMENT_TABS(n)       ((n) >= ED_POS_ELEMENT_TABS_FIRST && \
                                       (n) <= ED_POS_ELEMENT_TABS_LAST)
 #define IS_POS_ELEMENT_SETTINGS(n)    ((n) >= ED_POS_ELEMENT_SETTINGS_FIRST && \
 
 #define ED_LEVEL_TABS_LINE(n)          ((n) - ED_POS_LEVEL_TABS_FIRST)
 #define ED_LEVEL_SETTINGS_LINE(n)      ((n) - ED_POS_LEVEL_SETTINGS_FIRST)
+#define ED_ENGINE_TABS_LINE(n)         ((n) - ED_POS_ENGINE_TABS_FIRST)
+#define ED_ENGINE_SETTINGS_LINE(n)     ((n) - ED_POS_ENGINE_SETTINGS_FIRST)
 #define ED_ELEMENT_TABS_LINE(n)                ((n) - ED_POS_ELEMENT_TABS_FIRST)
 #define ED_ELEMENT_SETTINGS_LINE(n)    ((n) - ED_POS_ELEMENT_SETTINGS_FIRST)
 
 #define ED_LEVEL_SETTINGS_Y(n)         (ED_LEVEL_SETTINGS_YSTART +     \
                                         (n) * ED_SETTINGS_YOFFSET)
 
+#define ED_ENGINE_TABS_X(n)            (ED_ENGINE_TABS_XSTART +        \
+                                        (n) * ED_SETTINGS_TABS_XOFFSET)
+#define ED_ENGINE_TABS_Y(n)            (ED_ENGINE_TABS_YSTART +        \
+                                        (n) * ED_SETTINGS_TABS_YOFFSET)
+
+#define ED_ENGINE_SETTINGS_X(n)                (ED_ENGINE_SETTINGS_XSTART +    \
+                                        (n) * ED_SETTINGS_XOFFSET)
+#define ED_ENGINE_SETTINGS_Y(n)                (ED_ENGINE_SETTINGS_YSTART +    \
+                                        (n) * ED_SETTINGS_YOFFSET)
+
 #define ED_ELEMENT_TABS_X(n)           (ED_ELEMENT_TABS_XSTART +       \
                                         (n) * ED_SETTINGS_TABS_XOFFSET)
 #define ED_ELEMENT_TABS_Y(n)           (ED_ELEMENT_TABS_YSTART +       \
 #define ED_POS_TO_LEVEL_SETTINGS_Y(n)  \
   (ED_LEVEL_SETTINGS_Y(ED_LEVEL_SETTINGS_LINE(n)))
 
+#define ED_POS_TO_ENGINE_TABS_X(n)     \
+  (ED_ENGINE_TABS_X(ED_ENGINE_TABS_LINE(n)))
+#define ED_POS_TO_ENGINE_TABS_Y(n)     \
+  (ED_ENGINE_TABS_Y(ED_ENGINE_TABS_LINE(n)))
+
+#define ED_POS_TO_ENGINE_SETTINGS_X(n) \
+  (ED_ENGINE_SETTINGS_X(ED_ENGINE_SETTINGS_LINE(n)))
+#define ED_POS_TO_ENGINE_SETTINGS_Y(n) \
+  (ED_ENGINE_SETTINGS_Y(ED_ENGINE_SETTINGS_LINE(n)))
+
 #define ED_POS_TO_ELEMENT_TABS_X(n)    \
   (ED_ELEMENT_TABS_X(ED_ELEMENT_TABS_LINE(n)))
 #define ED_POS_TO_ELEMENT_TABS_Y(n)    \
                                         ED_POS_TO_LEVEL_TABS_X(n) : \
                                         IS_POS_LEVEL_SETTINGS(n) ?     \
                                         ED_POS_TO_LEVEL_SETTINGS_X(n) : \
+                                        IS_POS_ENGINE_TABS(n) ?        \
+                                        ED_POS_TO_ENGINE_TABS_X(n) : \
+                                        IS_POS_ENGINE_SETTINGS(n) ?    \
+                                        ED_POS_TO_ENGINE_SETTINGS_X(n) : \
                                         IS_POS_ELEMENT_TABS(n) ?       \
                                         ED_POS_TO_ELEMENT_TABS_X(n) : \
                                         IS_POS_ELEMENT_SETTINGS(n) ?   \
                                         ED_POS_TO_LEVEL_TABS_Y(n) : \
                                         IS_POS_LEVEL_SETTINGS(n) ?     \
                                         ED_POS_TO_LEVEL_SETTINGS_Y(n) : \
+                                        IS_POS_ENGINE_TABS(n) ?        \
+                                        ED_POS_TO_ENGINE_TABS_Y(n) : \
+                                        IS_POS_ENGINE_SETTINGS(n) ?    \
+                                        ED_POS_TO_ENGINE_SETTINGS_Y(n) : \
                                         IS_POS_ELEMENT_TABS(n) ?       \
                                         ED_POS_TO_ELEMENT_TABS_Y(n) : \
                                         IS_POS_ELEMENT_SETTINGS(n) ?   \
@@ -441,9 +502,6 @@ enum
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
-  GADGET_ID_BD_CREATURES_AUTO_TURN_DELAY_DOWN,
-  GADGET_ID_BD_CREATURES_AUTO_TURN_DELAY_TEXT,
-  GADGET_ID_BD_CREATURES_AUTO_TURN_DELAY_UP,
   GADGET_ID_BD_PUSHING_PROB_DOWN,
   GADGET_ID_BD_PUSHING_PROB_TEXT,
   GADGET_ID_BD_PUSHING_PROB_UP,
@@ -567,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,
@@ -586,6 +644,20 @@ enum
   GADGET_ID_BD_NUT_CONTENT,
   GADGET_ID_BD_EXPANDING_WALL_LOOKS_LIKE,
   GADGET_ID_BD_SAND_LOOKS_LIKE,
+  GADGET_ID_BD_ROCK_TURNS_TO_ON_FALLING,
+  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_1_EXPLODES_TO,
+  GADGET_ID_BD_FIREFLY_2_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,
+  GADGET_ID_BD_DIAMOND_BIRTH_TURNS_TO,
+  GADGET_ID_BD_BOMB_EXPLOSION_TURNS_TO,
+  GADGET_ID_BD_NITRO_EXPLOSION_TURNS_TO,
+  GADGET_ID_BD_EXPLOSION_TURNS_TO,
   GADGET_ID_START_ELEMENT,
   GADGET_ID_ARTWORK_ELEMENT,
   GADGET_ID_EXPLOSION_ELEMENT,
@@ -608,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
@@ -619,10 +698,19 @@ 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,
   GADGET_ID_MM_BALL_CHOICE_MODE,
   GADGET_ID_CUSTOM_WALK_TO_ACTION,
   GADGET_ID_CUSTOM_EXPLOSION_TYPE,
@@ -656,6 +744,8 @@ enum
   GADGET_ID_LEVELCONFIG_LEVELSET,
   GADGET_ID_LEVELCONFIG_EDITOR,
   GADGET_ID_LEVELCONFIG_ENGINE,
+  GADGET_ID_ENGINECONFIG_CONFIG,
+  GADGET_ID_ENGINECONFIG_COLORS,
   GADGET_ID_PROPERTIES_INFO,
   GADGET_ID_PROPERTIES_CONFIG,
   GADGET_ID_PROPERTIES_CONFIG_1,
@@ -666,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
 
@@ -703,9 +794,6 @@ enum
   GADGET_ID_BD_LINE_SHIFTING_BORDERS,
   GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW,
   GADGET_ID_BD_SHORT_EXPLOSIONS,
-  GADGET_ID_BD_GRAVITY_AFFECTS_ALL,
-  GADGET_ID_BD_CREATURES_START_BACKWARDS,
-  GADGET_ID_BD_CREATURES_TURN_ON_HATCHING,
   GADGET_ID_STICK_ELEMENT,
   GADGET_ID_EM_SLIPPERY_GEMS,
   GADGET_ID_EM_EXPLODES_BY_FIRE,
@@ -740,8 +828,10 @@ enum
   GADGET_ID_BD_DIAGONAL_MOVEMENTS,
   GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
   GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  GADGET_ID_BD_MAGIC_WALL_ZERO_INFINITE,
   GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING,
   GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+  GADGET_ID_BD_MAGIC_WALL_BREAK_SCAN,
   GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
   GADGET_ID_BD_AMOEBA_START_IMMEDIATELY,
   GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
@@ -756,6 +846,11 @@ enum
   GADGET_ID_BD_CONVEYOR_BELTS_CHANGED,
   GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN,
   GADGET_ID_BD_HAMMER_WALLS_REAPPEAR,
+  GADGET_ID_BD_INFINITE_ROCKETS,
+  GADGET_ID_BD_CREATURES_START_BACKWARDS,
+  GADGET_ID_BD_CREATURES_TURN_ON_HATCHING,
+  GADGET_ID_BD_GRAVITY_SWITCH_ACTIVE,
+  GADGET_ID_BD_GRAVITY_AFFECTS_ALL,
   GADGET_ID_ENVELOPE_AUTOWRAP,
   GADGET_ID_ENVELOPE_CENTERED,
   GADGET_ID_MM_LASER_RED,
@@ -828,7 +923,6 @@ enum
   ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
   ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
   ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
-  ED_COUNTER_ID_BD_CREATURES_AUTO_TURN_DELAY,
   ED_COUNTER_ID_BD_PUSHING_PROB,
   ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
   ED_COUNTER_ID_ELEMENT_VALUE1,
@@ -917,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
@@ -928,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
 {
@@ -945,10 +1049,19 @@ 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,
   ED_SELECTBOX_ID_MM_BALL_CHOICE_MODE,
   ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE,
   ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER,
@@ -988,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
@@ -1005,6 +1121,8 @@ enum
   ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET,
   ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR,
   ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE,
+  ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG,
+  ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS,
   ED_TEXTBUTTON_ID_PROPERTIES_INFO,
   ED_TEXTBUTTON_ID_PROPERTIES_CONFIG,
   ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1,
@@ -1015,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
 };
@@ -1022,6 +1141,9 @@ enum
 #define ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL
 #define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST  ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
 
+#define ED_TAB_BUTTON_ID_ENGINECONFIG_FIRST ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG
+#define ED_TAB_BUTTON_ID_ENGINECONFIG_LAST  ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS
+
 #define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_TAB_BUTTON_ID_PROPERTIES_LAST  ED_TEXTBUTTON_ID_PROPERTIES_CHANGE
 
@@ -1057,9 +1179,6 @@ enum
   ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
   ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
   ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
-  ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
-  ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS,
-  ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING,
   ED_CHECKBUTTON_ID_STICK_ELEMENT,
   ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS,
   ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE,
@@ -1094,8 +1213,10 @@ enum
   ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
   ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
   ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE,
   ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
   ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+  ED_CHECKBUTTON_ID_BD_MAGIC_WALL_BREAK_SCAN,
   ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
   ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY,
   ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
@@ -1110,6 +1231,11 @@ enum
   ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED,
   ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN,
   ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR,
+  ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS,
+  ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS,
+  ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING,
+  ED_CHECKBUTTON_ID_BD_GRAVITY_SWITCH_ACTIVE,
+  ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
   ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
   ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
   ED_CHECKBUTTON_ID_MM_LASER_RED,
@@ -1159,7 +1285,7 @@ enum
 #define ED_CHECKBUTTON_ID_EDITOR_LAST  ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2
 
 #define ED_CHECKBUTTON_ID_ENGINE_FIRST ED_CHECKBUTTON_ID_BD_INTERMISSION
-#define ED_CHECKBUTTON_ID_ENGINE_LAST  ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING
+#define ED_CHECKBUTTON_ID_ENGINE_LAST  ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS
 
 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST        ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
 #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE
@@ -1213,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,
@@ -1232,6 +1358,20 @@ enum
   ED_DRAWING_ID_BD_NUT_CONTENT,
   ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE,
   ED_DRAWING_ID_BD_SAND_LOOKS_LIKE,
+  ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_FALLING,
+  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_1_EXPLODES_TO,
+  ED_DRAWING_ID_BD_FIREFLY_2_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,
+  ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO,
+  ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO,
+  ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_TO,
+  ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO,
   ED_DRAWING_ID_START_ELEMENT,
   ED_DRAWING_ID_ARTWORK_ELEMENT,
   ED_DRAWING_ID_EXPLOSION_ELEMENT,
@@ -1282,6 +1422,10 @@ enum
 #define ED_MODE_LEVELCONFIG_EDITOR     ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR
 #define ED_MODE_LEVELCONFIG_ENGINE     ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
 
+// sub-screens in the engine settings section
+#define ED_MODE_ENGINECONFIG_CONFIG    ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG
+#define ED_MODE_ENGINECONFIG_COLORS    ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS
+
 // sub-screens in the element properties section
 #define ED_MODE_PROPERTIES_INFO                ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_MODE_PROPERTIES_CONFIG      ED_TEXTBUTTON_ID_PROPERTIES_CONFIG
@@ -1521,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;
@@ -1621,7 +1784,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(3),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
     50,                                                500,
     GADGET_ID_BD_CYCLE_DELAY_MS_DOWN,          GADGET_ID_BD_CYCLE_DELAY_MS_UP,
     GADGET_ID_BD_CYCLE_DELAY_MS_TEXT,          GADGET_ID_NONE,
@@ -1630,7 +1793,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(3),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(3),
     0,                                         32,
     GADGET_ID_BD_CYCLE_DELAY_C64_DOWN,         GADGET_ID_BD_CYCLE_DELAY_C64_UP,
     GADGET_ID_BD_CYCLE_DELAY_C64_TEXT,         GADGET_ID_NONE,
@@ -1639,7 +1802,7 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(4),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
     1,                                         40,
     GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN,   GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
     GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT,   GADGET_ID_NONE,
@@ -1648,22 +1811,13 @@ static struct
   },
   {
     ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(4),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(4),
     1,                                         40,
     GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,  GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
     GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,  GADGET_ID_NONE,
     &level.bd_hatching_delay_seconds,
     NULL,                                      NULL, "Hatching delay (seconds)"
   },
-  {
-    ED_COUNTER_ID_BD_CREATURES_AUTO_TURN_DELAY,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(12),
-    0,                                         999,
-    GADGET_ID_BD_CREATURES_AUTO_TURN_DELAY_DOWN, GADGET_ID_BD_CREATURES_AUTO_TURN_DELAY_UP,
-    GADGET_ID_BD_CREATURES_AUTO_TURN_DELAY_TEXT, GADGET_ID_NONE,
-    &level.bd_creatures_auto_turn_delay,
-    NULL,                                      NULL, "Creatures auto turn delay"
-  },
 
   // ---------- element settings: configure (various elements) ----------------
 
@@ -1967,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,
@@ -1984,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,
@@ -1992,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,
@@ -2000,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"
   }
 };
 
@@ -2067,6 +2285,16 @@ static struct ValueTextInfo options_levelset_save_mode[] =
   { -1,                                        NULL                            }
 };
 
+static struct ValueTextInfo options_bd_gravity_direction[] =
+{
+  { GD_MV_DOWN,                                "down"                          },
+  { GD_MV_UP,                          "up"                            },
+  { GD_MV_LEFT,                                "left"                          },
+  { GD_MV_RIGHT,                       "right"                         },
+
+  { -1,                                        NULL                            }
+};
+
 static struct ValueTextInfo options_wind_direction[] =
 {
   { MV_START_NONE,                     "none"                          },
@@ -2741,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,
@@ -2824,23 +3084,102 @@ 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_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(1),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(1),
     GADGET_ID_BD_SCHEDULING_TYPE,              GADGET_ID_NONE,
     -1,
     options_bd_scheduling_type,
     &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) ----------------
@@ -2863,6 +3202,15 @@ static struct
     &level.initial_player_stepsize[0],
     NULL, "Initial player speed:", NULL,       "Select initial player speed"
   },
+  {
+    ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_GRAVITY_DIRECTION,            GADGET_ID_NONE,
+    -1,
+    options_bd_gravity_direction,
+    &level.bd_gravity_direction,
+    NULL, "Gravity direction:", NULL,          "Select initial gravity direction"
+  },
   {
     ED_SELECTBOX_ID_MM_BALL_CHOICE_MODE,
     ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(4),
@@ -3153,7 +3501,24 @@ static struct
     -1,                                                -1,
     GADGET_ID_LEVELCONFIG_ENGINE,              GADGET_ID_LEVELCONFIG_EDITOR,
     8,                                         "Engine",
-    NULL, NULL, NULL,                          "Configure engine settings"
+    NULL, NULL, NULL,                          "Configure game engine settings"
+  },
+
+  // ---------- engine settings (tabs) ----------------------------------------
+
+  {
+    ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG,
+    ED_ENGINE_TABS_XPOS(0),                    ED_ENGINE_TABS_YPOS(0),
+    GADGET_ID_ENGINECONFIG_CONFIG,             GADGET_ID_NONE,
+    8,                                         "Config",
+    NULL, NULL, NULL,                          "Configure game engine settings"
+  },
+  {
+    ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS,
+    -1,                                                -1,
+    GADGET_ID_ENGINECONFIG_COLORS,             GADGET_ID_ENGINECONFIG_CONFIG,
+    8,                                         "Colors",
+    NULL, NULL, NULL,                          "Configure level colors"
   },
 
   // ---------- element settings (tabs) ---------------------------------------
@@ -3236,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
@@ -3470,7 +3845,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_INTERMISSION,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(0),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(0),
     GADGET_ID_BD_INTERMISSION,                 GADGET_ID_NONE,
     &level.bd_intermission,
     "Boulder Dash game engine settings:", NULL,
@@ -3478,7 +3853,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_PAL_TIMING,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(2),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(2),
     GADGET_ID_BD_PAL_TIMING,                   GADGET_ID_NONE,
     &level.bd_pal_timing,
     NULL, NULL,
@@ -3486,7 +3861,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(6),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(6),
     GADGET_ID_BD_LINE_SHIFTING_BORDERS,                GADGET_ID_NONE,
     &level.bd_line_shifting_borders,
     "Compatibility settings:", NULL,
@@ -3494,7 +3869,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(7),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(7),
     GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW,      GADGET_ID_NONE,
     &level.bd_scan_first_and_last_row,
     NULL, NULL,
@@ -3502,36 +3877,12 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(8),
+    ED_ENGINE_SETTINGS_XPOS(0),                        ED_ENGINE_SETTINGS_YPOS(8),
     GADGET_ID_BD_SHORT_EXPLOSIONS,             GADGET_ID_NONE,
     &level.bd_short_explosions,
     NULL, NULL,
     "Short explosions",                                "Use four game cycles for explosions"
   },
-  {
-    ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
-    ED_LEVEL_SETTINGS_XPOS(0),                 ED_LEVEL_SETTINGS_YPOS(9),
-    GADGET_ID_BD_GRAVITY_AFFECTS_ALL,          GADGET_ID_NONE,
-    &level.bd_gravity_affects_all,
-    NULL, NULL,
-    "Gravity change affects everything",       "Gravity affects all falling objects"
-  },
-  {
-    ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS,
-    ED_ELEMENT_SETTINGS_XPOS(0),               ED_LEVEL_SETTINGS_YPOS(10),
-    GADGET_ID_BD_CREATURES_START_BACKWARDS,    GADGET_ID_NONE,
-    &level.bd_creatures_start_backwards,
-    NULL, NULL,
-    "Creatures start moving backwards",                "Creatures start in opposite direction"
-  },
-  {
-    ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING,
-    ED_ELEMENT_SETTINGS_XPOS(0),               ED_LEVEL_SETTINGS_YPOS(11),
-    GADGET_ID_BD_CREATURES_TURN_ON_HATCHING,   GADGET_ID_NONE,
-    &level.bd_creatures_turn_on_hatching,
-    NULL, NULL,
-    "Creatures turn on hatching",              "Creatures change direction on hatching"
-  },
 
   // ---------- element settings: configure (various elements) ----------------
 
@@ -3808,8 +4159,16 @@ static struct
     "Mega rocks pushable with sweet",          "Push mega rocks after eating sweet"
   },
   {
-    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE,
     ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(2),
+    GADGET_ID_BD_MAGIC_WALL_ZERO_INFINITE,     GADGET_ID_NONE,
+    &level.bd_magic_wall_zero_infinite,
+    NULL, NULL,
+    "Run forever if duration is zero",         "Run infinitely if timer is zero"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING,     GADGET_ID_NONE,
     &level.bd_magic_wall_wait_hatching,
     NULL, NULL,
@@ -3817,11 +4176,19 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
-    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(3),
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA,      GADGET_ID_NONE,
     &level.bd_magic_wall_stops_amoeba,
     NULL, NULL,
-    "Turn amoeba to diamonds",                 "Activation changes amoeba to diamonds"
+    "Stop amoeba and turn to diamonds",                "Activation changes amoeba to diamonds"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_BREAK_SCAN,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(5),
+    GADGET_ID_BD_MAGIC_WALL_BREAK_SCAN,                GADGET_ID_NONE,
+    &level.bd_magic_wall_break_scan,
+    NULL, NULL,
+    "Emulate amoeba bug in BD1",               "Use buggy BD1 behavior"
   },
   {
     ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
@@ -3935,6 +4302,46 @@ static struct
     NULL, NULL,
     "Hammered walls reappear",                 "Hammered walls reappear after delay"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_INFINITE_ROCKETS,             GADGET_ID_NONE,
+    &level.bd_infinite_rockets,
+    NULL, NULL,
+    "Infinite rockets",                                "Rocket launcher has infinite rockets"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_CREATURES_START_BACKWARDS,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_CREATURES_START_BACKWARDS,    GADGET_ID_NONE,
+    &level.bd_creatures_start_backwards,
+    NULL, NULL,
+    "Creatures start moving backwards",                "Creatures start in opposite direction"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_CREATURES_TURN_ON_HATCHING,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(2),
+    GADGET_ID_BD_CREATURES_TURN_ON_HATCHING,   GADGET_ID_NONE,
+    &level.bd_creatures_turn_on_hatching,
+    NULL, NULL,
+    "Creatures auto turn on hatching",         "Creatures change direction on hatching"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_GRAVITY_SWITCH_ACTIVE,
+    ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_GRAVITY_SWITCH_ACTIVE,                GADGET_ID_NONE,
+    &level.bd_gravity_switch_active,
+    NULL, NULL,
+    "Gravity switch active at start",          "Gravity switch starts in active state"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL,
+    ED_LEVEL_SETTINGS_XPOS(0),                 ED_ELEMENT_SETTINGS_YPOS(3),
+    GADGET_ID_BD_GRAVITY_AFFECTS_ALL,          GADGET_ID_NONE,
+    &level.bd_gravity_affects_all,
+    NULL, NULL,
+    "Gravity change affects everything",       "Gravity affects all falling objects"
+  },
   {
     ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
     ED_ELEMENT_SETTINGS_XPOS(0),               ED_ELEMENT_SETTINGS_YPOS(1),
@@ -4421,7 +4828,7 @@ static struct
 
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(4),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(6),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO,                GADGET_ID_NONE,
     &level.bd_magic_wall_diamond_to,           1, 1,
@@ -4429,7 +4836,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(5),
+    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_MAGIC_WALL_ROCK_TO,           GADGET_ID_NONE,
     &level.bd_magic_wall_rock_to,              1, 1,
@@ -4437,7 +4844,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(6),
+    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_MAGIC_WALL_MEGA_ROCK_TO,      GADGET_ID_NONE,
     &level.bd_magic_wall_mega_rock_to,         1, 1,
@@ -4445,7 +4852,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(7),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(9),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_NUT_TO,            GADGET_ID_NONE,
     &level.bd_magic_wall_nut_to,               1, 1,
@@ -4453,7 +4860,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(8),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(10),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO,     GADGET_ID_NONE,
     &level.bd_magic_wall_nitro_pack_to,                1, 1,
@@ -4461,7 +4868,7 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(9),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(11),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, GADGET_ID_NONE,
     &level.bd_magic_wall_flying_diamond_to,    1, 1,
@@ -4469,30 +4876,30 @@ static struct
   },
   {
     ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
-    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(10),
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(12),
     ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,    GADGET_ID_NONE,
     &level.bd_magic_wall_flying_rock_to,       1, 1,
     "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 -------------------------------------------
@@ -4503,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,
@@ -4511,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,
@@ -4519,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,
@@ -4527,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,
@@ -4633,6 +5040,118 @@ static struct
     &level.bd_sand_looks_like,                 1, 1,
     "Use graphic of element:", NULL, NULL, NULL, "Sand looks like this element"
   },
+  {
+    ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_FALLING,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(2),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_ROCK_TURNS_TO_ON_FALLING,     GADGET_ID_NONE,
+    &level.bd_rock_turns_to_on_falling,                1, 1,
+    "Turns to when falling:", NULL, NULL, NULL,        "Changes to this when falling starts"
+  },
+  {
+    ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(3),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_ROCK_TURNS_TO_ON_IMPACT,      GADGET_ID_NONE,
+    &level.bd_rock_turns_to_on_impact,         1, 1,
+    "Turns to on impact:", NULL, NULL, NULL,   "Changes to this when falling stops"
+  },
+  {
+    ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_FALLING,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(2),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_DIAMOND_TURNS_TO_ON_FALLING,  GADGET_ID_NONE,
+    &level.bd_diamond_turns_to_on_falling,     1, 1,
+    "Turns to when falling:", NULL, NULL, NULL,        "Changes to this when falling starts"
+  },
+  {
+    ED_DRAWING_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(3),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_DIAMOND_TURNS_TO_ON_IMPACT,   GADGET_ID_NONE,
+    &level.bd_diamond_turns_to_on_impact,      1, 1,
+    "Turns to on impact:", NULL, NULL, NULL,   "Changes to this when falling stops"
+  },
+  {
+    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_1_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_firefly_1_explodes_to,           1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_FIREFLY_2_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_2_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_firefly_2_explodes_to,           1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    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_1_EXPLODES_TO,      GADGET_ID_NONE,
+    &level.bd_butterfly_1_explodes_to,         1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_BUTTERFLY_2_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_2_EXPLODES_TO,      GADGET_ID_NONE,
+    &level.bd_butterfly_2_explodes_to,         1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_STONEFLY_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_STONEFLY_EXPLODES_TO,         GADGET_ID_NONE,
+    &level.bd_stonefly_explodes_to,            1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_DRAGONFLY_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_DRAGONFLY_EXPLODES_TO,                GADGET_ID_NONE,
+    &level.bd_dragonfly_explodes_to,           1, 1,
+    "Explodes to:", NULL, NULL, NULL,          "Changes to this when exploding"
+  },
+  {
+    ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(1),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_DIAMOND_BIRTH_TURNS_TO,       GADGET_ID_NONE,
+    &level.bd_diamond_birth_turns_to,          1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
+  {
+    ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_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_BOMB_EXPLOSION_TURNS_TO,      GADGET_ID_NONE,
+    &level.bd_bomb_explosion_turns_to,         1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
+  {
+    ED_DRAWING_ID_BD_NITRO_EXPLOSION_TURNS_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_NITRO_EXPLOSION_TURNS_TO,     GADGET_ID_NONE,
+    &level.bd_nitro_explosion_turns_to,                1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
+  {
+    ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),              ED_AREA_1X1_SETTINGS_YPOS(1),
+    ED_AREA_1X1_SETTINGS_XOFF,                 ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_EXPLOSION_TURNS_TO,           GADGET_ID_NONE,
+    &level.bd_explosion_turns_to,              1, 1,
+    "Explosion ends in:", NULL, NULL, NULL,    "Changes to this after explosion"
+  },
 
   // ---------- level start element -------------------------------------------
 
@@ -4880,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
@@ -4902,6 +5420,7 @@ static int redo_buffer_steps = 0;
 
 static int edit_mode;
 static int edit_mode_levelconfig;
+static int edit_mode_engineconfig;
 static int edit_mode_properties;
 
 static int element_shift = 0;
@@ -4954,177 +5473,182 @@ static int editor_el_boulderdash[] =
 static int *editor_hl_boulderdash_ptr = editor_hl_boulderdash;
 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_BD_SAND_2,
-  EL_BD_MAGIC_WALL,
-
-  EL_BD_AMOEBA,
-  EL_BD_BUTTERFLY_UP,
-  EL_BD_FIREFLY_UP,
-  EL_BD_EXIT_CLOSED,
+static int num_editor_el_boulderdash = ARRAY_SIZE(editor_el_boulderdash);
 
-  EL_BD_BUTTERFLY_LEFT,
-  EL_BD_FIREFLY_LEFT,
-  EL_BD_BUTTERFLY_RIGHT,
-  EL_BD_FIREFLY_RIGHT,
+static int editor_hl_boulderdash_native[] =
+{
+  EL_INTERNAL_CASCADE_BDX_ACTIVE,
+  EL_CHAR('B'),
+  EL_CHAR('D'),
+  EL_EMPTY,
+};
 
-  EL_BD_INBOX,
-  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,
+static int editor_el_boulderdash_native[] =
+{
+  EL_EMPTY,
+  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_HORIZONTAL,
-
-  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_NORMAL,
-
-  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_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,
 };
 static int *editor_hl_boulderdash_native_ptr = editor_hl_boulderdash_native;
 static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native;
@@ -5133,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'),
@@ -5141,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;
@@ -6726,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
   },
@@ -6865,6 +7389,11 @@ static struct XY xy_directions[] =
 // functions
 // ----------------------------------------------------------------------------
 
+boolean isLevelEditorFastStart(void)
+{
+  return (level_editor_test_game && setup.editor.fast_game_start);
+}
+
 static int getMaxInfoTextLength(void)
 {
   return (SXSIZE / getFontWidth(INFOTEXT_FONT));
@@ -7532,7 +8061,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,
@@ -7573,45 +8102,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);
 }
@@ -8131,7 +8628,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,
@@ -8306,6 +8807,7 @@ static void CreateTextbuttonGadgets(void)
     int type_id = textbutton_info[i].gadget_type_id;
     int is_tab_button =
       ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_ENGINE) ||
+       (id >= GADGET_ID_ENGINECONFIG_CONFIG && id <= GADGET_ID_ENGINECONFIG_COLORS) ||
        (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE));
     int graphic =
       (is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON);
@@ -8881,12 +9383,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);
 
@@ -8926,11 +9439,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);
@@ -10062,30 +10574,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;
 }
@@ -10223,6 +10715,7 @@ void DrawLevelEd(void)
   {
     edit_mode = ED_MODE_DRAWING;
     edit_mode_levelconfig = ED_MODE_LEVELCONFIG_LEVEL;
+    edit_mode_engineconfig = ED_MODE_ENGINECONFIG_CONFIG;
     edit_mode_properties = ED_MODE_PROPERTIES_INFO;
 
     ResetUndoBuffer();
@@ -10613,6 +11106,39 @@ static Pixel getTabulatorBarColor(void)
   return GetPixel(gd->bitmap, gd_x, gd_y);
 }
 
+static void DrawEngineConfigTabulatorGadgets(void)
+{
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_ENGINECONFIG_CONFIG];
+  Pixel tab_color = getTabulatorBarColor();
+  int id_first = ED_TEXTBUTTON_ID_ENGINECONFIG_CONFIG;
+  int id_last  = ED_TEXTBUTTON_ID_ENGINECONFIG_COLORS;
+  int i;
+
+  for (i = id_first; i <= id_last; i++)
+  {
+    int gadget_id = textbutton_info[i].gadget_id;
+    struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+    boolean active = (i != edit_mode_engineconfig);
+
+    // draw background line below tabulator button
+    ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1);
+
+    // draw solid line below inactive tabulator buttons
+    if (!active && tab_color != BLACK_PIXEL)   // black => transparent
+      FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width,
+                   ED_GADGET_TINY_DISTANCE, tab_color);
+
+    ModifyGadget(gi, GDI_ACTIVE, active, GDI_END);
+    MapTextbuttonGadget(i);
+  }
+
+  // draw little border line below tabulator buttons
+  if (tab_color != BLACK_PIXEL)                        // black => transparent
+    FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height +
+                 ED_GADGET_TINY_DISTANCE,
+                 getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
+}
+
 static void DrawLevelConfigTabulatorGadgets(void)
 {
   struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL];
@@ -10648,6 +11174,10 @@ static void DrawLevelConfigTabulatorGadgets(void)
     FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height +
                  ED_GADGET_TINY_DISTANCE,
                  getTabulatorBarWidth(), getTabulatorBarHeight(), tab_color);
+
+  // draw second row of engine related tabulators when using native BD engine
+  if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE)
+    DrawEngineConfigTabulatorGadgets();
 }
 
 static void DrawPropertiesTabulatorGadgets(void)
@@ -10821,7 +11351,7 @@ static void DrawLevelConfigEditor(void)
   MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2);
 }
 
-static void DrawLevelConfigEngine(void)
+static void DrawEngineConfigConfig(void)
 {
   int i;
 
@@ -10837,8 +11367,6 @@ static void DrawLevelConfigEngine(void)
     MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS);
   }
 
-  MapCounterButtons(ED_COUNTER_ID_BD_CREATURES_AUTO_TURN_DELAY);
-
   // draw checkbutton gadgets
   for (i = ED_CHECKBUTTON_ID_ENGINE_FIRST; i <= ED_CHECKBUTTON_ID_ENGINE_LAST; i++)
     MapCheckbuttonGadget(i);
@@ -10848,6 +11376,159 @@ static void DrawLevelConfigEngine(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)
+{
+  int i;
+
+  if (!hasColorTemplate_BD())
+  {
+    int font_nr = FONT_TEXT_1;
+    int font_height = getFontHeight(font_nr);
+    int yoffset_above = font_height + ED_GADGET_LINE_DISTANCE;
+    int xpos = ED_ENGINE_SETTINGS_X(0);
+    int ypos = ED_ENGINE_SETTINGS_Y(0);
+
+    PrintInfoText("No level specific colors available.", font_nr, xpos, ypos - yoffset_above);
+    PrintInfoText("(Not supported by graphics set.)", font_nr, xpos, ypos);
+
+    return;
+  }
+
+  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)
+{
+  if (edit_mode_engineconfig == ED_MODE_ENGINECONFIG_CONFIG)
+    DrawEngineConfigConfig();
+  else if (edit_mode_engineconfig == ED_MODE_ENGINECONFIG_COLORS)
+    DrawEngineConfigColors();
+}
+
 static void DrawLevelConfigWindow(void)
 {
   char *text = "Global Settings";
@@ -10858,6 +11539,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();
@@ -11283,34 +11969,39 @@ 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)
+
+  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);
 
-  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
 
   PrintInfoText(description_text, font1_nr, xpos, ypos);
@@ -11356,6 +12047,8 @@ static void DrawPropertiesInfo(void)
 #define TEXT_HAMMER_REAPPEAR_DELAY     "Delay for reappearing walls"
 #define TEXT_SKELETONS_NEEDED          "Skeletons needed to use pot"
 #define TEXT_SKELETONS_WORTH           "Counts as this many diamonds"
+#define TEXT_AUTO_TURN_DELAY           "Creatures auto turn delay"
+#define TEXT_GRAVITY_DELAY             "Gravity switch change delay"
 
 static struct
 {
@@ -11368,7 +12061,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         },
@@ -11446,21 +12140,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_1,           &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           },
@@ -11468,40 +12163,43 @@ 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_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         },
   { EL_GAME_OF_LIFE,           &level.game_of_life[0],                 TEXT_GAME_OF_LIFE_1,0,8 },
@@ -11539,10 +12237,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) ||
@@ -11553,22 +12247,34 @@ static boolean checkPropertiesConfig(int element)
       IS_MM_MCDUFFIN(element) ||
       IS_DF_LASER(element) ||
       IS_PLAYER_ELEMENT(element) ||
-      IS_BD_PLAYER_ELEMENT(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_PLAYER_ELEMENT(element) ||
+      IS_BD_FIREFLY(properties_element) ||
+      IS_BDX_FIREFLY_1(properties_element) ||
+      IS_BDX_FIREFLY_2(properties_element) ||
+      IS_BD_BUTTERFLY(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_SWEET ||
-      element == EL_BD_VOODOO_DOLL ||
-      element == EL_BD_WATER)
+      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;
   }
@@ -11604,6 +12310,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:
@@ -11663,49 +12370,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: 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_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           ? 2 : 0) +
+                              (properties_element == EL_BDX_AMOEBA_2           ? 2 : 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;
@@ -11724,13 +12409,15 @@ 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);
 
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_ZERO_INFINITE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_BREAK_SCAN);
 
     MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO);
     MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO);
@@ -11746,15 +12433,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);
@@ -11766,17 +12453,19 @@ static void DrawPropertiesConfig(void)
       MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE);
     }
     else if (IS_AMOEBOID(properties_element))
+    {
       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);
     }
@@ -11785,7 +12474,9 @@ static void DrawPropertiesConfig(void)
             properties_element == EL_YAMYAM_RIGHT ||
             properties_element == EL_YAMYAM_UP ||
             properties_element == EL_YAMYAM_DOWN)
+    {
       DrawYamYamContentAreas();
+    }
     else if (properties_element == EL_EMC_MAGIC_BALL)
     {
       DrawMagicBallContentAreas();
@@ -11794,7 +12485,9 @@ static void DrawPropertiesConfig(void)
       MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INITIAL_BALL_ACTIVE);
     }
     else if (properties_element == EL_EMC_ANDROID)
+    {
       DrawAndroidElementArea();
+    }
     else if (properties_element == EL_MM_GRAY_BALL)
     {
       MapCounterButtons(ED_COUNTER_ID_MM_BALL_CONTENT);
@@ -11879,7 +12572,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);
@@ -11901,12 +12594,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);
@@ -11915,10 +12608,60 @@ static void DrawPropertiesConfig(void)
 
     MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
     MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+
+    MapDrawingArea(ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_FALLING);
+    MapDrawingArea(ED_DRAWING_ID_BD_ROCK_TURNS_TO_ON_IMPACT);
+  }
+
+  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);
+  }
+
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    if (IS_BDX_FIREFLY_1(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_FIREFLY_1_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_EXPLOSION_TURNS_TO);
+    }
+    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_BDX_BUTTERFLY_1(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_BUTTERFLY_1_EXPLODES_TO);
+      MapDrawingArea(ED_DRAWING_ID_BD_DIAMOND_BIRTH_TURNS_TO);
+    }
+    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_BDX_STONEFLY(properties_element))
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_STONEFLY_EXPLODES_TO);
+    }
+    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_BDX_BOMB)
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_BOMB_EXPLOSION_TURNS_TO);
+    }
+    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);
@@ -11929,7 +12672,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);
@@ -11937,7 +12680,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);
 
@@ -11949,38 +12692,57 @@ 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_NUT)
+  if (properties_element == EL_BDX_ROCKET_LAUNCHER)
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_INFINITE_ROCKETS);
+  }
+
+  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_BDX_GRAVITY_SWITCH)
+  {
+    MapSelectboxGadget(ED_SELECTBOX_ID_BD_GRAVITY_DIRECTION);
+
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_GRAVITY_SWITCH_ACTIVE);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_GRAVITY_AFFECTS_ALL);
+  }
+
+  if (properties_element == EL_BDX_NUT)
   {
     MapDrawingArea(ED_DRAWING_ID_BD_NUT_CONTENT);
   }
@@ -11992,7 +12754,8 @@ static void DrawPropertiesConfig(void)
   if (properties_element == EL_EM_DYNAMITE)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE);
 
-  if (COULD_MOVE_INTO_ACID(properties_element) &&
+  if (level.game_engine_type == GAME_ENGINE_TYPE_RND &&
+      COULD_MOVE_INTO_ACID(properties_element) &&
       !IS_PLAYER_ELEMENT(properties_element) &&
       (!IS_CUSTOM_ELEMENT(properties_element) ||
        edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2))
@@ -12270,9 +13033,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)
@@ -13201,6 +13977,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                  },
@@ -15545,6 +16322,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 &&
@@ -15614,6 +16400,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 ||
@@ -15635,6 +16452,13 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
 
     DrawLevelConfigWindow();
   }
+  else if (type_id >= ED_TAB_BUTTON_ID_ENGINECONFIG_FIRST &&
+          type_id <= ED_TAB_BUTTON_ID_ENGINECONFIG_LAST)
+  {
+    edit_mode_engineconfig = gi->custom_type_id;
+
+    DrawLevelConfigWindow();
+  }
   else if (type_id >= ED_TAB_BUTTON_ID_PROPERTIES_FIRST &&
           type_id <= ED_TAB_BUTTON_ID_PROPERTIES_LAST)
   {
@@ -15769,6 +16593,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)