added support for sand (dirt) settings in BD engine to level editor
[rocksndiamonds.git] / src / editor.c
index a3fc486f04d8e10a367493c20eac118646480796..73d2c36f336d13cedc4b39741d0823a8b06670b7 100644 (file)
@@ -557,16 +557,32 @@ enum
   GADGET_ID_ANDROID_CONTENT,
   GADGET_ID_AMOEBA_CONTENT,
   GADGET_ID_BD_SNAP_ELEMENT,
+  GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO,
+  GADGET_ID_BD_MAGIC_WALL_ROCK_TO,
+  GADGET_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,
+  GADGET_ID_BD_MAGIC_WALL_NUT_TO,
+  GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
+  GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
+  GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
   GADGET_ID_BD_AMOEBA_CONTENT_TOO_BIG,
   GADGET_ID_BD_AMOEBA_CONTENT_ENCLOSED,
   GADGET_ID_BD_AMOEBA_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_BD_SLIME_EATS_ELEMENT_1,
+  GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1,
+  GADGET_ID_BD_SLIME_EATS_ELEMENT_2,
+  GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2,
+  GADGET_ID_BD_SLIME_EATS_ELEMENT_3,
+  GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3,
   GADGET_ID_BD_ACID_EATS_ELEMENT,
   GADGET_ID_BD_ACID_TURNS_TO_ELEMENT,
   GADGET_ID_BD_BITER_EATS_ELEMENT,
   GADGET_ID_BD_BLADDER_CONVERTS_BY_ELEMENT,
+  GADGET_ID_BD_NUT_CONTENT,
+  GADGET_ID_BD_EXPANDING_WALL_LOOKS_LIKE,
+  GADGET_ID_BD_SAND_LOOKS_LIKE,
   GADGET_ID_START_ELEMENT,
   GADGET_ID_ARTWORK_ELEMENT,
   GADGET_ID_EXPLOSION_ELEMENT,
@@ -731,6 +747,10 @@ enum
   GADGET_ID_BD_SLIME_IS_PREDICTABLE,
   GADGET_ID_BD_CHANGE_EXPANDING_WALL,
   GADGET_ID_BD_REPLICATORS_ACTIVE,
+  GADGET_ID_BD_CONVEYOR_BELTS_ACTIVE,
+  GADGET_ID_BD_CONVEYOR_BELTS_CHANGED,
+  GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN,
+  GADGET_ID_BD_HAMMER_WALLS_REAPPEAR,
   GADGET_ID_ENVELOPE_AUTOWRAP,
   GADGET_ID_ENVELOPE_CENTERED,
   GADGET_ID_MM_LASER_RED,
@@ -1078,6 +1098,10 @@ enum
   ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE,
   ED_CHECKBUTTON_ID_BD_CHANGE_EXPANDING_WALL,
   ED_CHECKBUTTON_ID_BD_REPLICATORS_ACTIVE,
+  ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE,
+  ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED,
+  ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN,
+  ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR,
   ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
   ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
   ED_CHECKBUTTON_ID_MM_LASER_RED,
@@ -1174,16 +1198,32 @@ enum
   ED_DRAWING_ID_ANDROID_CONTENT,
   ED_DRAWING_ID_AMOEBA_CONTENT,
   ED_DRAWING_ID_BD_SNAP_ELEMENT,
+  ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO,
+  ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO,
+  ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,
+  ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO,
+  ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
+  ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
+  ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
   ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG,
   ED_DRAWING_ID_BD_AMOEBA_CONTENT_ENCLOSED,
   ED_DRAWING_ID_BD_AMOEBA_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_BD_SLIME_EATS_ELEMENT_1,
+  ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1,
+  ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_2,
+  ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2,
+  ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_3,
+  ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3,
   ED_DRAWING_ID_BD_ACID_EATS_ELEMENT,
   ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT,
   ED_DRAWING_ID_BD_BITER_EATS_ELEMENT,
   ED_DRAWING_ID_BD_BLADDER_CONVERTS_BY_ELEMENT,
+  ED_DRAWING_ID_BD_NUT_CONTENT,
+  ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE,
+  ED_DRAWING_ID_BD_SAND_LOOKS_LIKE,
   ED_DRAWING_ID_START_ELEMENT,
   ED_DRAWING_ID_ARTWORK_ELEMENT,
   ED_DRAWING_ID_EXPLOSION_ELEMENT,
@@ -3736,7 +3776,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING,
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_BD_MAGIC_WALL_WAIT_HATCHING, GADGET_ID_NONE,
     &level.bd_magic_wall_wait_hatching,
     NULL, NULL,
@@ -3744,7 +3784,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA,
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_BD_MAGIC_WALL_STOPS_AMOEBA, GADGET_ID_NONE,
     &level.bd_magic_wall_stops_amoeba,
     NULL, NULL,
@@ -3808,7 +3848,7 @@ static struct
   },
   {
     ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE,
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_BD_SLIME_IS_PREDICTABLE, GADGET_ID_NONE,
     &level.bd_slime_is_predictable,
     NULL, NULL,
@@ -3830,6 +3870,38 @@ static struct
     NULL, NULL,
     "Active at start",                 "Replicators start in active state"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_CONVEYOR_BELTS_ACTIVE,        GADGET_ID_NONE,
+    &level.bd_conveyor_belts_active,
+    NULL, NULL,
+    "Active at start",                 "Conveyor belts start in active state"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_CONVEYOR_BELTS_CHANGED, GADGET_ID_NONE,
+    &level.bd_conveyor_belts_changed,
+    NULL, NULL,
+    "Change direction",                        "Switch conveyor belt direction"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_WATER_CANNOT_FLOW_DOWN, GADGET_ID_NONE,
+    &level.bd_water_cannot_flow_down,
+    NULL, NULL,
+    "Does not flow downwards",         "Water can only flow up, left and right"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_HAMMER_WALLS_REAPPEAR, GADGET_ID_NONE,
+    &level.bd_hammer_walls_reappear,
+    NULL, NULL,
+    "Hammered walls reappear",         "Hammered walls reappear after delay"
+  },
   {
     ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
@@ -4312,6 +4384,65 @@ static struct
     "Snap element:", NULL, NULL, NULL, "Element created when snapping"
   },
 
+  // ---------- BD magic wall elements ----------------------------------------
+
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(4),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_DIAMOND_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_diamond_to,   1, 1,
+    "Changes diamonds to:", NULL, NULL, NULL,  "Element to turn diamonds to"
+  },
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(5),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_ROCK_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_rock_to,      1, 1,
+    "Changes rocks to:", NULL, NULL, NULL,     "Element to turn rocks to"
+  },
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(6),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_MEGA_ROCK_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_mega_rock_to, 1, 1,
+    "Changes mega rocks to:", NULL, NULL, NULL,        "Element to turn mega rocks to"
+  },
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(7),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_NUT_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_nut_to,       1, 1,
+    "Changes nuts to:", NULL, NULL, NULL,      "Element to turn nuts to"
+  },
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(8),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_NITRO_PACK_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_nitro_pack_to,        1, 1,
+    "Changes nitro packs to:", NULL, NULL, NULL,       "Element to turn nitro packs to"
+  },
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(9),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_flying_diamond_to, 1, 1,
+    "Changes flying diamonds to:", NULL, NULL, NULL,   "Element to turn flying diamonds to"
+  },
+  {
+    ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(10),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_MAGIC_WALL_FLYING_ROCK_TO, GADGET_ID_NONE,
+    &level.bd_magic_wall_flying_rock_to, 1, 1,
+    "Changes flying rocks to:", NULL, NULL, NULL,      "Element to turn flying rocks to"
+  },
+
   // ---------- BD amoeba content ---------------------------------------------
 
   {
@@ -4365,6 +4496,54 @@ static struct
     &level.bd_amoeba_2_content_looks_like,     1, 1,
     "Use graphic of element:", NULL, NULL, NULL,       "BD amoeba 2 looks like this element"
   },
+  {
+    ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(5),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_SLIME_EATS_ELEMENT_1, GADGET_ID_NONE,
+    &level.bd_slime_eats_element_1,    1, 1,
+    "Can eat:", NULL, NULL, NULL,      "Element that can be eaten"
+  },
+  {
+    ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(5),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1, GADGET_ID_BD_SLIME_EATS_ELEMENT_1,
+    &level.bd_slime_converts_to_element_1,     1, 1,
+    " and convert to:", NULL, NULL, NULL,      "Eaten element is converted to"
+  },
+  {
+    ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_2,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(6),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_SLIME_EATS_ELEMENT_2, GADGET_ID_NONE,
+    &level.bd_slime_eats_element_2,    1, 1,
+    "Can eat:", NULL, NULL, NULL,      "Element that can be eaten"
+  },
+  {
+    ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(6),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2, GADGET_ID_BD_SLIME_EATS_ELEMENT_2,
+    &level.bd_slime_converts_to_element_2,     1, 1,
+    " and convert to:", NULL, NULL, NULL,      "Eaten element is converted to"
+  },
+  {
+    ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_3,
+    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_SLIME_EATS_ELEMENT_3, GADGET_ID_NONE,
+    &level.bd_slime_eats_element_3,    1, 1,
+    "Can eat:", NULL, NULL, NULL,      "Element that can be eaten"
+  },
+  {
+    ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3,
+    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_SLIME_CONVERTS_TO_ELEMENT_3, GADGET_ID_BD_SLIME_EATS_ELEMENT_3,
+    &level.bd_slime_converts_to_element_3,     1, 1,
+    " and convert to:", NULL, NULL, NULL,      "Eaten element is converted to"
+  },
   {
     ED_DRAWING_ID_BD_ACID_EATS_ELEMENT,
     ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(1),
@@ -4397,6 +4576,30 @@ static struct
     &level.bd_bladder_converts_by_element,     1, 1,
     "Turns to clock by touching:", NULL, NULL, NULL,   "Turns to clock by touching element"
   },
+  {
+    ED_DRAWING_ID_BD_NUT_CONTENT,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(1),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_NUT_CONTENT,          GADGET_ID_NONE,
+    &level.bd_nut_content,             1, 1,
+    "When breaking, changes to:", NULL, NULL, NULL,    "Element created when breaking nut"
+  },
+  {
+    ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(1),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_EXPANDING_WALL_LOOKS_LIKE, GADGET_ID_NONE,
+    &level.bd_expanding_wall_looks_like,       1, 1,
+    "Use graphic of element:", NULL, NULL, NULL,       "Expanding wall looks like this element"
+  },
+  {
+    ED_DRAWING_ID_BD_SAND_LOOKS_LIKE,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(0),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_SAND_LOOKS_LIKE, GADGET_ID_NONE,
+    &level.bd_sand_looks_like, 1, 1,
+    "Use graphic of element:", NULL, NULL, NULL,       "Sand looks like this element"
+  },
 
   // ---------- level start element -------------------------------------------
 
@@ -4644,6 +4847,7 @@ static boolean getDrawModeHiRes(void);
 static int getTabulatorBarWidth(void);
 static int getTabulatorBarHeight(void);
 static Pixel getTabulatorBarColor(void);
+static void getEditorGraphicAndFrame(int, int *, int *, boolean);
 static int numHiresTiles(int);
 
 static int num_editor_gadgets = 0;     // dynamically determined
@@ -4852,7 +5056,7 @@ static int editor_el_boulderdash_native[] =
   EL_BD_CONVEYOR_LEFT,
   EL_BD_CONVEYOR_RIGHT,
   EL_BD_CONVEYOR_SWITCH,
-  EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,
+  EL_BD_CONVEYOR_DIR_SWITCH_NORMAL,
 
   EL_BD_CLOCK,
   EL_BD_TIME_PENALTY,
@@ -4879,10 +5083,10 @@ static int editor_el_boulderdash_native[] =
   EL_BD_WALL_KEY_3,
   EL_BD_WALL_DIAMOND,
 
+  EL_BD_POT,
   EL_BD_GRAVITY_SWITCH,
   EL_BD_PNEUMATIC_HAMMER,
   EL_BD_TELEPORTER,
-  EL_BD_POT,
 
   EL_BD_PLAYER,
   EL_BD_PLAYER_WITH_BOMB,
@@ -4894,6 +5098,141 @@ static int *editor_el_boulderdash_native_ptr = editor_el_boulderdash_native;
 static int num_editor_hl_boulderdash_native = ARRAY_SIZE(editor_hl_boulderdash_native);
 static int num_editor_el_boulderdash_native = ARRAY_SIZE(editor_el_boulderdash_native);
 
+static int editor_hl_boulderdash_effects[] =
+{
+  EL_INTERNAL_CASCADE_BD_EFFECTS_ACTIVE,
+  EL_CHAR('B'),
+  EL_CHAR('D'),
+  EL_CHAR('E'),
+};
+
+static int editor_el_boulderdash_effects[] =
+{
+  EL_BD_DIAMOND_FALLING,
+  EL_BD_ROCK_FALLING,
+  EL_BD_MEGA_ROCK_FALLING,
+  EL_BD_FLYING_DIAMOND_FLYING,
+
+  EL_BD_FALLING_WALL_FALLING,
+  EL_BD_NITRO_PACK_FALLING,
+  EL_BD_NUT_FALLING,
+  EL_BD_FLYING_ROCK_FLYING,
+
+  EL_BD_PLAYER_GROWING_1,
+  EL_BD_PLAYER_GROWING_2,
+  EL_BD_PLAYER_GROWING_3,
+  EL_BD_PLAYER,
+
+  EL_BD_PLAYER_WITH_BOMB,
+  EL_BD_PLAYER_STIRRING,
+  EL_BD_EXIT_OPEN,
+  EL_BD_INVISIBLE_EXIT_OPEN,
+
+  EL_BD_BLADDER_1,
+  EL_BD_BLADDER_2,
+  EL_BD_BLADDER_3,
+  EL_BD_BLADDER_4,
+
+  EL_BD_BLADDER_5,
+  EL_BD_BLADDER_6,
+  EL_BD_BLADDER_7,
+  EL_BD_BLADDER_8,
+
+  EL_BD_SAND_2,
+  EL_BD_COW_ENCLOSED_1,
+  EL_BD_COW_ENCLOSED_2,
+  EL_BD_COW_ENCLOSED_3,
+
+  EL_BD_COW_ENCLOSED_4,
+  EL_BD_COW_ENCLOSED_5,
+  EL_BD_COW_ENCLOSED_6,
+  EL_BD_COW_ENCLOSED_7,
+
+  EL_BD_WATER_1,
+  EL_BD_WATER_2,
+  EL_BD_WATER_3,
+  EL_BD_WATER_4,
+
+  EL_BD_WATER_5,
+  EL_BD_WATER_6,
+  EL_BD_WATER_7,
+  EL_BD_WATER_8,
+
+  EL_BD_WATER_9,
+  EL_BD_WATER_10,
+  EL_BD_WATER_11,
+  EL_BD_WATER_12,
+
+  EL_BD_WATER_13,
+  EL_BD_WATER_14,
+  EL_BD_WATER_15,
+  EL_BD_WATER_16,
+
+  EL_BD_BOMB_TICKING_1,
+  EL_BD_BOMB_TICKING_2,
+  EL_BD_BOMB_TICKING_3,
+  EL_BD_BOMB_TICKING_4,
+
+  EL_BD_BOMB_TICKING_5,
+  EL_BD_BOMB_TICKING_6,
+  EL_BD_BOMB_TICKING_7,
+  EL_EMPTY,
+
+  EL_BD_BOMB_EXPLODING_1,
+  EL_BD_BOMB_EXPLODING_2,
+  EL_BD_BOMB_EXPLODING_3,
+  EL_BD_BOMB_EXPLODING_4,
+
+  EL_BD_NUT_BREAKING_1,
+  EL_BD_NUT_BREAKING_2,
+  EL_BD_NUT_BREAKING_3,
+  EL_BD_NUT_BREAKING_4,
+
+  EL_BD_EXPLODING_1,
+  EL_BD_EXPLODING_2,
+  EL_BD_EXPLODING_3,
+  EL_BD_EXPLODING_4,
+
+  EL_BD_EXPLODING_5,
+  EL_BD_TIME_PENALTY,
+  EL_BD_DIAMOND_GROWING_1,
+  EL_BD_DIAMOND_GROWING_2,
+
+  EL_BD_DIAMOND_GROWING_3,
+  EL_BD_DIAMOND_GROWING_4,
+  EL_BD_DIAMOND_GROWING_5,
+  EL_BD_NITRO_PACK_EXPLODING,
+
+  EL_BD_NITRO_PACK_EXPLODING_1,
+  EL_BD_NITRO_PACK_EXPLODING_2,
+  EL_BD_NITRO_PACK_EXPLODING_3,
+  EL_BD_NITRO_PACK_EXPLODING_4,
+
+  EL_BD_ROCK_GROWING_1,
+  EL_BD_ROCK_GROWING_2,
+  EL_BD_ROCK_GROWING_3,
+  EL_BD_ROCK_GROWING_4,
+
+  EL_BD_STEELWALL_GROWING_1,
+  EL_BD_STEELWALL_GROWING_2,
+  EL_BD_STEELWALL_GROWING_3,
+  EL_BD_STEELWALL_GROWING_4,
+
+  EL_BD_CLOCK_GROWING_1,
+  EL_BD_CLOCK_GROWING_2,
+  EL_BD_CLOCK_GROWING_3,
+  EL_BD_CLOCK_GROWING_4,
+
+  EL_BD_GHOST_EXPLODING_1,
+  EL_BD_GHOST_EXPLODING_2,
+  EL_BD_GHOST_EXPLODING_3,
+  EL_BD_GHOST_EXPLODING_4,
+};
+static int *editor_hl_boulderdash_effects_ptr = editor_hl_boulderdash_effects;
+static int *editor_el_boulderdash_effects_ptr = editor_el_boulderdash_effects;
+static int num_editor_hl_boulderdash_effects = ARRAY_SIZE(editor_hl_boulderdash_effects);
+static int num_editor_el_boulderdash_effects = ARRAY_SIZE(editor_el_boulderdash_effects);
+
 static int editor_hl_emerald_mine[] =
 {
   EL_INTERNAL_CASCADE_EM_ACTIVE,
@@ -6305,6 +6644,7 @@ static boolean setup_editor_cascade_never = FALSE;
 static boolean setup_editor_el_players                 = TRUE;
 static boolean setup_editor_el_boulderdash             = TRUE;
 static boolean setup_editor_el_boulderdash_native      = TRUE;
+static boolean setup_editor_el_boulderdash_effects     = TRUE;
 static boolean setup_editor_el_emerald_mine            = TRUE;
 static boolean setup_editor_el_emerald_mine_club       = TRUE;
 static boolean setup_editor_el_more                    = TRUE;
@@ -6357,6 +6697,12 @@ editor_elements_info[] =
     &editor_hl_boulderdash_native_ptr, &num_editor_hl_boulderdash_native,
     &editor_el_boulderdash_native_ptr, &num_editor_el_boulderdash_native
   },
+  {
+    &setup_editor_el_boulderdash_effects,
+    &setup.editor_cascade.el_bd_effects,
+    &editor_hl_boulderdash_effects_ptr,        &num_editor_hl_boulderdash_effects,
+    &editor_el_boulderdash_effects_ptr,        &num_editor_el_boulderdash_effects
+  },
   {
     &setup_editor_el_emerald_mine,
     &setup.editor_cascade.el_em,
@@ -6657,6 +7003,7 @@ static void ReinitializeElementList_EnableSections(void)
   setup_editor_el_players              = TRUE;
   setup_editor_el_boulderdash          = TRUE;
   setup_editor_el_boulderdash_native   = TRUE;
+  setup_editor_el_boulderdash_effects  = TRUE;
   setup_editor_el_emerald_mine         = TRUE;
   setup_editor_el_emerald_mine_club    = TRUE;
   setup_editor_el_more                 = TRUE;
@@ -6680,6 +7027,7 @@ static void ReinitializeElementList_EnableSections(void)
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
     setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_boulderdash_effects        = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -6711,6 +7059,7 @@ static void ReinitializeElementList_EnableSections(void)
   if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
   {
     setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_boulderdash_effects        = FALSE;
     setup_editor_el_mirror_magic       = FALSE;
     setup_editor_el_deflektor          = FALSE;
   }
@@ -6736,6 +7085,7 @@ static void ReinitializeElementList_EnableSections(void)
   {
     setup_editor_el_boulderdash                = FALSE;
     setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_boulderdash_effects        = FALSE;
     setup_editor_el_more               = FALSE;
     setup_editor_el_sokoban            = FALSE;
     setup_editor_el_supaplex           = FALSE;
@@ -6752,6 +7102,7 @@ static void ReinitializeElementList_EnableSections(void)
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
     setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_boulderdash_effects        = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -6770,6 +7121,7 @@ static void ReinitializeElementList_EnableSections(void)
     setup_editor_el_players            = FALSE;
     setup_editor_el_boulderdash                = FALSE;
     setup_editor_el_boulderdash_native = FALSE;
+    setup_editor_el_boulderdash_effects        = FALSE;
     setup_editor_el_emerald_mine       = FALSE;
     setup_editor_el_emerald_mine_club  = FALSE;
     setup_editor_el_more               = FALSE;
@@ -7140,11 +7492,21 @@ static void DrawDrawingArea(int id)
   int tilesize = ED_DRAWINGAREA_TILE_SIZE;
 
   for (x = 0; x < area_xsize; x++)
+  {
     for (y = 0; y < area_ysize; y++)
+    {
+      int element = value[x * area_ysize + y];
+      int graphic;
+      int frame;
+
+      getEditorGraphicAndFrame(element, &graphic, &frame, TRUE);
+
       DrawSizedGraphicExt(drawto,
                          gi->x + x * tilesize,
                          gi->y + y * tilesize,
-                         el2edimg(value[x * area_ysize + y]), 0, tilesize);
+                         graphic, frame, tilesize);
+    }
+  }
 }
 
 static void ScrollEditorLevel(int from_x, int from_y, int scroll)
@@ -7178,10 +7540,47 @@ static void ScrollEditorLevel(int from_x, int from_y, int scroll)
   BackToFront();
 }
 
+static void getEditorGraphicAndFrame(int element, int *graphic, int *frame, boolean use_editor_gfx)
+{
+  if (use_editor_gfx)
+  {
+    *graphic = el2edimg(element);
+    *frame = 0;
+  }
+  else
+  {
+    *graphic = el2img(element);
+    *frame = (ANIM_MODE(*graphic) == ANIM_CE_VALUE ?
+             custom_element.ce_value_fixed_initial :
+             ANIM_MODE(*graphic) == ANIM_CE_SCORE ?
+             custom_element.collect_score_initial : FrameCounter);
+  }
+
+  if (*graphic == IMG_UNKNOWN)
+  {
+    // no graphic defined -- if BD style, try to get runtime ("effect") element graphics
+    // (normal BD style elements have graphics, but runtime ("effects") elements do not)
+    int element_bd = map_element_RND_to_BD_cave(element);
+
+    if (element_bd != O_UNKNOWN)
+    {
+      struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[element_bd][0];
+
+      *graphic = g_bd->graphic;
+      *frame   = g_bd->frame;
+    }
+  }
+}
+
 static void getEditorGraphicSource(int element, int tile_size, Bitmap **bitmap,
                                   int *x, int *y)
 {
-  getSizedGraphicSource(el2edimg(element), 0, tile_size, bitmap, x, y);
+  int graphic;
+  int frame;
+
+  getEditorGraphicAndFrame(element, &graphic, &frame, TRUE);
+
+  getSizedGraphicSource(graphic, frame, tile_size, bitmap, x, y);
 }
 
 static void CreateControlButtons(void)
@@ -10887,37 +11286,41 @@ static void DrawPropertiesInfo(void)
     PrintInfoText(no_description_text, font1_nr, xpos, ypos - line1_height);
 }
 
-#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"
-#define TEXT_DELAY_CHANGING    "Delay before changing"
-#define TEXT_DELAY_EXPLODING   "Delay before exploding"
-#define TEXT_DELAY_MOVING      "Delay before moving"
-#define TEXT_BALL_DELAY                "Element generation delay"
-#define TEXT_MOVE_SPEED                "Speed of android moving"
-#define TEXT_CLONE_SPEED       "Speed of android cloning"
-#define TEXT_GAME_OF_LIFE_1    "Min neighbours to survive"
-#define TEXT_GAME_OF_LIFE_2    "Max neighbours to survive"
-#define TEXT_GAME_OF_LIFE_3    "Min neighbours to create"
-#define TEXT_GAME_OF_LIFE_4    "Max neighbours to create"
-#define TEXT_TIME_BONUS                "Extra time to solve level"
-#define TEXT_TIME_PENALTY      "Time penalty if destroyed"
-#define TEXT_PERMEABILITY_RATE "slime permeability rate"
-#define TEXT_PERMEABILITY_BITS "slime permeability bits"
-#define TEXT_RANDOM_SEED       "slime random number seed"
-#define TEXT_ACID_SPREAD_RATE  "Spread rate (percent)"
-#define TEXT_BITER_MOVE_DELAY  "Move delay (BD frames)"
-#define TEXT_REPLICATION_DELAY "Create delay (BD frames)"
+#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"
+#define TEXT_DELAY_CHANGING            "Delay before changing"
+#define TEXT_DELAY_EXPLODING           "Delay before exploding"
+#define TEXT_DELAY_MOVING              "Delay before moving"
+#define TEXT_BALL_DELAY                        "Element generation delay"
+#define TEXT_MOVE_SPEED                        "Speed of android moving"
+#define TEXT_CLONE_SPEED               "Speed of android cloning"
+#define TEXT_GAME_OF_LIFE_1            "Min neighbours to survive"
+#define TEXT_GAME_OF_LIFE_2            "Max neighbours to survive"
+#define TEXT_GAME_OF_LIFE_3            "Min neighbours to create"
+#define TEXT_GAME_OF_LIFE_4            "Max neighbours to create"
+#define TEXT_TIME_BONUS                        "Extra time to solve level"
+#define TEXT_TIME_PENALTY              "Time penalty if destroyed"
+#define TEXT_PERMEABILITY_RATE         "slime permeability rate"
+#define TEXT_PERMEABILITY_BITS         "slime permeability bits"
+#define TEXT_RANDOM_SEED               "slime random number seed"
+#define TEXT_ACID_SPREAD_RATE          "Spread rate (percent)"
+#define TEXT_BITER_MOVE_DELAY          "Move delay (BD frames)"
+#define TEXT_REPLICATION_DELAY         "Create delay (BD frames)"
+#define TEXT_HAMMER_BREAK_DELAY                "Delay for breaking walls"
+#define TEXT_HAMMER_REAPPEAR_DELAY     "Delay for reappearing walls"
+#define TEXT_SKELETONS_NEEDED          "Skeletons needed to use pot"
+#define TEXT_SKELETONS_WORTH           "Counts as this many diamonds"
 
 static struct
 {
@@ -11054,6 +11457,16 @@ static struct
                                0, 3                                                            },
   { EL_BD_REPLICATOR,          &level.bd_replicator_create_delay,      TEXT_REPLICATION_DELAY,
                                0, 100                                                          },
+  { EL_BD_PNEUMATIC_HAMMER,    &level.bd_hammer_walls_break_delay,     TEXT_HAMMER_BREAK_DELAY,
+                               1, 100                                                          },
+  { EL_BD_PNEUMATIC_HAMMER,    &level.bd_hammer_walls_reappear_delay,  TEXT_HAMMER_REAPPEAR_DELAY,
+                               1, 200                                                          },
+  { EL_BD_POT,                 &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED,
+                               0, 50                                                           },
+  { EL_BD_SKELETON,            &level.bd_num_skeletons_needed_for_pot, TEXT_SKELETONS_NEEDED,
+                               0, 50                                                           },
+  { EL_BD_SKELETON,            &level.bd_skeleton_worth_num_diamonds,  TEXT_SKELETONS_WORTH,
+                               0, 10                                                           },
   { EL_EXTRA_TIME,             &level.extra_time,                      TEXT_TIME_BONUS         },
   { EL_TIME_ORB_FULL,          &level.time_orb_time,                   TEXT_TIME_BONUS         },
   { EL_GAME_OF_LIFE,           &level.game_of_life[0],                 TEXT_GAME_OF_LIFE_1,0,8 },
@@ -11107,15 +11520,20 @@ static boolean checkPropertiesConfig(int element)
       IS_PLAYER_ELEMENT(element) ||
       IS_BD_PLAYER_ELEMENT(element) ||
       IS_BD_EXPANDABLE_WALL(properties_element) ||
+      IS_BD_EXPANDABLE_STEELWALL(properties_element) ||
+      IS_BD_CONVEYOR_BELT(properties_element) ||
+      IS_BD_CONVEYOR_BELT_SWITCH(properties_element) ||
       IS_SOKOBAN_OBJECT_OR_FIELD(element) ||
       HAS_EDITOR_CONTENT(element) ||
       CAN_GROW(element) ||
       COULD_MOVE_INTO_ACID(element) ||
       MAYBE_DONT_COLLIDE_WITH(element) ||
+      element == EL_BD_SAND ||
       element == EL_BD_ROCK ||
       element == EL_BD_MEGA_ROCK ||
       element == EL_BD_SWEET ||
-      element == EL_BD_VOODOO_DOLL)
+      element == EL_BD_VOODOO_DOLL ||
+      element == EL_BD_WATER)
   {
     return TRUE;
   }
@@ -11242,11 +11660,19 @@ static void DrawPropertiesConfig(void)
                               (properties_element == EL_EMC_MAGIC_BALL     ? 2 : 0) +
                               num_element_counters);
 
+    // special case: set magic wall counter for BD game engine separately
+    if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+      counterbutton_info[counter_id].y = ED_ELEMENT_SETTINGS_YPOS(1);
+
     // special case: set amoeba counters for BD game engine separately
     if ((properties_element == EL_BD_AMOEBA && level.game_engine_type == GAME_ENGINE_TYPE_BD) ||
        (properties_element == EL_BD_AMOEBA_2))
       counterbutton_info[counter_id].y = ED_ELEMENT_SETTINGS_YPOS(3 + num_element_counters);
 
+    // special case: set position for delay counter for reappearing hammered walls
+    if (properties_element == EL_BD_PNEUMATIC_HAMMER && num_element_counters > 0)
+      counterbutton_info[counter_id].y += 1;
+
     counterbutton_info[counter_id].value      = elements_with_counter[i].value;
     counterbutton_info[counter_id].text_right = elements_with_counter[i].text;
     counterbutton_info[counter_id].min_value  = elements_with_counter[i].min_value;
@@ -11263,6 +11689,23 @@ static void DrawPropertiesConfig(void)
       break;
   }
 
+  if (properties_element == EL_BD_MAGIC_WALL && level.game_engine_type == GAME_ENGINE_TYPE_BD)
+  {
+    // draw stickybutton gadget
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
+
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_WAIT_HATCHING);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_MAGIC_WALL_STOPS_AMOEBA);
+
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_DIAMOND_TO);
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_ROCK_TO);
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_MEGA_ROCK_TO);
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_NUT_TO);
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_NITRO_PACK_TO);
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_DIAMOND_TO);
+    MapDrawingArea(ED_DRAWING_ID_BD_MAGIC_WALL_FLYING_ROCK_TO);
+  }
+
   if (HAS_EDITOR_CONTENT(properties_element))
   {
     // draw stickybutton gadget
@@ -11423,6 +11866,11 @@ static void DrawPropertiesConfig(void)
     MapDrawingArea(ED_DRAWING_ID_BD_SNAP_ELEMENT);
   }
 
+  if (properties_element == EL_BD_SAND)
+  {
+    MapDrawingArea(ED_DRAWING_ID_BD_SAND_LOOKS_LIKE);
+  }
+
   if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
   {
     counterbutton_info[ED_COUNTER_ID_BD_PUSHING_PROB].y =
@@ -11457,17 +11905,22 @@ static void DrawPropertiesConfig(void)
   if (properties_element == EL_BD_SLIME)
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE);
-  }
 
-  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);
+    MapDrawingArea(ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_1);
+    MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_1);
+    MapDrawingArea(ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_2);
+    MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_2);
+    MapDrawingArea(ED_DRAWING_ID_BD_SLIME_EATS_ELEMENT_3);
+    MapDrawingArea(ED_DRAWING_ID_BD_SLIME_CONVERTS_TO_ELEMENT_3);
   }
 
-  if (IS_BD_EXPANDABLE_WALL(properties_element))
+  if (IS_BD_EXPANDABLE_WALL(properties_element) ||
+      IS_BD_EXPANDABLE_STEELWALL(properties_element))
   {
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CHANGE_EXPANDING_WALL);
+
+    if (IS_BD_EXPANDABLE_WALL(properties_element))
+      MapDrawingArea(ED_DRAWING_ID_BD_EXPANDING_WALL_LOOKS_LIKE);
   }
 
   if (properties_element == EL_BD_REPLICATOR)
@@ -11475,6 +11928,28 @@ static void DrawPropertiesConfig(void)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_REPLICATORS_ACTIVE);
   }
 
+  if (IS_BD_CONVEYOR_BELT(properties_element) ||
+      IS_BD_CONVEYOR_BELT_SWITCH(properties_element))
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_ACTIVE);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_CONVEYOR_BELTS_CHANGED);
+  }
+
+  if (properties_element == EL_BD_WATER)
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_WATER_CANNOT_FLOW_DOWN);
+  }
+
+  if (properties_element == EL_BD_PNEUMATIC_HAMMER)
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_HAMMER_WALLS_REAPPEAR);
+  }
+
+  if (properties_element == EL_BD_NUT)
+  {
+    MapDrawingArea(ED_DRAWING_ID_BD_NUT_CONTENT);
+  }
+
   // 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);
@@ -11757,11 +12232,10 @@ static void DrawPropertiesChange(void)
 
 static void DrawEditorElementAnimation(int x, int y)
 {
-  int graphic = el2img(properties_element);
-  int frame = (ANIM_MODE(graphic) == ANIM_CE_VALUE ?
-              custom_element.ce_value_fixed_initial :
-              ANIM_MODE(graphic) == ANIM_CE_SCORE ?
-              custom_element.collect_score_initial : FrameCounter);
+  int graphic;
+  int frame;
+
+  getEditorGraphicAndFrame(properties_element, &graphic, &frame, FALSE);
 
   DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
 }