rnd-20030703-1-src
[rocksndiamonds.git] / src / editor.c
index 702fed4de857467554d1befc8ef071d7e7f142c3..dd757b0560755526e7be89a91d8c4904b0e49673 100644 (file)
@@ -20,6 +20,7 @@
 #include "tools.h"
 #include "files.h"
 #include "game.h"
+#include "init.h"
 #include "tape.h"
 
 
 #define ED_AREA_ELEM_CONTENT4_YPOS     (ED_SETTINGS_YPOS(12) + \
                                         ED_GADGET_DISTANCE - MINI_TILEY)
 /* custom change trigger element */
-#define ED_AREA_ELEM_CONTENT5_XPOS     (30 * MINI_TILEX + MINI_TILEX / 2)
+#define ED_AREA_ELEM_CONTENT5_XPOS     (28 * MINI_TILEX)
 #define ED_AREA_ELEM_CONTENT5_YPOS     (ED_SETTINGS_YPOS(7) + \
                                         ED_GADGET_DISTANCE)
 /* extended custom change target */
 #define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 48)
 #define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 49)
 #define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 53)
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 54)
 
 #define GADGET_ID_DRAWING_LEVEL                (GADGET_ID_DRAWING_AREA_FIRST + 0)
 #define GADGET_ID_ELEMENT_CONTENT_0    (GADGET_ID_DRAWING_AREA_FIRST + 1)
 #define GADGET_ID_CUSTOM_ACCESS_LAYER  (GADGET_ID_SELECTBOX_FIRST + 8)
 #define GADGET_ID_CHANGE_TIME_UNITS    (GADGET_ID_SELECTBOX_FIRST + 9)
 #define GADGET_ID_CHANGE_PLAYER_ACTION (GADGET_ID_SELECTBOX_FIRST + 10)
-#define GADGET_ID_CHANGE_IMPACT_ACTION (GADGET_ID_SELECTBOX_FIRST + 11)
+#define GADGET_ID_CHANGE_COLLIDE_ACTION        (GADGET_ID_SELECTBOX_FIRST + 11)
 #define GADGET_ID_CHANGE_OTHER_ACTION  (GADGET_ID_SELECTBOX_FIRST + 12)
 #define GADGET_ID_CHANGE_POWER         (GADGET_ID_SELECTBOX_FIRST + 13)
 
 #define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 21)
 #define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 22)
 #define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CHANGE_BY_PLAYER     (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CHANGE_IMPACT_SMASHED        (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CHANGE_BY_OTHER      (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CHANGE_BY_PLAYER     (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CHANGE_BY_COLLISION  (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CHANGE_BY_OTHER      (GADGET_ID_CHECKBUTTON_FIRST + 28)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 29)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_COUNTER_ID_MOVE_DELAY_RND   14
 #define ED_COUNTER_ID_CHANGE_DELAY_FIX 15
 #define ED_COUNTER_ID_CHANGE_DELAY_RND 16
+#define ED_COUNTER_ID_CHANGE_CONT_RND  17
 
-#define ED_NUM_COUNTERBUTTONS          17
+#define ED_NUM_COUNTERBUTTONS          18
 
 #define ED_COUNTER_ID_LEVEL_FIRST      ED_COUNTER_ID_LEVEL_XSIZE
 #define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM
 #define ED_COUNTER_ID_CUSTOM_LAST      ED_COUNTER_ID_MOVE_DELAY_RND
 
 #define ED_COUNTER_ID_CHANGE_FIRST     ED_COUNTER_ID_CHANGE_DELAY_FIX
-#define ED_COUNTER_ID_CHANGE_LAST      ED_COUNTER_ID_CHANGE_DELAY_RND
+#define ED_COUNTER_ID_CHANGE_LAST      ED_COUNTER_ID_CHANGE_CONT_RND
 
 /* values for scrollbutton gadgets */
 #define ED_SCROLLBUTTON_ID_AREA_UP     0
 #define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER    8
 #define ED_SELECTBOX_ID_CHANGE_TIME_UNITS      9
 #define ED_SELECTBOX_ID_CHANGE_PLAYER_ACTION   10
-#define ED_SELECTBOX_ID_CHANGE_IMPACT_ACTION   11
+#define ED_SELECTBOX_ID_CHANGE_COLLIDE_ACTION  11
 #define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION    12
 #define ED_SELECTBOX_ID_CHANGE_POWER           13
 
 #define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   19
 #define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 20
 #define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 21
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         22
-#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER     23
-#define ED_CHECKBUTTON_ID_CHANGE_IMPACT_SMASHED        24
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER      25
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    22
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         23
+#define ED_CHECKBUTTON_ID_CHANGE_BY_PLAYER     24
+#define ED_CHECKBUTTON_ID_CHANGE_BY_COLLISION  25
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER      26
 
-#define ED_NUM_CHECKBUTTONS                    26
+#define ED_NUM_CHECKBUTTONS                    27
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_DOUBLE_SPEED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
@@ -841,7 +848,15 @@ static struct
     GADGET_ID_CHANGE_DELAY_RND_TEXT,
     &custom_element.change.delay_random,
     NULL,                              "+random", NULL
-  }
+  },
+  {
+    ED_SETTINGS_XPOS(3),               ED_SETTINGS_YPOS(12),
+    0,                                 100,
+    GADGET_ID_CHANGE_CONT_RND_DOWN,    GADGET_ID_CHANGE_CONT_RND_UP,
+    GADGET_ID_CHANGE_CONT_RND_TEXT,
+    &custom_element.change.random,
+    NULL,                              "use random change:", NULL
+  },
 };
 
 static struct
@@ -975,21 +990,25 @@ static struct ValueTextInfo options_change_player_action[] =
 };
 static int value_change_player_action = 0;
 
-static struct ValueTextInfo options_change_impact_action[] =
+static struct ValueTextInfo options_change_collide_action[] =
 {
+  { CE_COLLISION,              "on collision"                  },
   { CE_IMPACT,                 "on impact"                     },
   { CE_SMASHED,                        "when smashed"                  },
   { -1,                                NULL                            }
 };
-static int value_change_impact_action = 0;
+static int value_change_collide_action = 0;
 
 static struct ValueTextInfo options_change_other_action[] =
 {
-  { CE_OTHER_COLLECTING,       "collecting"                    },
-  { CE_OTHER_PUSHING,          "pushing"                       },
-  { CE_OTHER_CHANGING,         "change of"                     },
-  { CE_OTHER_EXPLODING,                "explosion of"                  },
-  { -1,                                NULL                            }
+  { CE_OTHER_IS_TOUCHING,              "touching"                      },
+  { CE_OTHER_IS_CHANGING,              "change of"                     },
+  { CE_OTHER_IS_EXPLODING,             "explosion of"                  },
+  { CE_OTHER_GETS_TOUCHED,             "player touches"                },
+  { CE_OTHER_GETS_PRESSED,             "player presses"                },
+  { CE_OTHER_GETS_PUSHED,              "player pushes"                 },
+  { CE_OTHER_GETS_COLLECTED,           "player collects"               },
+  { -1,                                NULL                                    }
 };
 static int value_change_other_action = 0;
 
@@ -1106,10 +1125,10 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(6),
-    GADGET_ID_CHANGE_IMPACT_ACTION,
+    GADGET_ID_CHANGE_COLLIDE_ACTION,
     -1,
-    options_change_impact_action,
-    &value_change_impact_action,
+    options_change_collide_action,
+    &value_change_collide_action,
     NULL, NULL, "change after impact or smash"
   },
   {
@@ -1118,7 +1137,7 @@ static struct
     -1,
     options_change_other_action,
     &value_change_other_action,
-    NULL, "other element:", "type of other element action"
+    NULL, "element:", "type of other element action"
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(10),
@@ -1154,7 +1173,7 @@ static struct
     11, "Advanced",                    "Advanced element configuration"
   },
   {
-    ED_SETTINGS_XPOS(0) + 262,         ED_SETTINGS_YPOS(12),
+    ED_SETTINGS_XPOS(0) + 262,         ED_SETTINGS_YPOS(13),
     GADGET_ID_SAVE_AS_TEMPLATE,
     -1, "Save as template",            "Save current settings as new template"
   },
@@ -1268,6 +1287,10 @@ static struct
   }
 };
 
+static boolean can_explode_by_fire = FALSE;
+static boolean can_explode_smashed = FALSE;
+static boolean can_explode_impact = FALSE;
+
 static struct
 {
   int x, y;
@@ -1365,19 +1388,19 @@ static struct
   {
     ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_EXPLODE_FIRE,
-    &custom_element_properties[EP_CAN_EXPLODE_BY_FIRE],
+    &can_explode_by_fire,
     "by fire",                         "element can explode by fire/explosion"
   },
   {
     ED_SETTINGS_XPOS(7),               ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_EXPLODE_SMASH,
-    &custom_element_properties[EP_CAN_EXPLODE_SMASHED],
+    &can_explode_smashed,
     "smashed",                         "element can explode when smashed"
   },
   {
     ED_SETTINGS_XPOS(13),              ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_EXPLODE_IMPACT,
-    &custom_element_properties[EP_CAN_EXPLODE_IMPACT],
+    &can_explode_impact,
     "impact",                          "element can explode on impact"
   },
 
@@ -1409,8 +1432,8 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(6),
-    GADGET_ID_CHANGE_IMPACT_SMASHED,
-    &custom_element_change_events[CE_IMPACT_SMASHED],
+    GADGET_ID_CHANGE_BY_COLLISION,
+    &custom_element_change_events[CE_BY_COLLISION],
     NULL,                              "element changes by impact or smash"
   },
   {
@@ -1438,9 +1461,15 @@ static struct
     "only use complete change",                "only use complete extended content"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(12),
+    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(12),
+    GADGET_ID_CHANGE_USE_RANDOM,
+    &custom_element.change.use_random_change,
+    NULL,                              "use random value for new content"
+  },
+  {
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_USE_TEMPLATE,
-    &custom_element.use_template,
+    &level.use_custom_template,
     "use template",                    "use template for custom properties"
   },
 };
@@ -3589,6 +3618,9 @@ static void CopyCustomElementPropertiesToEditor(int element)
 {
   int i;
 
+  /* needed here to initialize combined element properties */
+  InitElementPropertiesEngine(level.game_version);
+
   custom_element = element_info[properties_element];
 
   for (i=0; i < NUM_ELEMENT_PROPERTIES; i++)
@@ -3597,83 +3629,99 @@ static void CopyCustomElementPropertiesToEditor(int element)
   for (i=0; i < NUM_CHANGE_EVENTS; i++)
     custom_element_change_events[i] = HAS_CHANGE_EVENT(element, i);
 
+  /* ---------- element settings: configure (custom elements) ------------- */
+
+  /* set accessible layer selectbox help value */
+  value_access_type =
+    (IS_WALKABLE(element) ? EP_WALKABLE :
+     IS_PASSABLE(element) ? EP_PASSABLE :
+     value_access_type);
+  value_access_layer =
+    (IS_ACCESSIBLE_OVER(element) ? EP_ACCESSIBLE_OVER :
+     IS_ACCESSIBLE_INSIDE(element) ? EP_ACCESSIBLE_INSIDE :
+     IS_ACCESSIBLE_UNDER(element) ? EP_ACCESSIBLE_UNDER :
+     value_access_layer);
+  custom_element_properties[EP_ACCESSIBLE] =
+    (IS_ACCESSIBLE_OVER(element) ||
+     IS_ACCESSIBLE_INSIDE(element) ||
+     IS_ACCESSIBLE_UNDER(element));
+
   /* set walk-to-object action selectbox help value */
   value_walk_to_action =
     (IS_DIGGABLE(element) ? EP_DIGGABLE :
      IS_COLLECTIBLE(element) ? EP_COLLECTIBLE :
      IS_PUSHABLE(element) ? EP_PUSHABLE :
-     EP_DIGGABLE);
+     value_walk_to_action);
   custom_element_properties[EP_WALK_TO_OBJECT] =
     (IS_DIGGABLE(element) ||
      IS_COLLECTIBLE(element) ||
      IS_PUSHABLE(element));
 
-  /* set consistency selectbox help value */
-  value_consistency =
-    (CAN_EXPLODE(element) ? EP_CAN_EXPLODE :
-     IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
-     EP_CAN_EXPLODE);
-  custom_element_properties[EP_EXPLODE_RESULT] =
-    (CAN_EXPLODE(element) ||
-     IS_INDESTRUCTIBLE(element));
+  /* set smash targets selectbox help value */
+  value_smash_targets =
+    (CAN_SMASH_EVERYTHING(element) ? EP_CAN_SMASH_EVERYTHING :
+     CAN_SMASH_ENEMIES(element) ? EP_CAN_SMASH_ENEMIES :
+     CAN_SMASH_PLAYER(element) ? EP_CAN_SMASH_PLAYER :
+     value_smash_targets);
+  custom_element_properties[EP_CAN_SMASH] =
+    (CAN_SMASH_EVERYTHING(element) ||
+     CAN_SMASH_ENEMIES(element) ||
+     CAN_SMASH_PLAYER(element));
 
   /* set deadliness selectbox help value */
   value_deadliness =
     (DONT_TOUCH(element) ? EP_DONT_TOUCH :
      DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH :
      DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO :
-     EP_DONT_RUN_INTO);
+     value_deadliness);
   custom_element_properties[EP_DEADLY] =
     (DONT_TOUCH(element) ||
      DONT_COLLIDE_WITH(element) ||
      DONT_RUN_INTO(element));
 
-  /* set smash targets selectbox help value */
-  value_smash_targets =
-    (CAN_SMASH_EVERYTHING(element) ? EP_CAN_SMASH_EVERYTHING :
-     CAN_SMASH_ENEMIES(element) ? EP_CAN_SMASH_ENEMIES :
-     CAN_SMASH_PLAYER(element) ? EP_CAN_SMASH_PLAYER :
-     EP_CAN_SMASH_PLAYER);
-  custom_element_properties[EP_CAN_SMASH] =
-    (CAN_SMASH_EVERYTHING(element) ||
-     CAN_SMASH_ENEMIES(element) ||
-     CAN_SMASH_PLAYER(element));
+  /* set consistency selectbox help value */
+  value_consistency =
+    (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
+     CAN_EXPLODE(element) ? EP_CAN_EXPLODE :
+     value_consistency);
+  custom_element_properties[EP_EXPLODE_RESULT] =
+    (IS_INDESTRUCTIBLE(element) ||
+     CAN_EXPLODE(element));
 
-  /* set accessible layer selectbox help value */
-  value_access_type =
-    (IS_WALKABLE(element) ? EP_WALKABLE :
-     IS_PASSABLE(element) ? EP_PASSABLE :
-     EP_WALKABLE);
-  value_access_layer =
-    (IS_ACCESSIBLE_OVER(element) ? EP_ACCESSIBLE_OVER :
-     IS_ACCESSIBLE_INSIDE(element) ? EP_ACCESSIBLE_INSIDE :
-     IS_ACCESSIBLE_UNDER(element) ? EP_ACCESSIBLE_UNDER :
-     EP_ACCESSIBLE_OVER);
-  custom_element_properties[EP_ACCESSIBLE] =
-    (IS_ACCESSIBLE_OVER(element) ||
-     IS_ACCESSIBLE_INSIDE(element) ||
-     IS_ACCESSIBLE_UNDER(element));
+  /* special case: sub-settings dependent from main setting */
+  if (CAN_EXPLODE(element))
+  {
+    can_explode_by_fire = CAN_EXPLODE_BY_FIRE(element);
+    can_explode_smashed = CAN_EXPLODE_SMASHED(element);
+    can_explode_impact  = CAN_EXPLODE_IMPACT(element);
+  };
+
+  /* ---------- element settings: advanced (custom elements) --------------- */
 
   /* set change by player selectbox help value */
   value_change_player_action =
     (HAS_CHANGE_EVENT(element, CE_PUSHED_BY_PLAYER) ? CE_PUSHED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_PRESSED_BY_PLAYER) ? CE_PRESSED_BY_PLAYER :
      HAS_CHANGE_EVENT(element, CE_TOUCHED_BY_PLAYER) ? CE_TOUCHED_BY_PLAYER :
-     CE_PRESSED_BY_PLAYER);
+     value_change_player_action);
 
-  /* set change by impact/smash selectbox help value */
-  value_change_impact_action =
+  /* set change by collision selectbox help value */
+  value_change_collide_action =
     (HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
      HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
-     CE_IMPACT);
+     HAS_CHANGE_EVENT(element, CE_COLLISION) ? CE_COLLISION :
+     value_change_collide_action);
 
   /* set change by other element action selectbox help value */
   value_change_other_action =
-    (HAS_CHANGE_EVENT(element, CE_OTHER_EXPLODING) ? CE_OTHER_EXPLODING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_CHANGING) ? CE_OTHER_CHANGING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_PUSHING) ? CE_OTHER_PUSHING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_COLLECTING) ? CE_OTHER_COLLECTING :
-     CE_OTHER_COLLECTING);
+    (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
+     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED :
+     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED :
+     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED :
+     HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
+     HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
+     HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
+     value_change_other_action);
 }
 
 static void CopyCustomElementPropertiesToGame(int element)
@@ -3682,6 +3730,20 @@ static void CopyCustomElementPropertiesToGame(int element)
 
   element_info[properties_element] = custom_element;
 
+  /* ---------- element settings: configure (custom elements) ------------- */
+
+  /* set accessible property from checkbox and selectbox */
+  custom_element_properties[EP_WALKABLE_OVER] = FALSE;
+  custom_element_properties[EP_WALKABLE_INSIDE] = FALSE;
+  custom_element_properties[EP_WALKABLE_UNDER] = FALSE;
+  custom_element_properties[EP_PASSABLE_OVER] = FALSE;
+  custom_element_properties[EP_PASSABLE_INSIDE] = FALSE;
+  custom_element_properties[EP_PASSABLE_UNDER] = FALSE;
+  custom_element_properties[((value_access_type == EP_WALKABLE ?
+                             EP_WALKABLE_OVER : EP_PASSABLE_OVER) +
+                            (value_access_layer - EP_ACCESSIBLE_OVER))] =
+    custom_element_properties[EP_ACCESSIBLE];
+
   /* set walk-to-object property from checkbox and selectbox */
   custom_element_properties[EP_DIGGABLE] = FALSE;
   custom_element_properties[EP_COLLECTIBLE] = FALSE;
@@ -3689,11 +3751,12 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_properties[value_walk_to_action] =
     custom_element_properties[EP_WALK_TO_OBJECT];
 
-  /* set consistency property from checkbox and selectbox */
-  custom_element_properties[EP_CAN_EXPLODE] = FALSE;
-  custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
-  custom_element_properties[value_consistency] =
-    custom_element_properties[EP_EXPLODE_RESULT];
+  /* set smash property from checkbox and selectbox */
+  custom_element_properties[EP_CAN_SMASH_PLAYER] = FALSE;
+  custom_element_properties[EP_CAN_SMASH_ENEMIES] = FALSE;
+  custom_element_properties[EP_CAN_SMASH_EVERYTHING] = FALSE;
+  custom_element_properties[value_smash_targets] =
+    custom_element_properties[EP_CAN_SMASH];
 
   /* set deadliness property from checkbox and selectbox */
   custom_element_properties[EP_DONT_RUN_INTO] = FALSE;
@@ -3702,24 +3765,24 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_properties[value_deadliness] =
     custom_element_properties[EP_DEADLY];
 
-  /* set smash property from checkbox and selectbox */
-  custom_element_properties[EP_CAN_SMASH_PLAYER] = FALSE;
-  custom_element_properties[EP_CAN_SMASH_ENEMIES] = FALSE;
-  custom_element_properties[EP_CAN_SMASH_EVERYTHING] = FALSE;
-  custom_element_properties[value_smash_targets] =
-    custom_element_properties[EP_CAN_SMASH];
+  /* set consistency property from checkbox and selectbox */
+  custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE;
+  custom_element_properties[value_consistency] =
+    custom_element_properties[EP_EXPLODE_RESULT];
 
-  /* set accessible property from checkbox and selectbox */
-  custom_element_properties[EP_WALKABLE_OVER] = FALSE;
-  custom_element_properties[EP_WALKABLE_INSIDE] = FALSE;
-  custom_element_properties[EP_WALKABLE_UNDER] = FALSE;
-  custom_element_properties[EP_PASSABLE_OVER] = FALSE;
-  custom_element_properties[EP_PASSABLE_INSIDE] = FALSE;
-  custom_element_properties[EP_PASSABLE_UNDER] = FALSE;
-  custom_element_properties[((value_access_type == EP_WALKABLE ?
-                             EP_WALKABLE_OVER : EP_PASSABLE_OVER) +
-                            (value_access_layer - EP_ACCESSIBLE_OVER))] =
-    custom_element_properties[EP_ACCESSIBLE];
+  /* special case: sub-settings dependent from main setting */
+  if (custom_element_properties[EP_CAN_EXPLODE])
+  {
+    custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = can_explode_by_fire;
+    custom_element_properties[EP_CAN_EXPLODE_SMASHED] = can_explode_smashed;
+    custom_element_properties[EP_CAN_EXPLODE_IMPACT]  = can_explode_impact;
+  }
+
+  /* ---------- element settings: advanced (custom elements) --------------- */
 
   /* set player change event from checkbox and selectbox */
   custom_element_change_events[CE_TOUCHED_BY_PLAYER] = FALSE;
@@ -3728,17 +3791,21 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[value_change_player_action] =
     custom_element_change_events[CE_BY_PLAYER];
 
-  /* set player change event from checkbox and selectbox */
+  /* set collision change event from checkbox and selectbox */
+  custom_element_change_events[CE_COLLISION] = FALSE;
   custom_element_change_events[CE_IMPACT] = FALSE;
   custom_element_change_events[CE_SMASHED] = FALSE;
-  custom_element_change_events[value_change_impact_action] =
-    custom_element_change_events[CE_IMPACT_SMASHED];
+  custom_element_change_events[value_change_collide_action] =
+    custom_element_change_events[CE_BY_COLLISION];
 
   /* set other element action change event from checkbox and selectbox */
-  custom_element_change_events[CE_OTHER_COLLECTING] = FALSE;
-  custom_element_change_events[CE_OTHER_PUSHING] = FALSE;
-  custom_element_change_events[CE_OTHER_CHANGING] = FALSE;
-  custom_element_change_events[CE_OTHER_EXPLODING] = FALSE;
+  custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE;
+  custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE;
+  custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE;
+  custom_element_change_events[CE_OTHER_GETS_TOUCHED] = FALSE;
+  custom_element_change_events[CE_OTHER_GETS_PRESSED] = FALSE;
+  custom_element_change_events[CE_OTHER_GETS_PUSHED] = FALSE;
+  custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
   custom_element_change_events[value_change_other_action] =
     custom_element_change_events[CE_BY_OTHER];
 
@@ -3800,6 +3867,7 @@ void DrawLevelEd()
   redraw_mask |= REDRAW_ALL;
 
   ReinitializeElementListButtons();    /* only needed after setup changes */
+  ModifyEditorElementList();           /* may be needed for custom elements */
 
   UnmapTapeButtons();
   MapControlButtons();
@@ -4225,7 +4293,7 @@ static void DrawCustomChangeTriggerArea()
 
   DrawElementBorder(area_sx, area_sy, MINI_TILEX, MINI_TILEY, TRUE);
   DrawMiniGraphicExt(drawto, gi->x, gi->y,
-                    el2edimg(custom_element.change.trigger));
+                    el2edimg(custom_element.change.trigger_element));
 
   MapDrawingArea(GADGET_ID_CUSTOM_CHANGE_TRIGGER);
 }
@@ -4764,6 +4832,16 @@ static void DrawPropertiesConfig()
   }
 }
 
+static void DrawPropertiesAdvancedDrawingAreas()
+{
+  DrawCustomGraphicElementArea();
+  DrawCustomChangeTargetArea();
+  DrawCustomChangeTriggerArea();
+  DrawCustomChangeContentArea();
+
+  redraw_mask |= REDRAW_FIELD;
+}
+
 static void DrawPropertiesAdvanced()
 {
   int i;
@@ -4790,10 +4868,7 @@ static void DrawPropertiesAdvanced()
   MapTextbuttonGadget(ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE);
 
   /* draw drawing area gadgets */
-  DrawCustomGraphicElementArea();
-  DrawCustomChangeTargetArea();
-  DrawCustomChangeContentArea();
-  DrawCustomChangeTriggerArea();
+  DrawPropertiesAdvancedDrawingAreas();
 }
 
 static void DrawElementName(int x, int y, int element)
@@ -5651,7 +5726,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
        }
        else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
        {
-         custom_element.change.trigger = new_element;
+         custom_element.change.trigger_element = new_element;
          element_info[properties_element] = custom_element;
        }
        else if (id == GADGET_ID_RANDOM_BACKGROUND)
@@ -5769,7 +5844,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
       else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
        PickDrawingElement(button, custom_element.change.content[sx][sy]);
       else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
-       PickDrawingElement(button, custom_element.change.trigger);
+       PickDrawingElement(button, custom_element.change.trigger_element);
       else if (id == GADGET_ID_RANDOM_BACKGROUND)
        PickDrawingElement(button, random_placement_background_element);
       else if (id >= GADGET_ID_ELEMENT_CONTENT_0 &&
@@ -5901,6 +5976,8 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
   {
     ModifyEditorElementList();
     RedrawDrawingElements();
+
+    DrawPropertiesAdvancedDrawingAreas();
   }
 }
 
@@ -6515,7 +6592,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
                getElementInfoText(custom_element.change.content[sx][sy]));
     else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
       DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s",
-               getElementInfoText(custom_element.change.trigger));
+               getElementInfoText(custom_element.change.trigger_element));
     else if (id == GADGET_ID_RANDOM_BACKGROUND)
       DrawTextF(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, "%s",
                getElementInfoText(random_placement_background_element));