added support for acid settings in BD engine to level editor
[rocksndiamonds.git] / src / editor.c
index 6e24056011ad3e6ccc4e2e3f0a50fbf25dd87e90..9345d1b12862002208ffcfd188218e91e5a4805d 100644 (file)
@@ -556,12 +556,15 @@ enum
   GADGET_ID_MAGIC_BALL_CONTENT_7,
   GADGET_ID_ANDROID_CONTENT,
   GADGET_ID_AMOEBA_CONTENT,
+  GADGET_ID_BD_SNAP_ELEMENT,
   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_ACID_EATS_ELEMENT,
+  GADGET_ID_BD_ACID_TURNS_TO_ELEMENT,
   GADGET_ID_START_ELEMENT,
   GADGET_ID_ARTWORK_ELEMENT,
   GADGET_ID_EXPLOSION_ELEMENT,
@@ -719,6 +722,11 @@ enum
   GADGET_ID_BD_AMOEBA_WAIT_FOR_HATCHING,
   GADGET_ID_BD_AMOEBA_START_IMMEDIATELY,
   GADGET_ID_BD_AMOEBA_2_EXPLODE_BY_AMOEBA,
+  GADGET_ID_BD_VOODOO_COLLECTS_DIAMONDS,
+  GADGET_ID_BD_VOODOO_HURT_KILLS_PLAYER,
+  GADGET_ID_BD_VOODOO_DIES_BY_ROCK,
+  GADGET_ID_BD_VOODOO_VANISH_BY_EXPLOSION,
+  GADGET_ID_BD_SLIME_IS_PREDICTABLE,
   GADGET_ID_ENVELOPE_AUTOWRAP,
   GADGET_ID_ENVELOPE_CENTERED,
   GADGET_ID_MM_LASER_RED,
@@ -1059,6 +1067,11 @@ enum
   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_BD_VOODOO_COLLECTS_DIAMONDS,
+  ED_CHECKBUTTON_ID_BD_VOODOO_HURT_KILLS_PLAYER,
+  ED_CHECKBUTTON_ID_BD_VOODOO_DIES_BY_ROCK,
+  ED_CHECKBUTTON_ID_BD_VOODOO_VANISH_BY_EXPLOSION,
+  ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE,
   ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
   ED_CHECKBUTTON_ID_ENVELOPE_CENTERED,
   ED_CHECKBUTTON_ID_MM_LASER_RED,
@@ -1154,12 +1167,15 @@ enum
   ED_DRAWING_ID_MAGIC_BALL_CONTENT_7,
   ED_DRAWING_ID_ANDROID_CONTENT,
   ED_DRAWING_ID_AMOEBA_CONTENT,
+  ED_DRAWING_ID_BD_SNAP_ELEMENT,
   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_ACID_EATS_ELEMENT,
+  ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT,
   ED_DRAWING_ID_START_ELEMENT,
   ED_DRAWING_ID_ARTWORK_ELEMENT,
   ED_DRAWING_ID_EXPLOSION_ELEMENT,
@@ -3750,6 +3766,46 @@ static struct
     NULL, NULL,
     "explodes if touched by amoeba",   "amoeba 2 explodes if touched by amoeba"
   },
+  {
+    ED_CHECKBUTTON_ID_BD_VOODOO_COLLECTS_DIAMONDS,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_VOODOO_COLLECTS_DIAMONDS, GADGET_ID_NONE,
+    &level.bd_voodoo_collects_diamonds,
+    NULL, NULL,
+    "can collect diamonds",            "can collect diamonds for the player"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_VOODOO_HURT_KILLS_PLAYER,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_BD_VOODOO_HURT_KILLS_PLAYER, GADGET_ID_NONE,
+    &level.bd_voodoo_hurt_kills_player,
+    NULL, NULL,
+    "player is killed if hurt",                "if hurt in any way, player is killed"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_VOODOO_DIES_BY_ROCK,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    GADGET_ID_BD_VOODOO_DIES_BY_ROCK,  GADGET_ID_NONE,
+    &level.bd_voodoo_dies_by_rock,
+    NULL, NULL,
+    "killed by falling rock",          "can be killed by a falling rock"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_VOODOO_VANISH_BY_EXPLOSION,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
+    GADGET_ID_BD_VOODOO_VANISH_BY_EXPLOSION, GADGET_ID_NONE,
+    &level.bd_voodoo_vanish_by_explosion,
+    NULL, NULL,
+    "disappears in explosions",                "can be destroyed by explosions"
+  },
+  {
+    ED_CHECKBUTTON_ID_BD_SLIME_IS_PREDICTABLE,
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_BD_SLIME_IS_PREDICTABLE, GADGET_ID_NONE,
+    &level.bd_slime_is_predictable,
+    NULL, NULL,
+    "slime is predictable",            "use predictable random numbers"
+  },
   {
     ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP,
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
@@ -4221,7 +4277,18 @@ static struct
     "content:", NULL, NULL, NULL,      "amoeba content"
   },
 
-  // ---------- BD amoeba content ------------------------------------------------
+  // ---------- BD snap element -----------------------------------------------
+
+  {
+    ED_DRAWING_ID_BD_SNAP_ELEMENT,
+    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_SNAP_ELEMENT,         GADGET_ID_NONE,
+    &level.bd_snap_element,            1, 1,
+    "snap element:", NULL, NULL, NULL, "element created when snapping"
+  },
+
+  // ---------- BD amoeba content ---------------------------------------------
 
   {
     ED_DRAWING_ID_BD_AMOEBA_CONTENT_TOO_BIG,
@@ -4240,7 +4307,7 @@ static struct
     "if enclosed, changes to:", NULL, NULL, NULL,      "BD amoeba content if enclosed"
   },
 
-  // ---------- BD amoeba 2 content ------------------------------------------------
+  // ---------- BD amoeba 2 content -------------------------------------------
 
   {
     ED_DRAWING_ID_BD_AMOEBA_2_CONTENT_TOO_BIG,
@@ -4274,6 +4341,22 @@ 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_ACID_EATS_ELEMENT,
+    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_ACID_EATS_ELEMENT,    GADGET_ID_NONE,
+    &level.bd_acid_eats_element,       1, 1,
+    "can eat:", NULL, NULL, NULL,              "eats this element when spreading"
+  },
+  {
+    ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT,
+    ED_AREA_1X1_SETTINGS_XPOS(0),      ED_AREA_1X1_SETTINGS_YPOS(3),
+    ED_AREA_1X1_SETTINGS_XOFF,         ED_AREA_1X1_SETTINGS_YOFF,
+    GADGET_ID_BD_ACID_TURNS_TO_ELEMENT,        GADGET_ID_NONE,
+    &level.bd_acid_turns_to_element,   1, 1,
+    "can leave behind:", NULL, NULL, NULL,     "turns to this element after spreading"
+  },
 
   // ---------- level start element -------------------------------------------
 
@@ -4613,7 +4696,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,
@@ -4634,34 +4717,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,
@@ -4671,15 +4754,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,
@@ -4691,100 +4774,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,
@@ -6406,7 +6464,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)
@@ -8250,9 +8308,12 @@ static void MapCounterButtons(int id)
   ModifyEditorCounterValue(id, *counterbutton_info[id].value);
 
   // set position for counter gadgets with dynamically determined position
-  ModifyGadget(gi_down, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-  ModifyGadget(gi_text, GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
-  ModifyGadget(gi_up,   GDI_Y, SY + ED_SETTINGS_Y(counterbutton_info[id].y), GDI_END);
+  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);
+  }
 
   // vertical position might have changed after setting position above
   y = gi_up->y + yoffset;
@@ -8310,7 +8371,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;
@@ -10809,139 +10870,162 @@ static void DrawPropertiesInfo(void)
 #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)"
 
 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_EMERALD,                        &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_BD_DIAMOND,             &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_BD_DIAMOND,             &level.score[SC_DIAMOND_EXTRA],         TEXT_COLLECTING_EXTRA   },
+  { EL_EMERALD_YELLOW,         &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_EMERALD_RED,            &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_EMERALD_PURPLE,         &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_SP_INFOTRON,            &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_DIAMOND,                        &level.score[SC_DIAMOND],               TEXT_COLLECTING         },
+  { EL_CRYSTAL,                        &level.score[SC_CRYSTAL],               TEXT_COLLECTING         },
+  { EL_PEARL,                  &level.score[SC_PEARL],                 TEXT_COLLECTING         },
+  { EL_BUG,                    &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BUG_RIGHT,              &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BUG_UP,                 &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BUG_LEFT,               &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BUG_DOWN,               &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY,           &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_RIGHT,     &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_UP,                &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_LEFT,      &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_BD_BUTTERFLY_DOWN,      &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_SP_ELECTRON,            &level.score[SC_BUG],                   TEXT_SMASHING           },
+  { EL_SPACESHIP,              &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_SPACESHIP_RIGHT,                &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_SPACESHIP_UP,           &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_SPACESHIP_LEFT,         &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_SPACESHIP_DOWN,         &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_BD_FIREFLY,             &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_BD_FIREFLY_RIGHT,       &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_BD_FIREFLY_UP,          &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_BD_FIREFLY_LEFT,                &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_BD_FIREFLY_DOWN,                &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_SP_SNIKSNAK,            &level.score[SC_SPACESHIP],             TEXT_SMASHING           },
+  { EL_YAMYAM,                 &level.score[SC_YAMYAM],                TEXT_SMASHING           },
+  { EL_YAMYAM_LEFT,            &level.score[SC_YAMYAM],                TEXT_SMASHING           },
+  { EL_YAMYAM_RIGHT,           &level.score[SC_YAMYAM],                TEXT_SMASHING           },
+  { EL_YAMYAM_UP,              &level.score[SC_YAMYAM],                TEXT_SMASHING           },
+  { EL_YAMYAM_DOWN,            &level.score[SC_YAMYAM],                TEXT_SMASHING           },
+  { EL_DARK_YAMYAM,            &level.score[SC_YAMYAM],                TEXT_SMASHING           },
+  { EL_ROBOT,                  &level.score[SC_ROBOT],                 TEXT_SMASHING           },
+  { EL_PACMAN,                 &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_PACMAN_RIGHT,           &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_PACMAN_UP,              &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_PACMAN_LEFT,            &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_PACMAN_DOWN,            &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_NUT,                    &level.score[SC_NUT],                   TEXT_CRACKING           },
+  { EL_DYNAMITE,               &level.score[SC_DYNAMITE],              TEXT_COLLECTING         },
+  { EL_EM_DYNAMITE,            &level.score[SC_DYNAMITE],              TEXT_COLLECTING         },
+  { EL_DYNABOMB_INCREASE_NUMBER,&level.score[SC_DYNAMITE],             TEXT_COLLECTING         },
+  { EL_DYNABOMB_INCREASE_SIZE, &level.score[SC_DYNAMITE],              TEXT_COLLECTING         },
+  { EL_DYNABOMB_INCREASE_POWER,        &level.score[SC_DYNAMITE],              TEXT_COLLECTING         },
+  { EL_SHIELD_NORMAL,          &level.score[SC_SHIELD],                TEXT_COLLECTING         },
+  { EL_SHIELD_DEADLY,          &level.score[SC_SHIELD],                TEXT_COLLECTING         },
+  { EL_EXTRA_TIME,             &level.extra_time_score,                TEXT_COLLECTING         },
+  { EL_KEY_1,                  &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_KEY_2,                  &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_KEY_3,                  &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_KEY_4,                  &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EM_KEY_1,               &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EM_KEY_2,               &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EM_KEY_3,               &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EM_KEY_4,               &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EMC_KEY_5,              &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EMC_KEY_6,              &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EMC_KEY_7,              &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_EMC_KEY_8,              &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_DC_KEY_WHITE,           &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_MM_KETTLE,              &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_DF_CELL,                        &level.score[SC_EMERALD],               TEXT_COLLECTING         },
+  { EL_MM_KEY,                 &level.score[SC_KEY],                   TEXT_COLLECTING         },
+  { EL_MM_LIGHTBALL,           &level.score[SC_ELEM_BONUS],            TEXT_COLLECTING         },
+  { EL_MM_PACMAN,              &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_MM_PACMAN_RIGHT,                &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_MM_PACMAN_UP,           &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_MM_PACMAN_LEFT,         &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_MM_PACMAN_DOWN,         &level.score[SC_PACMAN],                TEXT_SMASHING           },
+  { EL_AMOEBA_WET,             &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
+  { EL_AMOEBA_DRY,             &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
+  { EL_AMOEBA_FULL,            &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
+  { EL_BD_AMOEBA,              &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
+  { EL_EMC_DRIPPER,            &level.amoeba_speed,                    TEXT_AMOEBA_SPEED       },
   { EL_BD_AMOEBA,              &level.bd_amoeba_threshold_too_big,     TEXT_AMOEBA_THRESHOED   },
   { EL_BD_AMOEBA,              &level.bd_amoeba_slow_growth_time,      TEXT_AMOEBA_SLOW_TIME   },
-  { EL_BD_AMOEBA,              &level.bd_amoeba_slow_growth_rate,      TEXT_AMOEBA_SLOW_RATE   },
-  { EL_BD_AMOEBA,              &level.bd_amoeba_fast_growth_rate,      TEXT_AMOEBA_FAST_RATE   },
+  { EL_BD_AMOEBA,              &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   },
-  { EL_BD_AMOEBA_2,            &level.bd_amoeba_2_fast_growth_rate,    TEXT_AMOEBA_FAST_RATE   },
-  { EL_MAGIC_WALL,             &level.time_magic_wall,         TEXT_DURATION           },
-  { EL_BD_MAGIC_WALL,          &level.time_magic_wall,         TEXT_DURATION           },
-  { EL_DC_MAGIC_WALL,          &level.time_magic_wall,         TEXT_DURATION           },
-  { EL_ROBOT_WHEEL,            &level.time_wheel,              TEXT_DURATION           },
-  { EL_TIMEGATE_SWITCH,                &level.time_timegate,           TEXT_DURATION           },
-  { EL_DC_TIMEGATE_SWITCH,     &level.time_timegate,           TEXT_DURATION           },
-  { EL_LIGHT_SWITCH,           &level.time_light,              TEXT_DURATION           },
-  { EL_LIGHT_SWITCH_ACTIVE,    &level.time_light,              TEXT_DURATION           },
-  { EL_SHIELD_NORMAL,          &level.shield_normal_time,      TEXT_DURATION           },
-  { EL_SHIELD_DEADLY,          &level.shield_deadly_time,      TEXT_DURATION           },
-  { EL_EXTRA_TIME,             &level.extra_time,              TEXT_TIME_BONUS         },
-  { EL_TIME_ORB_FULL,          &level.time_orb_time,           TEXT_TIME_BONUS         },
-  { EL_GAME_OF_LIFE,           &level.game_of_life[0],         TEXT_GAME_OF_LIFE_1     },
-  { EL_GAME_OF_LIFE,           &level.game_of_life[1],         TEXT_GAME_OF_LIFE_2     },
-  { EL_GAME_OF_LIFE,           &level.game_of_life[2],         TEXT_GAME_OF_LIFE_3     },
-  { EL_GAME_OF_LIFE,           &level.game_of_life[3],         TEXT_GAME_OF_LIFE_4     },
-  { EL_BIOMAZE,                        &level.biomaze[0],              TEXT_GAME_OF_LIFE_1     },
-  { EL_BIOMAZE,                        &level.biomaze[1],              TEXT_GAME_OF_LIFE_2     },
-  { EL_BIOMAZE,                        &level.biomaze[2],              TEXT_GAME_OF_LIFE_3     },
-  { EL_BIOMAZE,                        &level.biomaze[3],              TEXT_GAME_OF_LIFE_4     },
-  { EL_EMC_ANDROID,            &level.android_move_time,       TEXT_MOVE_SPEED         },
-  { EL_EMC_ANDROID,            &level.android_clone_time,      TEXT_CLONE_SPEED        },
-  { EL_EMC_MAGIC_BALL,         &level.ball_time,               TEXT_BALL_DELAY         },
-  { EL_EMC_LENSES,             &level.lenses_score,            TEXT_COLLECTING         },
-  { EL_EMC_MAGNIFIER,          &level.magnify_score,           TEXT_COLLECTING         },
-  { EL_SPRING,                 &level.slurp_score,             TEXT_SLURPING           },
-  { EL_SPRING_LEFT,            &level.slurp_score,             TEXT_SLURPING           },
-  { EL_SPRING_RIGHT,           &level.slurp_score,             TEXT_SLURPING           },
-  { EL_EMC_LENSES,             &level.lenses_time,             TEXT_DURATION           },
-  { EL_EMC_MAGNIFIER,          &level.magnify_time,            TEXT_DURATION           },
-  { EL_MM_FUSE_ACTIVE,         &level.mm_time_fuse,            TEXT_DELAY_OFF          },
-  { EL_MM_BOMB,                        &level.mm_time_bomb,            TEXT_DELAY_EXPLODING    },
-  { EL_MM_GRAY_BALL,           &level.mm_time_ball,            TEXT_DELAY_CHANGING     },
-  { EL_MM_STEEL_BLOCK,         &level.mm_time_block,           TEXT_DELAY_MOVING       },
-  { EL_MM_WOODEN_BLOCK,                &level.mm_time_block,           TEXT_DELAY_MOVING       },
-
-  { -1,                                NULL,                           NULL                    }
+  { 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,
+                               -100, 100                                                       },
+  { EL_BD_VOODOO_DOLL,         &level.bd_voodoo_penalty_time,          TEXT_TIME_PENALTY,
+                               0, 100                                                          },
+  { EL_BD_SLIME,               &level.bd_slime_permeability_rate,      TEXT_PERMEABILITY_RATE,
+                               0, 100                                                          },
+  { EL_BD_SLIME,               &level.bd_slime_permeability_bits_c64,  TEXT_PERMEABILITY_BITS,
+                               0, 255                                                          },
+  { EL_BD_SLIME,               &level.bd_slime_random_seed_c64,        TEXT_RANDOM_SEED,
+                               -1, 65535                                                       },
+  { EL_BD_ACID,                        &level.bd_acid_spread_rate,             TEXT_ACID_SPREAD_RATE,
+                               0, 100                                                          },
+  { 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)
@@ -10974,7 +11058,8 @@ static boolean checkPropertiesConfig(int element)
       MAYBE_DONT_COLLIDE_WITH(element) ||
       element == EL_BD_ROCK ||
       element == EL_BD_MEGA_ROCK ||
-      element == EL_BD_SWEET)
+      element == EL_BD_SWEET ||
+      element == EL_BD_VOODOO_DOLL)
   {
     return TRUE;
   }
@@ -11058,8 +11143,7 @@ static void DrawPropertiesConfig(void)
     int xpos = ED_ELEMENT_SETTINGS_X(0);
     int ypos = ED_ELEMENT_SETTINGS_Y(0) + ED_GADGET_SMALL_DISTANCE;
 
-    PrintInfoText("No configuration options available.",
-                 FONT_TEXT_1, xpos, ypos);
+    PrintInfoText("No configuration options available.", FONT_TEXT_1, xpos, ypos);
 
     return;
   }
@@ -11067,71 +11151,59 @@ static void DrawPropertiesConfig(void)
   // check if there are elements where a value can be chosen for
   for (i = 0; elements_with_counter[i].element != -1; i++)
   {
-    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 =
-       ED_ELEMENT_SETTINGS_YPOS(
-               (HAS_EDITOR_CONTENT(properties_element)      ? 1 : 0) +
-               (CAN_GROW(properties_element)                ? 1 : 0) +
-               (COULD_MOVE_INTO_ACID(properties_element)    ? 1 : 0) +
-               (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) +
-               (properties_element == EL_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);
+    if (elements_with_counter[i].element != properties_element)
+      continue;
 
-      counterbutton_info[counter_id].value = elements_with_counter[i].value;
-      counterbutton_info[counter_id].text_right = elements_with_counter[i].text;
+    // 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;
 
-      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 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 !!!
-       counterbutton_info[counter_id].min_value = MIN_SCORE;
-       counterbutton_info[counter_id].max_value = MAX_SCORE;
-      }
+    // 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;
 
-      MapCounterButtons(counter_id);
+    // 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;
 
-      num_element_counters++;
-      if (num_element_counters >= max_num_element_counters)
-       break;
-    }
+    int counter_id = ED_COUNTER_ID_ELEMENT_VALUE1 + num_element_counters;
+
+    counterbutton_info[counter_id].y =
+      ED_ELEMENT_SETTINGS_YPOS((HAS_EDITOR_CONTENT(properties_element)      ? 1 : 0) +
+                              (CAN_GROW(properties_element)                ? 1 : 0) +
+                              (COULD_MOVE_INTO_ACID(properties_element)    ? 1 : 0) +
+                              (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0) +
+                              (properties_element == EL_BD_VOODOO_DOLL     ? 4 : 0) +
+                              (properties_element == EL_BD_SLIME           ? 1 : 0) +
+                              (properties_element == EL_BD_ACID            ? 1 : 0) +
+                              (properties_element == EL_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;
+    counterbutton_info[counter_id].min_value  = elements_with_counter[i].min_value;
+    counterbutton_info[counter_id].max_value  = elements_with_counter[i].max_value;
+
+    // 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);
+
+    num_element_counters++;
+    if (num_element_counters >= max_num_element_counters)
+      break;
   }
 
   if (HAS_EDITOR_CONTENT(properties_element))
@@ -11160,6 +11232,11 @@ static void DrawPropertiesConfig(void)
     }
     else if (IS_AMOEBOID(properties_element))
       MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
+    else if (properties_element == EL_BD_ACID)
+    {
+      MapDrawingArea(ED_DRAWING_ID_BD_ACID_EATS_ELEMENT);
+      MapDrawingArea(ED_DRAWING_ID_BD_ACID_TURNS_TO_ELEMENT);
+    }
     else if (properties_element == EL_YAMYAM ||
             properties_element == EL_YAMYAM_LEFT ||
             properties_element == EL_YAMYAM_RIGHT ||
@@ -11276,6 +11353,9 @@ static void DrawPropertiesConfig(void)
     // draw counter gadgets
     MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB);
     MapCounterButtons(ED_COUNTER_ID_BD_PUSHING_PROB_WITH_SWEET);
+
+    // draw drawing area gadgets
+    MapDrawingArea(ED_DRAWING_ID_BD_SNAP_ELEMENT);
   }
 
   if (properties_element == EL_BD_ROCK && level.game_engine_type == GAME_ENGINE_TYPE_BD)
@@ -11301,6 +11381,19 @@ static void DrawPropertiesConfig(void)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_PUSH_MEGA_ROCK_WITH_SWEET);
   }
 
+  if (properties_element == EL_BD_VOODOO_DOLL)
+  {
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_COLLECTS_DIAMONDS);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_HURT_KILLS_PLAYER);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_DIES_BY_ROCK);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BD_VOODOO_VANISH_BY_EXPLOSION);
+  }
+
+  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);