rnd-20080126-1-src
[rocksndiamonds.git] / src / editor.c
index 07043c5e727157bca5ed92446c3dcb637f788298..bcb76d4f96acfa6089f6b04445fcd0bf9a8f5fc1 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment                      *
+* (c) 1995-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
 #define GADGET_ID_CUSTOM_COPY          (GADGET_ID_TOOLBOX_FIRST + 25)
 #define GADGET_ID_CUSTOM_PASTE         (GADGET_ID_TOOLBOX_FIRST + 26)
 
-/* counter button identifiers */
+/* counter gadget identifiers */
 #define GADGET_ID_COUNTER_FIRST                (GADGET_ID_TOOLBOX_FIRST + 27)
 
 #define GADGET_ID_SELECT_LEVEL_DOWN    (GADGET_ID_COUNTER_FIRST + 0)
 #define GADGET_ID_RANDOM_PERCENTAGE    (GADGET_ID_CHECKBUTTON_FIRST + 0)
 #define GADGET_ID_RANDOM_QUANTITY      (GADGET_ID_CHECKBUTTON_FIRST + 1)
 #define GADGET_ID_RANDOM_RESTRICTED    (GADGET_ID_CHECKBUTTON_FIRST + 2)
-#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 3)
-#define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 4)
-#define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 5)
-#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 6)
-#define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_RANDOM_BALL_CONTENT  (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_INITIAL_BALL_STATE   (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 3)
+#define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 4)
+#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 5)
+#define GADGET_ID_USE_TIME_ORB_BUG     (GADGET_ID_CHECKBUTTON_FIRST + 6)
+#define GADGET_ID_RANDOM_BALL_CONTENT  (GADGET_ID_CHECKBUTTON_FIRST + 7)
+#define GADGET_ID_INITIAL_BALL_STATE   (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_GROW_INTO_DIGGABLE   (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_CONTINUOUS_SNAPPING  (GADGET_ID_CHECKBUTTON_FIRST + 10)
 #define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 11)
 #define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 12)
 #define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 13)
 #define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 45)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_SHIFTED_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#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_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 49)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 50)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 51)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_GRAPHICBUTTON_ID_CHANGE_LAST   ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE
 
 /* values for checkbutton gadgets */
-#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      0
-#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    1
-#define ED_CHECKBUTTON_ID_STICK_ELEMENT                2
-#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     3
-#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       4
-#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     5
-#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT  6
-#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE   7
-#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   8
+#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    0
+#define ED_CHECKBUTTON_ID_STICK_ELEMENT                1
+#define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     2
+#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       3
+#define ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG     4
+#define ED_CHECKBUTTON_ID_RANDOM_BALL_CONTENT  5
+#define ED_CHECKBUTTON_ID_INITIAL_BALL_STATE   6
+#define ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE   7
+#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING  8
 #define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     9
 #define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     10
 #define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  11
 #define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   12
-#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    13
-#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  14
-#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        15
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 16
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   17
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   18
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    19
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   20
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  21
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    22
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        23
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        24
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        25
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        26
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      27
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      28
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     29
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      30
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                31
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   32
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  33
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 34
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        35
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    36
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         37
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 38
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  39
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 40
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   41
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 42
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    43
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    44
-
-#define ED_NUM_CHECKBUTTONS                    45
-
-#define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
+#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION   13
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    14
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  15
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        16
+#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      17
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 18
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   19
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   20
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    21
+#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    22
+#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    23
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   24
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  25
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    26
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        27
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        28
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        29
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        30
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      31
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      32
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     33
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      34
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                35
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   36
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  37
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 38
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        39
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    40
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         41
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 42
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  43
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 44
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   45
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 46
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    47
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    48
+
+#define ED_NUM_CHECKBUTTONS                    49
+
+#define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 
 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST        ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
 
 /* values for elements with score for certain actions */
 #define MIN_SCORE                      0
-#define MAX_SCORE                      255
+#define MAX_SCORE                      999
 
 /* values for elements with count for collecting */
 #define MIN_COLLECT_COUNT              0
-#define MAX_COLLECT_COUNT              255
+#define MAX_COLLECT_COUNT              999
 
 /* values for random placement */
 #define RANDOM_USE_PERCENTAGE          0
@@ -1024,7 +1032,7 @@ static struct
     NULL,                              " ", "height",
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(6),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(5),
     0,                                 999,
     GADGET_ID_LEVEL_GEMSLIMIT_DOWN,    GADGET_ID_LEVEL_GEMSLIMIT_UP,
     GADGET_ID_LEVEL_GEMSLIMIT_TEXT,    GADGET_ID_NONE,
@@ -1032,7 +1040,7 @@ static struct
     NULL, "number of gems to collect:",        NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(8),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
     0,                                 9999,
     GADGET_ID_LEVEL_TIMELIMIT_DOWN,    GADGET_ID_LEVEL_TIMELIMIT_UP,
     GADGET_ID_LEVEL_TIMELIMIT_TEXT,    GADGET_ID_NONE,
@@ -1040,8 +1048,8 @@ static struct
     "time or step limit to solve level:", NULL, NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
-    0,                                 255,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
+    0,                                 999,
     GADGET_ID_LEVEL_TIMESCORE_DOWN,    GADGET_ID_LEVEL_TIMESCORE_UP,
     GADGET_ID_LEVEL_TIMESCORE_TEXT,    GADGET_ID_NONE,
     &level.score[SC_TIME_BONUS],
@@ -1119,7 +1127,7 @@ static struct
     MIN_ENVELOPE_XSIZE,                        MAX_ENVELOPE_XSIZE,
     GADGET_ID_ENVELOPE_XSIZE_DOWN,     GADGET_ID_ENVELOPE_XSIZE_UP,
     GADGET_ID_ENVELOPE_XSIZE_TEXT,     GADGET_ID_NONE,
-    NULL,
+    NULL,                              /* will be set when used */
     NULL,                              NULL, "width",
   },
   {
@@ -1127,7 +1135,7 @@ static struct
     MIN_ENVELOPE_YSIZE,                        MAX_ENVELOPE_YSIZE,
     GADGET_ID_ENVELOPE_YSIZE_DOWN,     GADGET_ID_ENVELOPE_YSIZE_UP,
     GADGET_ID_ENVELOPE_YSIZE_TEXT,     GADGET_ID_ENVELOPE_XSIZE_UP,
-    NULL,
+    NULL,                              /* will be set when used */
     NULL,                              " ", "height",
   },
 
@@ -1167,7 +1175,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(7),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_PUSH_DELAY_FIX_DOWN,     GADGET_ID_PUSH_DELAY_FIX_UP,
     GADGET_ID_PUSH_DELAY_FIX_TEXT,     GADGET_ID_NONE,
     &custom_element.push_delay_fixed,
@@ -1175,7 +1183,7 @@ static struct
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(7),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_PUSH_DELAY_RND_DOWN,     GADGET_ID_PUSH_DELAY_RND_UP,
     GADGET_ID_PUSH_DELAY_RND_TEXT,     GADGET_ID_PUSH_DELAY_FIX_UP,
     &custom_element.push_delay_random,
@@ -1183,7 +1191,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(8),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_DROP_DELAY_FIX_DOWN,     GADGET_ID_DROP_DELAY_FIX_UP,
     GADGET_ID_DROP_DELAY_FIX_TEXT,     GADGET_ID_NONE,
     &custom_element.drop_delay_fixed,
@@ -1191,7 +1199,7 @@ static struct
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(8),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_DROP_DELAY_RND_DOWN,     GADGET_ID_DROP_DELAY_RND_UP,
     GADGET_ID_DROP_DELAY_RND_TEXT,     GADGET_ID_DROP_DELAY_FIX_UP,
     &custom_element.drop_delay_random,
@@ -1218,7 +1226,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(12),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_EXPLOSION_DELAY_DOWN,    GADGET_ID_EXPLOSION_DELAY_UP,
     GADGET_ID_EXPLOSION_DELAY_TEXT,    GADGET_ID_NONE,
     &custom_element.explosion_delay,
@@ -1226,7 +1234,7 @@ static struct
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
-    0,                                 255,
+    0,                                 999,
     GADGET_ID_IGNITION_DELAY_DOWN,     GADGET_ID_IGNITION_DELAY_UP,
     GADGET_ID_IGNITION_DELAY_TEXT,     GADGET_ID_NONE,
     &custom_element.ignition_delay,
@@ -1314,11 +1322,11 @@ static struct
 } textarea_info[ED_NUM_TEXTAREAS] =
 {
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_ENVELOPE_INFO,
     MAX_ENVELOPE_XSIZE, MAX_ENVELOPE_YSIZE,
     NULL,
-    "Envelope Info:", "Envelope Info"
+    "Envelope Content:", "Envelope Content"
   }
 };
 
@@ -1507,6 +1515,7 @@ static struct ValueTextInfo options_deadliness[] =
 {
   { EP_DONT_RUN_INTO,          "running into"                  },
   { EP_DONT_COLLIDE_WITH,      "colliding with"                },
+  { EP_DONT_GET_HIT_BY,                "getting hit by"                },
   { EP_DONT_TOUCH,             "touching"                      },
 
   { -1,                                NULL                            }
@@ -1547,7 +1556,12 @@ static struct ValueTextInfo options_change_direct_action[] =
 #endif
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
+#if 0
+  { CE_VALUE_CHANGES,          "CE value changes"              },
+  { CE_SCORE_CHANGES,          "CE score changes"              },
+#endif
   { CE_VALUE_GETS_ZERO,                "CE value gets 0"               },
+  { CE_SCORE_GETS_ZERO,                "CE score gets 0"               },
 
   { -1,                                NULL                            }
 };
@@ -1573,7 +1587,10 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_EXPLOSION_OF_X,         "explosion of"                  },
   { CE_MOVE_OF_X,              "move of"                       },
   { CE_CREATION_OF_X,          "creation of"                   },
+  { CE_VALUE_CHANGES_OF_X,     "CE value changes of"           },
+  { CE_SCORE_CHANGES_OF_X,     "CE score changes of"           },
   { CE_VALUE_GETS_ZERO_OF_X,   "CE value gets 0 of"            },
+  { CE_SCORE_GETS_ZERO_OF_X,   "CE score gets 0 of"            },
 
   { -1,                                NULL                            }
 };
@@ -1663,7 +1680,6 @@ static struct ValueTextInfo options_action_type[] =
   { CA_SET_LEVEL_TIME,         "set time"                      },
   { CA_SET_LEVEL_SCORE,                "set score"                     },
   { CA_SET_LEVEL_GEMS,         "set needed gems"               },
-  { CA_SET_LEVEL_GRAVITY,      "set gravity"                   },
   { CA_SET_LEVEL_WIND,         "set wind dir."                 },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_PLAYER_ACTIONS,        "[player actions]"              },
@@ -1673,11 +1689,12 @@ static struct ValueTextInfo options_action_type[] =
   { CA_SET_PLAYER_KEYS,                "set keys"                      },
   { CA_SET_PLAYER_SPEED,       "set speed"                     },
   { CA_SET_PLAYER_SHIELD,      "set shield"                    },
+  { CA_SET_PLAYER_GRAVITY,     "set gravity"                   },
   { CA_SET_PLAYER_ARTWORK,     "set artwork"                   },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_CE_ACTIONS,    "[CE actions]"                  },
-  { CA_SET_CE_SCORE,           "set CE score"                  },
   { CA_SET_CE_VALUE,           "set CE value"                  },
+  { CA_SET_CE_SCORE,           "set CE score"                  },
   { CA_UNDEFINED,              " "                             },
   { CA_HEADLINE_ENGINE_ACTIONS,        "[engine actions]"              },
   { CA_SET_ENGINE_SCAN_MODE,   "set scan mode"                 },
@@ -1687,7 +1704,7 @@ static struct ValueTextInfo options_action_type[] =
 
 static struct ValueTextInfo options_action_mode_none[] =
 {
-  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_MODE_UNDEFINED,         " "                             },
 
   { -1,                                NULL                            }
 };
@@ -1757,19 +1774,21 @@ static struct ValueTextInfo options_action_arg_number[] =
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_RESET,       "reset"                         },
   { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
-  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
   { CA_ARG_NUMBER_CE_VALUE,    "CE value"                      },
+  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
+  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_LEVEL_TIME,  "time"                          },
   { CA_ARG_NUMBER_LEVEL_GEMS,  "gems"                          },
   { CA_ARG_NUMBER_LEVEL_SCORE, "score"                         },
   { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_ELEMENT_CV_HEADLINE,        "[CE value"                     },
-  { CA_ARG_ELEMENT_CV_HEADLINE,        " of"                           },
-  { CA_ARG_ELEMENT_CV_HEADLINE,        " element]"                     },
+  { CA_ARG_ELEMENT_CV_HEADLINE,        "[CE value]"                    },
   { CA_ARG_ELEMENT_CV_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_CV_TRIGGER, "trigger"                       },
+  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_ELEMENT_CS_HEADLINE,        "[CE score]"                    },
+  { CA_ARG_ELEMENT_CS_TARGET,  "target"                        },
+  { CA_ARG_ELEMENT_CS_TRIGGER, "trigger"                       },
 
   { -1,                                NULL                            }
 };
@@ -1792,20 +1811,22 @@ static struct ValueTextInfo options_action_arg_value[] =
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_RESET,       "reset"                         },
   { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
-  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
   { CA_ARG_NUMBER_CE_VALUE,    "CE value"                      },
+  { CA_ARG_NUMBER_CE_SCORE,    "CE score"                      },
+  { CA_ARG_NUMBER_CE_DELAY,    "CE delay"                      },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_NUMBER_LEVEL_TIME,  "time"                          },
   { CA_ARG_NUMBER_LEVEL_GEMS,  "gems"                          },
   { CA_ARG_NUMBER_LEVEL_SCORE, "score"                         },
   { CA_ARG_UNDEFINED,          " "                             },
-  { CA_ARG_ELEMENT_CV_HEADLINE,        "[CE value"                     },
-  { CA_ARG_ELEMENT_CV_HEADLINE,        " of"                           },
-  { CA_ARG_ELEMENT_CV_HEADLINE,        " element]"                     },
+  { CA_ARG_ELEMENT_CV_HEADLINE,        "[CE value]"                    },
   { CA_ARG_ELEMENT_CV_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_CV_TRIGGER, "trigger"                       },
   { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_ELEMENT_CS_HEADLINE,        "[CE score]"                    },
+  { CA_ARG_ELEMENT_CS_TARGET,  "target"                        },
+  { CA_ARG_ELEMENT_CS_TRIGGER, "trigger"                       },
+  { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_NR_HEADLINE,        "[element]"                     },
   { CA_ARG_ELEMENT_NR_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_NR_TRIGGER, "trigger"                       },
@@ -1962,14 +1983,14 @@ action_arg_options[] =
   { CA_SET_LEVEL_TIME,         3,      options_action_arg_number,      },
   { CA_SET_LEVEL_GEMS,         3,      options_action_arg_number,      },
   { CA_SET_LEVEL_SCORE,                3,      options_action_arg_number,      },
-  { CA_SET_LEVEL_GRAVITY,      1,      options_action_arg_gravity,     },
   { CA_SET_LEVEL_WIND,         1,      options_action_arg_direction,   },
   { CA_SET_PLAYER_KEYS,                2,      options_action_arg_key,         },
   { CA_SET_PLAYER_SPEED,       1,      options_action_arg_speed,       },
   { CA_SET_PLAYER_SHIELD,      1,      options_action_arg_shield,      },
+  { CA_SET_PLAYER_GRAVITY,     1,      options_action_arg_gravity,     },
   { CA_SET_PLAYER_ARTWORK,     1,      options_action_arg_artwork,     },
-  { CA_SET_CE_SCORE,           3,      options_action_arg_value,       },
   { CA_SET_CE_VALUE,           3,      options_action_arg_value,       },
+  { CA_SET_CE_SCORE,           3,      options_action_arg_value,       },
   { CA_SET_ENGINE_SCAN_MODE,   1,      options_action_arg_scan_mode,   },
 
   { -1,                                FALSE,  NULL                            }
@@ -1989,7 +2010,7 @@ static struct
   /* ---------- level and editor settings ---------------------------------- */
 
   {
-    -1,                                        ED_LEVEL_SETTINGS_YPOS(8),
+    -1,                                        ED_LEVEL_SETTINGS_YPOS(7),
     GADGET_ID_TIME_OR_STEPS,           GADGET_ID_LEVEL_TIMELIMIT_UP,
     -1,
     options_time_or_steps,
@@ -1997,7 +2018,7 @@ static struct
     NULL, "(0 => no limit)",           "time or step limit"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(5),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
     GADGET_ID_GAME_ENGINE_TYPE,                GADGET_ID_NONE,
     -1,
     options_game_engine_type,
@@ -2005,7 +2026,7 @@ static struct
     "game engine:", NULL,              "game engine"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
     GADGET_ID_WIND_DIRECTION,          GADGET_ID_NONE,
     -1,
     options_wind_direction,
@@ -2016,11 +2037,11 @@ static struct
   /* ---------- element settings: configure (several elements) ------------- */
 
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
     -1,
     options_player_speed,
-    &level.initial_player_stepsize,
+    &level.initial_player_stepsize[0],
     "initial player speed:", NULL,     "initial player speed"
   },
 
@@ -2388,6 +2409,8 @@ static struct
   int gd_x, gd_y;
   int x, y;
   int width, height;
+  int wheel_x, wheel_y;
+  int wheel_width, wheel_height;
   int type;
   int gadget_id;
   char *infotext;
@@ -2397,6 +2420,13 @@ static struct
     ED_SCROLLBAR_XPOS,                 ED_SCROLLBAR_YPOS,
     SX + ED_SCROLL_HORIZONTAL_XPOS,    SY + ED_SCROLL_HORIZONTAL_YPOS,
     ED_SCROLL_HORIZONTAL_XSIZE,                ED_SCROLL_HORIZONTAL_YSIZE,
+#if 1
+    SX,                                        SY,
+    SXSIZE,                            SYSIZE,
+#else
+    0,                                 0,
+    SX + SXSIZE + SX,                  WIN_YSIZE,
+#endif
     GD_TYPE_SCROLLBAR_HORIZONTAL,
     GADGET_ID_SCROLL_HORIZONTAL,
     "scroll level editing area horizontally"
@@ -2405,6 +2435,13 @@ static struct
     ED_SCROLLBAR_XPOS,                 ED_SCROLLBAR_YPOS,
     SX + ED_SCROLL_VERTICAL_XPOS,      SY + ED_SCROLL_VERTICAL_YPOS,
     ED_SCROLL_VERTICAL_XSIZE,          ED_SCROLL_VERTICAL_YSIZE,
+#if 1
+    SX,                                        SY,
+    SXSIZE,                            SYSIZE,
+#else
+    0,                                 0,
+    SX + SXSIZE + SX,                  WIN_YSIZE,
+#endif
     GD_TYPE_SCROLLBAR_VERTICAL,
     GADGET_ID_SCROLL_VERTICAL,
     "scroll level editing area vertically"
@@ -2413,6 +2450,13 @@ static struct
     ED_SCROLLBAR2_XPOS,                        ED_SCROLLBAR2_YPOS,
     DX + ED_SCROLL2_VERTICAL_XPOS,     DY + ED_SCROLL2_VERTICAL_YPOS,
     ED_SCROLL2_VERTICAL_XSIZE,         ED_SCROLL2_VERTICAL_YSIZE,
+#if 1
+    DX,                                        DY,
+    DXSIZE,                            DYSIZE,
+#else
+    SX + SXSIZE + SX,                  0,
+    WIN_XSIZE - (SX + SXSIZE + SX),    WIN_YSIZE,
+#endif
     GD_TYPE_SCROLLBAR_VERTICAL,
     GADGET_ID_SCROLL_LIST_VERTICAL,
     "scroll element list vertically"
@@ -2457,13 +2501,6 @@ static struct
 {
   /* ---------- level and editor settings ---------------------------------- */
 
-  {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
-    GADGET_ID_INITIAL_GRAVITY,         GADGET_ID_NONE,
-    &level.initial_gravity,
-    NULL,
-    "initial gravity",                 "set initial level gravity"
-  },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_COUNTER2_YPOS(9) - MINI_TILEY,
     GADGET_ID_RANDOM_RESTRICTED,       GADGET_ID_NONE,
@@ -2486,10 +2523,10 @@ static struct
     GADGET_ID_EM_SLIPPERY_GEMS,                GADGET_ID_NONE,
     &level.em_slippery_gems,
     NULL,
-    "slip down from certain flat walls","use EM style slipping behaviour"
+    "slip down from certain flat walls","use EM/DC style slipping behaviour"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_USE_SPRING_BUG,          GADGET_ID_NONE,
     &level.use_spring_bug,
     NULL,
@@ -2524,7 +2561,14 @@ static struct
     "can grow into anything diggable", "grow into more than just sand"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
+    GADGET_ID_CONTINUOUS_SNAPPING,     GADGET_ID_NONE,
+    &level.continuous_snapping,
+    NULL,
+    "continuos snapping",              "use snapping without releasing key"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
     NULL,
@@ -2552,28 +2596,42 @@ static struct
     "no scrolling when relocating",    "player gets relocated without delay"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(4),
+    GADGET_ID_SHIFTED_RELOCATION,      GADGET_ID_NONE,
+    &level.shifted_relocation,
+    NULL,
+    "no centering when relocating",    "level not centered after relocation"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     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(8),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     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),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(11),
     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),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(12),
+    GADGET_ID_INITIAL_GRAVITY,         GADGET_ID_NONE,
+    &level.initial_player_gravity[0],
+    NULL,
+    "use initial gravity",             "set initial player gravity"
+  },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_CAN_PASS_TO_WALKABLE,    GADGET_ID_NONE,
     &level.can_pass_to_walkable,
     NULL,
@@ -2600,6 +2658,20 @@ static struct
     NULL,
     "deadly when colliding with",      "element is deadly when hitting player"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_ENVELOPE_AUTOWRAP,       GADGET_ID_NONE,
+    &level.envelope[0].autowrap,
+    NULL,
+    "auto-wrap",                       "automatically wrap envelope text"
+  },
+  {
+    -1,                                        ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_ENVELOPE_CENTERED,       GADGET_ID_ENVELOPE_AUTOWRAP,
+    &level.envelope[0].centered,
+    " ",
+    "centered",                                "automatically center envelope text"
+  },
 
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
@@ -2610,46 +2682,54 @@ static struct
 
     /* !!! add separate "use existing element sound" !!! */
 #if 0
-    NULL, "use graphic/sound of element:", "use existing graphic and sound"
+    NULL,
+    "use graphic/sound of element:",   "use existing graphic and sound"
 #else
-    NULL, "use graphic of element:",   "use existing element graphic"
+    NULL,
+    "use graphic of element:",         "use existing element graphic"
 #endif
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CUSTOM_USE_TEMPLATE,     GADGET_ID_NONE,
     &level.use_custom_template,
-    NULL, "use template",              "use template for custom properties"
+    NULL,
+    "use template",                    "use template for custom properties"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(3),
     GADGET_ID_CUSTOM_ACCESSIBLE,       GADGET_ID_NONE,
     &custom_element_properties[EP_ACCESSIBLE],
-    NULL, NULL,                                "player can walk to or pass this field"
+    NULL,
+    NULL,                              "player can walk to or pass this field"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_GRAV_REACHABLE,   GADGET_ID_NONE,
     &custom_element_properties[EP_GRAVITY_REACHABLE],
-    NULL, "reachable despite gravity", "player can walk/dig despite gravity"
+    NULL,
+    "reachable despite gravity",       "player can walk/dig despite gravity"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_USE_LAST_VALUE,   GADGET_ID_NONE,
     &custom_element.use_last_ce_value,
-    NULL, "use last CE value after change", "use last CE value after change"
+    NULL,
+    "use last CE value after change",  "use last CE value after change"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_CUSTOM_WALK_TO_OBJECT,   GADGET_ID_NONE,
     &custom_element_properties[EP_WALK_TO_OBJECT],
-    NULL, NULL,                                "player can dig/collect/push element"
+    NULL,
+    NULL,                              "player can dig/collect/push element"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_INDESTRUCTIBLE,   GADGET_ID_NONE,
     &custom_element_properties[EP_INDESTRUCTIBLE],
-    NULL, "indestructible",            "element is indestructible"
+    NULL,
+    "indestructible",                  "element is indestructible"
   },
 
   /* ---------- element settings: configure 2 (custom elements) ----------- */
@@ -2658,55 +2738,64 @@ static struct
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_CAN_MOVE,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE],
-    NULL, NULL,                                "element can move with some pattern"
+    NULL,
+    NULL,                              "element can move with some pattern"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_CUSTOM_CAN_FALL,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_FALL],
-    NULL, "can fall",                  "element can fall down"
+    NULL,
+    "can fall",                                "element can fall down"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_CUSTOM_CAN_SMASH,                GADGET_ID_CUSTOM_CAN_FALL,
     &custom_element_properties[EP_CAN_SMASH],
-    " ", NULL,                         "element can smash other elements"
+    " ",
+    NULL,                              "element can smash other elements"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_SLIPPERY,         GADGET_ID_NONE,
     &custom_element_properties[EP_SLIPPERY],
-    NULL, NULL,                                "other elements can fall down from it"
+    NULL,
+    NULL,                              "other elements can fall down from it"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_DEADLY,           GADGET_ID_NONE,
     &custom_element_properties[EP_DEADLY],
-    NULL, NULL,                                "element can kill the player"
+    NULL,
+    NULL,                              "element can kill the player"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_CAN_EXPLODE,      GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_EXPLODE],
-    NULL, NULL,                                "element can explode"
+    NULL,
+    NULL,                              "element can explode"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_EXPLODE_FIRE,     GADGET_ID_NONE,
     &custom_element_properties[EP_EXPLODES_BY_FIRE],
-    NULL, "by fire",                   "element can explode by fire/explosion"
+    NULL,
+    "by fire",                         "element can explode by fire/explosion"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_EXPLODE_SMASH,    GADGET_ID_CUSTOM_EXPLODE_FIRE,
     &custom_element_properties[EP_EXPLODES_SMASHED],
-    " ", "smashed",                    "element can explode when smashed"
+    " ",
+    "smashed",                         "element can explode when smashed"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_EXPLODE_IMPACT,   GADGET_ID_CUSTOM_EXPLODE_SMASH,
     &custom_element_properties[EP_EXPLODES_IMPACT],
-    " ", "impact",                     "element can explode on impact"
+    " ",
+    "impact",                          "element can explode on impact"
   },
 
   /* ---------- element settings: advanced (custom elements) --------------- */
@@ -2715,55 +2804,64 @@ static struct
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_CAN_CHANGE,       GADGET_ID_NONE,
     &custom_element_change.can_change,
-    NULL, "element changes to:",       "change element on specified condition"
+    NULL,
+    "element changes to:",             "change element on specified condition"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_CHANGE_DELAY,            GADGET_ID_NONE,
     &custom_element_change_events[CE_DELAY],
-    NULL, NULL,                                "element changes after delay"
+    NULL,
+    NULL,                              "element changes after delay"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(4),
     GADGET_ID_CHANGE_BY_DIRECT_ACT,    GADGET_ID_NONE,
     &custom_element_change_events[CE_BY_DIRECT_ACTION],
-    NULL, NULL,                                "element changes by direct action"
+    NULL,
+    NULL,                              "element changes by direct action"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(5),
     GADGET_ID_CHANGE_BY_OTHER_ACT,     GADGET_ID_NONE,
     &custom_element_change_events[CE_BY_OTHER_ACTION],
-    NULL, NULL,                                "element changes by other element"
+    NULL,
+    NULL,                              "element changes by other element"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(8),
     GADGET_ID_CHANGE_USE_EXPLOSION,    GADGET_ID_NONE,
     &custom_element_change.explode,
-    NULL, "explode instead of change", "element explodes instead of change"
+    NULL,
+    "explode instead of change",       "element explodes instead of change"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(9),
     GADGET_ID_CHANGE_USE_CONTENT,      GADGET_ID_NONE,
     &custom_element_change.use_target_content,
-    NULL, "use extended change target:","element changes to more elements"
+    NULL,
+    "use extended change target:",     "element changes to more elements"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(11),
     GADGET_ID_CHANGE_ONLY_COMPLETE,    GADGET_ID_NONE,
     &custom_element_change.only_if_complete,
-    NULL, "replace all or nothing",    "only replace when all can be changed"
+    NULL,
+    "replace all or nothing",          "only replace when all can be changed"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(2),       ED_ELEMENT_SETTINGS_YPOS(12),
     GADGET_ID_CHANGE_USE_RANDOM,       GADGET_ID_NONE,
     &custom_element_change.use_random_replace,
-    NULL, NULL,                                "use percentage for random replace"
+    NULL,
+    NULL,                              "use percentage for random replace"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
     GADGET_ID_CHANGE_HAS_ACTION,       GADGET_ID_NONE,
     &custom_element_change.has_action,
-    NULL, NULL,                                "execute action on specified condition"
+    NULL,
+    NULL,                              "execute action on specified condition"
   },
 };
 
@@ -2909,7 +3007,7 @@ static struct
   /* ---------- level start element ---------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(7),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
     GADGET_ID_START_ELEMENT,           GADGET_ID_USE_START_ELEMENT,
     &level.start_element[0],           1, 1,
     NULL, NULL, NULL,                  "level start element"
@@ -2918,7 +3016,7 @@ static struct
   /* ---------- player artwork element ------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(8),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(10),
     GADGET_ID_ARTWORK_ELEMENT,         GADGET_ID_USE_ARTWORK_ELEMENT,
     &level.artwork_element[0],         1, 1,
     NULL, NULL, NULL,                  "element for player artwork"
@@ -2927,7 +3025,7 @@ static struct
   /* ---------- player explosion element ----------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(11),
     GADGET_ID_EXPLOSION_ELEMENT,       GADGET_ID_USE_EXPLOSION_ELEMENT,
     &level.explosion_element[0],       1, 1,
     NULL, NULL, NULL,                  "element for player explosion"
@@ -2984,7 +3082,7 @@ static struct
   /* ---------- custom change content (extended change target) ------------- */
 
   {
-    -1,                                        ED_AREA_3X3_SETTINGS_YPOS(10),
+    -1,                                        ED_AREA_3X3_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_CHANGE_CONTENT,   GADGET_ID_NONE, /* align three rows */
     &custom_element_change.target_content.e[0][0], 3, 3,
     NULL, NULL, NULL,                  "new extended elements after change"
@@ -2995,7 +3093,7 @@ static struct
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(5),
     GADGET_ID_CUSTOM_CHANGE_TRIGGER,   GADGET_ID_CHANGE_OTHER_ACTION,
-    &custom_element_change.trigger_element, 1, 1,
+    &custom_element_change.initial_trigger_element, 1, 1,
     NULL, NULL, NULL,                  "other element triggering change"
   },
 
@@ -3031,7 +3129,11 @@ static int ed_fieldx = MAX_ED_FIELDX - 1, ed_fieldy = MAX_ED_FIELDY - 1;
 /* actual position of level editor drawing area in level playfield */
 static int level_xpos = -1, level_ypos = -1;
 
+#if 1
+#define IN_ED_FIELD(x,y)       IN_FIELD(x, y, ed_fieldx, ed_fieldy)
+#else
 #define IN_ED_FIELD(x,y)  ((x)>=0 && (x)<ed_fieldx && (y)>=0 &&(y)<ed_fieldy)
+#endif
 
 /* drawing elements on the three mouse buttons */
 static int new_element1 = EL_WALL;
@@ -3082,6 +3184,7 @@ static int properties_element = 0;
 
 static short FieldBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+static short IntelliDrawBuffer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 static int undo_buffer_position = 0;
 static int undo_buffer_steps = 0;
 
@@ -3090,57 +3193,50 @@ static int edit_mode_properties;
 
 static int element_shift = 0;
 
+static int editor_el_players[] =
+{
+  EL_PLAYER_1,
+  EL_PLAYER_2,
+  EL_PLAYER_3,
+  EL_PLAYER_4
+};
+static int *editor_el_players_ptr = editor_el_players;
+static int num_editor_el_players = SIZEOF_ARRAY_INT(editor_el_players);
+
 static int editor_hl_boulderdash[] =
 {
   EL_INTERNAL_CASCADE_BD_ACTIVE,
   EL_CHAR('B'),
   EL_CHAR('D'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('B'),
-  EL_CHAR('O'),
-  EL_CHAR('U'),
-  EL_CHAR('L'),
-
-  EL_CHAR('-'),
-  EL_CHAR('D'),
-  EL_CHAR('E'),
-  EL_CHAR('R'),
-
-  EL_CHAR('D'),
-  EL_CHAR('A'),
-  EL_CHAR('S'),
-  EL_CHAR('H'),
-#endif
 };
 
 static int editor_el_boulderdash[] =
 {
-  EL_PLAYER_1,
   EL_EMPTY,
   EL_SAND,
-  EL_STEELWALL,
+  EL_BD_ROCK,
+  EL_BD_DIAMOND,
 
+  EL_STEELWALL,
   EL_BD_WALL,
+  EL_BD_EXPANDABLE_WALL,
   EL_BD_MAGIC_WALL,
-  EL_EXIT_CLOSED,
-  EL_EXIT_OPEN,
 
-  EL_BD_DIAMOND,
+  EL_BD_AMOEBA,
   EL_BD_BUTTERFLY_UP,
   EL_BD_FIREFLY_UP,
-  EL_BD_ROCK,
+  EL_EXIT_CLOSED,
 
   EL_BD_BUTTERFLY_LEFT,
   EL_BD_FIREFLY_LEFT,
   EL_BD_BUTTERFLY_RIGHT,
   EL_BD_FIREFLY_RIGHT,
 
-  EL_BD_AMOEBA,
+  EL_EMPTY,
   EL_BD_BUTTERFLY_DOWN,
   EL_BD_FIREFLY_DOWN,
-  EL_EMPTY,
+  EL_EXIT_OPEN,
 };
 static int *editor_hl_boulderdash_ptr = editor_hl_boulderdash;
 static int *editor_el_boulderdash_ptr = editor_el_boulderdash;
@@ -3153,36 +3249,14 @@ static int editor_hl_emerald_mine[] =
   EL_CHAR('E'),
   EL_CHAR('M'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('E'),
-  EL_CHAR('M'),
-  EL_CHAR('E'),
-  EL_CHAR('-'),
-
-  EL_CHAR('R'),
-  EL_CHAR('A'),
-  EL_CHAR('L'),
-  EL_CHAR('D'),
-
-  EL_CHAR('M'),
-  EL_CHAR('I'),
-  EL_CHAR('N'),
-  EL_CHAR('E'),
-#endif
 };
 
 static int editor_el_emerald_mine[] =
 {
-  EL_PLAYER_1,
-  EL_PLAYER_2,
-  EL_PLAYER_3,
-  EL_PLAYER_4,
-
-  EL_PLAYER_1,
-  EL_EMPTY,
   EL_SAND,
   EL_ROCK,
+  EL_QUICKSAND_EMPTY,
+  EL_QUICKSAND_FULL,
 
   EL_STEELWALL,
   EL_WALL,
@@ -3196,13 +3270,8 @@ static int editor_el_emerald_mine[] =
 
   EL_WALL_EMERALD,
   EL_WALL_DIAMOND,
-  EL_QUICKSAND_EMPTY,
-  EL_QUICKSAND_FULL,
-
   EL_DYNAMITE,
   EL_DYNAMITE_ACTIVE,
-  EL_EXIT_CLOSED,
-  EL_EXIT_OPEN,
 
   EL_YAMYAM,
   EL_BUG_UP,
@@ -3222,17 +3291,12 @@ static int editor_el_emerald_mine[] =
   EL_ACID_POOL_TOPLEFT,
   EL_ACID,
   EL_ACID_POOL_TOPRIGHT,
-  EL_EMPTY,
+  EL_AMOEBA_DROP,
 
   EL_ACID_POOL_BOTTOMLEFT,
   EL_ACID_POOL_BOTTOM,
   EL_ACID_POOL_BOTTOMRIGHT,
-  EL_EMPTY,
-
-  EL_AMOEBA_DROP,
-  EL_AMOEBA_DEAD,
   EL_AMOEBA_WET,
-  EL_AMOEBA_DRY,
 
   EL_EM_KEY_1,
   EL_EM_KEY_2,
@@ -3248,6 +3312,11 @@ static int editor_el_emerald_mine[] =
   EL_EM_GATE_2_GRAY,
   EL_EM_GATE_3_GRAY,
   EL_EM_GATE_4_GRAY,
+
+  EL_EM_EXIT_CLOSED,
+  EL_EM_EXIT_OPEN,
+  EL_EM_STEEL_EXIT_CLOSED,
+  EL_EM_STEEL_EXIT_OPEN,
 };
 static int *editor_hl_emerald_mine_ptr = editor_hl_emerald_mine;
 static int *editor_el_emerald_mine_ptr = editor_el_emerald_mine;
@@ -3260,28 +3329,6 @@ static int editor_hl_emerald_mine_club[] =
   EL_CHAR('E'),
   EL_CHAR('M'),
   EL_CHAR('C'),
-
-#if 0
-  EL_CHAR('E'),
-  EL_CHAR('M'),
-  EL_CHAR('E'),
-  EL_CHAR('-'),
-
-  EL_CHAR('R'),
-  EL_CHAR('A'),
-  EL_CHAR('L'),
-  EL_CHAR('D'),
-
-  EL_CHAR('M'),
-  EL_CHAR('I'),
-  EL_CHAR('N'),
-  EL_CHAR('E'),
-
-  EL_CHAR('C'),
-  EL_CHAR('L'),
-  EL_CHAR('U'),
-  EL_CHAR('B'),
-#endif
 };
 
 static int editor_el_emerald_mine_club[] =
@@ -3331,52 +3378,50 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_WALL_11,
   EL_EMC_WALL_12,
 
-  EL_EMC_ANDROID,
-  EL_BALLOON,
-  EL_BALLOON_SWITCH_ANY,
-  EL_BALLOON_SWITCH_NONE,
-
-  EL_BALLOON_SWITCH_LEFT,
-  EL_BALLOON_SWITCH_RIGHT,
-  EL_BALLOON_SWITCH_UP,
-  EL_BALLOON_SWITCH_DOWN,
-
   EL_EMC_GRASS,
+  EL_EMC_FAKE_GRASS,
   EL_EMC_PLANT,
-  EL_EMC_LENSES,
-  EL_EMC_MAGNIFIER,
+  EL_EMC_DRIPPER,
 
   EL_EMC_MAGIC_BALL,
   EL_EMC_MAGIC_BALL_SWITCH,
   EL_SPRING,
   EL_EMC_SPRING_BUMPER,
 
-  EL_EMC_DRIPPER,
-  EL_EMC_FAKE_GRASS,
-  EL_EMPTY,
-  EL_EMPTY,
+  EL_EMC_LENSES,
+  EL_EMC_MAGNIFIER,
+  EL_EM_DYNAMITE,
+  EL_EM_DYNAMITE_ACTIVE,
+
+  EL_BALLOON,
+  EL_YAMYAM_UP,
+  EL_BALLOON_SWITCH_UP,
+  EL_BALLOON_SWITCH_ANY,
+
+  EL_YAMYAM_LEFT,
+  EL_BALLOON_SWITCH_LEFT,
+  EL_YAMYAM_RIGHT,
+  EL_BALLOON_SWITCH_RIGHT,
+
+  EL_EMC_ANDROID,
+  EL_YAMYAM_DOWN,
+  EL_BALLOON_SWITCH_DOWN,
+  EL_BALLOON_SWITCH_NONE,
 };
 static int *editor_hl_emerald_mine_club_ptr = editor_hl_emerald_mine_club;
 static int *editor_el_emerald_mine_club_ptr = editor_el_emerald_mine_club;
 static int num_editor_hl_emerald_mine_club=SIZEOF_ARRAY_INT(editor_hl_emerald_mine_club);
 static int num_editor_el_emerald_mine_club=SIZEOF_ARRAY_INT(editor_el_emerald_mine_club);
 
-static int editor_hl_more[] =
+static int editor_hl_rnd[] =
 {
   EL_INTERNAL_CASCADE_RND_ACTIVE,
   EL_CHAR('R'),
   EL_CHAR('N'),
   EL_CHAR('D'),
-
-#if 0
-  EL_CHAR('M'),
-  EL_CHAR('O'),
-  EL_CHAR('R'),
-  EL_CHAR('E'),
-#endif
 };
 
-static int editor_el_more[] =
+static int editor_el_rnd[] =
 {
   EL_KEY_1,
   EL_KEY_2,
@@ -3398,17 +3443,22 @@ static int editor_el_more[] =
   EL_ARROW_UP,
   EL_ARROW_DOWN,
 
+  EL_AMOEBA_DEAD,
+  EL_AMOEBA_DRY,
   EL_AMOEBA_FULL,
+  EL_GAME_OF_LIFE,
+
   EL_EMERALD_YELLOW,
   EL_EMERALD_RED,
   EL_EMERALD_PURPLE,
+  EL_BIOMAZE,
 
-  EL_WALL_BD_DIAMOND,
   EL_WALL_EMERALD_YELLOW,
   EL_WALL_EMERALD_RED,
   EL_WALL_EMERALD_PURPLE,
+  EL_WALL_BD_DIAMOND,
 
-  EL_GAME_OF_LIFE,
+  EL_SPEED_PILL,
   EL_PACMAN_UP,
   EL_TIME_ORB_FULL,
   EL_TIME_ORB_EMPTY,
@@ -3416,9 +3466,9 @@ static int editor_el_more[] =
   EL_PACMAN_LEFT,
   EL_DARK_YAMYAM,
   EL_PACMAN_RIGHT,
-  EL_EXPANDABLE_WALL,
+  EL_EMPTY,
 
-  EL_BIOMAZE,
+  EL_BLACK_ORB,
   EL_PACMAN_DOWN,
   EL_LAMP,
   EL_LAMP_ACTIVE,
@@ -3439,29 +3489,24 @@ static int editor_el_more[] =
   EL_BD_FIREFLY,
 
   EL_MOLE_LEFT,
-  EL_EMPTY,
+  EL_SATELLITE,
   EL_MOLE_RIGHT,
   EL_PACMAN,
 
   EL_SPACESHIP,
   EL_MOLE_DOWN,
-  EL_EMPTY,
-  EL_EMPTY,
+  EL_INVISIBLE_STEELWALL,
+  EL_INVISIBLE_WALL,
 
-  EL_SATELLITE,
+  EL_EXPANDABLE_WALL,
   EL_EXPANDABLE_WALL_HORIZONTAL,
   EL_EXPANDABLE_WALL_VERTICAL,
   EL_EXPANDABLE_WALL_ANY,
-
-  EL_INVISIBLE_STEELWALL,
-  EL_INVISIBLE_WALL,
-  EL_SPEED_PILL,
-  EL_BLACK_ORB,
 };
-static int *editor_hl_more_ptr = editor_hl_more;
-static int *editor_el_more_ptr = editor_el_more;
-static int num_editor_hl_more = SIZEOF_ARRAY_INT(editor_hl_more);
-static int num_editor_el_more = SIZEOF_ARRAY_INT(editor_el_more);
+static int *editor_hl_rnd_ptr = editor_hl_rnd;
+static int *editor_el_rnd_ptr = editor_el_rnd;
+static int num_editor_hl_rnd = SIZEOF_ARRAY_INT(editor_hl_rnd);
+static int num_editor_el_rnd = SIZEOF_ARRAY_INT(editor_el_rnd);
 
 static int editor_hl_sokoban[] =
 {
@@ -3469,18 +3514,6 @@ static int editor_hl_sokoban[] =
   EL_CHAR('S'),
   EL_CHAR('B'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('S'),
-  EL_CHAR('O'),
-  EL_CHAR('K'),
-  EL_CHAR('O'),
-
-  EL_CHAR('-'),
-  EL_CHAR('B'),
-  EL_CHAR('A'),
-  EL_CHAR('N'),
-#endif
 };
 
 static int editor_el_sokoban[] =
@@ -3501,74 +3534,58 @@ static int editor_hl_supaplex[] =
   EL_CHAR('S'),
   EL_CHAR('P'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('S'),
-  EL_CHAR('U'),
-  EL_CHAR('P'),
-  EL_CHAR('A'),
-
-  EL_CHAR('P'),
-  EL_CHAR('L'),
-  EL_CHAR('E'),
-  EL_CHAR('X'),
-#endif
 };
 
 static int editor_el_supaplex[] =
 {
-#if 1
+  EL_SP_MURPHY,
   EL_EMPTY,
-#else
-  EL_SP_EMPTY,
-#endif
-  EL_SP_ZONK,
   EL_SP_BASE,
-  EL_SP_MURPHY,
+  EL_SP_BUGGY_BASE,
 
   EL_SP_INFOTRON,
-  EL_SP_CHIP_SINGLE,
-  EL_SP_HARDWARE_GRAY,
-  EL_SP_EXIT_CLOSED,
+  EL_SP_ZONK,
+  EL_SP_SNIKSNAK,
+  EL_SP_ELECTRON,
 
+  EL_SP_DISK_RED,
   EL_SP_DISK_ORANGE,
-  EL_SP_PORT_RIGHT,
-  EL_SP_PORT_DOWN,
-  EL_SP_PORT_LEFT,
-
-  EL_SP_PORT_UP,
-  EL_SP_GRAVITY_PORT_RIGHT,
-  EL_SP_GRAVITY_PORT_DOWN,
-  EL_SP_GRAVITY_PORT_LEFT,
-
-  EL_SP_GRAVITY_PORT_UP,
-  EL_SP_SNIKSNAK,
   EL_SP_DISK_YELLOW,
   EL_SP_TERMINAL,
 
-  EL_SP_DISK_RED,
-  EL_SP_PORT_VERTICAL,
+  EL_SP_EXIT_CLOSED,
   EL_SP_PORT_HORIZONTAL,
+  EL_SP_PORT_VERTICAL,
   EL_SP_PORT_ANY,
 
-  EL_SP_ELECTRON,
-  EL_SP_BUGGY_BASE,
-  EL_SP_CHIP_LEFT,
-  EL_SP_CHIP_RIGHT,
+  EL_SP_PORT_LEFT,
+  EL_SP_PORT_RIGHT,
+  EL_SP_PORT_UP,
+  EL_SP_PORT_DOWN,
 
-  EL_SP_HARDWARE_BASE_1,
+  EL_SP_GRAVITY_PORT_LEFT,
+  EL_SP_GRAVITY_PORT_RIGHT,
+  EL_SP_GRAVITY_PORT_UP,
+  EL_SP_GRAVITY_PORT_DOWN,
+
+  EL_SP_HARDWARE_GRAY,
   EL_SP_HARDWARE_GREEN,
   EL_SP_HARDWARE_BLUE,
   EL_SP_HARDWARE_RED,
 
-  EL_SP_HARDWARE_YELLOW,
+  EL_SP_HARDWARE_BASE_1,
   EL_SP_HARDWARE_BASE_2,
   EL_SP_HARDWARE_BASE_3,
   EL_SP_HARDWARE_BASE_4,
 
   EL_SP_HARDWARE_BASE_5,
   EL_SP_HARDWARE_BASE_6,
+  EL_SP_HARDWARE_YELLOW,
   EL_SP_CHIP_TOP,
+
+  EL_SP_CHIP_SINGLE,
+  EL_SP_CHIP_LEFT,
+  EL_SP_CHIP_RIGHT,
   EL_SP_CHIP_BOTTOM,
 };
 static int *editor_hl_supaplex_ptr = editor_hl_supaplex;
@@ -3582,28 +3599,6 @@ static int editor_hl_diamond_caves[] =
   EL_CHAR('D'),
   EL_CHAR('C'),
   EL_CHAR('2'),
-
-#if 0
-  EL_CHAR('D'),
-  EL_CHAR('I'),
-  EL_CHAR('A'),
-  EL_CHAR('-'),
-
-  EL_CHAR('M'),
-  EL_CHAR('O'),
-  EL_CHAR('N'),
-  EL_CHAR('D'),
-
-  EL_CHAR('C'),
-  EL_CHAR('A'),
-  EL_CHAR('V'),
-  EL_CHAR('E'),
-
-  EL_CHAR('S'),
-  EL_CHAR(' '),
-  EL_CHAR('I'),
-  EL_CHAR('I'),
-#endif
 };
 
 static int editor_el_diamond_caves[] =
@@ -3643,35 +3638,112 @@ static int editor_el_diamond_caves[] =
   EL_CONVEYOR_BELT_3_SWITCH_RIGHT,
   EL_CONVEYOR_BELT_4_SWITCH_RIGHT,
 
-  EL_SWITCHGATE_OPEN,
+  EL_TIMEGATE_CLOSED,
+  EL_TIMEGATE_OPEN,
+  EL_TIMEGATE_SWITCH,
+  EL_DC_TIMEGATE_SWITCH,
+
   EL_SWITCHGATE_CLOSED,
+  EL_SWITCHGATE_OPEN,
   EL_SWITCHGATE_SWITCH_UP,
-  EL_EMPTY,
+  EL_SWITCHGATE_SWITCH_DOWN,
+
+  EL_LIGHT_SWITCH,
+  EL_LIGHT_SWITCH_ACTIVE,
+  EL_DC_SWITCHGATE_SWITCH_UP,
+  EL_DC_SWITCHGATE_SWITCH_DOWN,
+
+  EL_STEEL_EXIT_CLOSED,
+  EL_STEEL_EXIT_OPEN,
+  EL_STEELWALL_SLIPPERY,
+  EL_INVISIBLE_SAND,
+
+  EL_QUICKSAND_FAST_EMPTY,
+  EL_QUICKSAND_FAST_FULL,
+  EL_LANDMINE,
+  EL_DC_LANDMINE,
+
+  EL_SHIELD_NORMAL,
+  EL_SHIELD_DEADLY,
+  EL_EXTRA_TIME,
+  EL_DC_MAGIC_WALL,
 
   EL_ENVELOPE_1,
   EL_ENVELOPE_2,
   EL_ENVELOPE_3,
   EL_ENVELOPE_4,
 
-  EL_TIMEGATE_CLOSED,
-  EL_TIMEGATE_OPEN,
-  EL_TIMEGATE_SWITCH,
+  EL_SIGN_RADIOACTIVITY,
+  EL_SIGN_WHEELCHAIR,
+  EL_SIGN_PARKING,
+  EL_SIGN_NO_ENTRY,
+
+  EL_SIGN_GIVE_WAY,
+  EL_SIGN_ENTRY_FORBIDDEN,
+  EL_SIGN_EMERGENCY_EXIT,
+  EL_SIGN_YIN_YANG,
+
+#if 0
+  EL_SIGN_SPERMS,
+  EL_SIGN_BULLET,
+  EL_SIGN_HEART,
+  EL_SIGN_CROSS,
+
+  EL_SIGN_FRANKIE,
+  EL_EMPTY,
+  EL_EMPTY,
   EL_EMPTY,
 
-  EL_LANDMINE,
-  EL_INVISIBLE_SAND,
-  EL_STEELWALL_SLIPPERY,
+  EL_SPERMS,
+  EL_BULLET,
+  EL_HEART,
+  EL_CROSS,
+
+  EL_FRANKIE,
+  EL_EMPTY,
   EL_EMPTY,
+  EL_EMPTY,
+#endif
 
+  EL_DC_STEELWALL_2_SINGLE,
+  EL_DC_STEELWALL_2_TOP,
   EL_SIGN_EXCLAMATION,
   EL_SIGN_STOP,
-  EL_LIGHT_SWITCH,
-  EL_LIGHT_SWITCH_ACTIVE,
 
-  EL_SHIELD_NORMAL,
-  EL_SHIELD_DEADLY,
-  EL_EXTRA_TIME,
+  EL_DC_STEELWALL_2_LEFT,
+  EL_DC_STEELWALL_2_MIDDLE,
+  EL_DC_STEELWALL_2_HORIZONTAL,
+  EL_DC_STEELWALL_2_RIGHT,
+
+  EL_DC_STEELWALL_1_TOPLEFT,
+  EL_DC_STEELWALL_2_VERTICAL,
+  EL_DC_STEELWALL_1_TOPRIGHT,
+  EL_DC_GATE_WHITE,
+
+  EL_DC_STEELWALL_1_VERTICAL,
+  EL_DC_STEELWALL_2_BOTTOM,
+  EL_DC_KEY_WHITE,
+  EL_DC_GATE_WHITE_GRAY,
+
+  EL_DC_STEELWALL_1_BOTTOMLEFT,
+  EL_DC_STEELWALL_1_HORIZONTAL,
+  EL_DC_STEELWALL_1_BOTTOMRIGHT,
+  EL_DC_GATE_FAKE_GRAY,
+
+  EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
+  EL_DC_STEELWALL_1_BOTTOM,
+  EL_DC_STEELWALL_1_BOTTOMLEFT_2,
+  EL_EXPANDABLE_STEELWALL_HORIZONTAL,
+
+  EL_DC_STEELWALL_1_RIGHT,
   EL_EMPTY,
+  EL_DC_STEELWALL_1_LEFT,
+  EL_EXPANDABLE_STEELWALL_VERTICAL,
+
+  EL_DC_STEELWALL_1_TOPRIGHT_2,
+  EL_DC_STEELWALL_1_TOP,
+  EL_DC_STEELWALL_1_TOPLEFT_2,
+  EL_EXPANDABLE_STEELWALL_ANY,
 };
 static int *editor_hl_diamond_caves_ptr = editor_hl_diamond_caves;
 static int *editor_el_diamond_caves_ptr = editor_el_diamond_caves;
@@ -3684,28 +3756,6 @@ static int editor_hl_dx_boulderdash[] =
   EL_CHAR('D'),
   EL_CHAR('X'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('D'),
-  EL_CHAR('X'),
-  EL_CHAR('-'),
-  EL_CHAR(' '),
-
-  EL_CHAR('B'),
-  EL_CHAR('O'),
-  EL_CHAR('U'),
-  EL_CHAR('L'),
-
-  EL_CHAR('-'),
-  EL_CHAR('D'),
-  EL_CHAR('E'),
-  EL_CHAR('R'),
-
-  EL_CHAR('D'),
-  EL_CHAR('A'),
-  EL_CHAR('S'),
-  EL_CHAR('H'),
-#endif
 };
 
 static int editor_el_dx_boulderdash[] =
@@ -3741,13 +3791,6 @@ static int editor_hl_chars[] =
   EL_CHAR('T'),
   EL_CHAR('X'),
   EL_CHAR('T'),
-
-#if 0
-  EL_CHAR('T'),
-  EL_CHAR('E'),
-  EL_CHAR('X'),
-  EL_CHAR('T'),
-#endif
 };
 
 static int editor_el_chars[] =
@@ -3840,6 +3883,11 @@ static int editor_el_chars[] =
   EL_CHAR('°'),
   EL_CHAR('®'),
   EL_CHAR(FONT_ASCII_CURSOR),
+  EL_CHAR(FONT_ASCII_BUTTON),
+
+  EL_CHAR(FONT_ASCII_UP),
+  EL_CHAR(FONT_ASCII_DOWN),
+  EL_CHAR(' '),
   EL_CHAR(' ')
 };
 static int *editor_hl_chars_ptr = editor_hl_chars;
@@ -3847,34 +3895,122 @@ static int *editor_el_chars_ptr = editor_el_chars;
 static int num_editor_hl_chars = SIZEOF_ARRAY_INT(editor_hl_chars);
 static int num_editor_el_chars = SIZEOF_ARRAY_INT(editor_el_chars);
 
+static int editor_hl_steel_chars[] =
+{
+  EL_INTERNAL_CASCADE_STEEL_CHARS_ACTIVE,
+  EL_STEEL_CHAR('T'),
+  EL_STEEL_CHAR('X'),
+  EL_STEEL_CHAR('T'),
+};
+
+static int editor_el_steel_chars[] =
+{
+  EL_STEEL_CHAR(' '),
+  EL_STEEL_CHAR('!'),
+  EL_STEEL_CHAR('"'),
+  EL_STEEL_CHAR('#'),
+
+  EL_STEEL_CHAR('$'),
+  EL_STEEL_CHAR('%'),
+  EL_STEEL_CHAR('&'),
+  EL_STEEL_CHAR('\''),
+
+  EL_STEEL_CHAR('('),
+  EL_STEEL_CHAR(')'),
+  EL_STEEL_CHAR('*'),
+  EL_STEEL_CHAR('+'),
+
+  EL_STEEL_CHAR(','),
+  EL_STEEL_CHAR('-'),
+  EL_STEEL_CHAR('.'),
+  EL_STEEL_CHAR('/'),
+
+  EL_STEEL_CHAR('0'),
+  EL_STEEL_CHAR('1'),
+  EL_STEEL_CHAR('2'),
+  EL_STEEL_CHAR('3'),
+
+  EL_STEEL_CHAR('4'),
+  EL_STEEL_CHAR('5'),
+  EL_STEEL_CHAR('6'),
+  EL_STEEL_CHAR('7'),
+
+  EL_STEEL_CHAR('8'),
+  EL_STEEL_CHAR('9'),
+  EL_STEEL_CHAR(':'),
+  EL_STEEL_CHAR(';'),
+
+  EL_STEEL_CHAR('<'),
+  EL_STEEL_CHAR('='),
+  EL_STEEL_CHAR('>'),
+  EL_STEEL_CHAR('?'),
+
+  EL_STEEL_CHAR('@'),
+  EL_STEEL_CHAR('A'),
+  EL_STEEL_CHAR('B'),
+  EL_STEEL_CHAR('C'),
+
+  EL_STEEL_CHAR('D'),
+  EL_STEEL_CHAR('E'),
+  EL_STEEL_CHAR('F'),
+  EL_STEEL_CHAR('G'),
+
+  EL_STEEL_CHAR('H'),
+  EL_STEEL_CHAR('I'),
+  EL_STEEL_CHAR('J'),
+  EL_STEEL_CHAR('K'),
+
+  EL_STEEL_CHAR('L'),
+  EL_STEEL_CHAR('M'),
+  EL_STEEL_CHAR('N'),
+  EL_STEEL_CHAR('O'),
+
+  EL_STEEL_CHAR('P'),
+  EL_STEEL_CHAR('Q'),
+  EL_STEEL_CHAR('R'),
+  EL_STEEL_CHAR('S'),
+
+  EL_STEEL_CHAR('T'),
+  EL_STEEL_CHAR('U'),
+  EL_STEEL_CHAR('V'),
+  EL_STEEL_CHAR('W'),
+
+  EL_STEEL_CHAR('X'),
+  EL_STEEL_CHAR('Y'),
+  EL_STEEL_CHAR('Z'),
+  EL_STEEL_CHAR('['),
+
+  EL_STEEL_CHAR('\\'),
+  EL_STEEL_CHAR(']'),
+  EL_STEEL_CHAR('^'),
+  EL_STEEL_CHAR('_'),
+
+  EL_STEEL_CHAR('©'),
+  EL_STEEL_CHAR('Ä'),
+  EL_STEEL_CHAR('Ö'),
+  EL_STEEL_CHAR('Ãœ'),
+
+  EL_STEEL_CHAR('°'),
+  EL_STEEL_CHAR('®'),
+  EL_STEEL_CHAR(FONT_ASCII_CURSOR),
+  EL_STEEL_CHAR(FONT_ASCII_BUTTON),
+
+  EL_STEEL_CHAR(FONT_ASCII_UP),
+  EL_STEEL_CHAR(FONT_ASCII_DOWN),
+  EL_STEEL_CHAR(' '),
+  EL_STEEL_CHAR(' ')
+};
+static int *editor_hl_steel_chars_ptr = editor_hl_steel_chars;
+static int *editor_el_steel_chars_ptr = editor_el_steel_chars;
+static int num_editor_hl_steel_chars = SIZEOF_ARRAY_INT(editor_hl_steel_chars);
+static int num_editor_el_steel_chars = SIZEOF_ARRAY_INT(editor_el_steel_chars);
+
 static int editor_hl_custom[] =
 {
   EL_INTERNAL_CASCADE_CE_ACTIVE,
   EL_CHAR('C'),
   EL_CHAR('E'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('C'),
-  EL_CHAR('U'),
-  EL_CHAR('S'),
-  EL_CHAR('-'),
-
-  EL_CHAR('T'),
-  EL_CHAR('O'),
-  EL_CHAR('M'),
-  EL_CHAR(' '),
-
-  EL_CHAR('E'),
-  EL_CHAR('L'),
-  EL_CHAR('E'),
-  EL_CHAR('M'),
-
-  EL_CHAR('E'),
-  EL_CHAR('N'),
-  EL_CHAR('T'),
-  EL_CHAR('S'),
-#endif
 };
 
 static int editor_el_custom[] =
@@ -4197,12 +4333,7 @@ static int editor_el_custom[] =
   EL_CUSTOM_START + 252,
   EL_CUSTOM_START + 253,
   EL_CUSTOM_START + 254,
-  EL_CUSTOM_START + 255,
-
-  EL_TRIGGER_PLAYER,
-  EL_TRIGGER_ELEMENT,
-  EL_TRIGGER_CE_VALUE,
-  EL_EMPTY
+  EL_CUSTOM_START + 255
 };
 static int *editor_hl_custom_ptr = editor_hl_custom;
 static int *editor_el_custom_ptr = editor_el_custom;
@@ -4215,28 +4346,6 @@ static int editor_hl_group[] =
   EL_CHAR('G'),
   EL_CHAR('E'),
   EL_EMPTY,
-
-#if 0
-  EL_CHAR('G'),
-  EL_CHAR('R'),
-  EL_CHAR('O'),
-  EL_CHAR('U'),
-
-  EL_CHAR('P'),
-  EL_CHAR(' '),
-  EL_CHAR(' '),
-  EL_CHAR(' '),
-
-  EL_CHAR('E'),
-  EL_CHAR('L'),
-  EL_CHAR('E'),
-  EL_CHAR('M'),
-
-  EL_CHAR('E'),
-  EL_CHAR('N'),
-  EL_CHAR('T'),
-  EL_CHAR('S'),
-#endif
 };
 
 static int editor_el_group[] =
@@ -4286,29 +4395,57 @@ static int *editor_el_group_ptr = editor_el_group;
 static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
 static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
 
-static int editor_hl_user_defined[] =
+static int editor_hl_reference[] =
 {
-  EL_INTERNAL_CASCADE_USER_ACTIVE,
-  EL_CHAR('M'),
-  EL_CHAR('Y'),
-  EL_EMPTY,
-
-#if 0
-  EL_CHAR('U'),
-  EL_CHAR('S'),
-  EL_CHAR('E'),
+  EL_INTERNAL_CASCADE_REF_ACTIVE,
   EL_CHAR('R'),
-
-  EL_CHAR('D'),
   EL_CHAR('E'),
-  EL_CHAR('F'),
-  EL_CHAR('I'),
+  EL_CHAR('F')
+};
 
-  EL_CHAR('-'),
-  EL_CHAR('N'),
-  EL_CHAR('E'),
-  EL_CHAR('D'),
-#endif
+static int editor_el_reference[] =
+{
+  EL_TRIGGER_PLAYER,
+  EL_TRIGGER_ELEMENT,
+  EL_TRIGGER_CE_VALUE,
+  EL_TRIGGER_CE_SCORE,
+
+  EL_SELF,
+  EL_ANY_ELEMENT,
+  EL_CURRENT_CE_VALUE,
+  EL_CURRENT_CE_SCORE,
+
+  EL_PREV_CE_8,
+  EL_PREV_CE_7,
+  EL_PREV_CE_6,
+  EL_PREV_CE_5,
+
+  EL_PREV_CE_4,
+  EL_PREV_CE_3,
+  EL_PREV_CE_2,
+  EL_PREV_CE_1,
+
+  EL_NEXT_CE_1,
+  EL_NEXT_CE_2,
+  EL_NEXT_CE_3,
+  EL_NEXT_CE_4,
+
+  EL_NEXT_CE_5,
+  EL_NEXT_CE_6,
+  EL_NEXT_CE_7,
+  EL_NEXT_CE_8,
+};
+static int *editor_hl_reference_ptr = editor_hl_reference;
+static int *editor_el_reference_ptr = editor_el_reference;
+static int num_editor_hl_reference = SIZEOF_ARRAY_INT(editor_hl_reference);
+static int num_editor_el_reference = SIZEOF_ARRAY_INT(editor_el_reference);
+
+static int editor_hl_user_defined[] =
+{
+  EL_INTERNAL_CASCADE_USER_ACTIVE,
+  EL_CHAR('M'),
+  EL_CHAR('Y'),
+  EL_EMPTY,
 };
 
 static int *editor_hl_user_defined_ptr = editor_hl_user_defined;
@@ -4342,6 +4479,13 @@ static boolean use_el_empty = FALSE;
 static int *editor_elements = NULL;    /* dynamically allocated */
 static int num_editor_elements = 0;    /* dynamically determined */
 
+static boolean setup_editor_show_always = TRUE;
+static boolean setup_editor_cascade_never = FALSE;
+
+static int editor_hl_unused[] = { EL_EMPTY };
+static int *editor_hl_unused_ptr = editor_hl_unused;
+static int num_editor_hl_unused = 0;
+
 static struct
 {
   boolean *setup_value;
@@ -4357,6 +4501,12 @@ static struct
 }
 editor_elements_info[] =
 {
+  {
+    &setup_editor_show_always,
+    &setup_editor_cascade_never,
+    &editor_hl_unused_ptr,             &num_editor_hl_unused,
+    &editor_el_players_ptr,            &num_editor_el_players
+  },
   {
     &setup.editor.el_boulderdash,
     &setup.editor_cascade.el_bd,
@@ -4378,8 +4528,8 @@ editor_elements_info[] =
   {
     &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
+    &editor_hl_rnd_ptr,                        &num_editor_hl_rnd,
+    &editor_el_rnd_ptr,                        &num_editor_el_rnd
   },
   {
     &setup.editor.el_sokoban,
@@ -4411,6 +4561,12 @@ editor_elements_info[] =
     &editor_hl_chars_ptr,              &num_editor_hl_chars,
     &editor_el_chars_ptr,              &num_editor_el_chars
   },
+  {
+    &setup.editor.el_steel_chars,
+    &setup.editor_cascade.el_steel_chars,
+    &editor_hl_steel_chars_ptr,                &num_editor_hl_steel_chars,
+    &editor_el_steel_chars_ptr,                &num_editor_el_steel_chars
+  },
   {
     &setup.editor.el_custom,
     &setup.editor_cascade.el_ce,
@@ -4423,6 +4579,12 @@ editor_elements_info[] =
     &editor_hl_group_ptr,              &num_editor_hl_group,
     &editor_el_group_ptr,              &num_editor_el_group
   },
+  {
+    &setup.editor.el_custom,
+    &setup.editor_cascade.el_ref,
+    &editor_hl_reference_ptr,          &num_editor_hl_reference,
+    &editor_el_reference_ptr,          &num_editor_el_reference
+  },
   {
     &setup.editor.el_user_defined,
     &setup.editor_cascade.el_user,
@@ -4486,11 +4648,7 @@ static char *getElementInfoText(int element)
 {
   char *info_text = NULL;
 
-#if 1
   if (element < MAX_NUM_ELEMENTS)
-#else
-  if (element < NUM_FILE_ELEMENTS)
-#endif
   {
     if (strlen(element_info[element].description) > 0)
       info_text = element_info[element].description;
@@ -4506,6 +4664,32 @@ static char *getElementInfoText(int element)
   return info_text;
 }
 
+char *getElementDescriptionFilename(int element)
+{
+  char *docs_dir = options.docs_directory;
+  char *elements_subdir = "elements";
+  static char *filename = NULL;
+  char basename[MAX_FILENAME_LEN];
+
+  checked_free(filename);
+
+  /* 1st try: look for element description file for exactly this element */
+  sprintf(basename, "%s.txt", element_info[element].token_name);
+  filename = getPath3(docs_dir, elements_subdir, basename);
+  if (fileExists(filename))
+    return filename;
+
+  free(filename);
+
+  /* 2nd try: look for element description file for this element's class */
+  sprintf(basename, "%s.txt", element_info[element].class_name);
+  filename = getPath3(docs_dir, elements_subdir, basename);
+  if (fileExists(filename))
+    return filename;
+
+  return NULL;
+}
+
 static void InitDynamicEditorElementList(int **elements, int *num_elements)
 {
   boolean element_found[NUM_FILE_ELEMENTS];
@@ -4602,7 +4786,7 @@ static void ReinitializeElementList()
       if (element >= NUM_FILE_ELEMENTS)
        Error(ERR_WARN, "editor element %d is runtime element", element);
 
-      if (strcmp(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT) == 0)
+      if (strEqual(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT))
        Error(ERR_WARN, "no element description for element %d", element);
     }
   }
@@ -4805,10 +4989,38 @@ static void DrawDrawingArea(int id)
 
 static void ScrollMiniLevel(int from_x, int from_y, int scroll)
 {
-  int x,y;
+#if 0
+  /* (directly solved in BlitBitmap() now) */
+  static Bitmap *tmp_backbuffer = NULL;
+#endif
+  int x, y;
   int dx = (scroll == ED_SCROLL_LEFT ? -1 : scroll == ED_SCROLL_RIGHT ? 1 : 0);
   int dy = (scroll == ED_SCROLL_UP   ? -1 : scroll == ED_SCROLL_DOWN  ? 1 : 0);
 
+#if 0
+  /* (directly solved in BlitBitmap() now) */
+  if (tmp_backbuffer == NULL)
+    tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
+
+  /* needed when blitting directly to same bitmap -- should not be needed with
+     recent SDL libraries, but apparently does not work in 1.2.11 directly */
+  BlitBitmap(drawto, tmp_backbuffer,
+            SX + (dx == -1 ? MINI_TILEX : 0),
+            SY + (dy == -1 ? MINI_TILEY : 0),
+            (ed_fieldx * MINI_TILEX) - (dx != 0 ? MINI_TILEX : 0),
+            (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0),
+            SX + (dx == +1 ? MINI_TILEX : 0),
+            SY + (dy == +1 ? MINI_TILEY : 0));
+  BlitBitmap(tmp_backbuffer, drawto,
+            SX + (dx == +1 ? MINI_TILEX : 0),
+            SY + (dy == +1 ? MINI_TILEY : 0),
+            (ed_fieldx * MINI_TILEX) - (dx != 0 ? MINI_TILEX : 0),
+            (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0),
+            SX + (dx == +1 ? MINI_TILEX : 0),
+            SY + (dy == +1 ? MINI_TILEY : 0));
+
+#else
+
   BlitBitmap(drawto, drawto,
             SX + (dx == -1 ? MINI_TILEX : 0),
             SY + (dy == -1 ? MINI_TILEY : 0),
@@ -4816,6 +5028,8 @@ static void ScrollMiniLevel(int from_x, int from_y, int scroll)
             (ed_fieldy * MINI_TILEY) - (dy != 0 ? MINI_TILEY : 0),
             SX + (dx == +1 ? MINI_TILEX : 0),
             SY + (dy == +1 ? MINI_TILEY : 0));
+#endif
+
   if (dx)
   {
     x = (dx == 1 ? 0 : ed_fieldx - 1);
@@ -5185,8 +5399,11 @@ static void CreateCounterButtons()
        if (i == ED_COUNTER_ID_SELECT_LEVEL)
        {
          font_type = FONT_LEVEL_NUMBER;
+#if 1
+         font_type_active = FONT_LEVEL_NUMBER_ACTIVE;
+#else
          font_type_active = FONT_LEVEL_NUMBER;
-
+#endif
          x += 2 * ED_GADGET_DISTANCE;
          y -= ED_GADGET_DISTANCE;
 
@@ -5654,6 +5871,10 @@ static void CreateScrollbarGadgets()
                      GDI_SCROLLBAR_ITEMS_MAX, items_max,
                      GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
                      GDI_SCROLLBAR_ITEM_POSITION, item_position,
+                     GDI_WHEEL_AREA_X, scrollbar_info[i].wheel_x,
+                     GDI_WHEEL_AREA_Y, scrollbar_info[i].wheel_y,
+                     GDI_WHEEL_AREA_WIDTH, scrollbar_info[i].wheel_width,
+                     GDI_WHEEL_AREA_HEIGHT, scrollbar_info[i].wheel_height,
                      GDI_STATE, GD_BUTTON_UNPRESSED,
                      GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
                      GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
@@ -5846,11 +6067,7 @@ static void MapCounterButtons(int id)
   int yoffset_above = MINI_TILEX + ED_GADGET_DISTANCE;
   int yoffset = ED_BORDER_SIZE;
   int x_left = gi_down->x - xoffset_left;
-#if 1
   int x_right; /* set after gadget position was modified */
-#else
-  int x_right = gi_up->x + gi_up->width + xoffset_right;
-#endif
   int y_above = gi_down->y - yoffset_above;
   int x = gi_down->x;
   int y;       /* set after gadget position was modified */
@@ -6351,71 +6568,8 @@ static void copy_custom_element_settings(int element_from, int element_to)
 {
   struct ElementInfo *ei_from = &element_info[element_from];
   struct ElementInfo *ei_to = &element_info[element_to];
-  int i, x, y;
-
-  /* ---------- copy element description ---------- */
-  for (i = 0; i < MAX_ELEMENT_NAME_LEN + 1; i++)
-    ei_to->description[i] = ei_from->description[i];
-
-  /* ---------- copy element base properties ---------- */
-  Properties[element_to][EP_BITFIELD_BASE] =
-    Properties[element_from][EP_BITFIELD_BASE];
-
-  /* ---------- copy custom property values ---------- */
-
-  ei_to->use_gfx_element = ei_from->use_gfx_element;
-  ei_to->gfx_element = ei_from->gfx_element;
-
-  ei_to->access_direction = ei_from->access_direction;
-
-  ei_to->collect_score_initial = ei_from->collect_score_initial;
-  ei_to->collect_count_initial = ei_from->collect_count_initial;
-
-  ei_to->ce_value_fixed_initial = ei_from->ce_value_fixed_initial;
-  ei_to->ce_value_random_initial = ei_from->ce_value_random_initial;
-  ei_to->use_last_ce_value = ei_from->use_last_ce_value;
 
-  ei_to->push_delay_fixed = ei_from->push_delay_fixed;
-  ei_to->push_delay_random = ei_from->push_delay_random;
-  ei_to->drop_delay_fixed = ei_from->drop_delay_fixed;
-  ei_to->drop_delay_random = ei_from->drop_delay_random;
-  ei_to->move_delay_fixed = ei_from->move_delay_fixed;
-  ei_to->move_delay_random = ei_from->move_delay_random;
-
-  ei_to->move_pattern = ei_from->move_pattern;
-  ei_to->move_direction_initial = ei_from->move_direction_initial;
-  ei_to->move_stepsize = ei_from->move_stepsize;
-
-  ei_to->move_enter_element = ei_from->move_enter_element;
-  ei_to->move_leave_element = ei_from->move_leave_element;
-  ei_to->move_leave_type = ei_from->move_leave_type;
-
-  ei_to->slippery_type = ei_from->slippery_type;
-
-  for (y = 0; y < 3; y++)
-    for (x = 0; x < 3; x++)
-      ei_to->content.e[x][y] = ei_from->content.e[x][y];
-
-  ei_to->explosion_type = ei_from->explosion_type;
-  ei_to->explosion_delay = ei_from->explosion_delay;
-  ei_to->ignition_delay = ei_from->ignition_delay;
-
-  /* ---------- reinitialize and copy change pages ---------- */
-
-  ei_to->num_change_pages = ei_from->num_change_pages;
-  ei_to->current_change_page = ei_from->current_change_page;
-
-  setElementChangePages(ei_to, ei_to->num_change_pages);
-
-  for (i=0; i < ei_to->num_change_pages; i++)
-    ei_to->change_page[i] = ei_from->change_page[i];
-
-  /* ---------- copy group element info ---------- */
-  if (ei_from->group != NULL && ei_to->group != NULL)  /* group or internal */
-    *ei_to->group = *ei_from->group;
-
-  /* mark this custom element as modified */
-  ei_to->modified_settings = TRUE;
+  copyElementInfo(ei_from, ei_to);
 }
 
 static void replace_custom_element_in_settings(int element_from,
@@ -6439,8 +6593,8 @@ static void replace_custom_element_in_settings(int element_from,
       if (change->target_element == element_from)
        change->target_element = element_to;
 
-      if (change->trigger_element == element_from)
-       change->trigger_element = element_to;
+      if (change->initial_trigger_element == element_from)
+       change->initial_trigger_element = element_to;
 
       for (y = 0; y < 3; y++)
        for (x = 0; x < 3; x++)
@@ -6616,11 +6770,13 @@ static void CopyCustomElementPropertiesToEditor(int element)
   /* set deadliness selectbox help value */
   custom_element.deadliness =
     (DONT_TOUCH(element) ? EP_DONT_TOUCH :
+     DONT_GET_HIT_BY(element) ? EP_DONT_GET_HIT_BY :
      DONT_COLLIDE_WITH(element) ? EP_DONT_COLLIDE_WITH :
      DONT_RUN_INTO(element) ? EP_DONT_RUN_INTO :
      custom_element.deadliness);
   custom_element_properties[EP_DEADLY] =
     (DONT_TOUCH(element) ||
+     DONT_GET_HIT_BY(element) ||
      DONT_COLLIDE_WITH(element) ||
      DONT_RUN_INTO(element));
 
@@ -6642,7 +6798,10 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_BLOCKED) ? CE_BLOCKED :
      HAS_CHANGE_EVENT(element, CE_IMPACT) ? CE_IMPACT :
      HAS_CHANGE_EVENT(element, CE_SMASHED) ? CE_SMASHED :
+     HAS_CHANGE_EVENT(element, CE_VALUE_CHANGES) ? CE_VALUE_CHANGES :
+     HAS_CHANGE_EVENT(element, CE_SCORE_CHANGES) ? CE_SCORE_CHANGES :
      HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO) ? CE_VALUE_GETS_ZERO :
+     HAS_CHANGE_EVENT(element, CE_SCORE_GETS_ZERO) ? CE_SCORE_GETS_ZERO :
      custom_element_change.direct_action);
 
   /* set "change by other element action" selectbox help value */
@@ -6666,7 +6825,10 @@ static void CopyCustomElementPropertiesToEditor(int element)
      HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X :
      HAS_CHANGE_EVENT(element, CE_MOVE_OF_X) ? CE_MOVE_OF_X :
      HAS_CHANGE_EVENT(element, CE_CREATION_OF_X) ? CE_CREATION_OF_X :
+     HAS_CHANGE_EVENT(element, CE_VALUE_CHANGES_OF_X) ? CE_VALUE_CHANGES_OF_X :
+     HAS_CHANGE_EVENT(element, CE_SCORE_CHANGES_OF_X) ? CE_SCORE_CHANGES_OF_X :
      HAS_CHANGE_EVENT(element, CE_VALUE_GETS_ZERO_OF_X) ? CE_VALUE_GETS_ZERO_OF_X :
+     HAS_CHANGE_EVENT(element, CE_SCORE_GETS_ZERO_OF_X) ? CE_SCORE_GETS_ZERO_OF_X :
      custom_element_change.other_action);
 }
 
@@ -6762,6 +6924,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   /* set deadliness property from checkbox and selectbox */
   custom_element_properties[EP_DONT_RUN_INTO] = FALSE;
   custom_element_properties[EP_DONT_COLLIDE_WITH] = FALSE;
+  custom_element_properties[EP_DONT_GET_HIT_BY] = FALSE;
   custom_element_properties[EP_DONT_TOUCH] = FALSE;
   custom_element_properties[custom_element.deadliness] =
     custom_element_properties[EP_DEADLY];
@@ -6783,7 +6946,10 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_BLOCKED] = FALSE;
   custom_element_change_events[CE_IMPACT] = FALSE;
   custom_element_change_events[CE_SMASHED] = FALSE;
+  custom_element_change_events[CE_VALUE_CHANGES] = FALSE;
+  custom_element_change_events[CE_SCORE_CHANGES] = FALSE;
   custom_element_change_events[CE_VALUE_GETS_ZERO] = FALSE;
+  custom_element_change_events[CE_SCORE_GETS_ZERO] = FALSE;
   custom_element_change_events[custom_element_change.direct_action] =
     custom_element_change_events[CE_BY_DIRECT_ACTION];
 
@@ -6807,7 +6973,10 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE;
   custom_element_change_events[CE_MOVE_OF_X] = FALSE;
   custom_element_change_events[CE_CREATION_OF_X] = FALSE;
+  custom_element_change_events[CE_VALUE_CHANGES_OF_X] = FALSE;
+  custom_element_change_events[CE_SCORE_CHANGES_OF_X] = FALSE;
   custom_element_change_events[CE_VALUE_GETS_ZERO_OF_X] = FALSE;
+  custom_element_change_events[CE_SCORE_GETS_ZERO_OF_X] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
     custom_element_change_events[CE_BY_OTHER_ACTION];
 
@@ -6853,11 +7022,29 @@ static void CopyElementPropertiesToGame(int element)
     CopyClassicElementPropertiesToGame(element);
 }
 
+void CheckElementDescriptions()
+{
+  int i;
+
+  for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+    if (getElementDescriptionFilename(i) == NULL && !IS_OBSOLETE(i))
+      Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i));
+}
+
 void DrawLevelEd()
 {
   CloseDoor(DOOR_CLOSE_ALL);
+
+#if 1
+  FadeOut(REDRAW_FIELD);
+#endif
+
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
 
+#if DEBUG
+  CheckElementDescriptions();
+#endif
+
   if (level_editor_test_game)
   {
     CopyPlayfield(level.field, Feld);
@@ -6892,15 +7079,33 @@ void DrawLevelEd()
   ReinitializeElementList();           /* update dynamic level element list */
   ReinitializeElementListButtons();    /* custom element may look different */
 
+#if 1
+  UnmapAllGadgets();
+#else
   UnmapTapeButtons();
+#endif
   MapControlButtons();
 
+#if 0
+  FadeOut(REDRAW_FIELD);
+#endif
+
   DrawEditModeWindow();
 
+#if 1
+  FadeIn(REDRAW_FIELD);
+#endif
+
   /* copy actual editor door content to door double buffer for OpenDoor() */
   BlitBitmap(drawto, bitmap_db_door,
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
+#if 1
+  /* draw new control window (with border) to window */
+  redraw_mask |= REDRAW_ALL;
+  BackToFront();
+#endif
+
   OpenDoor(DOOR_OPEN_1);
 }
 
@@ -7153,7 +7358,7 @@ static void DrawDrawingWindow()
   stick_element_properties_window = FALSE;
 
   SetMainBackgroundImage(IMG_UNDEFINED);
-  ClearWindow();
+  ClearField();
 
   UnmapLevelEditorWindowGadgets();
   UnmapLevelEditorToolboxCustomGadgets();
@@ -7176,7 +7381,7 @@ static void DrawLevelInfoWindow()
   stick_element_properties_window = FALSE;
 
   SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
-  ClearWindow();
+  ClearField();
   UnmapLevelEditorWindowGadgets();
 
 #if 0
@@ -7372,7 +7577,7 @@ static void DrawEnvelopeTextArea(int envelope_nr)
   DrawBackground(gi->x, gi->y, gi->width, gi->height);
 
   if (envelope_nr != -1)
-    textarea_info[id].value = level.envelope_text[envelope_nr];
+    textarea_info[id].value = level.envelope[envelope_nr].text;
 
   ModifyGadget(gi, GDI_AREA_SIZE,
               *counterbutton_info[ED_COUNTER_ID_ENVELOPE_XSIZE].value,
@@ -7382,32 +7587,6 @@ static void DrawEnvelopeTextArea(int envelope_nr)
   MapTextAreaGadget(ED_TEXTAREA_ID_ENVELOPE_INFO);
 }
 
-char *getElementDescriptionFilename(int element)
-{
-  char *docs_dir = options.docs_directory;
-  char *elements_subdir = "elements";
-  static char *filename = NULL;
-  char basename[MAX_FILENAME_LEN];
-
-  checked_free(filename);
-
-  /* 1st try: look for element description file for exactly this element */
-  sprintf(basename, "%s.txt", element_info[element].token_name);
-  filename = getPath3(docs_dir, elements_subdir, basename);
-  if (fileExists(filename))
-    return filename;
-
-  free(filename);
-
-  /* 2nd try: look for element description file for this element's class */
-  sprintf(basename, "%s.txt", element_info[element].class_name);
-  filename = getPath3(docs_dir, elements_subdir, basename);
-  if (fileExists(filename))
-    return filename;
-
-  return NULL;
-}
-
 static boolean PrintInfoText(char *text, int font_nr, int start_line)
 {
   int font_height = getFontHeight(font_nr);
@@ -7437,23 +7616,27 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line)
   int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width;
   int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
 
-  return DrawTextFromFile(sx, sy, filename, font_nr, max_chars_per_line,
-                         max_lines_per_screen);
+  return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+                     max_lines_per_screen, -1, TRUE, FALSE, FALSE);
 }
 
 static void DrawPropertiesTabulatorGadgets()
 {
-  struct GadgetInfo *gd_gi = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
-  struct GadgetDesign *gd = &gd_gi->alt_design[GD_BUTTON_UNPRESSED];
-  int gd_x = gd->x + gd_gi->border.width / 2;
-  int gd_y = gd->y + gd_gi->height - 1;
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
+  struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE];
+  struct GadgetDesign *gd = &gd_gi1->alt_design[GD_BUTTON_UNPRESSED];
+  int gd_x = gd->x + gd_gi1->border.width / 2;
+  int gd_y = gd->y + gd_gi1->height - 1;
   Pixel tab_color = GetPixel(gd->bitmap, gd_x, gd_y);
   int id_first = ED_TEXTBUTTON_ID_PROPERTIES_INFO;
   int id_last  = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG;
+#if 1
+#else
   int max_tabs = 4;
+#endif
   int i;
 
-  /* draw additional "advanced" tabulator for custom elements */
+  /* draw additional "change" tabulator for custom elements */
   if (IS_CUSTOM_ELEMENT(properties_element))
     id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE;
 
@@ -7469,21 +7652,29 @@ static void DrawPropertiesTabulatorGadgets()
       continue;
 
     /* draw background line below tabulator button */
-    ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width,1);
+    ClearRectangleOnBackground(drawto, gi->x, gi->y + gi->height, gi->width, 1);
 
     /* draw solid line below inactive tabulator buttons */
     if (!active && tab_color != BLACK_PIXEL)   /* black => transparent */
-      FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width,1, tab_color);
+      FillRectangle(drawto, gi->x, gi->y + gi->height, gi->width, 1, tab_color);
 
     ModifyGadget(gi, GDI_ACTIVE, active, GDI_END);
     MapTextbuttonGadget(i);
   }
 
+#if 1
   /* draw little border line below tabulator buttons */
   if (tab_color != BLACK_PIXEL)                        /* black => transparent */
-    FillRectangle(drawto, gd_gi->x, gd_gi->y + gd_gi->height + 1,
-                 max_tabs * gd_gi->width + (max_tabs -1) * ED_GADGET_DISTANCE,
+    FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1,
+                 gd_gi4->x - gd_gi1->x + gd_gi4->width, ED_GADGET_DISTANCE,
+                 tab_color);
+#else
+  /* draw little border line below tabulator buttons */
+  if (tab_color != BLACK_PIXEL)                        /* black => transparent */
+    FillRectangle(drawto, gd_gi1->x, gd_gi1->y + gd_gi1->height + 1,
+                 max_tabs * gd_gi1->width + (max_tabs -1) * ED_GADGET_DISTANCE,
                  ED_GADGET_DISTANCE, tab_color);
+#endif
 }
 
 static void DrawPropertiesInfo()
@@ -7525,6 +7716,7 @@ static void DrawPropertiesInfo()
 
     { EP_DONT_RUN_INTO,                "- deadly when running into"            },
     { EP_DONT_COLLIDE_WITH,    "- deadly when colliding with"          },
+    { EP_DONT_GET_HIT_BY,      "- deadly when getting hit by"          },
     { EP_DONT_TOUCH,           "- deadly when touching"                },
 
     { EP_INDESTRUCTIBLE,       "- indestructible"                      },
@@ -7537,6 +7729,7 @@ static void DrawPropertiesInfo()
 
     /* pre-defined properties */
     { EP_CAN_PASS_MAGIC_WALL,  "- can pass magic walls"                },
+    { EP_CAN_PASS_DC_MAGIC_WALL,"- can pass magic walls (DC style)"    },
     { EP_SWITCHABLE,           "- can be switched"                     },
 #if 0
     { EP_HAS_EDITOR_CONTENT,   "- can contain other elements"          },
@@ -7559,20 +7752,12 @@ static void DrawPropertiesInfo()
   int screen_line = 0;
   int i, x, y;
 
-#if DEBUG
-  if (IS_CUSTOM_ELEMENT(properties_element))
-  {
-    DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3,
-             "[Custom Element %d]", properties_element - EL_CUSTOM_START + 1);
-    screen_line++;
-  }
-  else if (IS_GROUP_ELEMENT(properties_element))
+  if (setup.editor.show_element_token)
   {
     DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3,
-             "[Group Element %d]", properties_element - EL_GROUP_START + 1);
+             "[%s]", element_info[properties_element].token_name);
     screen_line++;
   }
-#endif
 
   /* ----- print number of elements / percentage of this element in level */
 
@@ -7621,7 +7806,7 @@ static void DrawPropertiesInfo()
 
 #define TEXT_COLLECTING                "Score for collecting"
 #define TEXT_SMASHING          "Score for smashing"
-#define TEXT_SLURPING          "Score for slurping"
+#define TEXT_SLURPING          "Score for slurping robot"
 #define TEXT_CRACKING          "Score for cracking"
 #define TEXT_AMOEBA_SPEED      "Speed of amoeba growth"
 #define TEXT_DURATION          "Duration when activated"
@@ -7673,6 +7858,10 @@ static struct
   { 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   },
@@ -7682,6 +7871,7 @@ static struct
   { 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 },
@@ -7700,6 +7890,7 @@ static struct
   { 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_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 },
@@ -7707,10 +7898,12 @@ static struct
   { EL_EMC_DRIPPER,    &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_MAGIC_WALL,     &level.time_magic_wall,         TEXT_DURATION   },
   { EL_BD_MAGIC_WALL,  &level.time_magic_wall,         TEXT_DURATION   },
+  { EL_DC_MAGIC_WALL,  &level.time_magic_wall,         TEXT_DURATION   },
   { EL_ROBOT_WHEEL,    &level.time_wheel,              TEXT_DURATION   },
 
-#if 1
-  { EL_TIMEGATE_SWITCH,        &level.time_timegate,           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   },
@@ -7724,18 +7917,15 @@ static struct
   { 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 },
-#endif
 
-#if 1
   { 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_ROBOT,          &level.slurp_score,             TEXT_SLURPING   },
+  { EL_SPRING,         &level.slurp_score,             TEXT_SLURPING   },
   { EL_EMC_LENSES,     &level.lenses_time,             TEXT_DURATION   },
   { EL_EMC_MAGNIFIER,  &level.magnify_time,            TEXT_DURATION   },
-#endif
 
   { -1,                        NULL,                           NULL            }
 };
@@ -7822,7 +8012,11 @@ static void DrawPropertiesConfig()
 
     if (IS_AMOEBOID(properties_element))
       MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
-    else if (properties_element == EL_YAMYAM)
+    else if (properties_element == EL_YAMYAM ||
+            properties_element == EL_YAMYAM_LEFT ||
+            properties_element == EL_YAMYAM_RIGHT ||
+            properties_element == EL_YAMYAM_UP ||
+            properties_element == EL_YAMYAM_DOWN)
       DrawYamYamContentAreas();
     else if (properties_element == EL_EMC_MAGIC_BALL)
     {
@@ -7840,6 +8034,7 @@ static void DrawPropertiesConfig()
     int player_nr = GET_PLAYER_NR(properties_element);
 
     /* 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 =
@@ -7847,23 +8042,30 @@ static void DrawPropertiesConfig()
     drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
       &level.explosion_element[player_nr];
 
-    /* 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];
+    checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value =
+      &level.initial_player_gravity[player_nr];
+
+    selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value =
+      &level.initial_player_stepsize[player_nr];
 
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
                         ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
                         ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_INSTANT_RELOCATION);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_SHIFTED_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_INITIAL_GRAVITY);
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE);
 
     MapDrawingArea(ED_DRAWING_ID_START_ELEMENT);
@@ -7900,11 +8102,6 @@ static void DrawPropertiesConfig()
   if (properties_element == EL_TIME_ORB_FULL)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_TIME_ORB_BUG);
 
-#if 0
-  if (properties_element == EL_BALLOON)
-    MapSelectboxGadget(ED_SELECTBOX_ID_WIND_DIRECTION);
-#endif
-
   if (CAN_GROW(properties_element))
   {
     checkbutton_info[ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE].y =
@@ -7917,14 +8114,23 @@ static void DrawPropertiesConfig()
   {
     int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
     int counter2_id = ED_COUNTER_ID_ENVELOPE_YSIZE;
+    int button1_id = ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP;
+    int button2_id = ED_CHECKBUTTON_ID_ENVELOPE_CENTERED;
     int envelope_nr = properties_element - EL_ENVELOPE_1;
 
-    counterbutton_info[counter1_id].value = &level.envelope_xsize[envelope_nr];
-    counterbutton_info[counter2_id].value = &level.envelope_ysize[envelope_nr];
+    counterbutton_info[counter1_id].value = &level.envelope[envelope_nr].xsize;
+    counterbutton_info[counter2_id].value = &level.envelope[envelope_nr].ysize;
+
+    checkbutton_info[button1_id].value = &level.envelope[envelope_nr].autowrap;
+    checkbutton_info[button2_id].value = &level.envelope[envelope_nr].centered;
 
     /* display counter to choose size of envelope text area */
-    MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE);
-    MapCounterButtons(ED_COUNTER_ID_ENVELOPE_YSIZE);
+    MapCounterButtons(counter1_id);
+    MapCounterButtons(counter2_id);
+
+    /* display checkbuttons to choose auto-wrap and alignment properties */
+    MapCheckbuttonGadget(button1_id);
+    MapCheckbuttonGadget(button2_id);
 
     DrawEnvelopeTextArea(envelope_nr);
   }
@@ -8120,92 +8326,1062 @@ static void DrawEditorElementName(int x, int y, int element)
   }
 }
 
-static void DrawPropertiesWindow()
-{
-  int xstart = 2;
-  int ystart = 4;
+static void DrawPropertiesWindow()
+{
+  int xstart = 2;
+  int ystart = 4;
+
+  stick_element_properties_window = FALSE;
+
+  /* make sure that previous properties edit mode exists for this element */
+  if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG &&
+      !IS_CUSTOM_ELEMENT(properties_element))
+    edit_mode_properties = ED_MODE_PROPERTIES_CONFIG;
+
+  if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG &&
+      IS_CUSTOM_ELEMENT(properties_element))
+    edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1;
+
+  CopyElementPropertiesToEditor(properties_element);
+
+  UnmapLevelEditorWindowGadgets();
+  UnmapLevelEditorToolboxDrawingGadgets();
+  UnmapLevelEditorToolboxCustomGadgets();
+
+  if (IS_CUSTOM_ELEMENT(properties_element) ||
+      IS_GROUP_ELEMENT(properties_element))
+    MapLevelEditorToolboxCustomGadgets();
+
+  SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
+  ClearField();
+
+#if 0
+  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
+#else
+  DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
+          "Element Settings", FONT_TITLE_1);
+#endif
+
+  FrameCounter = 0;    /* restart animation frame counter */
+
+  DrawElementBorder(SX + xstart * MINI_TILEX,
+                   SY + ystart * MINI_TILEY + MINI_TILEY / 2,
+                   TILEX, TILEY, FALSE);
+
+  DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
+                            SY + ystart * MINI_TILEY + MINI_TILEY / 2);
+
+  DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
+                       (ystart + 1) * MINI_TILEY + 1,
+                       properties_element);
+
+  DrawPropertiesTabulatorGadgets();
+
+  if (edit_mode_properties == ED_MODE_PROPERTIES_INFO)
+    DrawPropertiesInfo();
+  else if (edit_mode_properties == ED_MODE_PROPERTIES_CHANGE)
+    DrawPropertiesChange();
+  else /* (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG[_1|_2]) */
+    DrawPropertiesConfig();
+}
+
+static void UpdateCustomElementGraphicGadgets()
+{
+  int i;
+
+  ModifyEditorElementList();
+  RedrawDrawingElements();
+
+  /* force redraw of all mapped drawing area gadgets */
+  for (i = 0; i < ED_NUM_DRAWING_AREAS; i++)
+  {
+    struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id];
+
+    if (gi->mapped)
+      MapDrawingArea(i);
+  }
+}
+
+static int getOpenDirectionFromTube(int element)
+{
+  switch (element)
+  {
+    case EL_TUBE_LEFT_UP:              return (MV_LEFT | MV_UP);
+    case EL_TUBE_LEFT_DOWN:            return (MV_LEFT | MV_DOWN);
+    case EL_TUBE_RIGHT_UP:             return (MV_RIGHT | MV_UP);
+    case EL_TUBE_RIGHT_DOWN:           return (MV_RIGHT | MV_DOWN);
+    case EL_TUBE_HORIZONTAL:           return (MV_HORIZONTAL);
+    case EL_TUBE_HORIZONTAL_UP:                return (MV_HORIZONTAL | MV_UP);
+    case EL_TUBE_HORIZONTAL_DOWN:      return (MV_HORIZONTAL | MV_DOWN);
+    case EL_TUBE_VERTICAL:             return (MV_VERTICAL);
+    case EL_TUBE_VERTICAL_LEFT:                return (MV_VERTICAL | MV_LEFT);
+    case EL_TUBE_VERTICAL_RIGHT:       return (MV_VERTICAL | MV_RIGHT);
+    case EL_TUBE_ANY:                  return (MV_ANY_DIRECTION);
+  }
+
+  return MV_NONE;
+}
+
+static int getTubeFromOpenDirection(int direction)
+{
+  switch (direction)
+  {
+    case (MV_LEFT | MV_UP):            return EL_TUBE_LEFT_UP;
+    case (MV_LEFT | MV_DOWN):          return EL_TUBE_LEFT_DOWN;
+    case (MV_RIGHT | MV_UP):           return EL_TUBE_RIGHT_UP;
+    case (MV_RIGHT | MV_DOWN):         return EL_TUBE_RIGHT_DOWN;
+    case (MV_HORIZONTAL):              return EL_TUBE_HORIZONTAL;
+    case (MV_HORIZONTAL | MV_UP):      return EL_TUBE_HORIZONTAL_UP;
+    case (MV_HORIZONTAL | MV_DOWN):    return EL_TUBE_HORIZONTAL_DOWN;
+    case (MV_VERTICAL):                        return EL_TUBE_VERTICAL;
+    case (MV_VERTICAL | MV_LEFT):      return EL_TUBE_VERTICAL_LEFT;
+    case (MV_VERTICAL | MV_RIGHT):     return EL_TUBE_VERTICAL_RIGHT;
+    case (MV_ANY_DIRECTION):           return EL_TUBE_ANY;
+
+    /* if only one direction, fall back to simple tube with that direction */
+    case (MV_LEFT):                    return EL_TUBE_HORIZONTAL;
+    case (MV_RIGHT):                   return EL_TUBE_HORIZONTAL;
+    case (MV_UP):                      return EL_TUBE_VERTICAL;
+    case (MV_DOWN):                    return EL_TUBE_VERTICAL;
+  }
+
+  return EL_EMPTY;
+}
+
+static int getTubeFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+  int element_new = getTubeFromOpenDirection(direction);
+
+  return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromBelt(int element)
+{
+  int belt_dir = getBeltDirFromBeltElement(element);
+
+  return (belt_dir == MV_LEFT ? MV_RIGHT :
+         belt_dir == MV_RIGHT ? MV_LEFT :
+         belt_dir == MV_NONE ? MV_HORIZONTAL : belt_dir);
+}
+
+static int getBeltFromNrAndOpenDirection(int nr, int direction)
+{
+  int belt_dir = (direction == MV_LEFT ? MV_RIGHT :
+                 direction == MV_RIGHT ? MV_LEFT :
+                 direction == MV_HORIZONTAL ? MV_NONE : direction);
+
+  if (direction == MV_NONE)
+    return EL_EMPTY;
+
+  return getBeltElementFromBeltNrAndBeltDir(nr, belt_dir);
+}
+
+static int getBeltFromNrAndOpenDirectionNotEmpty(int nr, int direction,
+                                                int element_old)
+{
+  int element_new = getBeltFromNrAndOpenDirection(nr, direction);
+
+  return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromPool(int element)
+{
+  switch (element)
+  {
+    case EL_ACID_POOL_TOPLEFT:         return (MV_DOWN | MV_RIGHT);
+    case EL_ACID_POOL_TOPRIGHT:                return (MV_DOWN | MV_LEFT);
+    case EL_ACID_POOL_BOTTOMLEFT:      return (MV_UP | MV_RIGHT);
+    case EL_ACID_POOL_BOTTOMRIGHT:     return (MV_UP | MV_LEFT);
+    case EL_ACID_POOL_BOTTOM:          return (MV_HORIZONTAL | MV_UP);
+    case EL_ACID:                      return (MV_HORIZONTAL | MV_DOWN);
+  }
+
+  return MV_NONE;
+}
+
+static int getPoolFromOpenDirection(int direction)
+{
+  switch (direction)
+  {
+    case (MV_DOWN | MV_RIGHT):         return EL_ACID_POOL_TOPLEFT;
+    case (MV_DOWN | MV_LEFT):          return EL_ACID_POOL_TOPRIGHT;
+    case (MV_UP | MV_RIGHT):           return EL_ACID_POOL_BOTTOMLEFT;
+    case (MV_UP | MV_LEFT):            return EL_ACID_POOL_BOTTOMRIGHT;
+    case (MV_HORIZONTAL | MV_UP):      return EL_ACID_POOL_BOTTOM;
+    case (MV_HORIZONTAL | MV_DOWN):    return EL_ACID;
+  }
+
+  return EL_EMPTY;
+}
+
+static int getPoolFromOpenDirectionExt(int direction, int help_element)
+{
+  int element = getPoolFromOpenDirection(direction);
+  int help_direction = getOpenDirectionFromPool(help_element);
+
+  if (element == EL_EMPTY)
+  {
+    int help_direction_vertical = help_direction & MV_VERTICAL;
+
+    element = getPoolFromOpenDirection(direction | help_direction_vertical);
+  }
+
+  if (element == EL_EMPTY)
+  {
+    int help_direction_horizontal = help_direction & MV_HORIZONTAL;
+
+    element = getPoolFromOpenDirection(direction | help_direction_horizontal);
+  }
+
+  return element;
+}
+
+static int getPoolFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+  int element_new = getPoolFromOpenDirectionExt(direction, element_old);
+
+  return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromPillar(int element)
+{
+  switch (element)
+  {
+    case EL_EMC_WALL_1:                        return (MV_DOWN);
+    case EL_EMC_WALL_2:                        return (MV_VERTICAL);
+    case EL_EMC_WALL_3:                        return (MV_UP);
+  }
+
+  return MV_NONE;
+}
+
+static int getPillarFromOpenDirection(int direction)
+{
+  switch (direction)
+  {
+    case (MV_DOWN):                    return EL_EMC_WALL_1;
+    case (MV_VERTICAL):                        return EL_EMC_WALL_2;
+    case (MV_UP):                      return EL_EMC_WALL_3;
+  }
+
+  return EL_EMPTY;
+}
+
+static int getPillarFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+  int element_new = getPillarFromOpenDirection(direction);
+
+  return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromSteel2(int element)
+{
+  switch (element)
+  {
+    case EL_DC_STEELWALL_2_LEFT:       return (MV_RIGHT);
+    case EL_DC_STEELWALL_2_RIGHT:      return (MV_LEFT);
+    case EL_DC_STEELWALL_2_TOP:                return (MV_DOWN);
+    case EL_DC_STEELWALL_2_BOTTOM:     return (MV_UP);
+    case EL_DC_STEELWALL_2_HORIZONTAL: return (MV_HORIZONTAL);
+    case EL_DC_STEELWALL_2_VERTICAL:   return (MV_VERTICAL);
+    case EL_DC_STEELWALL_2_MIDDLE:     return (MV_ANY_DIRECTION);
+    case EL_DC_STEELWALL_2_SINGLE:     return (MV_NONE);
+  }
+
+  return MV_NONE;
+}
+
+static int getSteel2FromOpenDirection(int direction)
+{
+  switch (direction)
+  {
+    case (MV_RIGHT):                   return EL_DC_STEELWALL_2_LEFT;
+    case (MV_LEFT):                    return EL_DC_STEELWALL_2_RIGHT;
+    case (MV_DOWN):                    return EL_DC_STEELWALL_2_TOP;
+    case (MV_UP):                      return EL_DC_STEELWALL_2_BOTTOM;
+    case (MV_HORIZONTAL):              return EL_DC_STEELWALL_2_HORIZONTAL;
+    case (MV_VERTICAL):                        return EL_DC_STEELWALL_2_VERTICAL;
+    case (MV_ANY_DIRECTION):           return EL_DC_STEELWALL_2_MIDDLE;
+    case (MV_NONE):                    return EL_DC_STEELWALL_2_SINGLE;
+  }
+
+  return EL_EMPTY;
+}
+
+static int getSteel2FromOpenDirectionNotEmpty(int direction, int element_old)
+{
+  int element_new = getSteel2FromOpenDirection(direction);
+
+  return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getOpenDirectionFromChip(int element)
+{
+  switch (element)
+  {
+    case EL_SP_CHIP_SINGLE:            return (MV_NONE);
+    case EL_SP_CHIP_LEFT:              return (MV_RIGHT);
+    case EL_SP_CHIP_RIGHT:             return (MV_LEFT);
+    case EL_SP_CHIP_TOP:               return (MV_DOWN);
+    case EL_SP_CHIP_BOTTOM:            return (MV_UP);
+  }
+
+  return MV_NONE;
+}
+
+static int getChipFromOpenDirection(int direction)
+{
+  switch (direction)
+  {
+    case (MV_NONE):                    return EL_SP_CHIP_SINGLE;
+    case (MV_LEFT):                    return EL_SP_CHIP_RIGHT;
+    case (MV_RIGHT):                   return EL_SP_CHIP_LEFT;
+    case (MV_UP):                      return EL_SP_CHIP_BOTTOM;
+    case (MV_DOWN):                    return EL_SP_CHIP_TOP;
+  }
+
+  return EL_EMPTY;
+}
+
+static int getChipFromOpenDirectionNotEmpty(int direction, int element_old)
+{
+  int element_new = getChipFromOpenDirection(direction);
+
+  return (element_new != EL_EMPTY ? element_new : element_old);
+}
+
+static int getClosedTube(int x, int y)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  int element_old = IntelliDrawBuffer[x][y];
+  int direction_old = getOpenDirectionFromTube(element_old);
+  int direction_new = MV_NONE;
+  int i;
+
+  for (i = 0; i < NUM_DIRECTIONS; i++)
+  {
+    int xx = x + xy[i][0];
+    int yy = y + xy[i][1];
+    int dir = MV_DIR_FROM_BIT(i);
+    int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+    if (IN_LEV_FIELD(xx, yy) && IS_TUBE(IntelliDrawBuffer[xx][yy]) &&
+       (direction_old & dir) &&
+       (getOpenDirectionFromTube(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+      direction_new |= dir;
+  }
+
+  return getTubeFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedBelt(int x, int y)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  int element_old = IntelliDrawBuffer[x][y];
+  int nr = getBeltNrFromBeltElement(element_old);
+  int direction_old = getOpenDirectionFromBelt(element_old);
+  int direction_new = MV_NONE;
+  int i;
+
+  for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; i++)
+  {
+    int xx = x + xy[i][0];
+    int yy = y + xy[i][1];
+    int dir = MV_DIR_FROM_BIT(i);
+    int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+    if (IN_LEV_FIELD(xx, yy) && IS_BELT(IntelliDrawBuffer[xx][yy]) &&
+       (direction_old & dir) &&
+       (getOpenDirectionFromBelt(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+      direction_new |= dir;
+  }
+
+  return getBeltFromNrAndOpenDirection(nr, direction_new);
+}
+
+static int getClosedPool(int x, int y)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  int element_old = IntelliDrawBuffer[x][y];
+  int direction_old = getOpenDirectionFromPool(element_old);
+  int direction_new = MV_NONE;
+  int i;
+
+  for (i = 0; i < NUM_DIRECTIONS; i++)
+  {
+    int xx = x + xy[i][0];
+    int yy = y + xy[i][1];
+    int dir = MV_DIR_FROM_BIT(i);
+    int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+    if (IN_LEV_FIELD(xx, yy) &&
+       IS_ACID_POOL_OR_ACID(IntelliDrawBuffer[xx][yy]) &&
+       (direction_old & dir) &&
+       (getOpenDirectionFromPool(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+      direction_new |= dir;
+  }
+
+  return getPoolFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedPillar(int x, int y)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  int element_old = IntelliDrawBuffer[x][y];
+  int direction_old = getOpenDirectionFromPillar(element_old);
+  int direction_new = MV_NONE;
+  int i;
+
+  for (i = MV_BIT_UP; i <= MV_BIT_DOWN; i++)
+  {
+    int xx = x + xy[i][0];
+    int yy = y + xy[i][1];
+    int dir = MV_DIR_FROM_BIT(i);
+    int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+    if (IN_LEV_FIELD(xx, yy) && IS_EMC_PILLAR(IntelliDrawBuffer[xx][yy]) &&
+       (direction_old & dir) &&
+       (getOpenDirectionFromPillar(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+      direction_new |= dir;
+  }
+
+  return getPillarFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedSteel2(int x, int y)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  int element_old = IntelliDrawBuffer[x][y];
+  int direction_old = getOpenDirectionFromSteel2(element_old);
+  int direction_new = MV_NONE;
+  int i;
+
+  for (i = 0; i < NUM_DIRECTIONS; i++)
+  {
+    int xx = x + xy[i][0];
+    int yy = y + xy[i][1];
+    int dir = MV_DIR_FROM_BIT(i);
+    int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+    if (IN_LEV_FIELD(xx, yy) && IS_DC_STEELWALL_2(IntelliDrawBuffer[xx][yy]) &&
+       (direction_old & dir) &&
+       (getOpenDirectionFromSteel2(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+      direction_new |= dir;
+  }
+
+  return getSteel2FromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static int getClosedChip(int x, int y)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  int element_old = IntelliDrawBuffer[x][y];
+  int direction_old = getOpenDirectionFromChip(element_old);
+  int direction_new = MV_NONE;
+  int i;
+
+  for (i = 0; i < NUM_DIRECTIONS; i++)
+  {
+    int xx = x + xy[i][0];
+    int yy = y + xy[i][1];
+    int dir = MV_DIR_FROM_BIT(i);
+    int dir_opposite = MV_DIR_OPPOSITE(dir);
+
+    if (IN_LEV_FIELD(xx, yy) && IS_SP_CHIP(IntelliDrawBuffer[xx][yy]) &&
+       (direction_old & dir) &&
+       (getOpenDirectionFromChip(IntelliDrawBuffer[xx][yy]) & dir_opposite))
+      direction_new |= dir;
+  }
+
+  return getChipFromOpenDirectionNotEmpty(direction_new, element_old);
+}
+
+static void SetElementSimple(int x, int y, int element, boolean change_level)
+{
+  int sx = x - level_xpos;
+  int sy = y - level_ypos;
+
+  IntelliDrawBuffer[x][y] = element;
+
+  if (change_level)
+    Feld[x][y] = element;
+
+  if (IN_ED_FIELD(sx, sy))
+    DrawMiniElement(sx, sy, element);
+}
+
+static void MergeAndCloseNeighbourElements(int x1, int y1, int *element1,
+                                          int x2, int y2, int *element2,
+                                          int (*close_function)(int, int),
+                                          boolean change_level)
+{
+  /* set neighbour elements to newly determined connections */
+  SetElementSimple(x1, y1, *element1, change_level);
+  SetElementSimple(x2, y2, *element2, change_level);
+
+  /* remove all open connections of neighbour elements */
+  *element1 = close_function(x1, y1);
+  *element2 = close_function(x2, y2);
+
+  /* set neighbour elements to new, minimized connections */
+  SetElementSimple(x1, y1, *element1, change_level);
+  SetElementSimple(x2, y2, *element2, change_level);
+}
+
+static void SetElementIntelliDraw(int x, int y, int new_element,
+                                 boolean change_level, int button)
+{
+  static int xy[4][2] =
+  {
+    { -1, 0 },
+    { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
+  };
+  static int last_x = -1;
+  static int last_y = -1;
+  int old_element = IntelliDrawBuffer[x][y];
+
+  if (new_element == EL_UNDEFINED)
+  {
+    last_x = -1;
+    last_y = -1;
+
+    return;
+  }
+
+  if (IS_TUBE(new_element))
+  {
+    int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
+
+    /* if old element is of same kind, keep all existing directions */
+    if (IS_TUBE(old_element))
+      direction |= getOpenDirectionFromTube(old_element);
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_TUBE(IntelliDrawBuffer[last_x][last_y]))
+      {
+       int dir = MV_DIR_FROM_BIT(i);
+       int dir_opposite = MV_DIR_OPPOSITE(dir);
+       int last_element_old = IntelliDrawBuffer[last_x][last_y];
+       int last_direction_old = getOpenDirectionFromTube(last_element_old);
+       int last_direction_new = last_direction_old | dir_opposite;
+
+       last_element_new = getTubeFromOpenDirection(last_direction_new);
+
+       direction |= dir;
+      }
+    }
+
+    new_element = getTubeFromOpenDirectionNotEmpty(direction, new_element);
+
+    if (last_element_new != EL_UNDEFINED)
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedTube, change_level);
+  }
+  else if (IS_BELT(new_element))
+  {
+    int belt_nr = getBeltNrFromBeltElement(new_element);
+    int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
+
+    /* if old element is of same kind, keep all existing directions */
+    if (IS_BELT(old_element))
+      direction |= getOpenDirectionFromBelt(old_element);
+
+    for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_BELT(IntelliDrawBuffer[last_x][last_y]))
+      {
+       int dir = MV_DIR_FROM_BIT(i);
+       int dir_opposite = MV_DIR_OPPOSITE(dir);
+       int last_element_old = IntelliDrawBuffer[last_x][last_y];
+       int last_belt_nr = getBeltNrFromBeltElement(last_element_old);
+       int last_direction_old = getOpenDirectionFromBelt(last_element_old);
+       int last_direction_new = last_direction_old | dir_opposite;
+
+       last_element_new = getBeltFromNrAndOpenDirection(last_belt_nr,
+                                                        last_direction_new);
+       direction |= dir;
+      }
+    }
+
+    new_element = getBeltFromNrAndOpenDirectionNotEmpty(belt_nr, direction,
+                                                       new_element);
+    if (last_element_new != EL_UNDEFINED)
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedBelt, change_level);
+  }
+  else if (IS_ACID_POOL_OR_ACID(new_element))
+  {
+    int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
+
+    /* if old element is of same kind, keep all existing directions */
+    if (IS_ACID_POOL_OR_ACID(old_element))
+      direction |= getOpenDirectionFromPool(old_element);
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_ACID_POOL_OR_ACID(IntelliDrawBuffer[last_x][last_y]))
+      {
+       int dir = MV_DIR_FROM_BIT(i);
+       int dir_opposite = MV_DIR_OPPOSITE(dir);
+       int last_element_old = IntelliDrawBuffer[last_x][last_y];
+       int last_direction_old = getOpenDirectionFromPool(last_element_old);
+       int last_direction_new = last_direction_old | dir_opposite;
+
+       last_element_new = getPoolFromOpenDirection(last_direction_new);
+
+       direction |= dir;
+      }
+    }
+
+    /* special corrections needed for intuitively correct acid pool drawing */
+    if (last_element_new == EL_EMPTY)
+      last_element_new = new_element;
+    else if (last_element_new != EL_UNDEFINED)
+      new_element = last_element_new;
+
+    new_element = getPoolFromOpenDirectionNotEmpty(direction, new_element);
+
+    if (last_element_new != EL_UNDEFINED)
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedPool, change_level);
+  }
+  else if (IS_EMC_PILLAR(new_element))
+  {
+    int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
+
+    /* if old element is of same kind, keep all existing directions */
+    if (IS_EMC_PILLAR(old_element))
+      direction |= getOpenDirectionFromPillar(old_element);
+
+    for (i = MV_BIT_UP; i <= MV_BIT_DOWN; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_EMC_PILLAR(IntelliDrawBuffer[last_x][last_y]))
+      {
+       int dir = MV_DIR_FROM_BIT(i);
+       int dir_opposite = MV_DIR_OPPOSITE(dir);
+       int last_element_old = IntelliDrawBuffer[last_x][last_y];
+       int last_direction_old = getOpenDirectionFromPillar(last_element_old);
+       int last_direction_new = last_direction_old | dir_opposite;
+
+       last_element_new = getPillarFromOpenDirection(last_direction_new);
+
+       direction |= dir;
+      }
+    }
+
+    new_element = getPillarFromOpenDirectionNotEmpty(direction, new_element);
+
+    if (last_element_new != EL_UNDEFINED)
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedPillar, change_level);
+  }
+  else if (IS_DC_STEELWALL_2(new_element))
+  {
+    int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
+
+    /* if old element is of same kind, keep all existing directions */
+    if (IS_DC_STEELWALL_2(old_element))
+      direction |= getOpenDirectionFromSteel2(old_element);
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_DC_STEELWALL_2(IntelliDrawBuffer[last_x][last_y]))
+      {
+       int dir = MV_DIR_FROM_BIT(i);
+       int dir_opposite = MV_DIR_OPPOSITE(dir);
+       int last_element_old = IntelliDrawBuffer[last_x][last_y];
+       int last_direction_old = getOpenDirectionFromSteel2(last_element_old);
+       int last_direction_new = last_direction_old | dir_opposite;
+
+       last_element_new = getSteel2FromOpenDirection(last_direction_new);
+
+       direction |= dir;
+      }
+    }
+
+    new_element = getSteel2FromOpenDirectionNotEmpty(direction, new_element);
+
+    if (last_element_new != EL_UNDEFINED)
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedSteel2, change_level);
+  }
+  else if (IS_SP_CHIP(new_element))
+  {
+    int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
+
+    /* (do not keep existing directions, regardless of kind of old element) */
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_SP_CHIP(IntelliDrawBuffer[last_x][last_y]))
+      {
+       int dir = MV_DIR_FROM_BIT(i);
+       int dir_opposite = MV_DIR_OPPOSITE(dir);
+       int last_element_old = IntelliDrawBuffer[last_x][last_y];
+       int last_direction_old = getOpenDirectionFromChip(last_element_old);
+       int last_direction_new = last_direction_old | dir_opposite;
+
+       if (last_direction_old == MV_NONE)
+       {
+         last_element_new = getChipFromOpenDirection(last_direction_new);
+         direction |= dir;
+       }
+       else if (last_direction_old & (dir | dir_opposite))
+       {
+         direction |= MV_DIR_OPPOSITE(last_direction_old);
+       }
+       else
+       {
+         direction |= MV_DIR_OPPOSITE(dir);
+       }
+      }
+    }
+
+    new_element = getChipFromOpenDirectionNotEmpty(direction, new_element);
+
+    if (last_element_new != EL_UNDEFINED)
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedChip, change_level);
+  }
+  else if (IS_SP_HARDWARE_BASE(new_element))
+  {
+    int nr = GetSimpleRandom(6);
+
+    new_element = (nr == 0 ? EL_SP_HARDWARE_BASE_1 :
+                  nr == 1 ? EL_SP_HARDWARE_BASE_2 :
+                  nr == 2 ? EL_SP_HARDWARE_BASE_3 :
+                  nr == 3 ? EL_SP_HARDWARE_BASE_4 :
+                  nr == 4 ? EL_SP_HARDWARE_BASE_5 : EL_SP_HARDWARE_BASE_6);
+  }
+  else if (new_element == EL_SP_HARDWARE_GREEN ||
+          new_element == EL_SP_HARDWARE_BLUE ||
+          new_element == EL_SP_HARDWARE_RED)
+  {
+    int nr = GetSimpleRandom(3);
+
+    new_element = (nr == 0 ? EL_SP_HARDWARE_GREEN :
+                  nr == 1 ? EL_SP_HARDWARE_BLUE : EL_SP_HARDWARE_RED);
+  }
+  else if (IS_GROUP_ELEMENT(new_element))
+  {
+    boolean connected_drawing = FALSE;
+    int i;
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
+    {
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
+
+      if (last_x == xx && last_y == yy && IN_LEV_FIELD(last_x, last_y) &&
+         IS_IN_GROUP_EL(IntelliDrawBuffer[last_x][last_y], new_element))
+       connected_drawing = TRUE;
+    }
+
+    if (!connected_drawing)
+      ResolveGroupElement(new_element);
+
+    new_element = GetElementFromGroupElement(new_element);
+  }
+  else if (IS_BELT_SWITCH(old_element))
+  {
+    int belt_nr = getBeltNrFromBeltSwitchElement(old_element);
+    int belt_dir = getBeltDirFromBeltSwitchElement(old_element);
+
+    belt_dir = (belt_dir == MV_LEFT ? MV_NONE :
+               belt_dir == MV_NONE ? MV_RIGHT : MV_LEFT);
+
+    new_element = getBeltSwitchElementFromBeltNrAndBeltDir(belt_nr, belt_dir);
+  }
+  else
+  {
+    static int swappable_elements[][2] =
+    {
+      { EL_EXIT_CLOSED,                        EL_EXIT_OPEN                    },
+      { EL_DYNAMITE,                   EL_DYNAMITE_ACTIVE              },
+      { EL_EM_DYNAMITE,                        EL_EM_DYNAMITE_ACTIVE           },
+      { EL_QUICKSAND_EMPTY,            EL_QUICKSAND_FULL               },
+      { EL_EMERALD,                    EL_WALL_EMERALD                 },
+      { EL_EMERALD_YELLOW,             EL_WALL_EMERALD_YELLOW          },
+      { EL_EMERALD_RED,                        EL_WALL_EMERALD_RED             },
+      { EL_EMERALD_PURPLE,             EL_WALL_EMERALD_PURPLE          },
+      { EL_DIAMOND,                    EL_WALL_DIAMOND                 },
+      { EL_BD_DIAMOND,                 EL_WALL_BD_DIAMOND              },
+      { EL_GATE_1,                     EL_GATE_1_GRAY                  },
+      { EL_GATE_2,                     EL_GATE_2_GRAY                  },
+      { EL_GATE_3,                     EL_GATE_3_GRAY                  },
+      { EL_GATE_4,                     EL_GATE_4_GRAY                  },
+      { EL_EM_GATE_1,                  EL_EM_GATE_1_GRAY               },
+      { EL_EM_GATE_2,                  EL_EM_GATE_2_GRAY               },
+      { EL_EM_GATE_3,                  EL_EM_GATE_3_GRAY               },
+      { EL_EM_GATE_4,                  EL_EM_GATE_4_GRAY               },
+      { EL_EMC_GATE_5,                 EL_EMC_GATE_5_GRAY              },
+      { EL_EMC_GATE_6,                 EL_EMC_GATE_6_GRAY              },
+      { EL_EMC_GATE_7,                 EL_EMC_GATE_7_GRAY              },
+      { EL_EMC_GATE_8,                 EL_EMC_GATE_8_GRAY              },
+      { EL_DC_GATE_WHITE,              EL_DC_GATE_WHITE_GRAY           },
+      { EL_TIME_ORB_EMPTY,             EL_TIME_ORB_FULL                },
+      { EL_LAMP,                       EL_LAMP_ACTIVE                  },
+      { EL_SOKOBAN_FIELD_EMPTY,                EL_SOKOBAN_FIELD_FULL           },
+      { EL_SP_BASE,                    EL_SP_BUGGY_BASE                },
+      { EL_PEARL,                      EL_WALL_PEARL                   },
+      { EL_CRYSTAL,                    EL_WALL_CRYSTAL                 },
+      { EL_TIMEGATE_CLOSED,            EL_TIMEGATE_OPEN                },
+      { EL_SWITCHGATE_CLOSED,          EL_SWITCHGATE_OPEN              },
+      { EL_SWITCHGATE_SWITCH_UP,       EL_SWITCHGATE_SWITCH_DOWN       },
+      { EL_DC_SWITCHGATE_SWITCH_UP,    EL_DC_SWITCHGATE_SWITCH_DOWN    },
+      { EL_LIGHT_SWITCH,               EL_LIGHT_SWITCH_ACTIVE          },
+      { EL_LANDMINE,                   EL_DC_LANDMINE                  },
+      { EL_SHIELD_NORMAL,              EL_SHIELD_DEADLY                },
+      { EL_STEEL_EXIT_CLOSED,          EL_STEEL_EXIT_OPEN              },
+      { EL_EM_EXIT_CLOSED,             EL_EM_EXIT_OPEN                 },
+      { EL_EM_STEEL_EXIT_CLOSED,       EL_EM_STEEL_EXIT_OPEN           },
+      { EL_QUICKSAND_FAST_EMPTY,       EL_QUICKSAND_FAST_FULL          },
+
+      { -1,                            -1                              },
+    };
+    static int rotatable_elements[][4] =
+    {
+      {
+       EL_BUG_UP,
+       EL_BUG_RIGHT,
+       EL_BUG_DOWN,
+       EL_BUG_LEFT
+      },
+
+      {
+       EL_SPACESHIP_UP,
+       EL_SPACESHIP_RIGHT,
+       EL_SPACESHIP_DOWN,
+       EL_SPACESHIP_LEFT
+      },
+
+      {
+       EL_BD_BUTTERFLY_UP,
+       EL_BD_BUTTERFLY_RIGHT,
+       EL_BD_BUTTERFLY_DOWN,
+       EL_BD_BUTTERFLY_LEFT
+      },
+
+      {
+       EL_BD_FIREFLY_UP,
+       EL_BD_FIREFLY_RIGHT,
+       EL_BD_FIREFLY_DOWN,
+       EL_BD_FIREFLY_LEFT
+      },
+
+      {
+       EL_PACMAN_UP,
+       EL_PACMAN_RIGHT,
+       EL_PACMAN_DOWN,
+       EL_PACMAN_LEFT
+      },
 
-  stick_element_properties_window = FALSE;
+      {
+       EL_YAMYAM_UP,
+       EL_YAMYAM_RIGHT,
+       EL_YAMYAM_DOWN,
+       EL_YAMYAM_LEFT
+      },
 
-  /* make sure that previous properties edit mode exists for this element */
-  if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG &&
-      !IS_CUSTOM_ELEMENT(properties_element))
-    edit_mode_properties = ED_MODE_PROPERTIES_CONFIG;
+      {
+       EL_ARROW_UP,
+       EL_ARROW_RIGHT,
+       EL_ARROW_DOWN,
+       EL_ARROW_LEFT
+      },
 
-  if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG &&
-      IS_CUSTOM_ELEMENT(properties_element))
-    edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1;
+      {
+       EL_SP_PORT_UP,
+       EL_SP_PORT_RIGHT,
+       EL_SP_PORT_DOWN,
+       EL_SP_PORT_LEFT
+      },
 
-  CopyElementPropertiesToEditor(properties_element);
+      {
+       EL_SP_GRAVITY_PORT_UP,
+       EL_SP_GRAVITY_PORT_RIGHT,
+       EL_SP_GRAVITY_PORT_DOWN,
+       EL_SP_GRAVITY_PORT_LEFT
+      },
 
-  UnmapLevelEditorWindowGadgets();
-  UnmapLevelEditorToolboxDrawingGadgets();
-  UnmapLevelEditorToolboxCustomGadgets();
+      {
+       EL_MOLE_UP,
+       EL_MOLE_RIGHT,
+       EL_MOLE_DOWN,
+       EL_MOLE_LEFT
+      },
 
-  if (IS_CUSTOM_ELEMENT(properties_element) ||
-      IS_GROUP_ELEMENT(properties_element))
-    MapLevelEditorToolboxCustomGadgets();
+      {
+       EL_BALLOON_SWITCH_UP,
+       EL_BALLOON_SWITCH_RIGHT,
+       EL_BALLOON_SWITCH_DOWN,
+       EL_BALLOON_SWITCH_LEFT
+      },
 
-  SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
-  ClearWindow();
+      {
+       EL_SP_GRAVITY_ON_PORT_UP,
+       EL_SP_GRAVITY_ON_PORT_RIGHT,
+       EL_SP_GRAVITY_ON_PORT_DOWN,
+       EL_SP_GRAVITY_ON_PORT_LEFT
+      },
 
-#if 0
-  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
-#else
-  DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
-          "Element Settings", FONT_TITLE_1);
-#endif
+      {
+       EL_SP_GRAVITY_OFF_PORT_UP,
+       EL_SP_GRAVITY_OFF_PORT_RIGHT,
+       EL_SP_GRAVITY_OFF_PORT_DOWN,
+       EL_SP_GRAVITY_OFF_PORT_LEFT
+      },
 
-#if 1
-  FrameCounter = 0;    /* restart animation frame counter */
-#endif
+      {
+       -1,
+       -1,
+       -1,
+       -1,
+      },
+    };
+    int i, j;
+
+    for (i = 0; swappable_elements[i][0] != -1; i++)
+    {
+      int element1 = swappable_elements[i][0];
+      int element2 = swappable_elements[i][1];
 
-  DrawElementBorder(SX + xstart * MINI_TILEX,
-                   SY + ystart * MINI_TILEY + MINI_TILEY / 2,
-                   TILEX, TILEY, FALSE);
-#if 1
-  DrawEditorElementAnimation(SX + xstart * MINI_TILEX,
-                            SY + ystart * MINI_TILEY + MINI_TILEY / 2);
-#else
-  DrawGraphicAnimationExt(drawto,
-                         SX + xstart * MINI_TILEX,
-                         SY + ystart * MINI_TILEY + MINI_TILEY / 2,
-                         el2img(properties_element), -1, NO_MASKING);
-#endif
+      if (old_element == element1 || old_element == element2)
+       new_element = (old_element == element1 ? element2 : element1);
+    }
 
-#if 0
-  FrameCounter = 0;    /* restart animation frame counter */
-#endif
+    for (i = 0; rotatable_elements[i][0] != -1; i++)
+    {
+      for (j = 0; j < 4; j++)
+      {
+       int element = rotatable_elements[i][j];
 
-  DrawEditorElementName((xstart + 3) * MINI_TILEX + 1,
-                       (ystart + 1) * MINI_TILEY + 1,
-                       properties_element);
+       if (old_element == element)
+         new_element = (button == 1 ? rotatable_elements[i][(j + 3) % 4] :
+                        button == 2 ? rotatable_elements[i][0]           :
+                        button == 3 ? rotatable_elements[i][(j + 1) % 4] :
+                        old_element);
+      }
+    }
+  }
 
-  DrawPropertiesTabulatorGadgets();
+  SetElementSimple(x, y, new_element, change_level);
 
-  if (edit_mode_properties == ED_MODE_PROPERTIES_INFO)
-    DrawPropertiesInfo();
-  else if (edit_mode_properties == ED_MODE_PROPERTIES_CHANGE)
-    DrawPropertiesChange();
-  else /* (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG[_1|_2]) */
-    DrawPropertiesConfig();
+  last_x = x;
+  last_y = y;
 }
 
-static void UpdateCustomElementGraphicGadgets()
+static void ResetIntelliDraw()
 {
-  int i;
+  int x, y;
 
-  ModifyEditorElementList();
-  RedrawDrawingElements();
+  for (x = 0; x < lev_fieldx; x++)
+    for (y = 0; y < lev_fieldy; y++)
+      IntelliDrawBuffer[x][y] = Feld[x][y];
 
-  /* force redraw of all mapped drawing area gadgets */
-  for (i = 0; i < ED_NUM_DRAWING_AREAS; i++)
-  {
-    struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[i].gadget_id];
+  SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
+}
 
-    if (gi->mapped)
-      MapDrawingArea(i);
-  }
+static void SetElementExt(int x, int y, int element, boolean change_level,
+                         int button)
+{
+  if (element < 0)
+    SetElementSimple(x, y, Feld[x][y], change_level);
+  else if (GetKeyModState() & KMOD_Shift)
+    SetElementIntelliDraw(x, y, element, change_level, button);
+  else
+    SetElementSimple(x, y, element, change_level);
+}
+
+static void SetElement(int x, int y, int element)
+{
+  SetElementExt(x, y, element, TRUE, -1);
+}
+
+static void SetElementButton(int x, int y, int element, int button)
+{
+  SetElementExt(x, y, element, TRUE, button);
 }
 
 static void DrawLineElement(int sx, int sy, int element, boolean change_level)
@@ -8213,66 +9389,51 @@ static void DrawLineElement(int sx, int sy, int element, boolean change_level)
   int lx = sx + level_xpos;
   int ly = sy + level_ypos;
 
-  DrawMiniElement(sx, sy, (element < 0 ? Feld[lx][ly] : element));
-
-  if (change_level)
-    Feld[lx][ly] = element;
+  SetElementExt(lx, ly, element, change_level, -1);
 }
 
 static void DrawLine(int from_x, int from_y, int to_x, int to_y,
                     int element, boolean change_level)
 {
+  int xsize = ABS(to_x - from_x);
+  int ysize = ABS(to_y - from_y);
+  int dx = (to_x < from_x ? -1 : +1);
+  int dy = (to_y < from_y ? -1 : +1);
+  int i;
+
   if (from_y == to_y)                  /* horizontal line */
   {
-    int x;
-    int y = from_y;
-
-    if (from_x > to_x)
-      swap_numbers(&from_x, &to_x);
-
-    for (x = from_x; x <= to_x; x++)
-      DrawLineElement(x, y, element, change_level);
+    for (i = 0; i <= xsize; i++)
+      DrawLineElement(from_x + i * dx, from_y, element, change_level);
   }
   else if (from_x == to_x)             /* vertical line */
   {
-    int x = from_x;
-    int y;
-
-    if (from_y > to_y)
-      swap_numbers(&from_y, &to_y);
-
-    for (y = from_y; y <= to_y; y++)
-      DrawLineElement(x, y, element, change_level);
+    for (i = 0; i <= ysize; i++)
+      DrawLineElement(from_x, from_y + i * dy, element, change_level);
   }
   else                                 /* diagonal line */
   {
-    int len_x = ABS(to_x - from_x);
-    int len_y = ABS(to_y - from_y);
-    int x, y;
-
-    if (len_y < len_x)                 /* a < 1 */
+    if (ysize < xsize)                 /* a < 1 */
     {
-      float a = (float)len_y / (float)len_x;
+      float a = (float)ysize / (float)xsize;
 
-      if (from_x > to_x)
-       swap_number_pairs(&from_x, &from_y, &to_x, &to_y);
-
-      for (x = 0; x <= len_x; x++)
+      for (i = 0; i <= xsize; i++)
       {
-       y = (int)(a * x + 0.5) * (to_y < from_y ? -1 : +1);
+       int x = dx * i;
+       int y = dy * (int)(a * i + 0.5);
+
        DrawLineElement(from_x + x, from_y + y, element, change_level);
       }
     }
     else                               /* a >= 1 */
     {
-      float a = (float)len_x / (float)len_y;
+      float a = (float)xsize / (float)ysize;
 
-      if (from_y > to_y)
-       swap_number_pairs(&from_x, &from_y, &to_x, &to_y);
-
-      for (y = 0; y <= len_y; y++)
+      for (i = 0; i <= ysize; i++)
       {
-       x = (int)(a * y + 0.5) * (to_x < from_x ? -1 : +1);
+       int x = dx * (int)(a * i + 0.5);
+       int y = dy * i;
+
        DrawLineElement(from_x + x, from_y + y, element, change_level);
       }
     }
@@ -8480,7 +9641,7 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
 
     for (y = 0; y < brush_height; y++)
     {
-      for (x=0; x < brush_width; x++)
+      for (x = 0; x < brush_width; x++)
       {
        brush_buffer[x][y] = Feld[from_lx + x][from_ly + y];
 
@@ -8585,33 +9746,7 @@ void DumpBrush_Small()
 
 static void FloodFill(int from_x, int from_y, int fill_element)
 {
-  int i,x,y;
-  int old_element;
-  static int check[4][2] = { {-1,0}, {0,-1}, {1,0}, {0,1} };
-  static int safety = 0;
-
-  /* check if starting field still has the desired content */
-  if (Feld[from_x][from_y] == fill_element)
-    return;
-
-  safety++;
-
-  if (safety > lev_fieldx*lev_fieldy)
-    Error(ERR_EXIT, "Something went wrong in 'FloodFill()'. Please debug.");
-
-  old_element = Feld[from_x][from_y];
-  Feld[from_x][from_y] = fill_element;
-
-  for (i = 0; i < 4; i++)
-  {
-    x = from_x + check[i][0];
-    y = from_y + check[i][1];
-
-    if (IN_LEV_FIELD(x,y) && Feld[x][y] == old_element)
-      FloodFill(x, y, fill_element);
-  }
-
-  safety--;
+  FloodFillLevel(from_x, from_y, fill_element, Feld, lev_fieldx, lev_fieldy);
 }
 
 /* values for DrawLevelText() modes */
@@ -8741,11 +9876,20 @@ static void SetTextCursor(int unused_sx, int unused_sy, int sx, int sy,
     DrawAreaBorder(sx, sy, sx, sy);
 }
 
+static void CheckLevelBorderElement(boolean redraw_playfield)
+{
+  int last_border_element = BorderElement;
+
+  SetBorderElement();
+
+  if (redraw_playfield && BorderElement != last_border_element)
+    DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+}
+
 static void CopyLevelToUndoBuffer(int mode)
 {
   static boolean accumulated_undo = FALSE;
   boolean new_undo_buffer_position = TRUE;
-  int last_border_element;
   int x, y;
 
   switch (mode)
@@ -8778,10 +9922,7 @@ static void CopyLevelToUndoBuffer(int mode)
       UndoBuffer[undo_buffer_position][x][y] = Feld[x][y];
 
   /* check if drawing operation forces change of border style */
-  last_border_element = BorderElement;
-  SetBorderElement();
-  if (BorderElement != last_border_element)
-    DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+  CheckLevelBorderElement(TRUE);
 
   level.changed = TRUE;
 }
@@ -8793,6 +9934,10 @@ static void RandomPlacement(int new_element)
   int num_percentage, num_elements;
   int x, y;
 
+#if 1
+  ResetIntelliDraw();
+#endif
+
   /* determine number of free positions for randomly placing the new element */
   for (x = 0; x < lev_fieldx; x++) for (y = 0; y < lev_fieldy; y++)
   {
@@ -8816,20 +9961,28 @@ static void RandomPlacement(int new_element)
     for (x = 0; x < lev_fieldx; x++)
       for (y = 0; y < lev_fieldy; y++)
        if (free_position[x][y])
+#if 1
+         SetElement(x, y, new_element);
+#else
          Feld[x][y] = new_element;
+#endif
   }
   else
   {
     while (num_elements > 0)
     {
-      x = RND(lev_fieldx);
-      y = RND(lev_fieldy);
+      x = GetSimpleRandom(lev_fieldx);
+      y = GetSimpleRandom(lev_fieldy);
 
       /* don't place element at the same position twice */
       if (free_position[x][y])
       {
        free_position[x][y] = FALSE;
+#if 1
+       SetElement(x, y, new_element);
+#else
        Feld[x][y] = new_element;
+#endif
        num_elements--;
       }
     }
@@ -8912,10 +10065,8 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   if (!started_inside_drawing_area)
     return;
 
-#if 1
   if (!IS_VALID_BUTTON(button))
     return;
-#endif
 
   if (!button && !button_release_event)
     return;
@@ -8932,6 +10083,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
     actual_drawing_function = GADGET_ID_PICK_ELEMENT;
   }
 
+  if (GetKeyModState() & KMOD_Shift)
+  {
+    if (button_press_event || button_release_event)
+      ResetIntelliDraw();
+  }
+
   switch (actual_drawing_function)
   {
     case GADGET_ID_SINGLE_ITEMS:
@@ -8944,17 +10101,27 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
          if (edit_mode == ED_MODE_DRAWING && draw_with_brush &&
              !inside_drawing_area)
            DeleteBrushFromCursor();
+
+#if 0
+         ResetIntelliDraw();
+#endif
        }
 
-       if (!button)
+       if (!button || button_release_event)
          break;
 
        if (draw_with_brush)
        {
+#if 0
          if (!button_release_event)
+#endif
            CopyBrushToLevel(sx, sy, button);
        }
+#if 1
+       else
+#else
        else if (new_element != Feld[lx][ly])
+#endif
        {
          if (new_element == EL_PLAYER_1)
          {
@@ -8965,18 +10132,30 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
              {
                if (Feld[x][y] == EL_PLAYER_1)
                {
+#if 1
+                 SetElement(x, y, EL_EMPTY);
+#else
                  Feld[x][y] = EL_EMPTY;
+#if 1
+                 if (IN_ED_FIELD(x - level_xpos, y - level_ypos))
+                   DrawMiniElement(x - level_xpos, y - level_ypos, EL_EMPTY);
+#else
                  if (x - level_xpos >= 0 && x - level_xpos < ed_fieldx &&
                      y - level_ypos >= 0 && y - level_ypos < ed_fieldy)
-                   DrawMiniElement(x - level_xpos, y - level_ypos,
-                                   EL_EMPTY);
+                   DrawMiniElement(x - level_xpos, y - level_ypos, EL_EMPTY);
+#endif
+#endif
                }
              }
            }
          }
 
+#if 1
+         SetElementButton(lx, ly, new_element, button);
+#else
          Feld[lx][ly] = new_element;
          DrawMiniElement(sx, sy, new_element);
+#endif
        }
       }
       else
@@ -9157,7 +10336,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
   if (counter_id == ED_COUNTER_ID_SELECT_LEVEL)
   {
       LoadLevel(level_nr);
+      LoadScore(level_nr);
+
       TapeErase();
+
       ResetUndoBuffer();
       DrawEditModeWindow();
 
@@ -9227,7 +10409,14 @@ static void HandleTextAreaGadgets(struct GadgetInfo *gi)
 {
   int type_id = gi->custom_type_id;
 
+#if 1
+  strncpy(textarea_info[type_id].value, gi->textarea.value,
+         MAX_ENVELOPE_TEXT_LEN);
+  textarea_info[type_id].value[MAX_ENVELOPE_TEXT_LEN] = '\0';
+#else
+  /* !!! BUGGY !!! MAX_ENVELOPE_TEXT_LEN != MAX_GADGET_TEXTSIZE !!! */
   strcpy(textarea_info[type_id].value, gi->textarea.value);
+#endif
 
   level.changed = TRUE;
 }
@@ -9256,14 +10445,7 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
     {
       /* when changing action type, also check action mode and action arg */
       if (value_old != value_new)
-      {
-#if 1
        setSelectboxSpecialActionVariablesIfNeeded();
-#else
-       custom_element_change.action_mode = -1;
-       custom_element_change.action_arg = -1;
-#endif
-      }
 
       DrawPropertiesChange();
     }
@@ -9436,14 +10618,6 @@ static void HandleControlButtons(struct GadgetInfo *gi)
   int new_element = BUTTON_ELEMENT(button);
   int x, y;
 
-#if 0
-  /* MAKES PROBLEMS WITH ELEMENT LIST SCROLLBAR AND IS PROBABLY NOT NEEDED */
-  /* !!! CHECK WHAT HAPPENS WHEN MOUSE WHEEL IS USED OVER ELEMENT LIST !!! */
-
-  if (!IS_VALID_BUTTON(button))
-    return;
-#endif
-
   if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT)
     DrawLevelText(0, 0, 0, TEXT_END);
 
@@ -9667,7 +10841,12 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       for (x = 0; x < lev_fieldx; x++)
        for (y = 0; y < lev_fieldy; y++)
          Feld[x][y] = UndoBuffer[undo_buffer_position][x][y];
-      DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos,level_ypos);
+
+      /* check if undo operation forces change of border style */
+      CheckLevelBorderElement(FALSE);
+
+      DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+
       break;
 
     case GADGET_ID_INFO:
@@ -9758,7 +10937,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_EXIT:
-      RequestExitLevelEditor(TRUE);    /* if level has changed, ask user */
+      RequestExitLevelEditor(TRUE, FALSE);  /* if level has changed, ask user */
       break;
 
     default:
@@ -9861,7 +11040,9 @@ void HandleLevelEditorKeyInput(Key key)
   }
   else if (button_status == MB_RELEASED)
   {
-    int i, id = GADGET_ID_NONE;
+    int id = GADGET_ID_NONE;
+    int new_element_shift = element_shift;
+    int i;
 
     switch (key)
     {
@@ -9886,10 +11067,56 @@ void HandleLevelEditorKeyInput(Key key)
        button = MB_RIGHTBUTTON;
        break;
 
+      case KSYM_Home:
+      case KSYM_End:
+       element_shift = (key == KSYM_Home ? 0 :
+                        num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS);
+
+       ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
+                    GDI_SCROLLBAR_ITEM_POSITION,
+                    element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
+
+       ModifyEditorElementList();
+
+       break;
+
+      case KSYM_Insert:
+      case KSYM_Delete:
+
+       /* this is needed to prevent interference with running "True X-Mouse" */
+       if (GetKeyModStateFromEvents() & KMOD_Control)
+         break;
+
+       /* check for last or next editor cascade block in element list */
+       for (i = 0; i < num_editor_elements; i++)
+       {
+         if ((key == KSYM_Insert && i == element_shift) ||
+             (key == KSYM_Delete && new_element_shift > element_shift))
+           break;
+
+         /* jump to next cascade block (or to start of element list) */
+         if (i == 0 || IS_EDITOR_CASCADE(editor_elements[i]))
+           new_element_shift = i;
+       }
+
+       if (i < num_editor_elements)
+         element_shift = new_element_shift;
+
+       if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
+         element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
+
+       ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
+                    GDI_SCROLLBAR_ITEM_POSITION,
+                    element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
+
+       ModifyEditorElementList();
+
+       break;
+
       case KSYM_Escape:
         if (edit_mode == ED_MODE_DRAWING)
        {
-         RequestExitLevelEditor(setup.ask_on_escape);
+         RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE);
        }
         else if (edit_mode == ED_MODE_INFO)
        {
@@ -9904,6 +11131,7 @@ void HandleLevelEditorKeyInput(Key key)
          DrawDrawingWindow();
          edit_mode = ED_MODE_DRAWING;
        }
+
         break;
 
       default:
@@ -9936,15 +11164,8 @@ void HandleLevelEditorIdle()
   if (!DelayReached(&action_delay, action_delay_value))
     return;
 
-#if 1
   DrawEditorElementAnimation(SX + xpos * TILEX,
                             SY + ypos * TILEY + MINI_TILEY / 2);
-#else
-  DrawGraphicAnimationExt(drawto,
-                         SX + xpos * TILEX,
-                         SY + ypos * TILEY + MINI_TILEY / 2,
-                         el2img(properties_element), -1, NO_MASKING);
-#endif
 
   MarkTileDirty(xpos, ypos);
   MarkTileDirty(xpos, ypos + 1);
@@ -9996,11 +11217,6 @@ void PrintEditorGadgetInfoText(struct GadgetInfo *gi)
 void HandleEditorGadgetInfoText(void *ptr)
 {
   struct GadgetInfo *gi = (struct GadgetInfo *)ptr;
-#if 0
-  char infotext[MAX_OUTPUT_LINESIZE + 1];
-  char shortcut[MAX_OUTPUT_LINESIZE + 1];
-  int max_infotext_len = getMaxInfoTextLength();
-#endif
 
   if (game_status != GAME_MODE_EDITOR)
     return;
@@ -10014,38 +11230,7 @@ void HandleEditorGadgetInfoText(void *ptr)
   if (edit_mode == ED_MODE_DRAWING && draw_with_brush)
     DeleteBrushFromCursor();
 
-#if 1
   PrintEditorGadgetInfoText(gi);
-#else
-  if (gi == NULL || gi->info_text == NULL)
-    return;
-
-  strncpy(infotext, gi->info_text, max_infotext_len);
-  infotext[max_infotext_len] = '\0';
-
-  if (gi->custom_id < ED_NUM_CTRL_BUTTONS)
-  {
-    int key = control_info[gi->custom_id].shortcut;
-
-    if (key)
-    {
-      if (gi->custom_id == GADGET_ID_SINGLE_ITEMS)     /* special case 1 */
-       sprintf(shortcut, " ('.' or '%c')", key);
-      else if (gi->custom_id == GADGET_ID_PICK_ELEMENT)        /* special case 2 */
-       sprintf(shortcut, " ('%c' or 'Ctrl')", key);
-      else if (gi->custom_id == GADGET_ID_TEST)                /* special case 3 */
-       sprintf(shortcut, " ('Enter' or 'Shift-%c')", key);
-      else                                             /* normal case */
-       sprintf(shortcut, " ('%s%c')",
-               (key >= 'A' && key <= 'Z' ? "Shift-" : ""), key);
-
-      if (strlen(infotext) + strlen(shortcut) <= max_infotext_len)
-       strcat(infotext, shortcut);
-    }
-  }
-
-  DrawText(INFOTEXT_XPOS, INFOTEXT_YPOS, infotext, FONT_TEXT_2);
-#endif
 }
 
 static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
@@ -10202,21 +11387,31 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
     DrawTextS(INFOTEXT_XPOS - SX, INFOTEXT_YPOS - SY, FONT_TEXT_2, infotext);
 }
 
-void RequestExitLevelEditor(boolean ask_if_level_has_changed)
+void RequestExitLevelEditor(boolean ask_if_level_has_changed,
+                           boolean quick_quit)
 {
   if (!ask_if_level_has_changed ||
       !LevelChanged() ||
       Request("Level has changed ! Exit without saving ?",
              REQ_ASK | REQ_STAY_OPEN))
   {
-#if 1
     CloseDoor(DOOR_CLOSE_1);
     SetDoorState(DOOR_CLOSE_2);
+
+#if 1
+    if (quick_quit)
+      FadeSkipNextFadeIn();
 #else
-    CloseDoor(DOOR_CLOSE_ALL);
+    if (quick_quit)
+      fading = fading_none;
 #endif
+
     game_status = GAME_MODE_MAIN;
+#if 1
+    DrawAndFadeInMainMenu(REDRAW_FIELD);
+#else
     DrawMainMenu();
+#endif
   }
   else
   {