rnd-20060102-1-src
[rocksndiamonds.git] / src / editor.c
index e25ece3686be4a78e2e9b1d2b70cde66c87c686b..e27359015ba8a6212fe5c7fc07e05ef4b9fe7e96 100644 (file)
 #define GADGET_ID_MAGIC_BALL_CONTENT_7 (GADGET_ID_DRAWING_AREA_FIRST + 16)
 #define GADGET_ID_AMOEBA_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 17)
 #define GADGET_ID_START_ELEMENT                (GADGET_ID_DRAWING_AREA_FIRST + 18)
-#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 19)
-#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 20)
-#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 21)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 22)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 23)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 24)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 25)
-#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 26)
-#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_ARTWORK_ELEMENT      (GADGET_ID_DRAWING_AREA_FIRST + 19)
+#define GADGET_ID_EXPLOSION_ELEMENT    (GADGET_ID_DRAWING_AREA_FIRST + 20)
+#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 21)
+#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 22)
+#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 23)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 24)
+#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 25)
+#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 26)
+#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 29)
 
 /* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 30)
 
 #define GADGET_ID_LEVEL_NAME           (GADGET_ID_TEXT_INPUT_FIRST + 0)
 #define GADGET_ID_LEVEL_AUTHOR         (GADGET_ID_TEXT_INPUT_FIRST + 1)
 #define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 14)
 #define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 15)
 #define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 47)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 48)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  12
 #define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   13
 #define ED_CHECKBUTTON_ID_USE_START_ELEMENT    14
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 15
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   16
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   17
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    18
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   19
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  20
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    21
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        22
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        23
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        24
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        25
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      26
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     28
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      29
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                30
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   31
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  32
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 33
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        34
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    35
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         36
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 37
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  38
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 39
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   40
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 41
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    42
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    43
-
-#define ED_NUM_CHECKBUTTONS                    44
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  15
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        16
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   18
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   19
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    20
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   21
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  22
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    23
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        24
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        25
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        26
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        27
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      28
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      29
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     30
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      31
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                32
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   33
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  34
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 35
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        36
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    37
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         38
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 39
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  40
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 41
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   42
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 43
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    44
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    45
+
+#define ED_NUM_CHECKBUTTONS                    46
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_DRAWING_ID_MAGIC_BALL_CONTENT_7     16
 #define ED_DRAWING_ID_AMOEBA_CONTENT           17
 #define ED_DRAWING_ID_START_ELEMENT            18
-#define ED_DRAWING_ID_CUSTOM_GRAPHIC           19
-#define ED_DRAWING_ID_CUSTOM_CONTENT           20
-#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                21
-#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                22
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     23
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    24
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    25
-#define ED_DRAWING_ID_GROUP_CONTENT            26
-#define ED_DRAWING_ID_RANDOM_BACKGROUND                27
+#define ED_DRAWING_ID_ARTWORK_ELEMENT          19
+#define ED_DRAWING_ID_EXPLOSION_ELEMENT                20
+#define ED_DRAWING_ID_CUSTOM_GRAPHIC           21
+#define ED_DRAWING_ID_CUSTOM_CONTENT           22
+#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                23
+#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                24
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     25
+#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    26
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    27
+#define ED_DRAWING_ID_GROUP_CONTENT            28
+#define ED_DRAWING_ID_RANDOM_BACKGROUND                29
 
-#define ED_NUM_DRAWING_AREAS                   28
+#define ED_NUM_DRAWING_AREAS                   30
 
 
 /*
@@ -2426,56 +2434,70 @@ static struct
     "can grow into anything diggable", "grow into more than just sand"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_DOUBLE_SPEED,            GADGET_ID_NONE,
     &level.double_speed,
     NULL,
     "double speed movement",           "set initial movement speed of player"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
     NULL,
     "block snapped field when snapping", "use snapping delay to show animation"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_BLOCK_LAST_FIELD,                GADGET_ID_NONE,
     &level.block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_SP_BLOCK_LAST_FIELD,     GADGET_ID_NONE,
     &level.sp_block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_INSTANT_RELOCATION,      GADGET_ID_NONE,
     &level.instant_relocation,
     NULL,
     "no scrolling when relocating",    "player gets relocated without delay"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_USE_START_ELEMENT,       GADGET_ID_NONE,
     &level.use_start_element[0],
     NULL,
     "use level start element:",               "start level at this element's position"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
+    GADGET_ID_USE_ARTWORK_ELEMENT,     GADGET_ID_NONE,
+    &level.use_artwork_element[0],
+    NULL,
+    "use artwork from element:",       "use player artwork from other element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
+    GADGET_ID_USE_EXPLOSION_ELEMENT,   GADGET_ID_NONE,
+    &level.use_explosion_element[0],
+    NULL,
+    "use explosion from element:",     "use explosion properties from element"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
     &level.can_pass_to_walkable,
     NULL,
     "can pass to walkable element",    "player can pass to empty or walkable"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CAN_FALL_INTO_ACID,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
     NULL,
@@ -2795,12 +2817,30 @@ static struct
   /* ---------- level start element ---------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(6),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(7),
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
     &level.start_element[0],           1, 1,
     NULL, NULL, NULL,                  "level start element"
   },
 
+  /* ---------- player artwork element ------------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(8),
+    GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
+    &level.artwork_element[0],         1, 1,
+    NULL, NULL, NULL,                  "element for player artwork"
+  },
+
+  /* ---------- player explosion element ----------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
+    &level.explosion_element[0],       1, 1,
+    NULL, NULL, NULL,                  "element for player explosion"
+  },
+
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
   /* ---------- custom graphic --------------------------------------------- */
@@ -2919,6 +2959,7 @@ static void ModifyEditorSelectboxValue(int, int);
 static void ModifyEditorSelectboxOptions(int, struct ValueTextInfo *);
 static void ModifyEditorDrawingArea(int, int, int);
 static void ModifyEditorElementList();
+static void AdjustElementListScrollbar();
 static void RedrawDrawingElements();
 static void DrawDrawingWindow();
 static void DrawLevelInfoWindow();
@@ -3636,7 +3677,7 @@ static int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderd
 
 static int editor_hl_chars[] =
 {
-  EL_INTERNAL_CASCADE_TEXT_ACTIVE,
+  EL_INTERNAL_CASCADE_CHARS_ACTIVE,
   EL_CHAR('T'),
   EL_CHAR('X'),
   EL_CHAR('T'),
@@ -4218,9 +4259,9 @@ static int num_editor_el_user_defined = 0;
 static int editor_hl_dynamic[] =
 {
   EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE,
-  EL_CHAR('D'),
-  EL_CHAR('Y'),
-  EL_CHAR('N'),
+  EL_CHAR('U'),
+  EL_CHAR('S'),
+  EL_CHAR('E'),
 };
 
 static int *editor_hl_dynamic_ptr = editor_hl_dynamic;
@@ -4244,6 +4285,7 @@ static int num_editor_elements = 0;       /* dynamically determined */
 static struct
 {
   boolean *setup_value;
+  boolean *setup_cascade_value;
 
   int **headline_list;
   int *headline_list_size;
@@ -4257,75 +4299,90 @@ editor_elements_info[] =
 {
   {
     &setup.editor.el_boulderdash,
+    &setup.editor_cascade.el_bd,
     &editor_hl_boulderdash_ptr,                &num_editor_hl_boulderdash,
     &editor_el_boulderdash_ptr,                &num_editor_el_boulderdash
   },
   {
     &setup.editor.el_emerald_mine,
+    &setup.editor_cascade.el_em,
     &editor_hl_emerald_mine_ptr,       &num_editor_hl_emerald_mine,
     &editor_el_emerald_mine_ptr,       &num_editor_el_emerald_mine
   },
   {
     &setup.editor.el_emerald_mine_club,
+    &setup.editor_cascade.el_emc,
     &editor_hl_emerald_mine_club_ptr,  &num_editor_hl_emerald_mine_club,
     &editor_el_emerald_mine_club_ptr,  &num_editor_el_emerald_mine_club
   },
   {
     &setup.editor.el_more,
+    &setup.editor_cascade.el_rnd,
     &editor_hl_more_ptr,               &num_editor_hl_more,
     &editor_el_more_ptr,               &num_editor_el_more
   },
   {
     &setup.editor.el_sokoban,
+    &setup.editor_cascade.el_sb,
     &editor_hl_sokoban_ptr,            &num_editor_hl_sokoban,
     &editor_el_sokoban_ptr,            &num_editor_el_sokoban
   },
   {
     &setup.editor.el_supaplex,
+    &setup.editor_cascade.el_sp,
     &editor_hl_supaplex_ptr,           &num_editor_hl_supaplex,
     &editor_el_supaplex_ptr,           &num_editor_el_supaplex
   },
   {
     &setup.editor.el_diamond_caves,
+    &setup.editor_cascade.el_dc,
     &editor_hl_diamond_caves_ptr,      &num_editor_hl_diamond_caves,
     &editor_el_diamond_caves_ptr,      &num_editor_el_diamond_caves
   },
   {
     &setup.editor.el_dx_boulderdash,
+    &setup.editor_cascade.el_dx,
     &editor_hl_dx_boulderdash_ptr,     &num_editor_hl_dx_boulderdash,
     &editor_el_dx_boulderdash_ptr,     &num_editor_el_dx_boulderdash
   },
   {
     &setup.editor.el_chars,
+    &setup.editor_cascade.el_chars,
     &editor_hl_chars_ptr,              &num_editor_hl_chars,
     &editor_el_chars_ptr,              &num_editor_el_chars
   },
   {
     &setup.editor.el_custom,
+    &setup.editor_cascade.el_ce,
     &editor_hl_custom_ptr,             &num_editor_hl_custom,
     &editor_el_custom_ptr,             &num_editor_el_custom
   },
   {
     &setup.editor.el_custom,
+    &setup.editor_cascade.el_ge,
     &editor_hl_group_ptr,              &num_editor_hl_group,
     &editor_el_group_ptr,              &num_editor_el_group
   },
   {
     &setup.editor.el_user_defined,
+    &setup.editor_cascade.el_user,
     &editor_hl_user_defined_ptr,       &num_editor_hl_user_defined,
     &editor_el_user_defined_ptr,       &num_editor_el_user_defined
   },
   {
     &setup.editor.el_dynamic,
+    &setup.editor_cascade.el_dynamic,
     &editor_hl_dynamic_ptr,            &num_editor_hl_dynamic,
     &editor_el_dynamic_ptr,            &num_editor_el_dynamic,
   },
   {
+    &use_el_empty,
     &use_el_empty,
     &editor_hl_empty_ptr,              &num_editor_hl_empty,
     &editor_el_empty_ptr,              &num_editor_el_empty,
   },
   {
+    NULL,
     NULL,
     NULL,                              NULL,
     NULL,                              NULL
@@ -4438,9 +4495,29 @@ static void InitDynamicEditorElementList(int **elements, int *num_elements)
 
 static void ReinitializeElementList()
 {
+  static boolean initialization_needed = TRUE;
   int pos = 0;
   int i, j;
 
+  if (initialization_needed)
+  {
+    LoadSetup_EditorCascade();         /* load last editor cascade state */
+
+    /* initialize editor cascade element from saved cascade state */
+    for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
+    {
+      int *cascade_element = &(*editor_elements_info[i].headline_list)[0];
+      boolean cascade_value = *editor_elements_info[i].setup_cascade_value;
+
+      if (IS_EDITOR_CASCADE(*cascade_element))
+       *cascade_element =
+         (cascade_value ? EL_CASCADE_ACTIVE(*cascade_element) :
+          EL_CASCADE_INACTIVE(*cascade_element));
+    }
+
+    initialization_needed = FALSE;
+  }
+
   checked_free(editor_elements);
 
   /* reload optional user defined element list for each invocation of editor */
@@ -4539,11 +4616,9 @@ static void ReinitializeElementList()
     }
   }
 
-  /* correct position of element list scrollbar */
-  if (element_shift < 0)
-    element_shift = 0;
-  if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
-    element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+  /* this function is also called before editor gadgets are initialized */
+  if (level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL] != NULL)
+    AdjustElementListScrollbar();
 }
 
 void PrintEditorElementList()
@@ -4553,10 +4628,25 @@ void PrintEditorElementList()
 
   for (i = 0; editor_elements_info[i].setup_value != stop; i++)
   {
+    int cascade_element = (*editor_elements_info[i].headline_list)[0];
+
+    if (IS_EDITOR_CASCADE(cascade_element))
+    {
+      int cascade_element_show = EL_CASCADE_INACTIVE(cascade_element);
+      char *headline = element_info[cascade_element_show].editor_description;
+
+      printf_line_with_prefix("# ", "-", 77);
+      printf("# %s\n", headline);
+      printf_line_with_prefix("# ", "-", 77);
+    }
+
     for (j = 0; j < *editor_elements_info[i].headline_list_size; j++)
     {
       int element = (*editor_elements_info[i].headline_list)[j];
 
+      if (IS_EDITOR_CASCADE(element))
+       element = EL_CHAR_MINUS;
+
       printf("# %s\n", element_info[element].token_name);
     }
 
@@ -4616,6 +4706,10 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   int src_x, src_y;
   int num_mini_tilex = width  / MINI_TILEX + 1;
   int num_mini_tiley = height / MINI_TILEY + 1;
+  int from_x = dest_x - MINI_TILEX / 2;
+  int from_y = dest_y - MINI_TILEY / 2;
+  int to_x = from_x + num_mini_tilex * MINI_TILEX - 1;
+  int to_y = from_y + num_mini_tiley * MINI_TILEY - 1;
   int x, y;
 
   getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y);
@@ -4623,10 +4717,14 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
   for (y = 0; y < num_mini_tiley; y++)
     for (x = 0; x < num_mini_tilex; x++)
       BlitBitmap(src_bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY,
-                dest_x - MINI_TILEX / 2 + x * MINI_TILEX,
-                dest_y - MINI_TILEY / 2 + y * MINI_TILEY);
+                from_x + x * MINI_TILEX, from_y + y * MINI_TILEY);
 
   ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
+
+  DrawSimpleBlackLine(drawto, from_x, from_y, to_x, from_y);
+  DrawSimpleBlackLine(drawto, to_x, from_y, to_x, to_y);
+  DrawSimpleBlackLine(drawto, to_x, to_y, from_x, to_y);
+  DrawSimpleBlackLine(drawto, from_x, to_y, from_x, from_y);
 }
 
 static void DrawDrawingArea(int id)
@@ -6821,6 +6919,7 @@ static void AdjustElementListScrollbar()
   struct GadgetInfo *gi = level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL];
   int items_max, items_visible, item_position;
 
+  /* correct position of element list scrollbar */
   if (element_shift < 0)
     element_shift = 0;
   if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
@@ -6910,8 +7009,10 @@ static void ModifyEditorElementList()
     int element = editor_elements[element_shift + i];
 
     UnmapGadget(gi);
+
     getMiniGraphicSource(el2edimg(element), &gd->bitmap, &gd->x, &gd->y);
     ModifyGadget(gi, GDI_INFO_TEXT, getElementInfoText(element), GDI_END);
+
     MapGadget(gi);
   }
 }
@@ -7613,13 +7714,21 @@ static void DrawPropertiesConfig()
   {
     int player_nr = GET_PLAYER_NR(properties_element);
 
-    /* this property can be set for every player individually */
+    /* these properties can be set for every player individually */
     drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
       &level.start_element[player_nr];
+    drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
+      &level.artwork_element[player_nr];
+    drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
+      &level.explosion_element[player_nr];
 
-    /* this property can be set for every player individually */
+    /* these properties can be set for every player individually */
     checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value =
       &level.use_start_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value =
+      &level.use_artwork_element[player_nr];
+    checkbutton_info[ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT].value =
+      &level.use_explosion_element[player_nr];
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
@@ -7628,10 +7737,14 @@ static void DrawPropertiesConfig()
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_START_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DOUBLE_SPEED);
 
     MapDrawingArea(ED_DRAWING_ID_START_ELEMENT);
+    MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT);
+    MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT);
   }
 
   if (IS_GEM(properties_element))
@@ -9504,21 +9617,24 @@ static void HandleControlButtons(struct GadgetInfo *gi)
 
          for (i = 0; editor_elements_info[i].setup_value != NULL; i++)
          {
-           int *cascade_element = *editor_elements_info[i].headline_list;
+           int *cascade_element= &(*editor_elements_info[i].headline_list)[0];
+           boolean *cascade_value=editor_elements_info[i].setup_cascade_value;
 
            if (*cascade_element == new_element)
            {
              *cascade_element = EL_CASCADE_TOGGLE(*cascade_element);
+             *cascade_value = IS_EDITOR_CASCADE_ACTIVE(*cascade_element);
 
+             /* update element selection list */
              ReinitializeElementList();
-#if 0
-             ReinitializeElementListButtons();
-#endif
              ModifyEditorElementList();
-             AdjustElementListScrollbar();
 
+             /* update cascading gadget info text */
              PrintEditorGadgetInfoText(level_editor_gadget[id]);
 
+             /* save current editor cascading state */
+             SaveSetup_EditorCascade();
+
              break;
            }
          }