improved code for generic counter min/max values in level editor
[rocksndiamonds.git] / src / editor.c
index 6d8bd174f876727a3ec06aff7a28b62f9aca3916..58a4e8e8983102d3511df6621eb43e0f41ff7ddb 100644 (file)
@@ -441,6 +441,12 @@ enum
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_DOWN,
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_TEXT,
   GADGET_ID_BD_HATCHING_DELAY_SECONDS_UP,
+  GADGET_ID_BD_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,
@@ -550,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,
@@ -664,6 +676,10 @@ enum
   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,
@@ -696,6 +712,13 @@ enum
   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,
@@ -768,6 +791,8 @@ enum
   ED_COUNTER_ID_BD_CYCLE_DELAY_C64,
   ED_COUNTER_ID_BD_HATCHING_DELAY_CYCLES,
   ED_COUNTER_ID_BD_HATCHING_DELAY_SECONDS,
+  ED_COUNTER_ID_BD_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,
@@ -991,6 +1016,10 @@ enum
   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,
@@ -1023,6 +1052,13 @@ enum
   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,
@@ -1072,7 +1108,7 @@ enum
 #define ED_CHECKBUTTON_ID_EDITOR_LAST  ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE_2
 
 #define ED_CHECKBUTTON_ID_ENGINE_FIRST ED_CHECKBUTTON_ID_BD_INTERMISSION
-#define ED_CHECKBUTTON_ID_ENGINE_LAST  ED_CHECKBUTTON_ID_BD_PAL_TIMING
+#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
@@ -1118,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,
@@ -1544,6 +1586,24 @@ static struct
 
   // ---------- 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),
@@ -3343,6 +3403,38 @@ static struct
     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) ----------------
 
@@ -3602,6 +3694,62 @@ static struct
     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),
@@ -4073,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 -------------------------------------------
 
   {
@@ -4411,13 +4613,13 @@ 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,
   EL_BD_BUTTERFLY_UP,
   EL_BD_FIREFLY_UP,
-  EL_EXIT_CLOSED,
+  EL_BD_EXIT_CLOSED,
 
   EL_BD_BUTTERFLY_LEFT,
   EL_BD_FIREFLY_LEFT,
@@ -4427,39 +4629,39 @@ static int editor_el_boulderdash_native[] =
   EL_BD_INBOX,
   EL_BD_BUTTERFLY_DOWN,
   EL_BD_FIREFLY_DOWN,
-  EL_EXIT_OPEN,
+  EL_BD_EXIT_OPEN,
 
   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,
@@ -4469,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,
@@ -4489,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,
@@ -6204,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)
@@ -8047,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
@@ -8115,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;
@@ -10596,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"
@@ -10616,125 +10793,140 @@ static struct
   int element;
   int *value;
   char *text;
+  int min_value;
+  int max_value;
 } elements_with_counter[] =
 {
-  { 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_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,
+                               0, 100                                                          },
+  { EL_BD_AMOEBA,              &level.bd_amoeba_fast_growth_rate,      TEXT_AMOEBA_FAST_RATE,
+                               0, 100                                                          },
+  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_threshold_too_big,   TEXT_AMOEBA_THRESHOED   },
+  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_slow_growth_time,    TEXT_AMOEBA_SLOW_TIME   },
+  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_slow_growth_rate,    TEXT_AMOEBA_SLOW_RATE,
+                               0, 100                                                          },
+  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_fast_growth_rate,    TEXT_AMOEBA_FAST_RATE,
+                               0, 100                                                          },
+  { EL_MAGIC_WALL,             &level.time_magic_wall,                 TEXT_DURATION           },
+  { EL_BD_MAGIC_WALL,          &level.time_magic_wall,                 TEXT_DURATION           },
+  { EL_DC_MAGIC_WALL,          &level.time_magic_wall,                 TEXT_DURATION           },
+  { EL_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_BD_CLOCK,               &level.bd_clock_extra_time,             TEXT_TIME_BONUS         },
+  { 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 },
+  { EL_GAME_OF_LIFE,           &level.game_of_life[1],                 TEXT_GAME_OF_LIFE_2,0,8 },
+  { EL_GAME_OF_LIFE,           &level.game_of_life[2],                 TEXT_GAME_OF_LIFE_3,0,8 },
+  { EL_GAME_OF_LIFE,           &level.game_of_life[3],                 TEXT_GAME_OF_LIFE_4,0,8 },
+  { EL_BIOMAZE,                        &level.biomaze[0],                      TEXT_GAME_OF_LIFE_1,0,8 },
+  { EL_BIOMAZE,                        &level.biomaze[1],                      TEXT_GAME_OF_LIFE_2,0,8 },
+  { EL_BIOMAZE,                        &level.biomaze[2],                      TEXT_GAME_OF_LIFE_3,0,8 },
+  { EL_BIOMAZE,                        &level.biomaze[3],                      TEXT_GAME_OF_LIFE_4,0,8 },
+  { 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)
@@ -10745,6 +10937,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) ||
@@ -10760,12 +10956,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;
 }
@@ -10851,6 +11054,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 =
@@ -10862,21 +11083,20 @@ static void DrawPropertiesConfig(void)
                (properties_element == EL_EMC_MAGIC_BALL     ? 2 : 0) +
                num_element_counters);
 
-      counterbutton_info[counter_id].value = elements_with_counter[i].value;
+      // 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;
+      counterbutton_info[counter_id].min_value  = elements_with_counter[i].min_value;
+      counterbutton_info[counter_id].max_value  = elements_with_counter[i].max_value;
 
-      if (properties_element == EL_GAME_OF_LIFE ||
-         properties_element == EL_BIOMAZE)
-      {
-       counterbutton_info[counter_id].min_value = 0;   // min neighbours
-       counterbutton_info[counter_id].max_value = 8;   // max neighbours
-      }
-      else
-      {
-       // !!! CHANGE THIS FOR CERTAIN ELEMENTS !!!
-       counterbutton_info[counter_id].min_value = MIN_SCORE;
-       counterbutton_info[counter_id].max_value = MAX_SCORE;
-      }
+      // default: counter values between 0 and 999
+      if (counterbutton_info[counter_id].max_value == 0)
+       counterbutton_info[counter_id].max_value = 999;
 
       MapCounterButtons(counter_id);
 
@@ -10891,7 +11111,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 ||
@@ -10993,17 +11232,57 @@ 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);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_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)
+    // 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)
   {
-    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);
 
@@ -11038,7 +11317,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);