cleanup of BD style game elements in level editor
[rocksndiamonds.git] / src / editor.c
index daa50a04e8d1b851a6ce088c9c490323d46c6943..14c5d86c88accd68a93fa004846995767b35e066 100644 (file)
@@ -556,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,
@@ -708,6 +714,11 @@ enum
   GADGET_ID_BD_DIAGONAL_MOVEMENTS,
   GADGET_ID_BD_TOPMOST_PLAYER_ACTIVE,
   GADGET_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  GADGET_ID_BD_MAGIC_WALL_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,
@@ -1043,6 +1054,11 @@ enum
   ED_CHECKBUTTON_ID_BD_DIAGONAL_MOVEMENTS,
   ED_CHECKBUTTON_ID_BD_TOPMOST_PLAYER_ACTIVE,
   ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET,
+  ED_CHECKBUTTON_ID_BD_MAGIC_WALL_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,
@@ -1138,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,
@@ -1571,7 +1593,7 @@ static struct
     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, "probability to push rocks"
+    NULL,                              NULL, "push probability"
   },
   {
     ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET,
@@ -1580,7 +1602,7 @@ static struct
     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, "as above, after eating sweet"
+    NULL,                              NULL, "push probability with sweet"
   },
   {
     ED_COUNTER_ID_ELEMENT_VALUE1,
@@ -3688,6 +3710,46 @@ static struct
     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),
@@ -4159,6 +4221,60 @@ 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 -------------------------------------------
 
   {
@@ -4497,7 +4613,7 @@ static int editor_el_boulderdash_native[] =
 
   EL_BD_STEELWALL,
   EL_BD_WALL,
-  EL_EMPTY,
+  EL_BD_SAND_2,
   EL_BD_MAGIC_WALL,
 
   EL_BD_AMOEBA,
@@ -4518,34 +4634,34 @@ static int editor_el_boulderdash_native[] =
   EL_BD_AMOEBA_2,
   EL_BD_BUTTERFLY_2_UP,
   EL_BD_FIREFLY_2_UP,
-  EL_EMPTY,
+  EL_BD_SLIME,
 
   EL_BD_BUTTERFLY_2_LEFT,
   EL_BD_FIREFLY_2_LEFT,
   EL_BD_BUTTERFLY_2_RIGHT,
   EL_BD_FIREFLY_2_RIGHT,
 
-  EL_EMPTY,
+  EL_BD_BOMB,
   EL_BD_BUTTERFLY_2_DOWN,
   EL_BD_FIREFLY_2_DOWN,
-  EL_EMPTY,
+  EL_BD_FLYING_DIAMOND,
 
-  EL_EMPTY,
+  EL_BD_NITRO_PACK,
   EL_BD_DRAGONFLY_UP,
   EL_BD_STONEFLY_UP,
-  EL_EMPTY,
+  EL_BD_DIAMOND_GLUED,
 
   EL_BD_DRAGONFLY_LEFT,
   EL_BD_STONEFLY_LEFT,
   EL_BD_DRAGONFLY_RIGHT,
   EL_BD_STONEFLY_RIGHT,
 
-  EL_EMPTY,
+  EL_BD_NUT,
   EL_BD_DRAGONFLY_DOWN,
   EL_BD_STONEFLY_DOWN,
   EL_EMPTY,
 
-  EL_EMPTY,
+  EL_BD_BITER_SWITCH_1,
   EL_BD_BITER_UP,
   EL_BD_COW_UP,
   EL_EMPTY,
@@ -4555,15 +4671,15 @@ static int editor_el_boulderdash_native[] =
   EL_BD_BITER_RIGHT,
   EL_BD_COW_RIGHT,
 
-  EL_EMPTY,
+  EL_BD_VOODOO_DOLL,
   EL_BD_BITER_DOWN,
   EL_BD_COW_DOWN,
-  EL_EMPTY,
+  EL_BD_GHOST,
 
-  EL_EMPTY,
-  EL_BD_SAND,
+  EL_BD_SAND_GLUED,
   EL_BD_SAND_BALL,
   EL_BD_SAND_LOOSE,
+  EL_BD_WALL_NON_SLOPED,
 
   EL_BD_SAND_SLOPED_UP_LEFT,
   EL_BD_SAND_SLOPED_UP_RIGHT,
@@ -4575,100 +4691,75 @@ static int editor_el_boulderdash_native[] =
   EL_BD_WALL_SLOPED_DOWN_LEFT,
   EL_BD_WALL_SLOPED_DOWN_RIGHT,
 
-  EL_BD_FLYING_DIAMOND,
   EL_BD_FLYING_ROCK,
+  EL_BD_ROCK_GLUED,
   EL_BD_STEELWALL_SLOPED_UP_LEFT,
   EL_BD_STEELWALL_SLOPED_UP_RIGHT,
 
-  EL_BD_NUT,
-  EL_BD_MEGA_ROCK,
+  EL_BD_WAITING_ROCK,
+  EL_BD_CHASING_ROCK,
   EL_BD_STEELWALL_SLOPED_DOWN_LEFT,
   EL_BD_STEELWALL_SLOPED_DOWN_RIGHT,
 
-  EL_BD_SAND_2,
-  EL_BD_WALL_NON_SLOPED,
-  EL_BD_WALL,
-  EL_BD_MAGIC_WALL,
-
-  EL_BD_EXIT_CLOSED,
-  EL_BD_EXIT_OPEN,
+  EL_BD_MEGA_ROCK,
+  EL_BD_SWEET,
   EL_BD_INVISIBLE_EXIT_CLOSED,
   EL_BD_INVISIBLE_EXIT_OPEN,
 
-  EL_BD_STEELWALL,
   EL_BD_STEELWALL_EXPLODABLE,
   EL_BD_STEELWALL_DIGGABLE,
   EL_BD_WALL_DIGGABLE,
+  EL_BD_FALLING_WALL,
 
   EL_BD_EXPANDABLE_WALL_HORIZONTAL,
   EL_BD_EXPANDABLE_WALL_VERTICAL,
   EL_BD_EXPANDABLE_WALL_ANY,
-  EL_BD_CREATURE_SWITCH,
+  EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,
 
   EL_BD_EXPANDABLE_STEELWALL_HORIZONTAL,
   EL_BD_EXPANDABLE_STEELWALL_VERTICAL,
   EL_BD_EXPANDABLE_STEELWALL_ANY,
-  EL_BD_EXPANDABLE_WALL_SWITCH_HORIZONTAL,
+  EL_BD_CREATURE_SWITCH,
 
-  EL_BD_BITER_SWITCH_1,
+  EL_BD_BLADDER,
+  EL_BD_BLADDER_SPENDER,
+  EL_BD_REPLICATOR,
   EL_BD_REPLICATOR_SWITCH,
+
+  EL_BD_CONVEYOR_LEFT,
+  EL_BD_CONVEYOR_RIGHT,
   EL_BD_CONVEYOR_SWITCH,
   EL_BD_CONVEYOR_DIR_SWITCH_RIGHT,
 
-  EL_BD_ACID,
-  EL_BD_FALLING_WALL,
-  EL_BD_BOX,
+  EL_BD_CLOCK,
   EL_BD_TIME_PENALTY,
-
   EL_BD_GRAVESTONE,
-  EL_BD_ROCK_GLUED,
-  EL_BD_DIAMOND_GLUED,
-  EL_BD_DIAMOND_KEY,
+  EL_BD_SKELETON,
 
-  EL_BD_TRAPPED_DIAMOND,
-  EL_BD_CLOCK,
-  EL_BD_SAND_GLUED,
   EL_BD_WATER,
+  EL_BD_ACID,
+  EL_BD_LAVA,
+  EL_BD_BOX,
+
+  EL_BD_GATE_1,
+  EL_BD_GATE_2,
+  EL_BD_GATE_3,
+  EL_BD_TRAPPED_DIAMOND,
 
   EL_BD_KEY_1,
   EL_BD_KEY_2,
   EL_BD_KEY_3,
-  EL_EMPTY,
+  EL_BD_DIAMOND_KEY,
 
   EL_BD_WALL_KEY_1,
   EL_BD_WALL_KEY_2,
   EL_BD_WALL_KEY_3,
   EL_BD_WALL_DIAMOND,
 
-  EL_BD_GATE_1,
-  EL_BD_GATE_2,
-  EL_BD_GATE_3,
-  EL_BD_POT,
-
   EL_BD_GRAVITY_SWITCH,
   EL_BD_PNEUMATIC_HAMMER,
   EL_BD_TELEPORTER,
-  EL_BD_SKELETON,
-
-  EL_BD_AMOEBA,
-  EL_BD_AMOEBA_2,
-  EL_BD_REPLICATOR,
-  EL_BD_BLADDER_SPENDER,
-
-  EL_BD_CONVEYOR_LEFT,
-  EL_BD_CONVEYOR_RIGHT,
-  EL_BD_BOMB,
-  EL_BD_NITRO_PACK,
-
-  EL_BD_LAVA,
-  EL_BD_SWEET,
-  EL_BD_VOODOO_DOLL,
-  EL_BD_SLIME,
-
-  EL_BD_BLADDER,
-  EL_BD_WAITING_ROCK,
-  EL_BD_CHASING_ROCK,
-  EL_BD_GHOST,
+  EL_BD_POT,
 
   EL_BD_PLAYER,
   EL_BD_PLAYER_WITH_BOMB,
@@ -6290,7 +6381,7 @@ static int getTextWidthForDrawingArea(char *text)
   if (text == NULL)
     return 0;
 
-  return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_TEXT_DISTANCE);
+  return (getTextWidth(text, FONT_TEXT_1) + ED_DRAWINGAREA_BORDER_SIZE);
 }
 
 static int getRightGadgetBorder(struct GadgetInfo *gi, char *text)
@@ -8133,16 +8224,12 @@ 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)
+  // set position for counter gadgets with dynamically determined position
+  if (id != ED_COUNTER_ID_SELECT_LEVEL)
   {
-    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);
+    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
@@ -8201,7 +8288,7 @@ static void MapDrawingArea(int id)
   int area_ysize = gi->drawing.area_ysize;
   int xoffset_left = getTextWidthForDrawingArea(drawingarea_info[id].text_left);
   int xoffset_below = getTextWidth(drawingarea_info[id].text_below, font_nr);
-  int x_left  = gi->x - xoffset_left;
+  int x_left  = gi->x - xoffset_left - ED_DRAWINGAREA_BORDER_SIZE;
   int x_right = gi->x + gi->width + ED_DRAWINGAREA_TEXT_DISTANCE;
   int x_above = gi->x - ED_DRAWINGAREA_BORDER_SIZE;
   int x_below = gi->x + (gi->width - xoffset_below) / 2;
@@ -10682,6 +10769,10 @@ static void DrawPropertiesInfo(void)
 #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"
@@ -10784,6 +10875,14 @@ static struct
   { EL_AMOEBA_FULL,            &level.amoeba_speed,            TEXT_AMOEBA_SPEED       },
   { EL_BD_AMOEBA,              &level.amoeba_speed,            TEXT_AMOEBA_SPEED       },
   { EL_EMC_DRIPPER,            &level.amoeba_speed,            TEXT_AMOEBA_SPEED       },
+  { EL_BD_AMOEBA,              &level.bd_amoeba_threshold_too_big,     TEXT_AMOEBA_THRESHOED   },
+  { EL_BD_AMOEBA,              &level.bd_amoeba_slow_growth_time,      TEXT_AMOEBA_SLOW_TIME   },
+  { EL_BD_AMOEBA,              &level.bd_amoeba_slow_growth_rate,      TEXT_AMOEBA_SLOW_RATE   },
+  { EL_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           },
@@ -10831,6 +10930,10 @@ static boolean checkPropertiesConfig(int element)
   if (element == EL_EMPTY_SPACE && level.game_engine_type != GAME_ENGINE_TYPE_RND)
     return FALSE;
 
+  // special case: BD style rock customization only available in BD game engine
+  if (element == EL_BD_ROCK && level.game_engine_type != GAME_ENGINE_TYPE_BD)
+    return FALSE;
+
   if (IS_GEM(element) ||
       IS_CUSTOM_ELEMENT(element) ||
       IS_GROUP_ELEMENT(element) ||
@@ -10846,12 +10949,19 @@ static boolean checkPropertiesConfig(int element)
       HAS_EDITOR_CONTENT(element) ||
       CAN_GROW(element) ||
       COULD_MOVE_INTO_ACID(element) ||
-      MAYBE_DONT_COLLIDE_WITH(element))
+      MAYBE_DONT_COLLIDE_WITH(element) ||
+      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;
 }
@@ -10937,6 +11047,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 =
@@ -10948,6 +11076,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;
 
@@ -10957,6 +11091,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 !!!
@@ -10977,7 +11117,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 ||
@@ -11080,6 +11239,13 @@ static void DrawPropertiesConfig(void)
 
   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);
@@ -11090,15 +11256,39 @@ static void DrawPropertiesConfig(void)
     MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
   }
 
-  // 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)
+  if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
   {
-    checkbutton_info[ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS].y =
-      ED_ELEMENT_SETTINGS_XPOS(properties_element == EL_BD_DIAMOND ? 2 : 1);
+    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);
 
-    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
+    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)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE);
 
@@ -11133,7 +11323,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);