added support for amoeba settings in BD engine to level editor
[rocksndiamonds.git] / src / editor.c
index 3bed979da4aaff0c642f24bc6e27b1e6883048cf..6e24056011ad3e6ccc4e2e3f0a50fbf25dd87e90 100644 (file)
@@ -429,6 +429,24 @@ enum
   GADGET_ID_LEVELSET_NUM_LEVELS_DOWN,
   GADGET_ID_LEVELSET_NUM_LEVELS_TEXT,
   GADGET_ID_LEVELSET_NUM_LEVELS_UP,
+  GADGET_ID_BD_CYCLE_DELAY_MS_DOWN,
+  GADGET_ID_BD_CYCLE_DELAY_MS_TEXT,
+  GADGET_ID_BD_CYCLE_DELAY_MS_UP,
+  GADGET_ID_BD_CYCLE_DELAY_C64_DOWN,
+  GADGET_ID_BD_CYCLE_DELAY_C64_TEXT,
+  GADGET_ID_BD_CYCLE_DELAY_C64_UP,
+  GADGET_ID_BD_HATCHING_DELAY_CYCLES_DOWN,
+  GADGET_ID_BD_HATCHING_DELAY_CYCLES_TEXT,
+  GADGET_ID_BD_HATCHING_DELAY_CYCLES_UP,
+  GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,
+  GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,
+  GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
+  GADGET_ID_BD_PUSHING_PROB_DOWN,
+  GADGET_ID_BD_PUSHING_PROB_TEXT,
+  GADGET_ID_BD_PUSHING_PROB_UP,
+  GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN,
+  GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT,
+  GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP,
   GADGET_ID_ELEMENT_VALUE1_DOWN,
   GADGET_ID_ELEMENT_VALUE1_TEXT,
   GADGET_ID_ELEMENT_VALUE1_UP,
@@ -538,6 +556,12 @@ enum
   GADGET_ID_MAGIC_BALL_CONTENT_7,
   GADGET_ID_ANDROID_CONTENT,
   GADGET_ID_AMOEBA_CONTENT,
+  GADGET_ID_BD_AMOEBA_CONTENT_TOO_BIG,
+  GADGET_ID_BD_AMOEBA_CONTENT_ENCLOSED,
+  GADGET_ID_BD_AMOEBA_2_CONTENT_TOO_BIG,
+  GADGET_ID_BD_AMOEBA_2_CONTENT_ENCLOSED,
+  GADGET_ID_BD_AMOEBA_2_CONTENT_EXPLODING,
+  GADGET_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE,
   GADGET_ID_START_ELEMENT,
   GADGET_ID_ARTWORK_ELEMENT,
   GADGET_ID_EXPLOSION_ELEMENT,
@@ -571,6 +595,7 @@ 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_WIND_DIRECTION,
   GADGET_ID_PLAYER_SPEED,
@@ -606,6 +631,7 @@ enum
   GADGET_ID_LEVELCONFIG_LEVEL,
   GADGET_ID_LEVELCONFIG_LEVELSET,
   GADGET_ID_LEVELCONFIG_EDITOR,
+  GADGET_ID_LEVELCONFIG_ENGINE,
   GADGET_ID_PROPERTIES_INFO,
   GADGET_ID_PROPERTIES_CONFIG,
   GADGET_ID_PROPERTIES_CONFIG_1,
@@ -648,6 +674,12 @@ enum
   GADGET_ID_RANDOM_PERCENTAGE,
   GADGET_ID_RANDOM_QUANTITY,
   GADGET_ID_RANDOM_RESTRICTED,
+  GADGET_ID_BD_INTERMISSION,
+  GADGET_ID_BD_PAL_TIMING,
+  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_STICK_ELEMENT,
   GADGET_ID_EM_SLIPPERY_GEMS,
   GADGET_ID_EM_EXPLODES_BY_FIRE,
@@ -679,6 +711,14 @@ enum
   GADGET_ID_CAN_FALL_INTO_ACID,
   GADGET_ID_CAN_MOVE_INTO_ACID,
   GADGET_ID_DONT_COLLIDE_WITH,
+  GADGET_ID_BD_DIAGONAL_MOVEMENTS,
+  GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
+  GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+  GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+  GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
+  GADGET_ID_BD_AMOEBA_START_IMMEDIATELY,
+  GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
   GADGET_ID_ENVELOPE_AUTOWRAP,
   GADGET_ID_ENVELOPE_CENTERED,
   GADGET_ID_MM_LASER_RED,
@@ -747,6 +787,12 @@ enum
   ED_COUNTER_ID_LEVEL_RANDOM_SEED,
   ED_COUNTER_ID_LEVELSET_NUM_LEVELS,
   ED_COUNTER_ID_LEVEL_RANDOM,
+  ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
+  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_PUSHING_PROB,
+  ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
   ED_COUNTER_ID_ELEMENT_VALUE1,
   ED_COUNTER_ID_ELEMENT_VALUE2,
   ED_COUNTER_ID_ELEMENT_VALUE3,
@@ -861,6 +907,7 @@ 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_WIND_DIRECTION,
   ED_SELECTBOX_ID_PLAYER_SPEED,
@@ -900,6 +947,9 @@ enum
 #define ED_SELECTBOX_ID_LEVELSET_FIRST ED_SELECTBOX_ID_LEVELSET_SAVE_MODE
 #define ED_SELECTBOX_ID_LEVELSET_LAST  ED_SELECTBOX_ID_LEVELSET_SAVE_MODE
 
+#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_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
@@ -916,6 +966,7 @@ enum
   ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL,
   ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET,
   ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR,
+  ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE,
   ED_TEXTBUTTON_ID_PROPERTIES_INFO,
   ED_TEXTBUTTON_ID_PROPERTIES_CONFIG,
   ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1,
@@ -931,7 +982,7 @@ enum
 };
 
 #define ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL
-#define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST  ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR
+#define ED_TAB_BUTTON_ID_LEVELCONFIG_LAST  ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
 
 #define ED_TAB_BUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_TAB_BUTTON_ID_PROPERTIES_LAST  ED_TEXTBUTTON_ID_PROPERTIES_CHANGE
@@ -963,6 +1014,12 @@ enum
   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED,
   ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3,
   ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2,
+  ED_CHECKBUTTON_ID_BD_INTERMISSION,
+  ED_CHECKBUTTON_ID_BD_PAL_TIMING,
+  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_STICK_ELEMENT,
   ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS,
   ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE,
@@ -994,6 +1051,14 @@ enum
   ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID,
   ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID,
   ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH,
+  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_WAIT_HATCHING,
+  ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+  ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
+  ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY,
+  ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
   ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
   ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
   ED_CHECKBUTTON_ID_MM_LASER_RED,
@@ -1042,6 +1107,9 @@ enum
 #define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #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_GRAVITY_AFFECTS_ALL
+
 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST        ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
 #define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE
 #define ED_CHECKBUTTON_ID_CUSTOM2_FIRST        ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE
@@ -1086,6 +1154,12 @@ enum
   ED_DRAWING_ID_MAGIC_BALL_CONTENT_7,
   ED_DRAWING_ID_ANDROID_CONTENT,
   ED_DRAWING_ID_AMOEBA_CONTENT,
+  ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG,
+  ED_DRAWING_ID_BD_AMOEBA_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,
+  ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE,
   ED_DRAWING_ID_START_ELEMENT,
   ED_DRAWING_ID_ARTWORK_ELEMENT,
   ED_DRAWING_ID_EXPLOSION_ELEMENT,
@@ -1134,6 +1208,7 @@ enum
 #define ED_MODE_LEVELCONFIG_LEVEL      ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL
 #define ED_MODE_LEVELCONFIG_LEVELSET   ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET
 #define ED_MODE_LEVELCONFIG_EDITOR     ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR
+#define ED_MODE_LEVELCONFIG_ENGINE     ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE
 
 // sub-screens in the element properties section
 #define ED_MODE_PROPERTIES_INFO                ED_TEXTBUTTON_ID_PROPERTIES_INFO
@@ -1376,6 +1451,7 @@ static int levelset_save_mode = LEVELSET_SAVE_MODE_UPDATE;
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int min_value, max_value;
   int gadget_id_down, gadget_id_up;
@@ -1388,6 +1464,7 @@ static struct
   // ---------- current level number ------------------------------------------
 
   {
+    ED_COUNTER_ID_SELECT_LEVEL,
     -1, -1,    // these values are not constant, but can change at runtime
     1,                                 100,
     GADGET_ID_SELECT_LEVEL_DOWN,       GADGET_ID_SELECT_LEVEL_UP,
@@ -1399,6 +1476,7 @@ static struct
   // ---------- level and editor settings -------------------------------------
 
   {
+    ED_COUNTER_ID_LEVEL_XSIZE,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(4),
     MIN_LEV_FIELDX,                    MAX_LEV_FIELDX,
     GADGET_ID_LEVEL_XSIZE_DOWN,                GADGET_ID_LEVEL_XSIZE_UP,
@@ -1407,6 +1485,7 @@ static struct
     "playfield size:",                 NULL, "width",
   },
   {
+    ED_COUNTER_ID_LEVEL_YSIZE,
     -1,                                        ED_LEVEL_SETTINGS_YPOS(4),
     MIN_LEV_FIELDY,                    MAX_LEV_FIELDY,
     GADGET_ID_LEVEL_YSIZE_DOWN,                GADGET_ID_LEVEL_YSIZE_UP,
@@ -1415,6 +1494,7 @@ static struct
     NULL,                              " ", "height",
   },
   {
+    ED_COUNTER_ID_LEVEL_GEMSLIMIT,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(5),
     0,                                 999,
     GADGET_ID_LEVEL_GEMSLIMIT_DOWN,    GADGET_ID_LEVEL_GEMSLIMIT_UP,
@@ -1423,6 +1503,7 @@ static struct
     NULL,                              "number of gems to collect:", NULL
   },
   {
+    ED_COUNTER_ID_LEVEL_TIMELIMIT,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(8),
     0,                                 9999,
     GADGET_ID_LEVEL_TIMELIMIT_DOWN,    GADGET_ID_LEVEL_TIMELIMIT_UP,
@@ -1431,6 +1512,7 @@ static struct
     "time or step limit to solve level:", NULL, NULL
   },
   {
+    ED_COUNTER_ID_LEVEL_TIMESCORE,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
     0,                                 999,
     GADGET_ID_LEVEL_TIMESCORE_DOWN,    GADGET_ID_LEVEL_TIMESCORE_UP,
@@ -1439,6 +1521,7 @@ static struct
     "score for time or steps left:",   NULL, NULL
   },
   {
+    ED_COUNTER_ID_LEVEL_RANDOM_SEED,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(13),
     0,                                 9999,
     GADGET_ID_LEVEL_RANDOM_SEED_DOWN,  GADGET_ID_LEVEL_RANDOM_SEED_UP,
@@ -1447,6 +1530,7 @@ static struct
     NULL,                              "random seed:", "(0 => random)"
   },
   {
+    ED_COUNTER_ID_LEVELSET_NUM_LEVELS,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(4),
     1,                                 MAX_LEVELS,
     GADGET_ID_LEVELSET_NUM_LEVELS_DOWN,        GADGET_ID_LEVELSET_NUM_LEVELS_UP,
@@ -1455,6 +1539,7 @@ static struct
     "number of levels:",               NULL, NULL,
   },
   {
+    ED_COUNTER_ID_LEVEL_RANDOM,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(0),
     1,                                 100,
     GADGET_ID_LEVEL_RANDOM_DOWN,       GADGET_ID_LEVEL_RANDOM_UP,
@@ -1462,10 +1547,65 @@ static struct
     &random_placement_value,
     "random element placement:",       NULL, "in"
   },
+  {
+    ED_COUNTER_ID_BD_CYCLE_DELAY_MS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_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,
+    &level.bd_cycle_delay_ms,
+    NULL,                              NULL, "game cycle delay (ms)"
+  },
+  {
+    ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_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,
+    &level.bd_cycle_delay_c64,
+    NULL,                              NULL, "game cycle delay (C64-style)"
+  },
+  {
+    ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_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,
+    &level.bd_hatching_delay_cycles,
+    NULL,                              NULL, "hatching delay (cycles)"
+  },
+  {
+    ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_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)"
+  },
 
   // ---------- element settings: configure (various elements) ----------------
 
   {
+    ED_COUNTER_ID_BD_PUSHING_PROB,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    0,                                 100,
+    GADGET_ID_BD_PUSHING_PROB_DOWN,    GADGET_ID_BD_PUSHING_PROB_UP,
+    GADGET_ID_BD_PUSHING_PROB_TEXT,    GADGET_ID_NONE,
+    &level.bd_pushing_prob,
+    NULL,                              NULL, "push probability"
+  },
+  {
+    ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
+    0,                                 100,
+    GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_DOWN, GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_UP,
+    GADGET_ID_BD_PUSHING_PROB_WITH_SWEET_TEXT, GADGET_ID_NONE,
+    &level.bd_pushing_prob_with_sweet,
+    NULL,                              NULL, "push probability with sweet"
+  },
+  {
+    ED_COUNTER_ID_ELEMENT_VALUE1,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_ELEMENT_VALUE1_DOWN,     GADGET_ID_ELEMENT_VALUE1_UP,
@@ -1474,6 +1614,7 @@ static struct
     NULL,                              NULL, NULL
   },
   {
+    ED_COUNTER_ID_ELEMENT_VALUE2,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_ELEMENT_VALUE2_DOWN,     GADGET_ID_ELEMENT_VALUE2_UP,
@@ -1482,6 +1623,7 @@ static struct
     NULL,                              NULL, NULL
   },
   {
+    ED_COUNTER_ID_ELEMENT_VALUE3,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_ELEMENT_VALUE3_DOWN,     GADGET_ID_ELEMENT_VALUE3_UP,
@@ -1490,6 +1632,7 @@ static struct
     NULL,                              NULL, NULL
   },
   {
+    ED_COUNTER_ID_ELEMENT_VALUE4,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_ELEMENT_VALUE4_DOWN,     GADGET_ID_ELEMENT_VALUE4_UP,
@@ -1498,6 +1641,7 @@ static struct
     NULL,                              NULL, NULL
   },
   {
+    ED_COUNTER_ID_YAMYAM_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     MIN_ELEMENT_CONTENTS,              MAX_ELEMENT_CONTENTS,
     GADGET_ID_YAMYAM_CONTENT_DOWN,     GADGET_ID_YAMYAM_CONTENT_UP,
@@ -1506,6 +1650,7 @@ static struct
     NULL,                              NULL, "number of content areas"
   },
   {
+    ED_COUNTER_ID_BALL_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     MIN_ELEMENT_CONTENTS,              MAX_ELEMENT_CONTENTS,
     GADGET_ID_BALL_CONTENT_DOWN,       GADGET_ID_BALL_CONTENT_UP,
@@ -1514,6 +1659,7 @@ static struct
     NULL,                              NULL, "number of content areas"
   },
   {
+    ED_COUNTER_ID_ANDROID_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     MIN_ANDROID_ELEMENTS,              MAX_ANDROID_ELEMENTS,
     GADGET_ID_ANDROID_CONTENT_DOWN,    GADGET_ID_ANDROID_CONTENT_UP,
@@ -1522,6 +1668,7 @@ static struct
     NULL,                              NULL, "number of clonable elements"
   },
   {
+    ED_COUNTER_ID_ENVELOPE_XSIZE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     MIN_ENVELOPE_XSIZE,                        MAX_ENVELOPE_XSIZE,
     GADGET_ID_ENVELOPE_XSIZE_DOWN,     GADGET_ID_ENVELOPE_XSIZE_UP,
@@ -1530,6 +1677,7 @@ static struct
     NULL,                              NULL, "width",
   },
   {
+    ED_COUNTER_ID_ENVELOPE_YSIZE,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(0),
     MIN_ENVELOPE_YSIZE,                        MAX_ENVELOPE_YSIZE,
     GADGET_ID_ENVELOPE_YSIZE_DOWN,     GADGET_ID_ENVELOPE_YSIZE_UP,
@@ -1538,6 +1686,7 @@ static struct
     NULL,                              " ", "height",
   },
   {
+    ED_COUNTER_ID_INVENTORY_SIZE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     MIN_INITIAL_INVENTORY_SIZE,                MAX_INITIAL_INVENTORY_SIZE,
     GADGET_ID_INVENTORY_SIZE_DOWN,     GADGET_ID_INVENTORY_SIZE_UP,
@@ -1546,6 +1695,7 @@ static struct
     NULL,                              NULL, "number of inventory elements"
   },
   {
+    ED_COUNTER_ID_MM_BALL_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     MIN_ELEMENTS_IN_GROUP,             MAX_MM_BALL_CONTENTS,
     GADGET_ID_MM_BALL_CONTENT_DOWN,    GADGET_ID_MM_BALL_CONTENT_UP,
@@ -1557,6 +1707,7 @@ static struct
   // ---------- element settings: configure 1 (custom elements) ---------------
 
   {
+    ED_COUNTER_ID_CUSTOM_SCORE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(5),
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_CUSTOM_SCORE_DOWN,       GADGET_ID_CUSTOM_SCORE_UP,
@@ -1565,6 +1716,7 @@ static struct
     NULL,                              "CE score", " "
   },
   {
+    ED_COUNTER_ID_CUSTOM_GEMCOUNT,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(5),
     MIN_COLLECT_COUNT,                 MAX_COLLECT_COUNT,
     GADGET_ID_CUSTOM_GEMCOUNT_DOWN,    GADGET_ID_CUSTOM_GEMCOUNT_UP,
@@ -1573,6 +1725,7 @@ static struct
     NULL,                              "CE count", NULL
   },
   {
+    ED_COUNTER_ID_CUSTOM_VALUE_FIX,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     0,                                 9999,
     GADGET_ID_CUSTOM_VALUE_FIX_DOWN,   GADGET_ID_CUSTOM_VALUE_FIX_UP,
@@ -1581,6 +1734,7 @@ static struct
     NULL,                              "CE value", NULL
   },
   {
+    ED_COUNTER_ID_CUSTOM_VALUE_RND,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     0,                                 9999,
     GADGET_ID_CUSTOM_VALUE_RND_DOWN,   GADGET_ID_CUSTOM_VALUE_RND_UP,
@@ -1589,6 +1743,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
+    ED_COUNTER_ID_PUSH_DELAY_FIX,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(6),
     0,                                 999,
     GADGET_ID_PUSH_DELAY_FIX_DOWN,     GADGET_ID_PUSH_DELAY_FIX_UP,
@@ -1597,6 +1752,7 @@ static struct
     NULL,                              "push delay", NULL
   },
   {
+    ED_COUNTER_ID_PUSH_DELAY_RND,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(6),
     0,                                 999,
     GADGET_ID_PUSH_DELAY_RND_DOWN,     GADGET_ID_PUSH_DELAY_RND_UP,
@@ -1605,6 +1761,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
+    ED_COUNTER_ID_DROP_DELAY_FIX,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(7),
     0,                                 999,
     GADGET_ID_DROP_DELAY_FIX_DOWN,     GADGET_ID_DROP_DELAY_FIX_UP,
@@ -1613,6 +1770,7 @@ static struct
     NULL,                              "drop delay", NULL
   },
   {
+    ED_COUNTER_ID_DROP_DELAY_RND,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(7),
     0,                                 999,
     GADGET_ID_DROP_DELAY_RND_DOWN,     GADGET_ID_DROP_DELAY_RND_UP,
@@ -1624,6 +1782,7 @@ static struct
   // ---------- element settings: configure 2 (custom elements) ---------------
 
   {
+    ED_COUNTER_ID_MOVE_DELAY_FIX,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(5),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_FIX_DOWN,     GADGET_ID_MOVE_DELAY_FIX_UP,
@@ -1632,6 +1791,7 @@ static struct
     NULL,                              "move delay", NULL
   },
   {
+    ED_COUNTER_ID_MOVE_DELAY_RND,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(5),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_RND_DOWN,     GADGET_ID_MOVE_DELAY_RND_UP,
@@ -1640,6 +1800,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
+    ED_COUNTER_ID_STEP_DELAY_FIX,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(6),
     0,                                 999,
     GADGET_ID_STEP_DELAY_FIX_DOWN,     GADGET_ID_STEP_DELAY_FIX_UP,
@@ -1648,6 +1809,7 @@ static struct
     NULL,                              "step delay", NULL
   },
   {
+    ED_COUNTER_ID_STEP_DELAY_RND,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(6),
     0,                                 999,
     GADGET_ID_STEP_DELAY_RND_DOWN,     GADGET_ID_STEP_DELAY_RND_UP,
@@ -1656,6 +1818,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
+    ED_COUNTER_ID_EXPLOSION_DELAY,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
     0,                                 999,
     GADGET_ID_EXPLOSION_DELAY_DOWN,    GADGET_ID_EXPLOSION_DELAY_UP,
@@ -1664,6 +1827,7 @@ static struct
     NULL,                              "explosion delay", NULL
   },
   {
+    ED_COUNTER_ID_IGNITION_DELAY,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(14),
     0,                                 999,
     GADGET_ID_IGNITION_DELAY_DOWN,     GADGET_ID_IGNITION_DELAY_UP,
@@ -1675,6 +1839,7 @@ static struct
   // ---------- element settings: configure (group elements) ------------------
 
   {
+    ED_COUNTER_ID_GROUP_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     MIN_ELEMENTS_IN_GROUP,             MAX_ELEMENTS_IN_GROUP,
     GADGET_ID_GROUP_CONTENT_DOWN,      GADGET_ID_GROUP_CONTENT_UP,
@@ -1686,6 +1851,7 @@ static struct
   // ---------- element settings: advanced (custom elements) ------------------
 
   {
+    ED_COUNTER_ID_CHANGE_DELAY_FIX,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(2),
     0,                                 999,
     GADGET_ID_CHANGE_DELAY_FIX_DOWN,   GADGET_ID_CHANGE_DELAY_FIX_UP,
@@ -1694,6 +1860,7 @@ static struct
     NULL,                              "CE delay", NULL,
   },
   {
+    ED_COUNTER_ID_CHANGE_DELAY_RND,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
     0,                                 999,
     GADGET_ID_CHANGE_DELAY_RND_DOWN,   GADGET_ID_CHANGE_DELAY_RND_UP,
@@ -1702,6 +1869,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
+    ED_COUNTER_ID_CHANGE_CONT_RND,
     ED_ELEMENT_SETTINGS_XPOS(3),       ED_ELEMENT_SETTINGS_YPOS(12),
     0,                                 100,
     GADGET_ID_CHANGE_CONT_RND_DOWN,    GADGET_ID_CHANGE_CONT_RND_UP,
@@ -1713,6 +1881,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int gadget_id;
   int size;
@@ -1721,6 +1890,7 @@ static struct
 } textinput_info[ED_NUM_TEXTINPUT] =
 {
   {
+    ED_TEXTINPUT_ID_LEVEL_NAME,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_LEVEL_NAME,
     MAX_LEVEL_NAME_LEN,
@@ -1728,6 +1898,7 @@ static struct
     "Title:", "Title for this level"
   },
   {
+    ED_TEXTINPUT_ID_LEVEL_AUTHOR,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(2),
     GADGET_ID_LEVEL_AUTHOR,
     MAX_LEVEL_AUTHOR_LEN,
@@ -1735,6 +1906,7 @@ static struct
     "Author:", "Author for this level"
   },
   {
+    ED_TEXTINPUT_ID_LEVELSET_NAME,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_LEVELSET_NAME,
     MAX_LEVEL_NAME_LEN,
@@ -1742,6 +1914,7 @@ static struct
     "Title:", "Title for this or new level set"
   },
   {
+    ED_TEXTINPUT_ID_LEVELSET_AUTHOR,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(2),
     GADGET_ID_LEVELSET_AUTHOR,
     MAX_LEVEL_AUTHOR_LEN,
@@ -1749,6 +1922,7 @@ static struct
     "Author:", "Author for this or new level set"
   },
   {
+    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
@@ -1759,6 +1933,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int gadget_id;
   int xsize, ysize;
@@ -1767,6 +1942,7 @@ static struct
 } textarea_info[ED_NUM_TEXTAREAS] =
 {
   {
+    ED_TEXTAREA_ID_ENVELOPE_INFO,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_ENVELOPE_INFO,
     MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE,
@@ -1794,6 +1970,7 @@ static struct ValueTextInfo options_time_score_base[] =
 static struct ValueTextInfo options_game_engine_type[] =
 {
   { GAME_ENGINE_TYPE_RND,      "Rocks'n'Diamonds"              },
+  { GAME_ENGINE_TYPE_BD,       "Boulder Dash"                  },
   { GAME_ENGINE_TYPE_EM,       "Emerald Mine"                  },
   { GAME_ENGINE_TYPE_SP,       "Supaplex"                      },
   { GAME_ENGINE_TYPE_MM,       "Mirror Magic"                  },
@@ -2470,6 +2647,19 @@ static struct ValueTextInfo options_group_choice_mode[] =
   { -1,                                NULL                            }
 };
 
+static struct ValueTextInfo options_bd_scheduling_type[] =
+{
+  { GD_SCHEDULING_MILLISECONDS,          "Milliseconds"                },
+  { GD_SCHEDULING_BD1,           "BD1"                         },
+  { GD_SCHEDULING_BD2,           "BD2"                         },
+  { GD_SCHEDULING_PLCK,                  "Construction Kit"            },
+  { GD_SCHEDULING_CRDR,                  "Crazy Dream 7"               },
+  { GD_SCHEDULING_BD1_ATARI,     "Atari BD1"                   },
+  { GD_SCHEDULING_BD2_PLCK_ATARI, "Atari BD2 / PLCK"           },
+
+  { -1,                                  NULL                          }
+};
+
 static struct ValueTextInfo *action_arg_modes[] =
 {
   options_action_mode_none,
@@ -2514,6 +2704,7 @@ action_arg_options[] =
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int gadget_id;
   int gadget_id_align;
@@ -2526,6 +2717,7 @@ static struct
   // ---------- level and editor settings -------------------------------------
 
   {
+    ED_SELECTBOX_ID_TIME_OR_STEPS,
     -1,                                        ED_LEVEL_SETTINGS_YPOS(8),
     GADGET_ID_TIME_OR_STEPS,           GADGET_ID_LEVEL_TIMELIMIT_UP,
     -1,
@@ -2534,6 +2726,7 @@ static struct
     NULL, NULL, "(0 => no limit)",     "time or step limit"
   },
   {
+    ED_SELECTBOX_ID_TIME_SCORE_BASE,
     -1,                                        ED_LEVEL_SETTINGS_YPOS(10),
     GADGET_ID_TIME_SCORE_BASE,         GADGET_ID_LEVEL_TIMESCORE_UP,
     -1,
@@ -2542,6 +2735,7 @@ static struct
     NULL, NULL, NULL,                  "time score for 1 or 10 seconds/steps"
   },
   {
+    ED_SELECTBOX_ID_GAME_ENGINE_TYPE,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
     GADGET_ID_GAME_ENGINE_TYPE,                GADGET_ID_NONE,
     -1,
@@ -2550,6 +2744,16 @@ static struct
     NULL, "game engine:", NULL,                "game engine"
   },
   {
+    ED_SELECTBOX_ID_BD_SCHEDULING_TYPE,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(1),
+    GADGET_ID_BD_SCHEDULING_TYPE,      GADGET_ID_NONE,
+    -1,
+    options_bd_scheduling_type,
+    &level.bd_scheduling_type,
+    NULL, "scheduling type:", NULL,    "level timing"
+  },
+  {
+    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,
@@ -2561,6 +2765,7 @@ static struct
   // ---------- element settings: configure (several elements) ----------------
 
   {
+    ED_SELECTBOX_ID_WIND_DIRECTION,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_WIND_DIRECTION,          GADGET_ID_NONE,
     -1,
@@ -2569,6 +2774,7 @@ static struct
     NULL, "initial wind direction:", NULL,     "initial wind direction"
   },
   {
+    ED_SELECTBOX_ID_PLAYER_SPEED,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
     -1,
@@ -2577,6 +2783,7 @@ static struct
     NULL, "initial player speed:", NULL,       "initial player speed"
   },
   {
+    ED_SELECTBOX_ID_MM_BALL_CHOICE_MODE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_MM_BALL_CHOICE_MODE,     GADGET_ID_NONE,
     -1,
@@ -2588,6 +2795,7 @@ static struct
   // ---------- element settings: configure 1 (custom elements) ---------------
 
   {
+    ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CUSTOM_ACCESS_TYPE,      GADGET_ID_NONE,
     -1,
@@ -2596,6 +2804,7 @@ static struct
     NULL, NULL, NULL,                  "type of access to this field"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CUSTOM_ACCESS_LAYER,     GADGET_ID_CUSTOM_ACCESS_TYPE,
     -1,
@@ -2604,6 +2813,7 @@ static struct
     NULL, NULL, NULL,                  "layer of access for this field"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CUSTOM_ACCESS_PROTECTED, GADGET_ID_CUSTOM_ACCESS_LAYER,
     -1,
@@ -2612,6 +2822,7 @@ static struct
     NULL, NULL, NULL,                  "protected access for this field"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_CUSTOM_ACCESS_DIRECTION, GADGET_ID_NONE,
     -1,
@@ -2620,6 +2831,7 @@ static struct
     NULL, "from", NULL,                        "access direction for this field"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CUSTOM_WALK_TO_ACTION,   GADGET_ID_NONE,
     -1,
@@ -2631,6 +2843,7 @@ static struct
   // ---------- element settings: configure 2 (custom elements) ---------------
 
   {
+    ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_MOVE_PATTERN,     GADGET_ID_NONE,
     -1,
@@ -2639,6 +2852,7 @@ static struct
     NULL, "can move", NULL,            "element move pattern"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CUSTOM_MOVE_DIRECTION,   GADGET_ID_NONE,
     -1,
@@ -2647,6 +2861,7 @@ static struct
     NULL, "starts moving", NULL,       "initial element move direction"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CUSTOM_MOVE_STEPSIZE,    GADGET_ID_NONE,
     -1,
@@ -2655,6 +2870,7 @@ static struct
     NULL, "move/fall speed", NULL,     "speed of element movement"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,  GADGET_ID_NONE,
     -1,
@@ -2666,6 +2882,7 @@ static struct
     NULL, "            can", ":",      "leave behind or change element"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_SMASH_TARGETS,    GADGET_ID_CUSTOM_CAN_SMASH,
     -1,
@@ -2674,6 +2891,7 @@ static struct
     NULL, "can smash", NULL,           "elements that can be smashed"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_SLIPPERY_TYPE,    GADGET_ID_NONE,
     -1,
@@ -2682,6 +2900,7 @@ static struct
     NULL, "slippery", NULL,            "where other elements fall down"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_DEADLINESS,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_DEADLINESS,       GADGET_ID_NONE,
     -1,
@@ -2690,6 +2909,7 @@ static struct
     NULL, "deadly when", NULL,         "deadliness of element"
   },
   {
+    ED_SELECTBOX_ID_CUSTOM_EXPLOSION_TYPE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_EXPLOSION_TYPE,   GADGET_ID_NONE,
     -1,
@@ -2701,6 +2921,7 @@ static struct
   // ---------- element settings: advanced (custom elements) ------------------
 
   {
+    ED_SELECTBOX_ID_CHANGE_TIME_UNITS,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_CHANGE_TIME_UNITS,       GADGET_ID_NONE,
     -1,
@@ -2709,6 +2930,7 @@ static struct
     NULL, "delay time given in", NULL, "delay time units for change"
   },
   {
+    ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CHANGE_DIRECT_ACTION,    GADGET_ID_NONE,
     -1,
@@ -2717,6 +2939,7 @@ static struct
     NULL, NULL, NULL,                  "type of direct action"
   },
   {
+    ED_SELECTBOX_ID_CHANGE_OTHER_ACTION,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_CHANGE_OTHER_ACTION,     GADGET_ID_NONE,
     -1,
@@ -2725,6 +2948,7 @@ static struct
     NULL, NULL, "element:",            "type of other element action"
   },
   {
+    ED_SELECTBOX_ID_CHANGE_SIDE,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_CHANGE_SIDE,             GADGET_ID_NONE,
     -1,
@@ -2733,6 +2957,7 @@ static struct
     NULL, "at", "side",                        "element side triggering change"
   },
   {
+    ED_SELECTBOX_ID_CHANGE_PLAYER,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_CHANGE_PLAYER,           GADGET_ID_NONE,
     -1,
@@ -2741,6 +2966,7 @@ static struct
     NULL, "player:", " ",              "player that causes change"
   },
   {
+    ED_SELECTBOX_ID_CHANGE_PAGE,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_CHANGE_PAGE,             GADGET_ID_CHANGE_PLAYER,
     -1,
@@ -2749,6 +2975,7 @@ static struct
     NULL, "page:", NULL,               "change page that causes change"
   },
   {
+    ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_CHANGE_REPLACE_WHEN,     GADGET_ID_NONE,
     -1,
@@ -2757,6 +2984,7 @@ static struct
     NULL, "replace when", NULL,                "which elements can be replaced"
   },
   {
+    ED_SELECTBOX_ID_ACTION_TYPE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_ACTION_TYPE,             GADGET_ID_NONE,
     15,
@@ -2765,6 +2993,7 @@ static struct
     NULL, NULL, NULL,                  "action on specified condition"
   },
   {
+    ED_SELECTBOX_ID_ACTION_MODE,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_ACTION_MODE,             GADGET_ID_ACTION_TYPE,
     -1,
@@ -2773,6 +3002,7 @@ static struct
     NULL, NULL, NULL,                  "action operator"
   },
   {
+    ED_SELECTBOX_ID_ACTION_ARG,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_ACTION_ARG,              GADGET_ID_ACTION_MODE,
     -1,
@@ -2781,6 +3011,7 @@ static struct
     NULL, NULL, NULL,                  "action parameter"
   },
   {
+    ED_SELECTBOX_ID_SELECT_CHANGE_PAGE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_SELECT_CHANGE_PAGE,      GADGET_ID_NONE,
     3,
@@ -2792,6 +3023,7 @@ static struct
   // ---------- element settings: configure (group elements) ------------------
 
   {
+    ED_SELECTBOX_ID_GROUP_CHOICE_MODE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_GROUP_CHOICE_MODE,       GADGET_ID_NONE,
     -1,
@@ -2803,6 +3035,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int gadget_id;
   int gadget_id_align;
@@ -2814,51 +3047,66 @@ static struct
   // ---------- level and editor settings (tabs) ------------------------------
 
   {
+    ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL,
     ED_LEVEL_TABS_XPOS(0),             ED_LEVEL_TABS_YPOS(0),
     GADGET_ID_LEVELCONFIG_LEVEL,       GADGET_ID_NONE,
     8,                                 "Level",
     NULL, NULL, NULL,                  "Configure level settings"
   },
   {
+    ED_TEXTBUTTON_ID_LEVELCONFIG_LEVELSET,
     -1,                                        -1,
     GADGET_ID_LEVELCONFIG_LEVELSET,    GADGET_ID_LEVELCONFIG_LEVEL,
     8,                                 "Levelset",
     NULL, NULL, NULL,                  "Update this or create new level set"
   },
   {
+    ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR,
     -1,                                        -1,
     GADGET_ID_LEVELCONFIG_EDITOR,      GADGET_ID_LEVELCONFIG_LEVELSET,
     8,                                 "Editor",
     NULL, NULL, NULL,                  "Configure editor settings"
   },
+  {
+    ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE,
+    -1,                                        -1,
+    GADGET_ID_LEVELCONFIG_ENGINE,      GADGET_ID_LEVELCONFIG_EDITOR,
+    8,                                 "Engine",
+    NULL, NULL, NULL,                  "Configure engine settings"
+  },
 
   // ---------- element settings (tabs) ---------------------------------------
 
   {
+    ED_TEXTBUTTON_ID_PROPERTIES_INFO,
     ED_ELEMENT_TABS_XPOS(0),           ED_ELEMENT_TABS_YPOS(0),
     GADGET_ID_PROPERTIES_INFO,         GADGET_ID_NONE,
     8,                                 "Info",
     NULL, NULL, NULL,                  "Show information about element"
   },
   {
+    ED_TEXTBUTTON_ID_PROPERTIES_CONFIG,
     -1,                                        -1,
     GADGET_ID_PROPERTIES_CONFIG,       GADGET_ID_PROPERTIES_INFO,
     8,                                 "Config",
     NULL, NULL, NULL,                  "Configure element properties"
   },
   {
+    ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1,
     -1,                                        -1,
     GADGET_ID_PROPERTIES_CONFIG_1,     GADGET_ID_PROPERTIES_INFO,
     8,                                 "Config 1",
     NULL, NULL, NULL,                  "Configure element properties, part 1"
   },
   {
+    ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2,
     -1,                                        -1,
     GADGET_ID_PROPERTIES_CONFIG_2,     GADGET_ID_PROPERTIES_CONFIG_1,
     8,                                 "Config 2",
     NULL, NULL, NULL,                  "Configure element properties, part 2"
   },
   {
+    ED_TEXTBUTTON_ID_PROPERTIES_CHANGE,
     -1,                                        -1,
     GADGET_ID_PROPERTIES_CHANGE,       GADGET_ID_PROPERTIES_CONFIG_2,
     8,                                 "Change",
@@ -2868,12 +3116,14 @@ static struct
   // ---------- level and editor settings (buttons) ---------------------------
 
   {
+    ED_TEXTBUTTON_ID_SAVE_LEVELSET,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
     GADGET_ID_SAVE_LEVELSET,           GADGET_ID_LEVELSET_SAVE_MODE,
     -1,                                        "Save",
     NULL, NULL, NULL,                  "Update or create level set"
   },
   {
+    ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(6),
     GADGET_ID_SAVE_AS_TEMPLATE_2,      GADGET_ID_NONE,
     -1,                                        "Save",
@@ -2884,6 +3134,7 @@ static struct
   // ---------- element settings (buttons) ------------------------------------
 
   {
+    ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_1,
     -1,                                        -1,
     GADGET_ID_SAVE_AS_TEMPLATE_1,      GADGET_ID_CUSTOM_USE_TEMPLATE_1,
     -1,                                        "Save",
@@ -2891,12 +3142,14 @@ static struct
     "Save current settings as new template"
   },
   {
+    ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE,
     -1,                                        -1,
     GADGET_ID_ADD_CHANGE_PAGE,         GADGET_ID_PASTE_CHANGE_PAGE,
     -1,                                        "New",
     NULL, NULL, NULL,                  "Add new change page"
   },
   {
+    ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE,
     -1,                                        -1,
     GADGET_ID_DEL_CHANGE_PAGE,         GADGET_ID_ADD_CHANGE_PAGE,
     -1,                                        "Delete",
@@ -2906,6 +3159,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int graphic;
   int x, y;
   int gadget_id;
@@ -2914,24 +3168,28 @@ static struct
 } graphicbutton_info[ED_NUM_GRAPHICBUTTONS] =
 {
   {
+    ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE,
     IMG_EDITOR_COUNTER_DOWN,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_PREV_CHANGE_PAGE,                GADGET_ID_NONE,
     NULL, NULL,                                "select previous change page"
   },
   {
+    ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE,
     IMG_EDITOR_COUNTER_UP,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_NEXT_CHANGE_PAGE,                GADGET_ID_SELECT_CHANGE_PAGE,
     NULL, "change page",               "select next change page"
   },
   {
+    ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE,
     IMG_GFX_EDITOR_BUTTON_CP_COPY,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_COPY_CHANGE_PAGE,                GADGET_ID_NEXT_CHANGE_PAGE,
     " ", NULL,                         "copy settings from this change page"
   },
   {
+    ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE,
     IMG_GFX_EDITOR_BUTTON_CP_PASTE,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_PASTE_CHANGE_PAGE,       GADGET_ID_COPY_CHANGE_PAGE,
@@ -2946,37 +3204,44 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int graphic;
   int gadget_id;
   char *infotext;
 } scrollbutton_info[ED_NUM_SCROLLBUTTONS] =
 {
   {
+    ED_SCROLLBUTTON_ID_AREA_UP,
     IMG_EDITOR_PLAYFIELD_SCROLL_UP,
     GADGET_ID_SCROLL_UP,
     "scroll level editing area up"
   },
   {
+    ED_SCROLLBUTTON_ID_AREA_DOWN,
     IMG_EDITOR_PLAYFIELD_SCROLL_DOWN,
     GADGET_ID_SCROLL_DOWN,
     "scroll level editing area down"
   },
   {
+    ED_SCROLLBUTTON_ID_AREA_LEFT,
     IMG_EDITOR_PLAYFIELD_SCROLL_LEFT,
     GADGET_ID_SCROLL_LEFT,
     "scroll level editing area left"
   },
   {
+    ED_SCROLLBUTTON_ID_AREA_RIGHT,
     IMG_EDITOR_PLAYFIELD_SCROLL_RIGHT,
     GADGET_ID_SCROLL_RIGHT,
     "scroll level editing area right"
   },
   {
+    ED_SCROLLBUTTON_ID_LIST_UP,
     IMG_EDITOR_PALETTE_SCROLL_UP,
     GADGET_ID_SCROLL_LIST_UP,
     "scroll element list up ('Page Up')"
   },
   {
+    ED_SCROLLBUTTON_ID_LIST_DOWN,
     IMG_EDITOR_PALETTE_SCROLL_DOWN,
     GADGET_ID_SCROLL_LIST_DOWN,
     "scroll element list down ('Page Down')"
@@ -2993,6 +3258,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int graphic;
   int type;
   int gadget_id;
@@ -3000,18 +3266,21 @@ static struct
 } scrollbar_info[ED_NUM_SCROLLBARS] =
 {
   {
+    ED_SCROLLBAR_ID_AREA_HORIZONTAL,
     IMG_EDITOR_PLAYFIELD_SCROLLBAR,
     GD_TYPE_SCROLLBAR_HORIZONTAL,
     GADGET_ID_SCROLL_HORIZONTAL,
     "scroll level editing area horizontally"
   },
   {
+    ED_SCROLLBAR_ID_AREA_VERTICAL,
     IMG_EDITOR_PLAYFIELD_SCROLLBAR,
     GD_TYPE_SCROLLBAR_VERTICAL,
     GADGET_ID_SCROLL_VERTICAL,
     "scroll level editing area vertically"
   },
   {
+    ED_SCROLLBAR_ID_LIST_VERTICAL,
     IMG_EDITOR_PALETTE_SCROLLBAR,
     GD_TYPE_SCROLLBAR_VERTICAL,
     GADGET_ID_SCROLL_LIST_VERTICAL,
@@ -3022,6 +3291,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int gadget_id;
   int gadget_id_align;
@@ -3032,6 +3302,7 @@ static struct
 } radiobutton_info[ED_NUM_RADIOBUTTONS] =
 {
   {
+    ED_RADIOBUTTON_ID_PERCENTAGE,
     -1,                                        ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_RANDOM_PERCENTAGE,       GADGET_ID_LEVEL_RANDOM_UP,
     RADIO_NR_RANDOM_ELEMENTS,
@@ -3039,6 +3310,7 @@ static struct
     " ", "percentage",                 "use percentage for random elements"
   },
   {
+    ED_RADIOBUTTON_ID_QUANTITY,
     -1,                                        ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_RANDOM_QUANTITY,         GADGET_ID_RANDOM_PERCENTAGE,
     RADIO_NR_RANDOM_ELEMENTS,
@@ -3049,6 +3321,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int gadget_id;
   int gadget_id_align;
@@ -3059,6 +3332,7 @@ static struct
   // ---------- level and editor settings -------------------------------------
 
   {
+    ED_CHECKBUTTON_ID_AUTO_COUNT_GEMS,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(6),
     GADGET_ID_AUTO_COUNT_GEMS,         GADGET_ID_NONE,
     &level.auto_count_gems,
@@ -3066,6 +3340,7 @@ static struct
     "automatically count gems needed", "set counter to number of gems"
   },
   {
+    ED_CHECKBUTTON_ID_RATE_TIME_OVER_SCORE,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
     GADGET_ID_RATE_TIME_OVER_SCORE,    GADGET_ID_NONE,
     &level.rate_time_over_score,
@@ -3073,6 +3348,7 @@ static struct
     "rate time/steps used over score", "sort high scores by playing time/steps"
   },
   {
+    ED_CHECKBUTTON_ID_USE_LEVELSET_ARTWORK,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
     GADGET_ID_USE_LEVELSET_ARTWORK,    GADGET_ID_NONE,
     &levelset_use_levelset_artwork,
@@ -3080,6 +3356,7 @@ static struct
     "use current custom artwork",      "use custom artwork of this level set"
   },
   {
+    ED_CHECKBUTTON_ID_COPY_LEVEL_TEMPLATE,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(8),
     GADGET_ID_COPY_LEVEL_TEMPLATE,     GADGET_ID_NONE,
     &levelset_copy_level_template,
@@ -3087,6 +3364,7 @@ static struct
     "copy current level template",     "copy level template of this level set"
   },
   {
+    ED_CHECKBUTTON_ID_RANDOM_RESTRICTED,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(1),
     GADGET_ID_RANDOM_RESTRICTED,       GADGET_ID_NONE,
     &random_placement_background_restricted,
@@ -3094,6 +3372,7 @@ static struct
     "restrict random placement to:",   "set random placement restriction"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_3,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(4),
     GADGET_ID_CUSTOM_USE_TEMPLATE_3,   GADGET_ID_NONE,
     &setup.editor.use_template_for_new_levels,
@@ -3101,16 +3380,66 @@ static struct
     "use template for new levels",     "use template for level properties"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2,
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(5),
     GADGET_ID_CUSTOM_USE_TEMPLATE_2,   GADGET_ID_NONE,
     &level.use_custom_template,
     NULL, NULL,
     "use template for custom elements",        "use template for custom properties"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_INTERMISSION,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(0),
+    GADGET_ID_BD_INTERMISSION,         GADGET_ID_NONE,
+    &level.bd_intermission,
+    "Boulder Dash game engine settings:", NULL,
+    "intermission",                    "level is an intermission level"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_PAL_TIMING,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(2),
+    GADGET_ID_BD_PAL_TIMING,           GADGET_ID_NONE,
+    &level.bd_pal_timing,
+    NULL, NULL,
+    "PAL timing",                      "use slower timer (like PAL C64)"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_LINE_SHIFTING_BORDERS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(6),
+    GADGET_ID_BD_LINE_SHIFTING_BORDERS,        GADGET_ID_NONE,
+    &level.bd_line_shifting_borders,
+    "Compatibility settings:", NULL,
+    "line-shifting borders",           "use line-shifting wrap-around"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_SCAN_FIRST_AND_LAST_ROW,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
+    GADGET_ID_BD_SCAN_FIRST_AND_LAST_ROW, GADGET_ID_NONE,
+    &level.bd_scan_first_and_last_row,
+    NULL, NULL,
+    "scan first and last row",         "also process top/bottom border rows"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_SHORT_EXPLOSIONS,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_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"
+  },
 
   // ---------- element settings: configure (various elements) ----------------
 
   {
+    ED_CHECKBUTTON_ID_STICK_ELEMENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_STICK_ELEMENT,           GADGET_ID_NONE,
     &stick_element_properties_window,
@@ -3118,6 +3447,7 @@ static struct
     "stick this screen to edit content","stick this screen to edit content"
   },
   {
+    ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_EM_SLIPPERY_GEMS,                GADGET_ID_NONE,
     &level.em_slippery_gems,
@@ -3125,6 +3455,7 @@ static struct
     "slip down from certain flat walls","use EM/DC style slipping behaviour"
   },
   {
+    ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_EM_EXPLODES_BY_FIRE,     GADGET_ID_NONE,
     &level.em_explodes_by_fire,
@@ -3132,6 +3463,7 @@ static struct
     "explodes with chain reaction",    "use R'n'D style explosion behaviour"
   },
   {
+    ED_CHECKBUTTON_ID_USE_SPRING_BUG,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_USE_SPRING_BUG,          GADGET_ID_NONE,
     &level.use_spring_bug,
@@ -3139,6 +3471,7 @@ static struct
     "use spring pushing bug",          "use odd spring pushing behaviour"
   },
   {
+    ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_USE_TIME_ORB_BUG,                GADGET_ID_NONE,
     &level.use_time_orb_bug,
@@ -3146,6 +3479,7 @@ static struct
     "use time orb bug",                        "use odd time orb behaviour"
   },
   {
+    ED_CHECKBUTTON_ID_USE_LIFE_BUGS,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_USE_LIFE_BUGS,           GADGET_ID_NONE,
     &level.use_life_bugs,
@@ -3153,6 +3487,7 @@ static struct
     "use buggy element behaviour",     "use odd (historic) element behaviour"
   },
   {
+    ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_RANDOM_BALL_CONTENT,     GADGET_ID_NONE,
     &level.ball_random,
@@ -3160,6 +3495,7 @@ static struct
     "create single random element",    "only create one element from content"
   },
   {
+    ED_CHECKBUTTON_ID_INITIAL_BALL_ACTIVE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_INITIAL_BALL_ACTIVE,     GADGET_ID_NONE,
     &level.ball_active_initial,
@@ -3167,6 +3503,7 @@ static struct
     "magic ball initially activated",  "activate magic ball after level start"
   },
   {
+    ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_GROW_INTO_DIGGABLE,      GADGET_ID_NONE,
     &level.grow_into_diggable,
@@ -3174,6 +3511,7 @@ static struct
     "can grow into anything diggable", "grow into more than just sand"
   },
   {
+    ED_CHECKBUTTON_ID_SB_FIELDS_NEEDED,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_SB_FIELDS_NEEDED,                GADGET_ID_NONE,
     &level.sb_fields_needed,
@@ -3181,6 +3519,7 @@ static struct
     "all fields need to be filled",    "require all SB fields to be solved"
   },
   {
+    ED_CHECKBUTTON_ID_SB_OBJECTS_NEEDED,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_SB_OBJECTS_NEEDED,       GADGET_ID_NONE,
     &level.sb_objects_needed,
@@ -3188,6 +3527,7 @@ static struct
     "all objects need to be placed",   "require all SB objects to be solved"
   },
   {
+    ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_AUTO_EXIT_SOKOBAN,       GADGET_ID_NONE,
     &level.auto_exit_sokoban,
@@ -3195,6 +3535,7 @@ static struct
     "exit level if all tasks solved",  "automatically finish Sokoban levels"
   },
   {
+    ED_CHECKBUTTON_ID_SOLVED_BY_ONE_PLAYER,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_SOLVED_BY_ONE_PLAYER,    GADGET_ID_NONE,
     &level.solved_by_one_player,
@@ -3202,6 +3543,7 @@ static struct
     "only one player must enter exit", "level solved by first player in exit"
   },
   {
+    ED_CHECKBUTTON_ID_FINISH_DIG_COLLECT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_FINISH_DIG_COLLECT,      GADGET_ID_NONE,
     &level.finish_dig_collect,
@@ -3209,6 +3551,7 @@ static struct
     "CE action on finished dig/collect", "only finished dig/collect triggers CE"
   },
   {
+    ED_CHECKBUTTON_ID_KEEP_WALKABLE_CE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_KEEP_WALKABLE_CE,                GADGET_ID_NONE,
     &level.keep_walkable_ce,
@@ -3216,6 +3559,7 @@ static struct
     "keep walkable CE changed to player", "keep CE changing to player if walkable"
   },
   {
+    ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CONTINUOUS_SNAPPING,     GADGET_ID_NONE,
     &level.continuous_snapping,
@@ -3223,6 +3567,7 @@ static struct
     "continuous snapping",             "use snapping without releasing key"
   },
   {
+    ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
@@ -3230,6 +3575,7 @@ static struct
     "block snapped field when snapping", "use snapping delay to show animation"
   },
   {
+    ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_BLOCK_LAST_FIELD,                GADGET_ID_NONE,
     &level.block_last_field,
@@ -3237,6 +3583,7 @@ static struct
     "block last field when moving",    "player blocks last field when moving"
   },
   {
+    ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_SP_BLOCK_LAST_FIELD,     GADGET_ID_NONE,
     &level.sp_block_last_field,
@@ -3244,6 +3591,7 @@ static struct
     "block last field when moving",    "player blocks last field when moving"
   },
   {
+    ED_CHECKBUTTON_ID_INSTANT_RELOCATION,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_INSTANT_RELOCATION,      GADGET_ID_NONE,
     &level.instant_relocation,
@@ -3251,6 +3599,7 @@ static struct
     "no scrolling when relocating",    "player gets relocated without delay"
   },
   {
+    ED_CHECKBUTTON_ID_SHIFTED_RELOCATION,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_SHIFTED_RELOCATION,      GADGET_ID_NONE,
     &level.shifted_relocation,
@@ -3258,6 +3607,7 @@ static struct
     "no centering when relocating",    "level not centered after relocation"
   },
   {
+    ED_CHECKBUTTON_ID_LAZY_RELOCATION,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_LAZY_RELOCATION,         GADGET_ID_NONE,
     &level.lazy_relocation,
@@ -3265,6 +3615,7 @@ static struct
     "only redraw off-screen relocation","no redraw if relocation target visible"
   },
   {
+    ED_CHECKBUTTON_ID_USE_START_ELEMENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_USE_START_ELEMENT,       GADGET_ID_NONE,
     &level.use_start_element[0],
@@ -3272,6 +3623,7 @@ static struct
     "use level start element:",               "start level at this element's position"
   },
   {
+    ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_USE_ARTWORK_ELEMENT,     GADGET_ID_NONE,
     &level.use_artwork_element[0],
@@ -3279,6 +3631,7 @@ static struct
     "use artwork from element:",       "use player artwork from other element"
   },
   {
+    ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_USE_EXPLOSION_ELEMENT,   GADGET_ID_NONE,
     &level.use_explosion_element[0],
@@ -3286,6 +3639,7 @@ static struct
     "use explosion from element:",     "use explosion properties from element"
   },
   {
+    ED_CHECKBUTTON_ID_INITIAL_GRAVITY,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_INITIAL_GRAVITY,         GADGET_ID_NONE,
     &level.initial_player_gravity[0],
@@ -3293,6 +3647,7 @@ static struct
     "use initial gravity",             "set initial player gravity"
   },
   {
+    ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_USE_INITIAL_INVENTORY,   GADGET_ID_NONE,
     &level.use_initial_inventory[0],
@@ -3300,6 +3655,7 @@ static struct
     "use initial inventory:",          "use collected elements on level start"
   },
   {
+    ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
     &level.can_pass_to_walkable,
@@ -3307,6 +3663,7 @@ static struct
     "can pass to walkable element",    "player can pass to empty or walkable"
   },
   {
+    ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CAN_FALL_INTO_ACID,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
@@ -3314,6 +3671,7 @@ static struct
     "can fall into acid (with gravity)","player can fall into acid pool"
   },
   {
+    ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
     GADGET_ID_CAN_MOVE_INTO_ACID,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
@@ -3321,6 +3679,7 @@ static struct
     "can move into acid",              "element can move into acid pool"
   },
   {
+    ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_DONT_COLLIDE_WITH,       GADGET_ID_NONE,
     &custom_element_properties[EP_DONT_COLLIDE_WITH],
@@ -3328,6 +3687,71 @@ static struct
     "deadly when colliding with",      "element is deadly when hitting player"
   },
   {
+    ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_DIAGONAL_MOVEMENTS,   GADGET_ID_NONE,
+    &level.bd_diagonal_movements,
+    NULL, NULL,
+    "can move diagonally",             "player can move diagonally"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,        GADGET_ID_NONE,
+    &level.bd_topmost_player_active,
+    NULL, NULL,
+    "topmost player is active",                "use first player found on playfield"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET, GADGET_ID_NONE,
+    &level.bd_push_mega_rock_with_sweet,
+    NULL, NULL,
+    "mega rocks pushable with sweet",  "push mega rocks after eating sweet"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING, GADGET_ID_NONE,
+    &level.bd_magic_wall_wait_hatching,
+    NULL, NULL,
+    "wait for player's birth",         "timer start waits for player's birth"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    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"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING, GADGET_ID_NONE,
+    &level.bd_amoeba_wait_for_hatching,
+    NULL, NULL,
+    "wait for player's birth",         "timer start waits for player's birth"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    GADGET_ID_BD_AMOEBA_START_IMMEDIATELY, GADGET_ID_NONE,
+    &level.bd_amoeba_start_immediately,
+    NULL, NULL,
+    "start growing immediately",       "start slow growth time immediately"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
+    GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA, GADGET_ID_NONE,
+    &level.bd_amoeba_2_explode_by_amoeba,
+    NULL, NULL,
+    "explodes if touched by amoeba",   "amoeba 2 explodes if touched by amoeba"
+  },
+  {
+    ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_ENVELOPE_AUTOWRAP,       GADGET_ID_NONE,
     &level.envelope[0].autowrap,
@@ -3335,6 +3759,7 @@ static struct
     "auto-wrap",                       "automatically wrap envelope text"
   },
   {
+    ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_ENVELOPE_CENTERED,       GADGET_ID_ENVELOPE_AUTOWRAP,
     &level.envelope[0].centered,
@@ -3342,6 +3767,7 @@ static struct
     "centered",                                "automatically center envelope text"
   },
   {
+    ED_CHECKBUTTON_ID_MM_LASER_RED,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_MM_LASER_RED,            GADGET_ID_NONE,
     &level.mm_laser_red,
@@ -3349,6 +3775,7 @@ static struct
     "red",                             "use red color components in laser"
   },
   {
+    ED_CHECKBUTTON_ID_MM_LASER_GREEN,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_MM_LASER_GREEN,          GADGET_ID_NONE,
     &level.mm_laser_green,
@@ -3356,6 +3783,7 @@ static struct
     "green",                           "use green color components in laser"
   },
   {
+    ED_CHECKBUTTON_ID_MM_LASER_BLUE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_MM_LASER_BLUE,           GADGET_ID_NONE,
     &level.mm_laser_blue,
@@ -3363,6 +3791,7 @@ static struct
     "blue",                            "use blue color components in laser"
   },
   {
+    ED_CHECKBUTTON_ID_DF_LASER_RED,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_DF_LASER_RED,            GADGET_ID_NONE,
     &level.df_laser_red,
@@ -3370,6 +3799,7 @@ static struct
     "red",                             "use red color components in laser"
   },
   {
+    ED_CHECKBUTTON_ID_DF_LASER_GREEN,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_DF_LASER_GREEN,          GADGET_ID_NONE,
     &level.df_laser_green,
@@ -3377,6 +3807,7 @@ static struct
     "green",                           "use green color components in laser"
   },
   {
+    ED_CHECKBUTTON_ID_DF_LASER_BLUE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_DF_LASER_BLUE,           GADGET_ID_NONE,
     &level.df_laser_blue,
@@ -3384,6 +3815,7 @@ static struct
     "blue",                            "use blue color components in laser"
   },
   {
+    ED_CHECKBUTTON_ID_ROTATE_MM_BALL_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_ROTATE_MM_BALL_CONTENT,  GADGET_ID_NONE,
     &level.rotate_mm_ball_content,
@@ -3391,6 +3823,7 @@ static struct
     "randomly rotate created content", "randomly rotate newly created content"
   },
   {
+    ED_CHECKBUTTON_ID_EXPLODE_MM_BALL,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_EXPLODE_MM_BALL,         GADGET_ID_NONE,
     &level.explode_mm_ball,
@@ -3401,6 +3834,7 @@ static struct
   // ---------- element settings: configure 1 (custom elements) ---------------
 
   {
+    ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_USE_GRAPHIC,      GADGET_ID_NONE,
     &custom_element.use_gfx_element,
@@ -3408,6 +3842,7 @@ static struct
     "use graphic of element:",         "use existing element graphic"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_1,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_CUSTOM_USE_TEMPLATE_1,   GADGET_ID_NONE,
     &level.use_custom_template,
@@ -3415,6 +3850,7 @@ static struct
     "use template",                    "use template for custom properties"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CUSTOM_ACCESSIBLE,       GADGET_ID_NONE,
     &custom_element_properties[EP_ACCESSIBLE],
@@ -3422,6 +3858,7 @@ static struct
     NULL,                              "player can walk to or pass this field"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_GRAV_REACHABLE,   GADGET_ID_NONE,
     &custom_element_properties[EP_GRAVITY_REACHABLE],
@@ -3429,6 +3866,7 @@ static struct
     "reachable despite gravity",       "player can walk/dig despite gravity"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_USE_LAST_VALUE,   GADGET_ID_NONE,
     &custom_element.use_last_ce_value,
@@ -3436,6 +3874,7 @@ static struct
     "use last CE value after change",  "use last CE value after change"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CUSTOM_WALK_TO_OBJECT,   GADGET_ID_NONE,
     &custom_element_properties[EP_WALK_TO_OBJECT],
@@ -3443,6 +3882,7 @@ static struct
     NULL,                              "player can dig/collect/push element"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_INDESTRUCTIBLE,   GADGET_ID_NONE,
     &custom_element_properties[EP_INDESTRUCTIBLE],
@@ -3453,6 +3893,7 @@ static struct
   // ---------- element settings: configure 2 (custom elements) ---------------
 
   {
+    ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_CAN_MOVE,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE],
@@ -3460,6 +3901,7 @@ static struct
     NULL,                              "element can move with some pattern"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_CAN_FALL,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_FALL],
@@ -3467,6 +3909,7 @@ static struct
     "can fall",                                "element can fall down"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_CAN_SMASH,                GADGET_ID_CUSTOM_CAN_FALL,
     &custom_element_properties[EP_CAN_SMASH],
@@ -3474,6 +3917,7 @@ static struct
     NULL,                              "element can smash other elements"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_SLIPPERY,         GADGET_ID_NONE,
     &custom_element_properties[EP_SLIPPERY],
@@ -3481,6 +3925,7 @@ static struct
     NULL,                              "other elements can fall down from it"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_DEADLY,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_DEADLY,           GADGET_ID_NONE,
     &custom_element_properties[EP_DEADLY],
@@ -3488,6 +3933,7 @@ static struct
     NULL,                              "element can kill the player"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_CAN_EXPLODE,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_EXPLODE],
@@ -3495,6 +3941,7 @@ static struct
     NULL,                              "element can explode"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_CUSTOM_EXPLODE_FIRE,     GADGET_ID_NONE,
     &custom_element_properties[EP_EXPLODES_BY_FIRE],
@@ -3502,6 +3949,7 @@ static struct
     "by fire",                         "element can explode by fire/explosion"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_CUSTOM_EXPLODE_SMASH,    GADGET_ID_CUSTOM_EXPLODE_FIRE,
     &custom_element_properties[EP_EXPLODES_SMASHED],
@@ -3509,6 +3957,7 @@ static struct
     "smashed",                         "element can explode when smashed"
   },
   {
+    ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT,
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_CUSTOM_EXPLODE_IMPACT,   GADGET_ID_CUSTOM_EXPLODE_SMASH,
     &custom_element_properties[EP_EXPLODES_IMPACT],
@@ -3519,6 +3968,7 @@ static struct
   // ---------- element settings: advanced (custom elements) ------------------
 
   {
+    ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_CAN_CHANGE,       GADGET_ID_NONE,
     &custom_element_change.can_change,
@@ -3526,6 +3976,7 @@ static struct
     "element changes to:",             "change element on specified condition"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_DELAY,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CHANGE_DELAY,            GADGET_ID_NONE,
     &custom_element_change_events[CE_DELAY],
@@ -3533,6 +3984,7 @@ static struct
     NULL,                              "element changes after delay"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CHANGE_BY_DIRECT_ACT,    GADGET_ID_NONE,
     &custom_element_change_events[CE_BY_DIRECT_ACTION],
@@ -3540,6 +3992,7 @@ static struct
     NULL,                              "element changes by direct action"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_CHANGE_BY_OTHER_ACT,     GADGET_ID_NONE,
     &custom_element_change_events[CE_BY_OTHER_ACTION],
@@ -3547,6 +4000,7 @@ static struct
     NULL,                              "element changes by other element"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CHANGE_USE_EXPLOSION,    GADGET_ID_NONE,
     &custom_element_change.explode,
@@ -3554,6 +4008,7 @@ static struct
     "explode instead of change",       "element explodes instead of change"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT,
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CHANGE_USE_CONTENT,      GADGET_ID_NONE,
     &custom_element_change.use_target_content,
@@ -3561,6 +4016,7 @@ static struct
     "use extended change target:",     "element changes to more elements"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CHANGE_ONLY_COMPLETE,    GADGET_ID_NONE,
     &custom_element_change.only_if_complete,
@@ -3568,6 +4024,7 @@ static struct
     "replace all or nothing",          "only replace when all can be changed"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM,
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_CHANGE_USE_RANDOM,       GADGET_ID_NONE,
     &custom_element_change.use_random_replace,
@@ -3575,6 +4032,7 @@ static struct
     NULL,                              "use percentage for random replace"
   },
   {
+    ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_CHANGE_HAS_ACTION,       GADGET_ID_NONE,
     &custom_element_change.has_action,
@@ -3585,6 +4043,7 @@ static struct
 
 static struct
 {
+  int gadget_type_id;
   int x, y;
   int xoffset, yoffset;
   int gadget_id;
@@ -3597,6 +4056,7 @@ static struct
   // ---------- level playfield content ---------------------------------------
 
   {
+    ED_DRAWING_ID_DRAWING_LEVEL,
     0,                                 0,
     0,                                 0,
     GADGET_ID_DRAWING_LEVEL,           GADGET_ID_NONE,
@@ -3608,6 +4068,7 @@ static struct
   // ---------- yam yam content -----------------------------------------------
 
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_0,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(0),    ED_AREA_YAMYAM_CONTENT_YOFF(0),
     GADGET_ID_YAMYAM_CONTENT_0,                GADGET_ID_NONE,
@@ -3615,6 +4076,7 @@ static struct
     NULL, NULL, NULL, "1",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_1,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(1),    ED_AREA_YAMYAM_CONTENT_YOFF(1),
     GADGET_ID_YAMYAM_CONTENT_1,                GADGET_ID_NONE,
@@ -3622,6 +4084,7 @@ static struct
     NULL, NULL, NULL, "2",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_2,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(2),    ED_AREA_YAMYAM_CONTENT_YOFF(2),
     GADGET_ID_YAMYAM_CONTENT_2,                GADGET_ID_NONE,
@@ -3629,6 +4092,7 @@ static struct
     NULL, NULL, NULL, "3",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_3,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(3),    ED_AREA_YAMYAM_CONTENT_YOFF(3),
     GADGET_ID_YAMYAM_CONTENT_3,                GADGET_ID_NONE,
@@ -3636,6 +4100,7 @@ static struct
     NULL, NULL, NULL, "4",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_4,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(4),    ED_AREA_YAMYAM_CONTENT_YOFF(4),
     GADGET_ID_YAMYAM_CONTENT_4,                GADGET_ID_NONE,
@@ -3643,6 +4108,7 @@ static struct
     NULL, NULL, NULL, "5",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_5,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(5),    ED_AREA_YAMYAM_CONTENT_YOFF(5),
     GADGET_ID_YAMYAM_CONTENT_5,                GADGET_ID_NONE,
@@ -3650,6 +4116,7 @@ static struct
     NULL, NULL, NULL, "6",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_6,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(6),    ED_AREA_YAMYAM_CONTENT_YOFF(6),
     GADGET_ID_YAMYAM_CONTENT_6,                GADGET_ID_NONE,
@@ -3657,6 +4124,7 @@ static struct
     NULL, NULL, NULL, "7",             NULL
   },
   {
+    ED_DRAWING_ID_YAMYAM_CONTENT_7,
     ED_AREA_YAMYAM_CONTENT_XPOS,       ED_AREA_YAMYAM_CONTENT_YPOS,
     ED_AREA_YAMYAM_CONTENT_XOFF(7),    ED_AREA_YAMYAM_CONTENT_YOFF(7),
     GADGET_ID_YAMYAM_CONTENT_7,                GADGET_ID_NONE,
@@ -3667,6 +4135,7 @@ static struct
   // ---------- magic ball content --------------------------------------------
 
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_0,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(0),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(0),
     GADGET_ID_MAGIC_BALL_CONTENT_0,    GADGET_ID_NONE,
@@ -3674,6 +4143,7 @@ static struct
     NULL, NULL, NULL, "1",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_1,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(1),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(1),
     GADGET_ID_MAGIC_BALL_CONTENT_1,    GADGET_ID_NONE,
@@ -3681,6 +4151,7 @@ static struct
     NULL, NULL, NULL, "2",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_2,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(2),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(2),
     GADGET_ID_MAGIC_BALL_CONTENT_2,    GADGET_ID_NONE,
@@ -3688,6 +4159,7 @@ static struct
     NULL, NULL, NULL, "3",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_3,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(3),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(3),
     GADGET_ID_MAGIC_BALL_CONTENT_3,    GADGET_ID_NONE,
@@ -3695,6 +4167,7 @@ static struct
     NULL, NULL, NULL, "4",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_4,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(4),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(4),
     GADGET_ID_MAGIC_BALL_CONTENT_4,    GADGET_ID_NONE,
@@ -3702,6 +4175,7 @@ static struct
     NULL, NULL, NULL, "5",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_5,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(5),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(5),
     GADGET_ID_MAGIC_BALL_CONTENT_5,    GADGET_ID_NONE,
@@ -3709,6 +4183,7 @@ static struct
     NULL, NULL, NULL, "6",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_6,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(6),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(6),
     GADGET_ID_MAGIC_BALL_CONTENT_6,    GADGET_ID_NONE,
@@ -3716,6 +4191,7 @@ static struct
     NULL, NULL, NULL, "7",             NULL
   },
   {
+    ED_DRAWING_ID_MAGIC_BALL_CONTENT_7,
     ED_AREA_MAGIC_BALL_CONTENT_XPOS,   ED_AREA_MAGIC_BALL_CONTENT_YPOS,
     ED_AREA_MAGIC_BALL_CONTENT_XOFF(7),        ED_AREA_MAGIC_BALL_CONTENT_YOFF(7),
     GADGET_ID_MAGIC_BALL_CONTENT_7,    GADGET_ID_NONE,
@@ -3726,6 +4202,7 @@ static struct
   // ---------- android content -----------------------------------------------
 
   {
+    ED_DRAWING_ID_ANDROID_CONTENT,
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(6),
     ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_ANDROID_CONTENT,         GADGET_ID_NONE,
@@ -3736,6 +4213,7 @@ static struct
   // ---------- amoeba content ------------------------------------------------
 
   {
+    ED_DRAWING_ID_AMOEBA_CONTENT,
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(3),
     ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_AMOEBA_CONTENT,          GADGET_ID_NONE,
@@ -3743,9 +4221,64 @@ static struct
     "content:", NULL, NULL, NULL,      "amoeba content"
   },
 
+  // ---------- BD amoeba content ------------------------------------------------
+
+  {
+    ED_DRAWING_ID_BD_AMOEBA_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"
+  },
+  {
+    ED_DRAWING_ID_BD_AMOEBA_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"
+  },
+
+  // ---------- BD amoeba 2 content ------------------------------------------------
+
+  {
+    ED_DRAWING_ID_BD_AMOEBA_2_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_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"
+  },
+  {
+    ED_DRAWING_ID_BD_AMOEBA_2_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_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"
+  },
+  {
+    ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING,
+    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_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"
+  },
+  {
+    ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_LOOKS_LIKE,
+    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_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"
+  },
+
   // ---------- level start element -------------------------------------------
 
   {
+    ED_DRAWING_ID_START_ELEMENT,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(10),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
@@ -3756,6 +4289,7 @@ static struct
   // ---------- player artwork element ----------------------------------------
 
   {
+    ED_DRAWING_ID_ARTWORK_ELEMENT,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(11),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
@@ -3766,6 +4300,7 @@ static struct
   // ---------- player explosion element --------------------------------------
 
   {
+    ED_DRAWING_ID_EXPLOSION_ELEMENT,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(12),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
@@ -3776,6 +4311,7 @@ static struct
   // ---------- player initial inventory --------------------------------------
 
   {
+    ED_DRAWING_ID_INVENTORY_CONTENT,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_INVENTORY_CONTENT,       GADGET_ID_USE_INITIAL_INVENTORY,
@@ -3786,6 +4322,7 @@ static struct
   // ---------- gray ball content -----------------------------------------
 
   {
+    ED_DRAWING_ID_MM_BALL_CONTENT,
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(2),
     ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_MM_BALL_CONTENT,         GADGET_ID_NONE,
@@ -3798,6 +4335,7 @@ static struct
   // ---------- custom graphic ------------------------------------------------
 
   {
+    ED_DRAWING_ID_CUSTOM_GRAPHIC,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_GRAPHIC,          GADGET_ID_CUSTOM_USE_GRAPHIC,
@@ -3810,6 +4348,7 @@ static struct
   // ---------- custom content (when exploding) -------------------------------
 
   {
+    ED_DRAWING_ID_CUSTOM_CONTENT,
     -1,                                        ED_AREA_3X3_SETTINGS_YPOS(11),
     0,                                 ED_AREA_3X3_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CONTENT,          GADGET_ID_NONE, // align three rows
@@ -3820,6 +4359,7 @@ static struct
   // ---------- custom enter and leave element (when moving) ------------------
 
   {
+    ED_DRAWING_ID_CUSTOM_MOVE_ENTER,
     ED_AREA_1X1_SETTINGS_XPOS(1),      ED_AREA_1X1_SETTINGS_YPOS(3),
     ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_MOVE_ENTER,       GADGET_ID_NONE,
@@ -3827,6 +4367,7 @@ static struct
     "can dig:", " ", NULL, NULL,       "element that can be digged/collected"
   },
   {
+    ED_DRAWING_ID_CUSTOM_MOVE_LEAVE,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(3),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_MOVE_LEAVE,       GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,
@@ -3839,6 +4380,7 @@ static struct
   // ---------- custom change target ------------------------------------------
 
   {
+    ED_DRAWING_ID_CUSTOM_CHANGE_TARGET,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_TARGET,    GADGET_ID_CUSTOM_CAN_CHANGE,
@@ -3849,6 +4391,7 @@ static struct
   // ---------- custom change content (extended change target) ----------------
 
   {
+    ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT,
     -1,                                        ED_AREA_3X3_SETTINGS_YPOS(9),
     0,                                 ED_AREA_3X3_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_CONTENT,   GADGET_ID_NONE, // align three rows
@@ -3859,6 +4402,7 @@ static struct
   // ---------- custom change trigger (element causing change) ----------------
 
   {
+    ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(5),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_TRIGGER,   GADGET_ID_CHANGE_OTHER_ACTION,
@@ -3869,6 +4413,7 @@ static struct
   // ---------- custom change action (element used for action) ----------------
 
   {
+    ED_DRAWING_ID_CUSTOM_CHANGE_ACTION,
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(13),
     0,                                 ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_CUSTOM_CHANGE_ACTION,    GADGET_ID_ACTION_ARG,
@@ -3879,6 +4424,7 @@ static struct
   // ---------- group element content -----------------------------------------
 
   {
+    ED_DRAWING_ID_GROUP_CONTENT,
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(2),
     ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
     GADGET_ID_GROUP_CONTENT,           GADGET_ID_NONE,
@@ -3889,6 +4435,7 @@ static struct
   // ---------- random background (for random painting) -----------------------
 
   {
+    ED_DRAWING_ID_RANDOM_BACKGROUND,
     -1,                                        ED_AREA_1X1_LSETTINGS_YPOS(1),
     0,                                 ED_AREA_1X1_LSETTINGS_YOFF,
     GADGET_ID_RANDOM_BACKGROUND,       GADGET_ID_RANDOM_RESTRICTED,
@@ -4059,21 +4606,101 @@ static int editor_hl_boulderdash_native[] =
 
 static int editor_el_boulderdash_native[] =
 {
+  EL_EMPTY,
+  EL_BD_SAND,
+  EL_BD_ROCK,
+  EL_BD_DIAMOND,
+
+  EL_BD_STEELWALL,
+  EL_BD_WALL,
+  EL_EMPTY,
+  EL_BD_MAGIC_WALL,
+
+  EL_BD_AMOEBA,
+  EL_BD_BUTTERFLY_UP,
+  EL_BD_FIREFLY_UP,
+  EL_BD_EXIT_CLOSED,
+
+  EL_BD_BUTTERFLY_LEFT,
+  EL_BD_FIREFLY_LEFT,
+  EL_BD_BUTTERFLY_RIGHT,
+  EL_BD_FIREFLY_RIGHT,
+
+  EL_BD_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_EMPTY,
+
+  EL_BD_BUTTERFLY_2_LEFT,
+  EL_BD_FIREFLY_2_LEFT,
+  EL_BD_BUTTERFLY_2_RIGHT,
+  EL_BD_FIREFLY_2_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_BUTTERFLY_2_DOWN,
+  EL_BD_FIREFLY_2_DOWN,
+  EL_EMPTY,
+
+  EL_EMPTY,
+  EL_BD_DRAGONFLY_UP,
+  EL_BD_STONEFLY_UP,
+  EL_EMPTY,
+
+  EL_BD_DRAGONFLY_LEFT,
+  EL_BD_STONEFLY_LEFT,
+  EL_BD_DRAGONFLY_RIGHT,
+  EL_BD_STONEFLY_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_DRAGONFLY_DOWN,
+  EL_BD_STONEFLY_DOWN,
+  EL_EMPTY,
+
+  EL_EMPTY,
+  EL_BD_BITER_UP,
+  EL_BD_COW_UP,
+  EL_EMPTY,
+
+  EL_BD_BITER_LEFT,
+  EL_BD_COW_LEFT,
+  EL_BD_BITER_RIGHT,
+  EL_BD_COW_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_BITER_DOWN,
+  EL_BD_COW_DOWN,
+  EL_EMPTY,
+
   EL_EMPTY,
   EL_BD_SAND,
   EL_BD_SAND_BALL,
   EL_BD_SAND_LOOSE,
 
-  EL_BD_SAND_SLOPED_UP_RIGHT,
   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_UP_RIGHT,
-  EL_BD_WALL_SLOPED_UP_LEFT,
   EL_BD_WALL_SLOPED_DOWN_LEFT,
   EL_BD_WALL_SLOPED_DOWN_RIGHT,
 
+  EL_BD_FLYING_DIAMOND,
+  EL_BD_FLYING_ROCK,
+  EL_BD_STEELWALL_SLOPED_UP_LEFT,
+  EL_BD_STEELWALL_SLOPED_UP_RIGHT,
+
+  EL_BD_NUT,
+  EL_BD_MEGA_ROCK,
+  EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
+  EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
+
   EL_BD_SAND_2,
   EL_BD_WALL_NON_SLOPED,
   EL_BD_WALL,
@@ -4084,26 +4711,11 @@ static int editor_el_boulderdash_native[] =
   EL_BD_INVISIBLE_EXIT_CLOSED,
   EL_BD_INVISIBLE_EXIT_OPEN,
 
-  EL_BD_STEELWALL_SLOPED_UP_RIGHT,
-  EL_BD_STEELWALL_SLOPED_UP_LEFT,
-  EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
-  EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
-
   EL_BD_STEELWALL,
   EL_BD_STEELWALL_EXPLODABLE,
   EL_BD_STEELWALL_DIGGABLE,
   EL_BD_WALL_DIGGABLE,
 
-  EL_BD_ROCK,
-  EL_BD_FLYING_ROCK,
-  EL_BD_MEGA_ROCK,
-  EL_BD_DIAMOND,
-
-  EL_BD_FLYING_DIAMOND,
-  EL_BD_NUT,
-  EL_BD_BLADDER_SPENDER,
-  EL_BD_INBOX,
-
   EL_BD_EXPANDABLE_WALL_HORIZONTAL,
   EL_BD_EXPANDABLE_WALL_VERTICAL,
   EL_BD_EXPANDABLE_WALL_ANY,
@@ -4157,7 +4769,7 @@ static int editor_el_boulderdash_native[] =
   EL_BD_AMOEBA,
   EL_BD_AMOEBA_2,
   EL_BD_REPLICATOR,
-  EL_EMPTY,
+  EL_BD_BLADDER_SPENDER,
 
   EL_BD_CONVEYOR_LEFT,
   EL_BD_CONVEYOR_RIGHT,
@@ -4174,46 +4786,6 @@ static int editor_el_boulderdash_native[] =
   EL_BD_CHASING_ROCK,
   EL_BD_GHOST,
 
-  EL_BD_COW_LEFT,
-  EL_BD_COW_UP,
-  EL_BD_COW_RIGHT,
-  EL_BD_COW_DOWN,
-
-  EL_BD_FIREFLY_LEFT,
-  EL_BD_FIREFLY_UP,
-  EL_BD_FIREFLY_RIGHT,
-  EL_BD_FIREFLY_DOWN,
-
-  EL_BD_FIREFLY_2_LEFT,
-  EL_BD_FIREFLY_2_UP,
-  EL_BD_FIREFLY_2_RIGHT,
-  EL_BD_FIREFLY_2_DOWN,
-
-  EL_BD_BUTTERFLY_LEFT,
-  EL_BD_BUTTERFLY_UP,
-  EL_BD_BUTTERFLY_RIGHT,
-  EL_BD_BUTTERFLY_DOWN,
-
-  EL_BD_BUTTERFLY_2_LEFT,
-  EL_BD_BUTTERFLY_2_UP,
-  EL_BD_BUTTERFLY_2_RIGHT,
-  EL_BD_BUTTERFLY_2_DOWN,
-
-  EL_BD_STONEFLY_LEFT,
-  EL_BD_STONEFLY_UP,
-  EL_BD_STONEFLY_RIGHT,
-  EL_BD_STONEFLY_DOWN,
-
-  EL_BD_BITER_UP,
-  EL_BD_BITER_RIGHT,
-  EL_BD_BITER_DOWN,
-  EL_BD_BITER_LEFT,
-
-  EL_BD_DRAGONFLY_LEFT,
-  EL_BD_DRAGONFLY_UP,
-  EL_BD_DRAGONFLY_RIGHT,
-  EL_BD_DRAGONFLY_DOWN,
-
   EL_BD_PLAYER,
   EL_BD_PLAYER_WITH_BOMB,
   EL_BD_PLAYER_GLUED,
@@ -6046,6 +6618,7 @@ static void ReinitializeElementList_EnableSections(void)
   }
   else if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
   {
+    setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
@@ -6521,6 +7094,7 @@ static void CreateControlButtons(void)
   // create toolbox buttons
   for (i = 0; i < ED_NUM_CTRL_BUTTONS; i++)
   {
+    int type_id = controlbutton_info[i].gadget_id;     // same as gadget ID here
     int id = controlbutton_info[i].gadget_id;
     int type = controlbutton_info[i].gadget_type;
     int graphic = controlbutton_info[i].graphic;
@@ -6544,6 +7118,9 @@ static void CreateControlButtons(void)
     int radio_button_nr = RADIO_NR_NONE;
     boolean checked = FALSE;
 
+    if (type_id != i)
+      Fail("'controlbutton_info' structure corrupted at index %d -- please fix", i);
+
     if (type == GD_TYPE_RADIO_BUTTON)
     {
       event_mask = GD_EVENT_PRESSED;
@@ -6604,7 +7181,7 @@ static void CreateControlButtons(void)
     }
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, controlbutton_info[i].infotext,
                      GDI_X, x,
@@ -6653,6 +7230,7 @@ static void CreateControlButtons(void)
   for (i = 0; i < ED_NUM_SCROLLBUTTONS; i++)
   {
     int id = scrollbutton_info[i].gadget_id;
+    int type_id = scrollbutton_info[i].gadget_type_id;
     int graphic = scrollbutton_info[i].graphic;
     struct GraphicInfo *gd = &graphic_info[graphic];
     Bitmap *gd_bitmap = gd->bitmap;
@@ -6666,6 +7244,9 @@ static void CreateControlButtons(void)
     int y = scrollbutton_pos[i].y;
     unsigned int event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
+    if (type_id != i)
+      Fail("'scrollbutton_info' structure corrupted at index %d -- please fix", i);
+
     if (id == GADGET_ID_SCROLL_LIST_UP ||
        id == GADGET_ID_SCROLL_LIST_DOWN)
     {
@@ -6679,7 +7260,7 @@ static void CreateControlButtons(void)
     }
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, scrollbutton_info[i].infotext,
                      GDI_X, x,
@@ -6704,6 +7285,7 @@ static void CreateControlButtons(void)
   // create buttons for element list
   for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
   {
+    int type_id = i;
     int id = GADGET_ID_ELEMENTLIST_FIRST + i;
     int graphic = IMG_EDITOR_PALETTE_BUTTON;
     struct GraphicInfo *gd = &graphic_info[graphic];
@@ -6728,7 +7310,7 @@ static void CreateControlButtons(void)
     deco_ypos = (gd->height - tile_size) / 2;
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, getElementInfoText(element),
                      GDI_X, x,
@@ -6762,9 +7344,13 @@ static void CreateCounterButtons(void)
 
   for (i = 0; i < ED_NUM_COUNTERBUTTONS; i++)
   {
-    int j;
+    int type_id = counterbutton_info[i].gadget_type_id;
     int x = SX + ED_SETTINGS_X(counterbutton_info[i].x); // down count button
     int y = SY + ED_SETTINGS_Y(counterbutton_info[i].y);
+    int j;
+
+    if (type_id != i)
+      Fail("'counterbutton_info' structure corrupted at index %d -- please fix", i);
 
     // determine horizontal position to the right of specified gadget
     if (counterbutton_info[i].gadget_id_align != GADGET_ID_NONE)
@@ -6824,7 +7410,7 @@ static void CreateCounterButtons(void)
              (j == 0 ? "decrease" : "increase"));
 
       gi = CreateGadget(GDI_CUSTOM_ID, id,
-                       GDI_CUSTOM_TYPE_ID, i,
+                       GDI_CUSTOM_TYPE_ID, type_id,
                        GDI_IMAGE_ID, graphic,
                        GDI_INFO_TEXT, infotext,
                        GDI_X, x,
@@ -6881,7 +7467,7 @@ static void CreateCounterButtons(void)
        gd_y2 = gd->src_y + gd->active_yoffset;
 
        gi = CreateGadget(GDI_CUSTOM_ID, id,
-                         GDI_CUSTOM_TYPE_ID, i,
+                         GDI_CUSTOM_TYPE_ID, type_id,
                          GDI_IMAGE_ID, graphic,
                          GDI_INFO_TEXT, "enter counter value",
                          GDI_X, x,
@@ -6927,6 +7513,7 @@ static void CreateDrawingAreas(void)
   {
     struct GadgetInfo *gi;
     int id = drawingarea_info[i].gadget_id;
+    int type_id = drawingarea_info[i].gadget_type_id;
     int x = SX + ED_AREA_SETTINGS_X(drawingarea_info[i]);
     int y = SY + ED_AREA_SETTINGS_Y(drawingarea_info[i]);
     int area_xsize = drawingarea_info[i].area_xsize;
@@ -6937,6 +7524,9 @@ static void CreateDrawingAreas(void)
       GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
       GD_EVENT_OFF_BORDERS | GD_EVENT_PIXEL_PRECISE;
 
+    if (type_id != i)
+      Fail("'drawingarea_info' structure corrupted at index %d -- please fix", i);
+
     // determine horizontal position to the right of specified gadget
     if (drawingarea_info[i].gadget_id_align != GADGET_ID_NONE)
       x = (right_gadget_border[drawingarea_info[i].gadget_id_align] +
@@ -6947,7 +7537,7 @@ static void CreateDrawingAreas(void)
       x += getTextWidthForDrawingArea(drawingarea_info[i].text_left);
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_X, x,
                      GDI_Y, y,
                      GDI_TYPE, GD_TYPE_DRAWING_AREA,
@@ -6983,8 +7573,12 @@ static void CreateTextInputGadgets(void)
     unsigned int event_mask = GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = textinput_info[i].gadget_id;
+    int type_id = textinput_info[i].gadget_type_id;
     int x, y;
 
+    if (type_id != i)
+      Fail("'textinput_info' structure corrupted at index %d -- please fix", i);
+
     if (i == ED_TEXTINPUT_ID_ELEMENT_NAME)
     {
       int element_border = graphic_info[IMG_EDITOR_ELEMENT_BORDER].border_size;
@@ -7011,7 +7605,7 @@ static void CreateTextInputGadgets(void)
     infotext[max_infotext_len] = '\0';
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_INFO_TEXT, infotext,
                      GDI_X, SX + x,
                      GDI_Y, SY + y,
@@ -7052,14 +7646,18 @@ static void CreateTextAreaGadgets(void)
     unsigned int event_mask = GD_EVENT_TEXT_LEAVING;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = textarea_info[i].gadget_id;
+    int type_id = textarea_info[i].gadget_type_id;
     int area_xsize = textarea_info[i].xsize;
     int area_ysize = textarea_info[i].ysize;
 
+    if (type_id != i)
+      Fail("'textarea_info' structure corrupted at index %d -- please fix", i);
+
     sprintf(infotext, "Enter %s", textarea_info[i].infotext);
     infotext[max_infotext_len] = '\0';
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_INFO_TEXT, infotext,
                      GDI_X, SX + ED_SETTINGS_X(textarea_info[i].x),
                      GDI_Y, SY + ED_SETTINGS_Y(textarea_info[i].y),
@@ -7100,11 +7698,15 @@ static void CreateSelectboxGadgets(void)
     struct GadgetInfo *gi;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = selectbox_info[i].gadget_id;
+    int type_id = selectbox_info[i].gadget_type_id;
     int x = SX + ED_SETTINGS_X(selectbox_info[i].x);
     int y = SY + ED_SETTINGS_Y(selectbox_info[i].y);
     unsigned int event_mask =
       GD_EVENT_RELEASED | GD_EVENT_TEXT_RETURN | GD_EVENT_TEXT_LEAVING;
 
+    if (type_id != i)
+      Fail("'selectbox_info' structure corrupted at index %d -- please fix", i);
+
     if (selectbox_info[i].size == -1)  // dynamically determine size
     {
       // (we cannot use -1 for uninitialized values if we directly compare
@@ -7132,7 +7734,7 @@ static void CreateSelectboxGadgets(void)
     infotext[max_infotext_len] = '\0';
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_INFO_TEXT, infotext,
                      GDI_X, x,
                      GDI_Y, y,
@@ -7170,8 +7772,9 @@ static void CreateTextbuttonGadgets(void)
   for (i = 0; i < ED_NUM_TEXTBUTTONS; i++)
   {
     int id = textbutton_info[i].gadget_id;
+    int type_id = textbutton_info[i].gadget_type_id;
     int is_tab_button =
-      ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_EDITOR) ||
+      ((id >= GADGET_ID_LEVELCONFIG_LEVEL && id <= GADGET_ID_LEVELCONFIG_ENGINE) ||
        (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE));
     int graphic =
       (is_tab_button ? IMG_EDITOR_TABBUTTON : IMG_EDITOR_TEXTBUTTON);
@@ -7192,6 +7795,9 @@ static void CreateTextbuttonGadgets(void)
     int x = SX + ED_SETTINGS_X(textbutton_info[i].x);
     int y = SY + ED_SETTINGS_Y(textbutton_info[i].y);
 
+    if (type_id != i)
+      Fail("'textbutton_info' structure corrupted at index %d -- please fix", i);
+
     if (textbutton_info[i].size == -1) // dynamically determine size
       textbutton_info[i].size = strlen(textbutton_info[i].text);
 
@@ -7214,7 +7820,7 @@ static void CreateTextbuttonGadgets(void)
       x += getTextWidthForGadget(textbutton_info[i].text_left);
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, infotext,
                      GDI_X, x,
@@ -7253,6 +7859,7 @@ static void CreateGraphicbuttonGadgets(void)
   for (i = 0; i < ED_NUM_GRAPHICBUTTONS; i++)
   {
     int id = graphicbutton_info[i].gadget_id;
+    int type_id = graphicbutton_info[i].gadget_type_id;
     int x = SX + ED_SETTINGS_X(graphicbutton_info[i].x);
     int y = SY + ED_SETTINGS_Y(graphicbutton_info[i].y);
     int graphic = graphicbutton_info[i].graphic;
@@ -7263,6 +7870,9 @@ static void CreateGraphicbuttonGadgets(void)
     int gd_y2 = gd->src_y + gd->pressed_yoffset;
     unsigned int event_mask = GD_EVENT_RELEASED;
 
+    if (type_id != i)
+      Fail("'graphicbutton_info' structure corrupted at index %d -- please fix", i);
+
     // determine horizontal position to the right of specified gadget
     if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE)
       x = (right_gadget_border[graphicbutton_info[i].gadget_id_align] +
@@ -7273,7 +7883,7 @@ static void CreateGraphicbuttonGadgets(void)
       x += getTextWidthForGadget(graphicbutton_info[i].text_left);
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, graphicbutton_info[i].infotext,
                      GDI_X, x,
@@ -7345,6 +7955,7 @@ static void CreateScrollbarGadgets(void)
   for (i = 0; i < ED_NUM_SCROLLBARS; i++)
   {
     int id = scrollbar_info[i].gadget_id;
+    int type_id = scrollbar_info[i].gadget_type_id;
     int graphic = scrollbar_info[i].graphic;
     struct GraphicInfo *gd = &graphic_info[graphic];
     int gd_x1 = gd->src_x;
@@ -7355,6 +7966,9 @@ static void CreateScrollbarGadgets(void)
     int items_max, items_visible, item_position;
     unsigned int event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
 
+    if (type_id != i)
+      Fail("'scrollbar_info' structure corrupted at index %d -- please fix", i);
+
     if (i == ED_SCROLLBAR_ID_LIST_VERTICAL)
     {
       items_max = num_editor_elements / ED_ELEMENTLIST_BUTTONS_HORIZ;
@@ -7378,7 +7992,7 @@ static void CreateScrollbarGadgets(void)
     }
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, scrollbar_info[i].infotext,
                      GDI_X, scrollbar_pos[i].x,
@@ -7417,6 +8031,7 @@ static void CreateCheckbuttonGadgets(void)
   for (i = 0; i < ED_NUM_CHECKBUTTONS; i++)
   {
     int id = checkbutton_info[i].gadget_id;
+    int type_id = checkbutton_info[i].gadget_type_id;
     int graphic = (id == GADGET_ID_STICK_ELEMENT ? IMG_EDITOR_STICKYBUTTON :
                   IMG_EDITOR_CHECKBOX);
     struct GraphicInfo *gd = &graphic_info[graphic];
@@ -7432,6 +8047,9 @@ static void CreateCheckbuttonGadgets(void)
     int y = SY + ED_SETTINGS_Y(checkbutton_info[i].y);
     unsigned int event_mask = GD_EVENT_PRESSED;
 
+    if (type_id != i)
+      Fail("'checkbutton_info' structure corrupted at index %d -- please fix", i);
+
     // determine horizontal position to the right of specified gadget
     if (checkbutton_info[i].gadget_id_align != GADGET_ID_NONE)
       x = (right_gadget_border[checkbutton_info[i].gadget_id_align] +
@@ -7442,7 +8060,7 @@ static void CreateCheckbuttonGadgets(void)
       x += getTextWidthForGadget(checkbutton_info[i].text_left);
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, checkbutton_info[i].infotext,
                      GDI_X, x,
@@ -7487,10 +8105,14 @@ static void CreateRadiobuttonGadgets(void)
   for (i = 0; i < ED_NUM_RADIOBUTTONS; i++)
   {
     int id = radiobutton_info[i].gadget_id;
+    int type_id = radiobutton_info[i].gadget_type_id;
     int x = SX + ED_SETTINGS_X(radiobutton_info[i].x);
     int y = SY + ED_SETTINGS_Y(radiobutton_info[i].y);
     unsigned int event_mask = GD_EVENT_PRESSED;
 
+    if (type_id != i)
+      Fail("'radiobutton_info' structure corrupted at index %d -- please fix", i);
+
     int checked =
       (*radiobutton_info[i].value == radiobutton_info[i].checked_value);
 
@@ -7504,7 +8126,7 @@ static void CreateRadiobuttonGadgets(void)
       x += getTextWidthForGadget(radiobutton_info[i].text_left);
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
-                     GDI_CUSTOM_TYPE_ID, i,
+                     GDI_CUSTOM_TYPE_ID, type_id,
                      GDI_IMAGE_ID, graphic,
                      GDI_INFO_TEXT, radiobutton_info[i].infotext,
                      GDI_X, x,
@@ -7627,17 +8249,10 @@ static void MapCounterButtons(int id)
 
   ModifyEditorCounterValue(id, *counterbutton_info[id].value);
 
-  // set position for "value[1,2,3,4]" counter gadgets (score in most cases)
-  if (id >= ED_COUNTER_ID_ELEMENT_VALUE1 &&
-      id <= ED_COUNTER_ID_ELEMENT_VALUE4)
-  {
-    ModifyGadget(gi_down, GDI_Y,
-                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-    ModifyGadget(gi_text, GDI_Y,
-                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-    ModifyGadget(gi_up,   GDI_Y,
-                SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-  }
+  // set position for counter gadgets with dynamically determined position
+  ModifyGadget(gi_down, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+  ModifyGadget(gi_text, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+  ModifyGadget(gi_up,   GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
 
   // vertical position might have changed after setting position above
   y = gi_up->y + yoffset;
@@ -7920,7 +8535,7 @@ static void MapMainDrawingArea(void)
     no_vertical_scrollbar   = (lev_fieldy <= ed_fieldy);
   }
 
-  for (i=ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++)
+  for (i = ED_SCROLLBUTTON_ID_AREA_FIRST; i <= ED_SCROLLBUTTON_ID_AREA_LAST; i++)
   {
     if (((i == ED_SCROLLBUTTON_ID_AREA_LEFT ||
          i == ED_SCROLLBUTTON_ID_AREA_RIGHT) &&
@@ -9468,10 +10083,14 @@ static void DrawLevelConfigTabulatorGadgets(void)
 {
   struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELCONFIG_LEVEL];
   Pixel tab_color = getTabulatorBarColor();
-  int id_first = ED_TAB_BUTTON_ID_LEVELCONFIG_FIRST;
-  int id_last  = ED_TAB_BUTTON_ID_LEVELCONFIG_LAST;
+  int id_first = ED_TEXTBUTTON_ID_LEVELCONFIG_LEVEL;
+  int id_last  = ED_TEXTBUTTON_ID_LEVELCONFIG_EDITOR;
   int i;
 
+  // draw additional "engine" tabulator when using native BD engine
+  if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    id_last = ED_TEXTBUTTON_ID_LEVELCONFIG_ENGINE;
+
   for (i = id_first; i <= id_last; i++)
   {
     int gadget_id = textbutton_info[i].gadget_id;
@@ -9654,11 +10273,11 @@ static void DrawLevelConfigEditor(void)
     MapCounterButtons(i);
 
   // draw checkbutton gadgets
-  for (i=ED_CHECKBUTTON_ID_EDITOR_FIRST; i<= ED_CHECKBUTTON_ID_EDITOR_LAST; i++)
+  for (i = ED_CHECKBUTTON_ID_EDITOR_FIRST; i <= ED_CHECKBUTTON_ID_EDITOR_LAST; i++)
     MapCheckbuttonGadget(i);
 
   // draw radiobutton gadgets
-  for (i=ED_RADIOBUTTON_ID_EDITOR_FIRST; i<= ED_RADIOBUTTON_ID_EDITOR_LAST; i++)
+  for (i = ED_RADIOBUTTON_ID_EDITOR_FIRST; i <= ED_RADIOBUTTON_ID_EDITOR_LAST; i++)
     MapRadiobuttonGadget(i);
 
   // draw drawing area
@@ -9668,6 +10287,31 @@ static void DrawLevelConfigEditor(void)
   MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE_2);
 }
 
+static void DrawLevelConfigEngine(void)
+{
+  int i;
+
+  // draw counter gadgets
+  if (level.bd_scheduling_type == GD_SCHEDULING_MILLISECONDS)
+  {
+    MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_MS);
+    MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES);
+  }
+  else
+  {
+    MapCounterButtons(ED_COUNTER_ID_BD_CYCLE_DELAY_C64);
+    MapCounterButtons(ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS);
+  }
+
+  // draw checkbutton gadgets
+  for (i = ED_CHECKBUTTON_ID_ENGINE_FIRST; i <= ED_CHECKBUTTON_ID_ENGINE_LAST; i++)
+    MapCheckbuttonGadget(i);
+
+  // draw selectbox gadgets
+  for (i = ED_SELECTBOX_ID_ENGINE_FIRST; i <= ED_SELECTBOX_ID_ENGINE_LAST; i++)
+    MapSelectboxGadget(i);
+}
+
 static void DrawLevelConfigWindow(void)
 {
   char *text = "Global Settings";
@@ -9695,6 +10339,8 @@ static void DrawLevelConfigWindow(void)
     DrawLevelConfigLevelSet();
   else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_EDITOR)
     DrawLevelConfigEditor();
+  else if (edit_mode_levelconfig == ED_MODE_LEVELCONFIG_ENGINE)
+    DrawLevelConfigEngine();
 }
 
 static void DrawCustomContentArea(void)
@@ -10140,10 +10786,15 @@ static void DrawPropertiesInfo(void)
 }
 
 #define TEXT_COLLECTING                "Score for collecting"
+#define TEXT_COLLECTING_EXTRA  "Score for extra diamonds"
 #define TEXT_SMASHING          "Score for smashing"
 #define TEXT_SLURPING          "Score for slurping robot"
 #define TEXT_CRACKING          "Score for cracking"
 #define TEXT_AMOEBA_SPEED      "Speed of amoeba growth"
+#define TEXT_AMOEBA_THRESHOED  "Size for turning to rocks"
+#define TEXT_AMOEBA_SLOW_TIME  "Slow growth time (seconds)"
+#define TEXT_AMOEBA_SLOW_RATE  "Slow growth rate (percent)"
+#define TEXT_AMOEBA_FAST_RATE  "Fast growth rate (percent)"
 #define TEXT_DURATION          "Duration when activated"
 #define TEXT_DELAY_ON          "Delay before activating"
 #define TEXT_DELAY_OFF         "Delay before deactivating"
@@ -10166,130 +10817,145 @@ static struct
   char *text;
 } elements_with_counter[] =
 {
-  { EL_EMERALD,                &level.score[SC_EMERALD],       TEXT_COLLECTING },
-  { EL_BD_DIAMOND,     &level.score[SC_EMERALD],       TEXT_COLLECTING },
-  { 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 },
-  { EL_SP_INFOTRON,    &level.score[SC_EMERALD],       TEXT_COLLECTING },
-  { EL_DIAMOND,                &level.score[SC_DIAMOND],       TEXT_COLLECTING },
-  { EL_CRYSTAL,                &level.score[SC_CRYSTAL],       TEXT_COLLECTING },
-  { EL_PEARL,          &level.score[SC_PEARL],         TEXT_COLLECTING },
-  { EL_BUG,            &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_BUG_RIGHT,      &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_BUG_UP,         &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_BUG_LEFT,       &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_BUG_DOWN,       &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_BD_BUTTERFLY,   &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_BD_BUTTERFLY_RIGHT,&level.score[SC_BUG],                TEXT_SMASHING   },
-  { EL_BD_BUTTERFLY_UP,   &level.score[SC_BUG],                TEXT_SMASHING   },
-  { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG],                TEXT_SMASHING   },
-  { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG],                TEXT_SMASHING   },
-  { EL_SP_ELECTRON,    &level.score[SC_BUG],           TEXT_SMASHING   },
-  { EL_SPACESHIP,      &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_SPACESHIP_RIGHT,        &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_SPACESHIP_UP,   &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_BD_FIREFLY,     &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_BD_FIREFLY_RIGHT,&level.score[SC_SPACESHIP],    TEXT_SMASHING   },
-  { EL_BD_FIREFLY_UP,  &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP],    TEXT_SMASHING   },
-  { EL_BD_FIREFLY_DOWN, &level.score[SC_SPACESHIP],    TEXT_SMASHING   },
-  { EL_SP_SNIKSNAK,    &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
-  { EL_YAMYAM,         &level.score[SC_YAMYAM],        TEXT_SMASHING   },
-  { EL_YAMYAM_LEFT,    &level.score[SC_YAMYAM],        TEXT_SMASHING   },
-  { EL_YAMYAM_RIGHT,   &level.score[SC_YAMYAM],        TEXT_SMASHING   },
-  { EL_YAMYAM_UP,      &level.score[SC_YAMYAM],        TEXT_SMASHING   },
-  { EL_YAMYAM_DOWN,    &level.score[SC_YAMYAM],        TEXT_SMASHING   },
-  { EL_DARK_YAMYAM,    &level.score[SC_YAMYAM],        TEXT_SMASHING   },
-  { EL_ROBOT,          &level.score[SC_ROBOT],         TEXT_SMASHING   },
-  { EL_PACMAN,         &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_PACMAN_RIGHT,   &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_PACMAN_UP,      &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_PACMAN_LEFT,    &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_PACMAN_DOWN,    &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_NUT,            &level.score[SC_NUT],           TEXT_CRACKING   },
-  { EL_DYNAMITE,       &level.score[SC_DYNAMITE],      TEXT_COLLECTING },
-  { EL_EM_DYNAMITE,    &level.score[SC_DYNAMITE],      TEXT_COLLECTING },
-  { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE], TEXT_COLLECTING },
-  { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE], TEXT_COLLECTING },
-  { EL_DYNABOMB_INCREASE_POWER,        &level.score[SC_DYNAMITE], TEXT_COLLECTING },
-  { EL_SHIELD_NORMAL,  &level.score[SC_SHIELD],        TEXT_COLLECTING },
-  { EL_SHIELD_DEADLY,  &level.score[SC_SHIELD],        TEXT_COLLECTING },
-  { EL_EXTRA_TIME,     &level.extra_time_score,        TEXT_COLLECTING },
-  { EL_KEY_1,          &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_KEY_2,          &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_KEY_3,          &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_KEY_4,          &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_1,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_2,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_3,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_4,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EMC_KEY_5,      &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EMC_KEY_6,      &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EMC_KEY_7,      &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EMC_KEY_8,      &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_DC_KEY_WHITE,   &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_MM_KETTLE,      &level.score[SC_EMERALD],       TEXT_COLLECTING },
-  { EL_DF_CELL,                &level.score[SC_EMERALD],       TEXT_COLLECTING },
-  { EL_MM_KEY,         &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_MM_LIGHTBALL,   &level.score[SC_ELEM_BONUS],    TEXT_COLLECTING },
-  { EL_MM_PACMAN,      &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_MM_PACMAN_RIGHT,        &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_MM_PACMAN_UP,   &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_MM_PACMAN_LEFT, &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_MM_PACMAN_DOWN, &level.score[SC_PACMAN],        TEXT_SMASHING   },
-  { EL_AMOEBA_WET,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
-  { EL_AMOEBA_DRY,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
-  { 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_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_ROBOT_WHEEL,    &level.time_wheel,              TEXT_DURATION   },
-
-  { EL_TIMEGATE_SWITCH,          &level.time_timegate,         TEXT_DURATION   },
-  { EL_DC_TIMEGATE_SWITCH,&level.time_timegate,                TEXT_DURATION   },
-  { EL_LIGHT_SWITCH,   &level.time_light,              TEXT_DURATION   },
-  { 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_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 },
-  { EL_GAME_OF_LIFE,   &level.game_of_life[1],         TEXT_GAME_OF_LIFE_2 },
-  { EL_GAME_OF_LIFE,   &level.game_of_life[2],         TEXT_GAME_OF_LIFE_3 },
-  { EL_GAME_OF_LIFE,   &level.game_of_life[3],         TEXT_GAME_OF_LIFE_4 },
-  { EL_BIOMAZE,                &level.biomaze[0],              TEXT_GAME_OF_LIFE_1 },
-  { EL_BIOMAZE,                &level.biomaze[1],              TEXT_GAME_OF_LIFE_2 },
-  { EL_BIOMAZE,                &level.biomaze[2],              TEXT_GAME_OF_LIFE_3 },
-  { EL_BIOMAZE,                &level.biomaze[3],              TEXT_GAME_OF_LIFE_4 },
-
-  { EL_EMC_ANDROID,    &level.android_move_time,       TEXT_MOVE_SPEED },
-  { EL_EMC_ANDROID,    &level.android_clone_time,      TEXT_CLONE_SPEED },
-  { EL_EMC_MAGIC_BALL, &level.ball_time,               TEXT_BALL_DELAY },
-  { EL_EMC_LENSES,     &level.lenses_score,            TEXT_COLLECTING },
-  { EL_EMC_MAGNIFIER,  &level.magnify_score,           TEXT_COLLECTING },
-  { EL_SPRING,         &level.slurp_score,             TEXT_SLURPING   },
-  { EL_SPRING_LEFT,    &level.slurp_score,             TEXT_SLURPING   },
-  { EL_SPRING_RIGHT,   &level.slurp_score,             TEXT_SLURPING   },
-  { EL_EMC_LENSES,     &level.lenses_time,             TEXT_DURATION   },
-  { EL_EMC_MAGNIFIER,  &level.magnify_time,            TEXT_DURATION   },
-  { EL_MM_FUSE_ACTIVE, &level.mm_time_fuse,            TEXT_DELAY_OFF  },
-  { EL_MM_BOMB,                &level.mm_time_bomb,            TEXT_DELAY_EXPLODING },
-  { EL_MM_GRAY_BALL,   &level.mm_time_ball,            TEXT_DELAY_CHANGING },
-  { EL_MM_STEEL_BLOCK, &level.mm_time_block,           TEXT_DELAY_MOVING },
-  { EL_MM_WOODEN_BLOCK,        &level.mm_time_block,           TEXT_DELAY_MOVING },
-
-  { -1,                        NULL,                           NULL            }
+  { 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_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         },
+  { EL_SP_INFOTRON,            &level.score[SC_EMERALD],       TEXT_COLLECTING         },
+  { EL_DIAMOND,                        &level.score[SC_DIAMOND],       TEXT_COLLECTING         },
+  { EL_CRYSTAL,                        &level.score[SC_CRYSTAL],       TEXT_COLLECTING         },
+  { EL_PEARL,                  &level.score[SC_PEARL],         TEXT_COLLECTING         },
+  { EL_BUG,                    &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BUG_RIGHT,              &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BUG_UP,                 &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BUG_LEFT,               &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BUG_DOWN,               &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY,           &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_RIGHT,     &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_UP,                &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_LEFT,      &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_DOWN,      &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_SP_ELECTRON,            &level.score[SC_BUG],           TEXT_SMASHING           },
+  { EL_SPACESHIP,              &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_SPACESHIP_RIGHT,                &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_SPACESHIP_UP,           &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_SPACESHIP_LEFT,         &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_SPACESHIP_DOWN,         &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_BD_FIREFLY,             &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_BD_FIREFLY_RIGHT,       &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_BD_FIREFLY_UP,          &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_BD_FIREFLY_LEFT,                &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_BD_FIREFLY_DOWN,                &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_SP_SNIKSNAK,            &level.score[SC_SPACESHIP],     TEXT_SMASHING           },
+  { EL_YAMYAM,                 &level.score[SC_YAMYAM],        TEXT_SMASHING           },
+  { EL_YAMYAM_LEFT,            &level.score[SC_YAMYAM],        TEXT_SMASHING           },
+  { EL_YAMYAM_RIGHT,           &level.score[SC_YAMYAM],        TEXT_SMASHING           },
+  { EL_YAMYAM_UP,              &level.score[SC_YAMYAM],        TEXT_SMASHING           },
+  { EL_YAMYAM_DOWN,            &level.score[SC_YAMYAM],        TEXT_SMASHING           },
+  { EL_DARK_YAMYAM,            &level.score[SC_YAMYAM],        TEXT_SMASHING           },
+  { EL_ROBOT,                  &level.score[SC_ROBOT],         TEXT_SMASHING           },
+  { EL_PACMAN,                 &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_PACMAN_RIGHT,           &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_PACMAN_UP,              &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_PACMAN_LEFT,            &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_PACMAN_DOWN,            &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_NUT,                    &level.score[SC_NUT],           TEXT_CRACKING           },
+  { EL_DYNAMITE,               &level.score[SC_DYNAMITE],      TEXT_COLLECTING         },
+  { EL_EM_DYNAMITE,            &level.score[SC_DYNAMITE],      TEXT_COLLECTING         },
+  { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE],     TEXT_COLLECTING         },
+  { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE],      TEXT_COLLECTING         },
+  { EL_DYNABOMB_INCREASE_POWER,        &level.score[SC_DYNAMITE],      TEXT_COLLECTING         },
+  { EL_SHIELD_NORMAL,          &level.score[SC_SHIELD],        TEXT_COLLECTING         },
+  { EL_SHIELD_DEADLY,          &level.score[SC_SHIELD],        TEXT_COLLECTING         },
+  { EL_EXTRA_TIME,             &level.extra_time_score,        TEXT_COLLECTING         },
+  { EL_KEY_1,                  &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_KEY_2,                  &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_KEY_3,                  &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_KEY_4,                  &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EM_KEY_1,               &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EM_KEY_2,               &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EM_KEY_3,               &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EM_KEY_4,               &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EMC_KEY_5,              &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EMC_KEY_6,              &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EMC_KEY_7,              &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_EMC_KEY_8,              &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_DC_KEY_WHITE,           &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_MM_KETTLE,              &level.score[SC_EMERALD],       TEXT_COLLECTING         },
+  { EL_DF_CELL,                        &level.score[SC_EMERALD],       TEXT_COLLECTING         },
+  { EL_MM_KEY,                 &level.score[SC_KEY],           TEXT_COLLECTING         },
+  { EL_MM_LIGHTBALL,           &level.score[SC_ELEM_BONUS],    TEXT_COLLECTING         },
+  { EL_MM_PACMAN,              &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_MM_PACMAN_RIGHT,                &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_MM_PACMAN_UP,           &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_MM_PACMAN_LEFT,         &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_MM_PACMAN_DOWN,         &level.score[SC_PACMAN],        TEXT_SMASHING           },
+  { EL_AMOEBA_WET,             &level.amoeba_speed,            TEXT_AMOEBA_SPEED       },
+  { EL_AMOEBA_DRY,             &level.amoeba_speed,            TEXT_AMOEBA_SPEED       },
+  { 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_BD_AMOEBA,              &level.bd_amoeba_fast_growth_rate,      TEXT_AMOEBA_FAST_RATE   },
+  { 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_BD_AMOEBA_2,            &level.bd_amoeba_2_fast_growth_rate,    TEXT_AMOEBA_FAST_RATE   },
+  { 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_ROBOT_WHEEL,            &level.time_wheel,              TEXT_DURATION           },
+  { EL_TIMEGATE_SWITCH,                &level.time_timegate,           TEXT_DURATION           },
+  { EL_DC_TIMEGATE_SWITCH,     &level.time_timegate,           TEXT_DURATION           },
+  { EL_LIGHT_SWITCH,           &level.time_light,              TEXT_DURATION           },
+  { 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_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     },
+  { EL_GAME_OF_LIFE,           &level.game_of_life[1],         TEXT_GAME_OF_LIFE_2     },
+  { EL_GAME_OF_LIFE,           &level.game_of_life[2],         TEXT_GAME_OF_LIFE_3     },
+  { EL_GAME_OF_LIFE,           &level.game_of_life[3],         TEXT_GAME_OF_LIFE_4     },
+  { EL_BIOMAZE,                        &level.biomaze[0],              TEXT_GAME_OF_LIFE_1     },
+  { EL_BIOMAZE,                        &level.biomaze[1],              TEXT_GAME_OF_LIFE_2     },
+  { EL_BIOMAZE,                        &level.biomaze[2],              TEXT_GAME_OF_LIFE_3     },
+  { EL_BIOMAZE,                        &level.biomaze[3],              TEXT_GAME_OF_LIFE_4     },
+  { EL_EMC_ANDROID,            &level.android_move_time,       TEXT_MOVE_SPEED         },
+  { EL_EMC_ANDROID,            &level.android_clone_time,      TEXT_CLONE_SPEED        },
+  { EL_EMC_MAGIC_BALL,         &level.ball_time,               TEXT_BALL_DELAY         },
+  { EL_EMC_LENSES,             &level.lenses_score,            TEXT_COLLECTING         },
+  { EL_EMC_MAGNIFIER,          &level.magnify_score,           TEXT_COLLECTING         },
+  { EL_SPRING,                 &level.slurp_score,             TEXT_SLURPING           },
+  { EL_SPRING_LEFT,            &level.slurp_score,             TEXT_SLURPING           },
+  { EL_SPRING_RIGHT,           &level.slurp_score,             TEXT_SLURPING           },
+  { EL_EMC_LENSES,             &level.lenses_time,             TEXT_DURATION           },
+  { EL_EMC_MAGNIFIER,          &level.magnify_time,            TEXT_DURATION           },
+  { EL_MM_FUSE_ACTIVE,         &level.mm_time_fuse,            TEXT_DELAY_OFF          },
+  { EL_MM_BOMB,                        &level.mm_time_bomb,            TEXT_DELAY_EXPLODING    },
+  { EL_MM_GRAY_BALL,           &level.mm_time_ball,            TEXT_DELAY_CHANGING     },
+  { EL_MM_STEEL_BLOCK,         &level.mm_time_block,           TEXT_DELAY_MOVING       },
+  { EL_MM_WOODEN_BLOCK,                &level.mm_time_block,           TEXT_DELAY_MOVING       },
+
+  { -1,                                NULL,                           NULL                    }
 };
 
 static boolean checkPropertiesConfig(int element)
 {
   int i;
 
+  // special case: empty space customization only available in R'n'D game engine
+  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) ||
@@ -10300,18 +10966,24 @@ static boolean checkPropertiesConfig(int element)
       IS_MM_MCDUFFIN(element) ||
       IS_DF_LASER(element) ||
       IS_PLAYER_ELEMENT(element) ||
+      IS_BD_PLAYER_ELEMENT(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_SOKOBAN_OBJECT ||
-      element == EL_SOKOBAN_FIELD_EMPTY ||
-      element == EL_SOKOBAN_FIELD_FULL)
+      element == EL_BD_ROCK ||
+      element == EL_BD_MEGA_ROCK ||
+      element == EL_BD_SWEET)
+  {
     return TRUE;
+  }
   else
+  {
     for (i = 0; elements_with_counter[i].element != -1; i++)
       if (elements_with_counter[i].element == element)
        return TRUE;
+  }
 
   return FALSE;
 }
@@ -10397,6 +11069,24 @@ static void DrawPropertiesConfig(void)
   {
     if (elements_with_counter[i].element == properties_element)
     {
+      // 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 =
@@ -10408,6 +11098,12 @@ static void DrawPropertiesConfig(void)
                (properties_element == EL_EMC_MAGIC_BALL     ? 2 : 0) +
                num_element_counters);
 
+      // 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);
+
       counterbutton_info[counter_id].value = elements_with_counter[i].value;
       counterbutton_info[counter_id].text_right = elements_with_counter[i].text;
 
@@ -10417,6 +11113,12 @@ static void DrawPropertiesConfig(void)
        counterbutton_info[counter_id].min_value = 0;   // min neighbours
        counterbutton_info[counter_id].max_value = 8;   // max neighbours
       }
+      else if (strEqual(elements_with_counter[i].text, TEXT_AMOEBA_SLOW_RATE) ||
+              strEqual(elements_with_counter[i].text, TEXT_AMOEBA_FAST_RATE))
+      {
+       counterbutton_info[counter_id].min_value = 0;   // min percent
+       counterbutton_info[counter_id].max_value = 100; // max percent
+      }
       else
       {
        // !!! CHANGE THIS FOR CERTAIN ELEMENTS !!!
@@ -10437,7 +11139,26 @@ static void DrawPropertiesConfig(void)
     // draw stickybutton gadget
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
-    if (IS_AMOEBOID(properties_element))
+    if (properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+    {
+      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);
+    }
+    else if (properties_element == EL_BD_AMOEBA_2)
+    {
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_WAIT_FOR_HATCHING);
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_START_IMMEDIATELY);
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA);
+
+      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_TOO_BIG);
+      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_ENCLOSED);
+      MapDrawingArea(ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_EXPLODING);
+      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_YAMYAM ||
             properties_element == EL_YAMYAM_LEFT ||
@@ -10538,7 +11259,56 @@ static void DrawPropertiesConfig(void)
     }
   }
 
-  if (IS_GEM(properties_element))
+  if (IS_BD_PLAYER_ELEMENT(properties_element))
+  {
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
+      ED_ELEMENT_SETTINGS_YPOS(2);
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(3);
+    checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(4);
+
+    // draw checkbutton gadgets
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
+
+    // draw counter gadgets
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+  }
+
+  if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
+      ED_ELEMENT_SETTINGS_YPOS(0);
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(1);
+
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+  }
+
+  if (properties_element == EL_BD_MEGA_ROCK ||
+      properties_element == EL_BD_SWEET)
+  {
+    counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(0);
+    checkbutton_info[ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET].y =
+      ED_ELEMENT_SETTINGS_YPOS(1);
+
+    MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
+  }
+
+  if (properties_element == EL_BD_MAGIC_WALL)
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA);
+  }
+
+  // special case: slippery walls option for gems only available in R'n'D game engine
+  if (IS_GEM(properties_element) && level.game_engine_type == GAME_ENGINE_TYPE_RND)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
 
   if (properties_element == EL_EM_DYNAMITE)
@@ -10575,7 +11345,7 @@ static void DrawPropertiesConfig(void)
       properties_element == EL_BIOMAZE)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_LIFE_BUGS);
 
-  if (CAN_GROW(properties_element))
+  if (CAN_GROW(properties_element) && level.game_engine_type != GAME_ENGINE_TYPE_BD)
   {
     checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y =
       ED_ELEMENT_SETTINGS_YPOS(HAS_EDITOR_CONTENT(properties_element) ? 1 : 0);
@@ -14155,10 +14925,18 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
   }
   else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE)
   {
-    // update element selection list
+    // show or hide "engine" tabulator depending on game engine type
+    DrawLevelConfigWindow();
+
+    // update element selection list depending on game engine type
     ReinitializeElementList();
     ModifyEditorElementList();
   }
+  else if (type_id == ED_SELECTBOX_ID_BD_SCHEDULING_TYPE)
+  {
+    // update BD cycle delay counter gadgets depending on BD scheduling type
+    DrawLevelConfigWindow();
+  }
 
   // do not mark level as modified for certain non-level-changing gadgets
   if (type_id == ED_SELECTBOX_ID_LEVELSET_SAVE_MODE ||