rnd-20040322-B-src
[rocksndiamonds.git] / src / editor.c
index 18ef65c8ed4cc60720a155878bc95ff84859e0eb..7852895b4d85797be41f155461ec36116a7c21ae 100644 (file)
@@ -47,6 +47,8 @@
 #define ED_CTRL1_BUTTONS_GFX_YPOS      236
 #define ED_CTRL2_BUTTONS_GFX_YPOS      236
 #define ED_CTRL3_BUTTONS_GFX_YPOS      324
+#define ED_CTRL4_BUTTONS_GFX_XPOS      44
+#define ED_CTRL4_BUTTONS_GFX_YPOS      214
 #define ED_CTRL1_BUTTONS_ALT_GFX_YPOS  142
 #define ED_CTRL3_BUTTONS_ALT_GFX_YPOS  302
 
 #define ED_CTRL3_BUTTON_YSIZE          22
 #define ED_CTRL3_BUTTONS_XPOS          6
 #define ED_CTRL3_BUTTONS_YPOS          6
+#define ED_CTRL4_BUTTON_XSIZE          22
+#define ED_CTRL4_BUTTON_YSIZE          22
+#define ED_CTRL4_BUTTONS_XPOS          6
+#define ED_CTRL4_BUTTONS_YPOS          6
 
 #define ED_CTRL1_BUTTONS_HORIZ         4
 #define ED_CTRL1_BUTTONS_VERT          4
 #define ED_CTRL2_BUTTONS_VERT          2
 #define ED_CTRL3_BUTTONS_HORIZ         3
 #define ED_CTRL3_BUTTONS_VERT          1
+#define ED_CTRL4_BUTTONS_HORIZ         2
+#define ED_CTRL4_BUTTONS_VERT          1
 
 #define ED_NUM_CTRL1_BUTTONS   (ED_CTRL1_BUTTONS_HORIZ * ED_CTRL1_BUTTONS_VERT)
 #define ED_NUM_CTRL2_BUTTONS   (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT)
 #define ED_NUM_CTRL3_BUTTONS   (ED_CTRL3_BUTTONS_HORIZ * ED_CTRL3_BUTTONS_VERT)
-#define ED_NUM_CTRL1_2_BUTTONS (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS)
+#define ED_NUM_CTRL4_BUTTONS   (ED_CTRL4_BUTTONS_HORIZ * ED_CTRL4_BUTTONS_VERT)
+#define ED_NUM_CTRL1_2_BUTTONS (ED_NUM_CTRL1_BUTTONS   + ED_NUM_CTRL2_BUTTONS)
+#define ED_NUM_CTRL1_3_BUTTONS (ED_NUM_CTRL1_2_BUTTONS + ED_NUM_CTRL3_BUTTONS)
 #define ED_NUM_CTRL_BUTTONS    (ED_NUM_CTRL1_BUTTONS + \
                                ED_NUM_CTRL2_BUTTONS + \
-                               ED_NUM_CTRL3_BUTTONS)
+                               ED_NUM_CTRL3_BUTTONS + \
+                               ED_NUM_CTRL4_BUTTONS)
 
 /* values for the element list */
 #define ED_ELEMENTLIST_XPOS            5
                                         ED_GADGET_DISTANCE - MINI_TILEY)
 /* movement enter/leave element */
 #define ED_AREA_ELEM_CONTENT4a_XPOS    (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4a_YPOS    (ED_SETTINGS_YPOS(10) + \
+#define ED_AREA_ELEM_CONTENT4a_YPOS    (ED_SETTINGS_YPOS(11) + \
                                         ED_GADGET_DISTANCE)
 #define ED_AREA_ELEM_CONTENT4b_XPOS    (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4b_YPOS    (ED_SETTINGS_YPOS(10) + \
+#define ED_AREA_ELEM_CONTENT4b_YPOS    (ED_SETTINGS_YPOS(11) + \
                                         ED_GADGET_DISTANCE)
 /* custom change trigger element */
 #define ED_AREA_ELEM_CONTENT5_YPOS     (ED_SETTINGS_YPOS(5) + \
 #define ED_RADIOBUTTON_YPOS            (ED_BUTTON_MINUS_YPOS + 44)
 #define ED_STICKYBUTTON_YPOS           (ED_BUTTON_MINUS_YPOS + 66)
 
-/* some positions in the editor control window */
-#define ED_BUTTON_ELEM_XPOS            6
-#define ED_BUTTON_ELEM_YPOS            30
-#define ED_BUTTON_ELEM_XSIZE           22
-#define ED_BUTTON_ELEM_YSIZE           22
+/* values for some special graphic buttons */
+#define ED_COPY_CHANGE_PAGE_XPOS       25
+#define ED_COPY_CHANGE_PAGE_YPOS       50
+#define ED_PASTE_CHANGE_PAGE_XPOS      25
+#define ED_PASTE_CHANGE_PAGE_YPOS      70
 
 /* some values for text input, selectbox and counter gadgets */
 #define ED_BUTTON_COUNT_YPOS           60
 #define GADGET_ID_CUSTOM_COPY_FROM     (GADGET_ID_TOOLBOX_FIRST + 22)
 #define GADGET_ID_CUSTOM_COPY_TO       (GADGET_ID_TOOLBOX_FIRST + 23)
 #define GADGET_ID_CUSTOM_EXCHANGE      (GADGET_ID_TOOLBOX_FIRST + 24)
+#define GADGET_ID_CUSTOM_COPY          (GADGET_ID_TOOLBOX_FIRST + 25)
+#define GADGET_ID_CUSTOM_PASTE         (GADGET_ID_TOOLBOX_FIRST + 26)
 
 /* counter button identifiers */
-#define GADGET_ID_COUNTER_FIRST                (GADGET_ID_TOOLBOX_FIRST + 25)
+#define GADGET_ID_COUNTER_FIRST                (GADGET_ID_TOOLBOX_FIRST + 27)
 
 #define GADGET_ID_SELECT_LEVEL_DOWN    (GADGET_ID_COUNTER_FIRST + 0)
 #define GADGET_ID_SELECT_LEVEL_TEXT    (GADGET_ID_COUNTER_FIRST + 1)
 #define GADGET_ID_PUSH_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 42)
 #define GADGET_ID_PUSH_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 43)
 #define GADGET_ID_PUSH_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 44)
-#define GADGET_ID_MOVE_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 45)
-#define GADGET_ID_MOVE_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 46)
-#define GADGET_ID_MOVE_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 47)
-#define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 48)
-#define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 49)
-#define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 53)
-#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 54)
-#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 55)
-#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 56)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 57)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 58)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 59)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 60)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 61)
-#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 62)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 63)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 64)
-#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 65)
-#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 66)
-#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 67)
-#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_DROP_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 45)
+#define GADGET_ID_DROP_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 46)
+#define GADGET_ID_DROP_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 47)
+#define GADGET_ID_DROP_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 48)
+#define GADGET_ID_DROP_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 49)
+#define GADGET_ID_DROP_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_MOVE_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_MOVE_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_MOVE_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 59)
+#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 60)
+#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 61)
+#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 64)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 65)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 66)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 67)
+#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 70)
+#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 71)
+#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 72)
+#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 73)
+#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 74)
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 75)
 
 #define GADGET_ID_DRAWING_LEVEL                (GADGET_ID_DRAWING_AREA_FIRST + 0)
 #define GADGET_ID_ELEMENT_CONTENT_0    (GADGET_ID_DRAWING_AREA_FIRST + 1)
 /* selectbox identifiers */
 #define GADGET_ID_SELECTBOX_FIRST      (GADGET_ID_TEXT_AREA_FIRST + 1)
 
-#define GADGET_ID_CUSTOM_WALK_TO_ACTION        (GADGET_ID_SELECTBOX_FIRST + 0)
-#define GADGET_ID_CUSTOM_CONSISTENCY   (GADGET_ID_SELECTBOX_FIRST + 1)
-#define GADGET_ID_CUSTOM_DEADLINESS    (GADGET_ID_SELECTBOX_FIRST + 2)
-#define GADGET_ID_CUSTOM_MOVE_PATTERN  (GADGET_ID_SELECTBOX_FIRST + 3)
-#define GADGET_ID_CUSTOM_MOVE_DIRECTION        (GADGET_ID_SELECTBOX_FIRST + 4)
-#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 5)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 6)
-#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 7)
-#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 8)
-#define GADGET_ID_CUSTOM_ACCESS_TYPE   (GADGET_ID_SELECTBOX_FIRST + 9)
-#define GADGET_ID_CUSTOM_ACCESS_LAYER  (GADGET_ID_SELECTBOX_FIRST + 10)
-#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 11)
-#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 12)
-#define GADGET_ID_CHANGE_TIME_UNITS    (GADGET_ID_SELECTBOX_FIRST + 13)
-#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 14)
-#define GADGET_ID_CHANGE_OTHER_ACTION  (GADGET_ID_SELECTBOX_FIRST + 15)
-#define GADGET_ID_CHANGE_SIDES         (GADGET_ID_SELECTBOX_FIRST + 16)
-#define GADGET_ID_CHANGE_PLAYERS       (GADGET_ID_SELECTBOX_FIRST + 17)
-#define GADGET_ID_CHANGE_PAGES         (GADGET_ID_SELECTBOX_FIRST + 18)
-#define GADGET_ID_CHANGE_POWER         (GADGET_ID_SELECTBOX_FIRST + 19)
-#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 20)
-#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 21)
+#define GADGET_ID_TIME_OR_STEPS                (GADGET_ID_SELECTBOX_FIRST + 0)
+#define GADGET_ID_CUSTOM_WALK_TO_ACTION        (GADGET_ID_SELECTBOX_FIRST + 1)
+#define GADGET_ID_CUSTOM_CONSISTENCY   (GADGET_ID_SELECTBOX_FIRST + 2)
+#define GADGET_ID_CUSTOM_DEADLINESS    (GADGET_ID_SELECTBOX_FIRST + 3)
+#define GADGET_ID_CUSTOM_MOVE_PATTERN  (GADGET_ID_SELECTBOX_FIRST + 4)
+#define GADGET_ID_CUSTOM_MOVE_DIRECTION        (GADGET_ID_SELECTBOX_FIRST + 5)
+#define GADGET_ID_CUSTOM_MOVE_STEPSIZE (GADGET_ID_SELECTBOX_FIRST + 6)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE (GADGET_ID_SELECTBOX_FIRST + 7)
+#define GADGET_ID_CUSTOM_SMASH_TARGETS (GADGET_ID_SELECTBOX_FIRST + 8)
+#define GADGET_ID_CUSTOM_SLIPPERY_TYPE (GADGET_ID_SELECTBOX_FIRST + 9)
+#define GADGET_ID_CUSTOM_ACCESS_TYPE   (GADGET_ID_SELECTBOX_FIRST + 10)
+#define GADGET_ID_CUSTOM_ACCESS_LAYER  (GADGET_ID_SELECTBOX_FIRST + 11)
+#define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 12)
+#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 13)
+#define GADGET_ID_CHANGE_TIME_UNITS    (GADGET_ID_SELECTBOX_FIRST + 14)
+#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_CHANGE_OTHER_ACTION  (GADGET_ID_SELECTBOX_FIRST + 16)
+#define GADGET_ID_CHANGE_SIDE          (GADGET_ID_SELECTBOX_FIRST + 17)
+#define GADGET_ID_CHANGE_PLAYER                (GADGET_ID_SELECTBOX_FIRST + 18)
+#define GADGET_ID_CHANGE_PAGE          (GADGET_ID_SELECTBOX_FIRST + 19)
+#define GADGET_ID_CHANGE_REPLACE_WHEN  (GADGET_ID_SELECTBOX_FIRST + 20)
+#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 21)
+#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 22)
 
 /* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 22)
+#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 23)
 
 #define GADGET_ID_PROPERTIES_INFO      (GADGET_ID_TEXTBUTTON_FIRST + 0)
 #define GADGET_ID_PROPERTIES_CONFIG    (GADGET_ID_TEXTBUTTON_FIRST + 1)
 
 #define GADGET_ID_PREV_CHANGE_PAGE     (GADGET_ID_GRAPHICBUTTON_FIRST + 0)
 #define GADGET_ID_NEXT_CHANGE_PAGE     (GADGET_ID_GRAPHICBUTTON_FIRST + 1)
+#define GADGET_ID_COPY_CHANGE_PAGE     (GADGET_ID_GRAPHICBUTTON_FIRST + 2)
+#define GADGET_ID_PASTE_CHANGE_PAGE    (GADGET_ID_GRAPHICBUTTON_FIRST + 3)
 
 /* gadgets for scrolling of drawing area */
-#define GADGET_ID_SCROLLING_FIRST      (GADGET_ID_GRAPHICBUTTON_FIRST + 2)
+#define GADGET_ID_SCROLLING_FIRST      (GADGET_ID_GRAPHICBUTTON_FIRST + 4)
 
 #define GADGET_ID_SCROLL_UP            (GADGET_ID_SCROLLING_FIRST + 0)
 #define GADGET_ID_SCROLL_DOWN          (GADGET_ID_SCROLLING_FIRST + 1)
 #define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 7)
 #define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 8)
 #define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_CUSTOM_EXPLODE_RESULT        (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_CUSTOM_EXPLODE_RESULT        (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 34)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 35)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_COUNTER_ID_CUSTOM_GEMCOUNT  12
 #define ED_COUNTER_ID_PUSH_DELAY_FIX   13
 #define ED_COUNTER_ID_PUSH_DELAY_RND   14
-#define ED_COUNTER_ID_MOVE_DELAY_FIX   15
-#define ED_COUNTER_ID_MOVE_DELAY_RND   16
-#define ED_COUNTER_ID_EXPLOSION_DELAY  17
-#define ED_COUNTER_ID_IGNITION_DELAY   18
-#define ED_COUNTER_ID_GROUP_CONTENT    19
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 20
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 21
-#define ED_COUNTER_ID_CHANGE_CONT_RND  22
-
-#define ED_NUM_COUNTERBUTTONS          23
+#define ED_COUNTER_ID_DROP_DELAY_FIX   15
+#define ED_COUNTER_ID_DROP_DELAY_RND   16
+#define ED_COUNTER_ID_MOVE_DELAY_FIX   17
+#define ED_COUNTER_ID_MOVE_DELAY_RND   18
+#define ED_COUNTER_ID_EXPLOSION_DELAY  19
+#define ED_COUNTER_ID_IGNITION_DELAY   20
+#define ED_COUNTER_ID_GROUP_CONTENT    21
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 22
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 23
+#define ED_COUNTER_ID_CHANGE_CONT_RND  24
+
+#define ED_NUM_COUNTERBUTTONS          25
 
 #define ED_COUNTER_ID_LEVEL_FIRST      ED_COUNTER_ID_LEVEL_XSIZE
 #define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM
 #define ED_TEXTAREA_ID_LEVEL_LAST      ED_TEXTAREA_ID_ENVELOPE
 
 /* values for selectbox gadgets */
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE     0
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER    1
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED        2
-#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION        3
-#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION  4
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN    5
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION  6
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE   7
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 8
-#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS   9
-#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE   10
-#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS      11
-#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY     12
-#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS      13
-#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION   14
-#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION    15
-#define ED_SELECTBOX_ID_CHANGE_SIDES           16
-#define ED_SELECTBOX_ID_CHANGE_PLAYERS         17
-#define ED_SELECTBOX_ID_CHANGE_PAGES           18
-#define ED_SELECTBOX_ID_CHANGE_POWER           19
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     20
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      21
-
-#define ED_NUM_SELECTBOX                       22
+#define ED_SELECTBOX_ID_TIME_OR_STEPS          0
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE     1
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER    2
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED        3
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION        4
+#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION  5
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN    6
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION  7
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE   8
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 9
+#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS   10
+#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE   11
+#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS      12
+#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY     13
+#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS      14
+#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION   15
+#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION    16
+#define ED_SELECTBOX_ID_CHANGE_SIDE            17
+#define ED_SELECTBOX_ID_CHANGE_PLAYER          18
+#define ED_SELECTBOX_ID_CHANGE_PAGE            19
+#define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN    20
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     21
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      22
+
+#define ED_NUM_SELECTBOX                       23
+
+#define ED_SELECTBOX_ID_LEVEL_FIRST    ED_SELECTBOX_ID_TIME_OR_STEPS
+#define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_TIME_OR_STEPS
 
 #define ED_SELECTBOX_ID_CUSTOM1_FIRST  ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
-#define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE
-#define ED_SELECTBOX_ID_CUSTOM2_FIRST  ED_SELECTBOX_ID_CUSTOM_DEADLINESS
+#define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE
+#define ED_SELECTBOX_ID_CUSTOM2_FIRST  ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS
 #define ED_SELECTBOX_ID_CUSTOM2_LAST   ED_SELECTBOX_ID_CUSTOM_CONSISTENCY
 #define ED_SELECTBOX_ID_CUSTOM_FIRST   ED_SELECTBOX_ID_CUSTOM1_FIRST
 #define ED_SELECTBOX_ID_CUSTOM_LAST    ED_SELECTBOX_ID_CUSTOM2_LAST
 /* values for graphicbutton gadgets */
 #define ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE   0
 #define ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE   1
+#define ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE   2
+#define ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE  3
 
-#define ED_NUM_GRAPHICBUTTONS                  2
+#define ED_NUM_GRAPHICBUTTONS                  4
 
-#define ED_GRAPHICBUTTON_ID_CHANGE_FIRST   ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE
-#define ED_GRAPHICBUTTON_ID_CHANGE_LAST    ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE
+#define ED_GRAPHICBUTTON_ID_CHANGE_FIRST  ED_GRAPHICBUTTON_ID_PREV_CHANGE_PAGE
+#define ED_GRAPHICBUTTON_ID_CHANGE_LAST   ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE
 
 /* values for checkbutton gadgets */
 #define ED_CHECKBUTTON_ID_DOUBLE_SPEED         0
 #define ED_CHECKBUTTON_ID_USE_SPRING_BUG       5
 #define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     6
 #define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  7
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   8
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   9
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  10
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    11
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        12
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      13
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      14
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     15
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      16
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                17
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT        18
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  19
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 20
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        21
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    22
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         23
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 24
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  25
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 26
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   27
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 28
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    29
-
-#define ED_NUM_CHECKBUTTONS                    30
+#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   8
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   9
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   10
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    11
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   12
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  13
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    14
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        15
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      16
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      17
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     18
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      19
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                20
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT        21
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  22
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 23
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        24
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    25
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         26
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 27
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  28
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 29
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   30
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 31
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    32
+
+#define ED_NUM_CHECKBUTTONS                    33
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_DOUBLE_SPEED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 
 #define ED_CHECKBUTTON_ID_CUSTOM1_FIRST        ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC
-#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY
-#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST        ED_CHECKBUTTON_ID_CUSTOM_DEADLY
+#define ED_CHECKBUTTON_ID_CUSTOM1_LAST ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE
+#define ED_CHECKBUTTON_ID_CUSTOM2_FIRST        ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL
 #define ED_CHECKBUTTON_ID_CUSTOM2_LAST ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT
 #define ED_CHECKBUTTON_ID_CUSTOM_FIRST ED_CHECKBUTTON_ID_CUSTOM1_FIRST
 #define ED_CHECKBUTTON_ID_CUSTOM_LAST  ED_CHECKBUTTON_ID_CUSTOM2_LAST
@@ -856,7 +892,10 @@ static struct
 
   { '\0',      "copy settings from other element"      },
   { '\0',      "copy settings to other element"        },
-  { '\0',      "exchange settings with other element"  },
+  { '\0',      "exchange element with other element"   },
+
+  { '\0',      "copy settings from this element"       },
+  { '\0',      "paste settings to this element"        },
 };
 
 static int random_placement_value = 10;
@@ -913,7 +952,7 @@ static struct
     GADGET_ID_LEVEL_GEMSLIMIT_DOWN,    GADGET_ID_LEVEL_GEMSLIMIT_UP,
     GADGET_ID_LEVEL_GEMSLIMIT_TEXT,    GADGET_ID_NONE,
     &level.gems_needed,
-    "number of emeralds to collect:",  NULL, NULL
+    "number of gems to collect:",      NULL, NULL
   },
   {
     ED_SETTINGS_XPOS(0),               ED_COUNTER_YPOS(4),
@@ -921,7 +960,7 @@ static struct
     GADGET_ID_LEVEL_TIMELIMIT_DOWN,    GADGET_ID_LEVEL_TIMELIMIT_UP,
     GADGET_ID_LEVEL_TIMELIMIT_TEXT,    GADGET_ID_NONE,
     &level.time,
-    "time available to solve level:",  NULL, "(0 => no time limit)"
+    "time or step limit to solve level:", NULL, NULL
   },
   {
     ED_SETTINGS_XPOS(0),               ED_COUNTER_YPOS(5),
@@ -929,7 +968,7 @@ static struct
     GADGET_ID_LEVEL_TIMESCORE_DOWN,    GADGET_ID_LEVEL_TIMESCORE_UP,
     GADGET_ID_LEVEL_TIMESCORE_TEXT,    GADGET_ID_NONE,
     &level.score[SC_TIME_BONUS],
-    "score for each 10 seconds left:", NULL, NULL
+    "score for each 10 sec/steps left:", NULL, NULL
   },
   {
     ED_SETTINGS_XPOS(0),               ED_COUNTER2_YPOS(8),
@@ -995,7 +1034,7 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(7),
-    0,                                 999,
+    0,                                 255,
     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,
@@ -1003,14 +1042,30 @@ static struct
   },
   {
     -1,                                        ED_SETTINGS_YPOS(7),
-    0,                                 999,
+    0,                                 255,
     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,
     NULL,                              "+random", NULL
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(12),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(8),
+    0,                                 255,
+    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,
+    NULL,                              "drop delay", NULL
+  },
+  {
+    -1,                                        ED_SETTINGS_YPOS(8),
+    0,                                 255,
+    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,
+    NULL,                              "+random", NULL
+  },
+  {
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(13),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_FIX_DOWN,     GADGET_ID_MOVE_DELAY_FIX_UP,
     GADGET_ID_MOVE_DELAY_FIX_TEXT,     GADGET_ID_NONE,
@@ -1018,7 +1073,7 @@ static struct
     NULL,                              "move delay", NULL
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(12),
+    -1,                                        ED_SETTINGS_YPOS(13),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_RND_DOWN,     GADGET_ID_MOVE_DELAY_RND_UP,
     GADGET_ID_MOVE_DELAY_RND_TEXT,     GADGET_ID_MOVE_DELAY_FIX_UP,
@@ -1079,7 +1134,7 @@ static struct
     0,                                 100,
     GADGET_ID_CHANGE_CONT_RND_DOWN,    GADGET_ID_CHANGE_CONT_RND_UP,
     GADGET_ID_CHANGE_CONT_RND_TEXT,    GADGET_ID_NONE,
-    &custom_element_change.random,
+    &custom_element_change.random_percentage,
     NULL,                              "use random replace:", "%"
   },
 };
@@ -1134,10 +1189,19 @@ static struct
   }
 };
 
+static struct ValueTextInfo options_time_or_steps[] =
+{
+  { 0,                         "seconds"                       },
+  { 1,                         "steps"                         },
+
+  { -1,                                NULL                            }
+};
+
 static struct ValueTextInfo options_access_type[] =
 {
   { EP_WALKABLE,               "walkable"                      },
   { EP_PASSABLE,               "passable"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1146,6 +1210,7 @@ static struct ValueTextInfo options_access_layer[] =
   { EP_ACCESSIBLE_OVER,                "over"                          },
   { EP_ACCESSIBLE_INSIDE,      "inside"                        },
   { EP_ACCESSIBLE_UNDER,       "under"                         },
+
   { -1,                                NULL                            }
 };
 
@@ -1153,6 +1218,7 @@ static struct ValueTextInfo options_access_protected[] =
 {
   { 0,                         "unprotected"                   },
   { 1,                         "protected"                     },
+
   { -1,                                NULL                            }
 };
 
@@ -1173,6 +1239,7 @@ static struct ValueTextInfo options_access_direction[] =
   { MV_VERTICAL   | MV_LEFT,   "vertical + left"               },
   { MV_VERTICAL   | MV_RIGHT,  "vertical + right"              },
   { MV_ALL_DIRECTIONS,         "all directions"                },
+
   { -1,                                NULL                            }
 };
 
@@ -1182,6 +1249,7 @@ static struct ValueTextInfo options_walk_to_action[] =
   { EP_COLLECTIBLE_ONLY,       "collectible"                   },
   { EP_DROPPABLE,              "collectible & droppable"       },
   { EP_PUSHABLE,               "pushable"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1207,6 +1275,7 @@ static struct ValueTextInfo options_move_pattern[] =
   { MV_WHEN_DROPPED,           "when dropped"                  },
   { MV_MAZE_RUNNER,            "maze runner style"             },
   { MV_MAZE_HUNTER,            "maze hunter style"             },
+
   { -1,                                NULL                            }
 };
 
@@ -1219,6 +1288,7 @@ static struct ValueTextInfo options_move_direction[] =
   { MV_START_DOWN,             "down"                          },
   { MV_START_RANDOM,           "random"                        },
   { MV_START_PREVIOUS,         "previous"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1229,6 +1299,10 @@ static struct ValueTextInfo options_move_stepsize[] =
   { 4,                         "normal"                        },
   { 8,                         "fast"                          },
   { 16,                                "very fast"                     },
+#if 1
+  { 32,                                "even faster"                   },
+#endif
+
   { -1,                                NULL                            }
 };
 
@@ -1236,6 +1310,7 @@ static struct ValueTextInfo options_move_leave_type[] =
 {
   { LEAVE_TYPE_UNLIMITED,      "leave behind"                  },
   { LEAVE_TYPE_LIMITED,                "change it to"                  },
+
   { -1,                                NULL                            }
 };
 
@@ -1246,6 +1321,7 @@ static struct ValueTextInfo options_smash_targets[] =
   { EP_CAN_SMASH_ENEMIES,      "enemies"                       },
 #endif
   { EP_CAN_SMASH_EVERYTHING,   "everything"                    },
+
   { -1,                                NULL                            }
 };
 
@@ -1256,6 +1332,7 @@ static struct ValueTextInfo options_slippery_type[] =
   { SLIPPERY_ANY_RIGHT_LEFT,   "right, left"                   },
   { SLIPPERY_ONLY_LEFT,                "only left"                     },
   { SLIPPERY_ONLY_RIGHT,       "only right"                    },
+
   { -1,                                NULL                            }
 };
 
@@ -1264,15 +1341,17 @@ static struct ValueTextInfo options_deadliness[] =
   { EP_DONT_RUN_INTO,          "running into"                  },
   { EP_DONT_COLLIDE_WITH,      "colliding with"                },
   { EP_DONT_TOUCH,             "touching"                      },
+
   { -1,                                NULL                            }
 };
 
 static struct ValueTextInfo options_consistency[] =
 {
   { EP_CAN_EXPLODE_3X3,                "can explode 3x3"               },
-  { EP_CAN_EXPLODE_DYNA,       "can explode 3+3"               },
+  { EP_CAN_EXPLODE_CROSS,      "can explode 3+3"               },
   { EP_CAN_EXPLODE_1X1,                "can explode 1x1"               },
   { EP_INDESTRUCTIBLE,         "indestructible"                },
+
   { -1,                                NULL                            }
 };
 
@@ -1280,6 +1359,7 @@ static struct ValueTextInfo options_time_units[] =
 {
   { 1,                         "frames"                        },
   { FRAMES_PER_SECOND,         "seconds"                       },
+
   { -1,                                NULL                            }
 };
 
@@ -1300,6 +1380,7 @@ static struct ValueTextInfo options_change_direct_action[] =
 #endif
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
+
   { -1,                                NULL                            }
 };
 
@@ -1319,12 +1400,13 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_OTHER_GETS_HIT,         "hit by ..."                    },
 #endif
   { CE_OTHER_IS_SWITCHING,     "switch of ..."                 },
-  { CE_OTHER_IS_CHANGING,      "change of"                     },
+  { CE_OTHER_IS_CHANGING,      "change by page of"             },
   { CE_OTHER_IS_EXPLODING,     "explosion of"                  },
+
   { -1,                                NULL                            }
 };
 
-static struct ValueTextInfo options_change_sides[] =
+static struct ValueTextInfo options_change_trigger_side[] =
 {
   { CH_SIDE_LEFT,              "left"                          },
   { CH_SIDE_RIGHT,             "right"                         },
@@ -1333,62 +1415,66 @@ static struct ValueTextInfo options_change_sides[] =
   { CH_SIDE_LEFT_RIGHT,                "left/right"                    },
   { CH_SIDE_TOP_BOTTOM,                "top/bottom"                    },
   { CH_SIDE_ANY,               "any"                           },
+
   { -1,                                NULL                            }
 };
 
 static struct ValueTextInfo options_change_trigger_player[] =
 {
-  { 0,                         "any"                           },
-  { 1,                         "1"                             },
-  { 2,                         "2"                             },
-  { 3,                         "3"                             },
-  { 4,                         "4"                             },
+  { CH_PLAYER_1,               "1"                             },
+  { CH_PLAYER_2,               "2"                             },
+  { CH_PLAYER_3,               "3"                             },
+  { CH_PLAYER_4,               "4"                             },
+  { CH_PLAYER_ANY,             "any"                           },
+
   { -1,                                NULL                            }
 };
 
 static struct ValueTextInfo options_change_trigger_page[] =
 {
-  { 0,                         "any"                           },
-  { 1,                         "1"                             },
-  { 2,                         "2"                             },
-  { 3,                         "3"                             },
-  { 4,                         "4"                             },
-  { 5,                         "5"                             },
-  { 6,                         "6"                             },
-  { 7,                         "7"                             },
-  { 8,                         "8"                             },
-  { 9,                         "9"                             },
-  { 10,                                "10"                            },
-  { 11,                                "11"                            },
-  { 12,                                "12"                            },
-  { 13,                                "13"                            },
-  { 14,                                "14"                            },
-  { 15,                                "15"                            },
-  { 16,                                "16"                            },
-  { 17,                                "17"                            },
-  { 18,                                "18"                            },
-  { 19,                                "19"                            },
-  { 20,                                "20"                            },
-  { 21,                                "21"                            },
-  { 22,                                "22"                            },
-  { 23,                                "23"                            },
-  { 24,                                "24"                            },
-  { 25,                                "25"                            },
-  { 26,                                "26"                            },
-  { 27,                                "27"                            },
-  { 28,                                "28"                            },
-  { 29,                                "29"                            },
-  { 30,                                "30"                            },
-  { 31,                                "31"                            },
-  { 32,                                "32"                            },
+  { (1 << 0),                  "1"                             },
+  { (1 << 1),                  "2"                             },
+  { (1 << 2),                  "3"                             },
+  { (1 << 3),                  "4"                             },
+  { (1 << 4),                  "5"                             },
+  { (1 << 5),                  "6"                             },
+  { (1 << 6),                  "7"                             },
+  { (1 << 7),                  "8"                             },
+  { (1 << 8),                  "9"                             },
+  { (1 << 9),                  "10"                            },
+  { (1 << 10),                 "11"                            },
+  { (1 << 11),                 "12"                            },
+  { (1 << 12),                 "13"                            },
+  { (1 << 13),                 "14"                            },
+  { (1 << 14),                 "15"                            },
+  { (1 << 15),                 "16"                            },
+  { (1 << 16),                 "17"                            },
+  { (1 << 17),                 "18"                            },
+  { (1 << 18),                 "19"                            },
+  { (1 << 19),                 "20"                            },
+  { (1 << 20),                 "21"                            },
+  { (1 << 21),                 "22"                            },
+  { (1 << 22),                 "23"                            },
+  { (1 << 23),                 "24"                            },
+  { (1 << 24),                 "25"                            },
+  { (1 << 25),                 "26"                            },
+  { (1 << 26),                 "27"                            },
+  { (1 << 27),                 "28"                            },
+  { (1 << 28),                 "29"                            },
+  { (1 << 29),                 "30"                            },
+  { (1 << 30),                 "31"                            },
+  { (1 << 31),                 "32"                            },
+  { CH_PAGE_ANY,               "any"                           },
+
   { -1,                                NULL                            }
 };
 
-static struct ValueTextInfo options_change_power[] =
+static struct ValueTextInfo options_change_replace_when[] =
 {
-  { CP_NON_DESTRUCTIVE,                "empty"                         },
-  { CP_HALF_DESTRUCTIVE,       "diggable"                      },
-  { CP_FULL_DESTRUCTIVE,       "destructible"                  },
+  { CP_WHEN_EMPTY,             "empty"                         },
+  { CP_WHEN_DIGGABLE,          "diggable"                      },
+  { CP_WHEN_DESTRUCTIBLE,      "destructible"                  },
+
   { -1,                                NULL                            }
 };
 
@@ -1405,6 +1491,7 @@ static struct ValueTextInfo options_group_choice_mode[] =
   { ANIM_LINEAR,               "linear"                        },
   { ANIM_PINGPONG,             "pingpong"                      },
   { ANIM_PINGPONG2,            "pingpong 2"                    },
+
   { -1,                                NULL                            }
 };
 
@@ -1419,6 +1506,17 @@ static struct
   char *text_left, *text_right, *infotext;
 } selectbox_info[ED_NUM_SELECTBOX] =
 {
+  /* ---------- level and editor settings ---------------------------------- */
+
+  {
+    -1,                                        ED_COUNTER_YPOS(4),
+    GADGET_ID_TIME_OR_STEPS,           GADGET_ID_LEVEL_TIMELIMIT_UP,
+    -1,
+    options_time_or_steps,
+    &level.use_step_counter,
+    NULL, "(0 => no limit)",           "time or step limit"
+  },
+
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
   {
@@ -1462,7 +1560,7 @@ static struct
     NULL, NULL,                                "diggable/collectible/pushable"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(8),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_MOVE_PATTERN,     GADGET_ID_NONE,
     -1,
     options_move_pattern,
@@ -1470,7 +1568,7 @@ static struct
     "can move", NULL,                  "element move direction"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_MOVE_DIRECTION,   GADGET_ID_NONE,
     -1,
     options_move_direction,
@@ -1478,7 +1576,7 @@ static struct
     "starts moving", NULL,             "initial element move direction"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(11),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(12),
     GADGET_ID_CUSTOM_MOVE_STEPSIZE,    GADGET_ID_NONE,
     -1,
     options_move_stepsize,
@@ -1486,7 +1584,7 @@ static struct
     "move/fall speed", NULL,           "speed of element movement"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(10),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,  GADGET_ID_NONE,
     -1,
     options_move_leave_type,
@@ -1557,15 +1655,15 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(6),
-    GADGET_ID_CHANGE_SIDES,            GADGET_ID_NONE,
+    GADGET_ID_CHANGE_SIDE            GADGET_ID_NONE,
     -1,
-    options_change_sides,
-    &custom_element_change.sides,
+    options_change_trigger_side,
+    &custom_element_change.trigger_side,
     "... at", "side",                  "element side that causes change"
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(7),
-    GADGET_ID_CHANGE_PLAYERS,          GADGET_ID_NONE,
+    GADGET_ID_CHANGE_PLAYER          GADGET_ID_NONE,
     -1,
     options_change_trigger_player,
     &custom_element_change.trigger_player,
@@ -1573,7 +1671,7 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(7),
-    GADGET_ID_CHANGE_PAGES,            GADGET_ID_CHANGE_PLAYERS,
+    GADGET_ID_CHANGE_PAGE,             GADGET_ID_CHANGE_PLAYER,
     -1,
     options_change_trigger_page,
     &custom_element_change.trigger_page,
@@ -1581,10 +1679,10 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(10),
-    GADGET_ID_CHANGE_POWER,            GADGET_ID_NONE,
+    GADGET_ID_CHANGE_REPLACE_WHEN,     GADGET_ID_NONE,
     -1,
-    options_change_power,
-    &custom_element_change.power,
+    options_change_replace_when,
+    &custom_element_change.replace_when,
     "replace when", NULL,              "which elements can be replaced"
   },
   {
@@ -1677,9 +1775,9 @@ static struct
   },
   {
     -1,                                        ED_SETTINGS_YPOS(14),
-    GADGET_ID_ADD_CHANGE_PAGE,         GADGET_ID_NEXT_CHANGE_PAGE,
+    GADGET_ID_ADD_CHANGE_PAGE,         GADGET_ID_PASTE_CHANGE_PAGE,
     -1,                                        "New",
-    " ", NULL,                         "Add new change page"
+    NULL, NULL,                                "Add new change page"
   },
   {
     -1,                                        ED_SETTINGS_YPOS(14),
@@ -1713,6 +1811,20 @@ static struct
     GADGET_ID_NEXT_CHANGE_PAGE,                GADGET_ID_SELECT_CHANGE_PAGE,
     NULL, "change page",               "select next change page"
   },
+  {
+    ED_COPY_CHANGE_PAGE_XPOS,          ED_COPY_CHANGE_PAGE_YPOS,
+    -1,                                        ED_SETTINGS_YPOS(14),
+    ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
+    GADGET_ID_COPY_CHANGE_PAGE,                GADGET_ID_NEXT_CHANGE_PAGE,
+    " ", NULL,                         "copy settings from this change page"
+  },
+  {
+    ED_PASTE_CHANGE_PAGE_XPOS,         ED_PASTE_CHANGE_PAGE_YPOS,
+    -1,                                        ED_SETTINGS_YPOS(14),
+    ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
+    GADGET_ID_PASTE_CHANGE_PAGE,       GADGET_ID_COPY_CHANGE_PAGE,
+    NULL, NULL,                                "paste settings to this change page"
+  },
 };
 
 static struct
@@ -1879,19 +1991,33 @@ static struct
     "use spring pushing bug",          "use odd spring pushing behaviour"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(1),
     GADGET_ID_BLOCK_LAST_FIELD,                GADGET_ID_NONE,
     &level.block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(1),
     GADGET_ID_SP_BLOCK_LAST_FIELD,     GADGET_ID_NONE,
     &level.sp_block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
+  {
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(2),
+    GADGET_ID_INSTANT_RELOCATION,      GADGET_ID_NONE,
+    &level.instant_relocation,
+    NULL,
+    "no scrolling when relocating",    "player gets relocated without delay"
+  },
+  {
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
+    GADGET_ID_CAN_FALL_INTO_ACID,      GADGET_ID_NONE,
+    &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
+    NULL,
+    "can fall into acid (with gravity)","player can fall into acid pool"
+  },
   {
     ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
     GADGET_ID_CAN_MOVE_INTO_ACID,      GADGET_ID_NONE,
@@ -1899,6 +2025,13 @@ static struct
     NULL,
     "can move into acid",              "element can move into acid pool"
   },
+  {
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(1),
+    GADGET_ID_DONT_COLLIDE_WITH,       GADGET_ID_NONE,
+    &custom_element_properties[EP_DONT_COLLIDE_WITH],
+    NULL,
+    "deadly when colliding with",      "element is deadly when hitting player"
+  },
 
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
@@ -1927,7 +2060,7 @@ static struct
     NULL, NULL,                                "player can dig/collect/push element"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(8),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_CAN_MOVE,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE],
     NULL, NULL,                                "element can move in some direction"
@@ -2019,19 +2152,19 @@ static struct
   {
     ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
     GADGET_ID_CHANGE_USE_CONTENT,      GADGET_ID_NONE,
-    &custom_element_change.use_content,
+    &custom_element_change.use_target_content,
     NULL, "use extended change target:","element changes to more elements"
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(11),
     GADGET_ID_CHANGE_ONLY_COMPLETE,    GADGET_ID_NONE,
-    &custom_element_change.only_complete,
+    &custom_element_change.only_if_complete,
     NULL, "replace all or nothing",    "only replace when all can be changed"
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(12),
     GADGET_ID_CHANGE_USE_RANDOM,       GADGET_ID_NONE,
-    &custom_element_change.use_random_change,
+    &custom_element_change.use_random_replace,
     NULL, NULL,                                "use percentage for random replace"
   },
 };
@@ -3238,6 +3371,22 @@ static int *editor_el_custom_more_ptr = editor_el_custom_more;
 static int num_editor_hl_custom_more = SIZEOF_ARRAY_INT(editor_hl_custom_more);
 static int num_editor_el_custom_more = SIZEOF_ARRAY_INT(editor_el_custom_more);
 
+static int editor_hl_custom_special[] =
+{
+};
+
+static int editor_el_custom_special[] =
+{
+  EL_TRIGGER_ELEMENT,
+  EL_TRIGGER_PLAYER,
+  EL_EMPTY,
+  EL_EMPTY
+};
+static int *editor_hl_custom_special_ptr = editor_hl_custom_special;
+static int *editor_el_custom_special_ptr = editor_el_custom_special;
+static int num_editor_hl_custom_special = SIZEOF_ARRAY_INT(editor_hl_custom_special);
+static int num_editor_el_custom_special = SIZEOF_ARRAY_INT(editor_el_custom_special);
+
 static int editor_hl_group[] =
 {
   EL_CHAR('G'),
@@ -3419,6 +3568,11 @@ editor_elements_info[] =
     &editor_hl_custom_more_ptr,                &num_editor_hl_custom_more,
     &editor_el_custom_more_ptr,                &num_editor_el_custom_more
   },
+  {
+    &setup.editor.el_custom,
+    &editor_hl_custom_special_ptr,     &num_editor_hl_custom_special,
+    &editor_el_custom_special_ptr,     &num_editor_el_custom_special
+  },
   {
     &setup.editor.el_custom,
     &editor_hl_group_ptr,              &num_editor_hl_group,
@@ -3901,7 +4055,7 @@ static void DrawDrawingArea(int id)
       for (x = 0; x < 3; x++)
        DrawMiniGraphicExt(drawto,
                           gi->x + x * MINI_TILEX, gi->y + y * MINI_TILEY,
-                          el2edimg(custom_element_change.content[x][y]));
+                          el2edimg(custom_element_change.target_content[x][y]));
   else if (id == ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER)
     DrawMiniGraphicExt(drawto, gi->x, gi->y,
                       el2edimg(custom_element_change.trigger_element));
@@ -4011,7 +4165,7 @@ static void CreateControlButtons()
 
       gd_xoffset = ED_CTRL1_BUTTONS_XPOS + x * ED_CTRL1_BUTTON_XSIZE;
       gd_yoffset = ED_CTRL1_BUTTONS_YPOS + y * ED_CTRL1_BUTTON_YSIZE;
-      width = ED_CTRL1_BUTTON_XSIZE;
+      width  = ED_CTRL1_BUTTON_XSIZE;
       height = ED_CTRL1_BUTTON_YSIZE;
 
       gd_x1 = DOOR_GFX_PAGEX8 + gd_xoffset;
@@ -4026,7 +4180,7 @@ static void CreateControlButtons()
 
       gd_xoffset = ED_CTRL2_BUTTONS_XPOS + x * ED_CTRL2_BUTTON_XSIZE;
       gd_yoffset = ED_CTRL2_BUTTONS_YPOS + y * ED_CTRL2_BUTTON_YSIZE;
-      width = ED_CTRL2_BUTTON_XSIZE;
+      width  = ED_CTRL2_BUTTON_XSIZE;
       height = ED_CTRL2_BUTTON_YSIZE;
 
       gd_x1 = DOOR_GFX_PAGEX8 + gd_xoffset;
@@ -4034,14 +4188,14 @@ static void CreateControlButtons()
       gd_y1 = DOOR_GFX_PAGEY1 + ED_CTRL2_BUTTONS_GFX_YPOS + gd_yoffset;
       gd_y2 = 0;       /* no alternative graphic for these buttons */
     }
-    else
+    else if (id < ED_NUM_CTRL1_3_BUTTONS)
     {
       int x = (i - ED_NUM_CTRL1_2_BUTTONS) % ED_CTRL3_BUTTONS_HORIZ + 1;
       int y = (i - ED_NUM_CTRL1_2_BUTTONS) / ED_CTRL3_BUTTONS_HORIZ;
 
       gd_xoffset = ED_CTRL3_BUTTONS_XPOS + x * ED_CTRL3_BUTTON_XSIZE;
       gd_yoffset = ED_CTRL3_BUTTONS_YPOS + y * ED_CTRL3_BUTTON_YSIZE;
-      width = ED_CTRL3_BUTTON_XSIZE;
+      width  = ED_CTRL3_BUTTON_XSIZE;
       height = ED_CTRL3_BUTTON_YSIZE;
 
       gd_x1 = DOOR_GFX_PAGEX6 + gd_xoffset;
@@ -4049,6 +4203,21 @@ static void CreateControlButtons()
       gd_y1 = DOOR_GFX_PAGEY1 + ED_CTRL3_BUTTONS_GFX_YPOS     + gd_yoffset;
       gd_y2 = DOOR_GFX_PAGEY1 + ED_CTRL3_BUTTONS_ALT_GFX_YPOS + gd_yoffset;
     }
+    else
+    {
+      int x = (i - ED_NUM_CTRL1_3_BUTTONS) % ED_CTRL4_BUTTONS_HORIZ;
+      int y = (i - ED_NUM_CTRL1_3_BUTTONS) / ED_CTRL4_BUTTONS_HORIZ + 3;
+
+      gd_xoffset = ED_CTRL4_BUTTONS_XPOS + x * ED_CTRL4_BUTTON_XSIZE;
+      gd_yoffset = ED_CTRL4_BUTTONS_YPOS + y * ED_CTRL4_BUTTON_YSIZE;
+      width  = ED_CTRL4_BUTTON_XSIZE;
+      height = ED_CTRL4_BUTTON_YSIZE;
+
+      gd_x1 = DOOR_GFX_PAGEX6 + ED_CTRL4_BUTTONS_GFX_XPOS + gd_xoffset;
+      gd_x2 = DOOR_GFX_PAGEX5 + ED_CTRL4_BUTTONS_GFX_XPOS + gd_xoffset;
+      gd_y1 = DOOR_GFX_PAGEY1 + ED_CTRL4_BUTTONS_GFX_YPOS + gd_yoffset;
+      gd_y2 = 0;       /* no alternative graphic for these buttons */
+    }
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
@@ -4655,10 +4824,20 @@ static void CreateGraphicbuttonGadgets()
 
     event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
-    gd_x1 = DOOR_GFX_PAGEX4 + graphicbutton_info[i].gd_x;
-    gd_x2 = DOOR_GFX_PAGEX3 + graphicbutton_info[i].gd_x;
-    gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
-    gd_y2 = gd_y1;
+    if (i <= ED_GRAPHICBUTTON_ID_NEXT_CHANGE_PAGE)
+    {
+      gd_x1 = DOOR_GFX_PAGEX4 + graphicbutton_info[i].gd_x;
+      gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
+      gd_x2 = DOOR_GFX_PAGEX3 + graphicbutton_info[i].gd_x;
+      gd_y2 = gd_y1;
+    }
+    else       /* (i <= ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE) */
+    {
+      gd_x1 = DOOR_GFX_PAGEX6 + graphicbutton_info[i].gd_x;
+      gd_y1 = DOOR_GFX_PAGEY1 + graphicbutton_info[i].gd_y;
+      gd_x2 = gd_x1 - ED_BUTTON_COUNT_XSIZE;
+      gd_y2 = gd_y1;
+    }
 
     /* determine horizontal position to the right of specified gadget */
     if (graphicbutton_info[i].gadget_id_align != GADGET_ID_NONE)
@@ -5163,8 +5342,7 @@ static void MapCheckbuttonGadget(int id)
   int y;       /* set after gadget position was modified */
 
   /* set position for "stickybutton" and "can move into acid" gadgets */
-  if (id == ED_CHECKBUTTON_ID_STICK_ELEMENT ||
-      id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID)
+  if (id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID)
     ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END);
 
   y = gi->y + yoffset;
@@ -5219,7 +5397,9 @@ static void MapOrUnmapLevelEditorToolboxCustomGadgets(boolean map)
   {
     if (i == GADGET_ID_CUSTOM_COPY_FROM ||
         i == GADGET_ID_CUSTOM_COPY_TO ||
-        i == GADGET_ID_CUSTOM_EXCHANGE)
+        i == GADGET_ID_CUSTOM_EXCHANGE ||
+        i == GADGET_ID_CUSTOM_COPY ||
+        i == GADGET_ID_CUSTOM_PASTE)
     {
       if (map)
        MapGadget(level_editor_gadget[i]);
@@ -5375,7 +5555,7 @@ static int setSelectboxValue(int selectbox_id, int new_value)
 
 static void copy_custom_element_settings(int element_from, int element_to)
 {
-#if 1
+#if 0
   struct ElementInfo ei_to_old = element_info[element_to];
   struct ElementInfo *ei_from = &element_info[element_from];
   struct ElementInfo *ei_to = &element_info[element_to];
@@ -5417,7 +5597,7 @@ static void copy_custom_element_settings(int element_from, int element_to)
   for (i = 0; i < MAX_ELEMENT_NAME_LEN + 1; i++)
     ei_to->description[i] = ei_from->description[i];
 
-  /* ---------- copy element properties ---------- */
+  /* ---------- copy element base properties ---------- */
   Properties[element_to][EP_BITFIELD_BASE] =
     Properties[element_from][EP_BITFIELD_BASE];
 
@@ -5426,11 +5606,15 @@ static void copy_custom_element_settings(int element_from, int element_to)
   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 = ei_from->collect_score;
   ei_to->collect_count = ei_from->collect_count;
 
   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;
 
@@ -5438,49 +5622,33 @@ static void copy_custom_element_settings(int element_from, int element_to)
   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[x][y] = ei_from->content[x][y];
 
-  ei_to->num_change_pages = ei_from->num_change_pages;
-  setElementChangePages(ei_to, ei_to->num_change_pages);
-
-  for (i=0; i < ei_to->num_change_pages; i++)
-  {
-    struct ElementChangeInfo *change_to = &ei_to->change_page[i];
-    struct ElementChangeInfo *change_from = &ei_from->change_page[i];
+  ei_to->explosion_delay = ei_from->explosion_delay;
+  ei_to->ignition_delay = ei_from->ignition_delay;
 
-    /* always start with reliable default values */
-    setElementChangeInfoToDefaults(change_to);
-
-    change_to->events = change_from->events;
-
-    change_to->target_element = change_from->target_element;
-
-    change_to->delay_fixed = change_from->delay_fixed;
-    change_to->delay_random = change_from->delay_random;
-    change_to->delay_frames = change_from->delay_frames;
-
-    change_to->trigger_element = change_from->trigger_element;
+  /* ---------- reinitialize and copy change pages ---------- */
 
-    change_to->explode = change_from->explode;
-    change_to->use_content = change_from->use_content;
-    change_to->only_complete = change_from->only_complete;
-    change_to->use_random_change = change_from->use_random_change;
+  ei_to->num_change_pages = ei_from->num_change_pages;
+  ei_to->current_change_page = ei_from->current_change_page;
 
-    change_to->random = change_from->random;
-    change_to->power = change_from->power;
+  setElementChangePages(ei_to, ei_to->num_change_pages);
 
-    for (y = 0; y < 3; y++)
-      for (x = 0; x < 3; x++)
-       change_to->content[x][y] = change_from->content[x][y];
+  for (i=0; i < ei_to->num_change_pages; i++)
+    ei_to->change_page[i] = ei_from->change_page[i];
 
-    change_to->can_change = change_from->can_change;
+  /* ---------- copy group element info ---------- */
+  if (ei_from->group != NULL && ei_to->group != NULL)  /* group or internal */
+    *ei_to->group = *ei_from->group;
 
-    change_to->sides = change_from->sides;
-  }
 #endif
 
   /* mark this custom element as modified */
@@ -5513,8 +5681,8 @@ static void replace_custom_element_in_settings(int element_from,
 
       for (y = 0; y < 3; y++)
        for (x = 0; x < 3; x++)
-         if (change->content[x][y] == element_from)
-           change->content[x][y] = element_to;
+         if (change->target_content[x][y] == element_from)
+           change->target_content[x][y] = element_to;
     }
 
     if (ei->group != NULL)                             /* group or internal */
@@ -5538,7 +5706,19 @@ static void replace_custom_element_in_playfield(int element_from,
 static boolean CopyCustomElement(int element_old, int element_new,
                                 int copy_mode)
 {
-  if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
+  if (copy_mode == GADGET_ID_CUSTOM_COPY)
+  {
+    element_new = (IS_CUSTOM_ELEMENT(element_old) ?
+                  EL_INTERNAL_CLIPBOARD_CUSTOM : EL_INTERNAL_CLIPBOARD_GROUP);
+    copy_mode = GADGET_ID_CUSTOM_COPY_TO;
+  }
+  else if (copy_mode == GADGET_ID_CUSTOM_PASTE)
+  {
+    element_old = (IS_CUSTOM_ELEMENT(element_new) ?
+                  EL_INTERNAL_CLIPBOARD_CUSTOM : EL_INTERNAL_CLIPBOARD_GROUP);
+    copy_mode = GADGET_ID_CUSTOM_COPY_TO;
+  }
+  else if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
   {
     Request("Please choose custom element !", REQ_CONFIRM);
 
@@ -5561,17 +5741,17 @@ static boolean CopyCustomElement(int element_old, int element_new,
   }
   else if (copy_mode == GADGET_ID_CUSTOM_EXCHANGE)
   {
-    copy_custom_element_settings(element_old, EL_INTERNAL_EDITOR);
+    copy_custom_element_settings(element_old, EL_INTERNAL_DUMMY);
     copy_custom_element_settings(element_new, element_old);
-    copy_custom_element_settings(EL_INTERNAL_EDITOR, element_new);
+    copy_custom_element_settings(EL_INTERNAL_DUMMY, element_new);
 
-    replace_custom_element_in_settings(element_old, EL_INTERNAL_EDITOR);
+    replace_custom_element_in_settings(element_old, EL_INTERNAL_DUMMY);
     replace_custom_element_in_settings(element_new, element_old);
-    replace_custom_element_in_settings(EL_INTERNAL_EDITOR, element_new);
+    replace_custom_element_in_settings(EL_INTERNAL_DUMMY, element_new);
 
-    replace_custom_element_in_playfield(element_old, EL_INTERNAL_EDITOR);
+    replace_custom_element_in_playfield(element_old, EL_INTERNAL_DUMMY);
     replace_custom_element_in_playfield(element_new, element_old);
-    replace_custom_element_in_playfield(EL_INTERNAL_EDITOR, element_new);
+    replace_custom_element_in_playfield(EL_INTERNAL_DUMMY, element_new);
   }
 
   UpdateCustomElementGraphicGadgets();
@@ -5675,13 +5855,13 @@ static void CopyCustomElementPropertiesToEditor(int element)
     (IS_INDESTRUCTIBLE(element) ? EP_INDESTRUCTIBLE :
      CAN_EXPLODE_1X1(element) ? EP_CAN_EXPLODE_1X1 :
      CAN_EXPLODE_3X3(element) ? EP_CAN_EXPLODE_3X3 :
-     CAN_EXPLODE_DYNA(element) ? EP_CAN_EXPLODE_DYNA :
+     CAN_EXPLODE_CROSS(element) ? EP_CAN_EXPLODE_CROSS :
      custom_element.consistency);
   custom_element_properties[EP_EXPLODE_RESULT] =
     (IS_INDESTRUCTIBLE(element) ||
      CAN_EXPLODE_1X1(element) ||
      CAN_EXPLODE_3X3(element) ||
-     CAN_EXPLODE_DYNA(element));
+     CAN_EXPLODE_CROSS(element));
 
   /* special case: sub-settings dependent from main setting */
   if (CAN_EXPLODE_BY_FIRE(element))
@@ -5736,10 +5916,13 @@ static void CopyGroupElementPropertiesToEditor(int element)
 static void CopyClassicElementPropertiesToEditor(int element)
 {
 #if 1
-  if (COULD_MOVE_INTO_ACID(element))
+  if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element))
     custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
       getMoveIntoAcidProperty(&level, element);
 
+  if (MAYBE_DONT_COLLIDE_WITH(element))
+    custom_element_properties[EP_DONT_COLLIDE_WITH] =
+      getDontCollideWithProperty(&level, element);
 #else
 
   if (COULD_MOVE_INTO_ACID(element))
@@ -5748,7 +5931,7 @@ static void CopyClassicElementPropertiesToEditor(int element)
 
     if (bit_nr > -1)
       custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
-       ((level.can_move_into_acid & (1 << bit_nr)) != 0);
+       ((level.can_move_into_acid_bits & (1 << bit_nr)) != 0);
   }
 #endif
 }
@@ -5834,7 +6017,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   custom_element_properties[EP_INDESTRUCTIBLE] = FALSE;
   custom_element_properties[EP_CAN_EXPLODE_1X1] = FALSE;
   custom_element_properties[EP_CAN_EXPLODE_3X3] = FALSE;
-  custom_element_properties[EP_CAN_EXPLODE_DYNA] = FALSE;
+  custom_element_properties[EP_CAN_EXPLODE_CROSS] = FALSE;
   custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] = FALSE;
   custom_element_properties[EP_CAN_EXPLODE_SMASHED] = FALSE;
   custom_element_properties[EP_CAN_EXPLODE_IMPACT] = FALSE;
@@ -5844,7 +6027,7 @@ static void CopyCustomElementPropertiesToGame(int element)
   /* special case: sub-settings dependent from main setting */
   if (custom_element_properties[EP_CAN_EXPLODE_1X1] ||
       custom_element_properties[EP_CAN_EXPLODE_3X3] ||
-      custom_element_properties[EP_CAN_EXPLODE_DYNA])
+      custom_element_properties[EP_CAN_EXPLODE_CROSS])
   {
     custom_element_properties[EP_CAN_EXPLODE_BY_FIRE] =
       custom_element.can_explode_by_fire;
@@ -5912,10 +6095,13 @@ static void CopyGroupElementPropertiesToGame(int element)
 static void CopyClassicElementPropertiesToGame(int element)
 {
 #if 1
-  if (COULD_MOVE_INTO_ACID(element))
+  if (ELEM_IS_PLAYER(element) || COULD_MOVE_INTO_ACID(element))
     setMoveIntoAcidProperty(&level, element,
                            custom_element_properties[EP_CAN_MOVE_INTO_ACID]);
 
+  if (MAYBE_DONT_COLLIDE_WITH(element))
+    setDontCollideWithProperty(&level, element,
+                             custom_element_properties[EP_DONT_COLLIDE_WITH]);
 #else
 
   if (COULD_MOVE_INTO_ACID(element))
@@ -5924,10 +6110,10 @@ static void CopyClassicElementPropertiesToGame(int element)
 
     if (bit_nr > -1)
     {
-      level.can_move_into_acid &= ~(1 << bit_nr);
+      level.can_move_into_acid_bits &= ~(1 << bit_nr);
 
       if (custom_element_properties[EP_CAN_MOVE_INTO_ACID])
-       level.can_move_into_acid |= (1 << bit_nr);
+       level.can_move_into_acid_bits |= (1 << bit_nr);
     }
   }
 #endif
@@ -6237,6 +6423,10 @@ static void DrawLevelInfoWindow()
   for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++)
     MapCounterButtons(i);
 
+  /* draw selectbox gadgets */
+  for (i = ED_SELECTBOX_ID_LEVEL_FIRST; i <= ED_SELECTBOX_ID_LEVEL_LAST; i++)
+    MapSelectboxGadget(i);
+
   /* draw checkbutton gadgets */
   for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i <= ED_CHECKBUTTON_ID_LEVEL_LAST; i++)
     MapCheckbuttonGadget(i);
@@ -6275,7 +6465,7 @@ static void DrawCustomChangeContentArea()
   int id = ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT;
   struct GadgetInfo *gi = level_editor_gadget[drawingarea_info[id].gadget_id];
   int x1 = right_gadget_border[GADGET_ID_CHANGE_USE_CONTENT];
-  int x2 = right_gadget_border[GADGET_ID_CHANGE_POWER];
+  int x2 = right_gadget_border[GADGET_ID_CHANGE_REPLACE_WHEN];
   int x3 = right_gadget_border[GADGET_ID_CHANGE_ONLY_COMPLETE];
   int xoffset = ED_DRAWINGAREA_TEXT_DISTANCE;
 
@@ -6778,7 +6968,7 @@ static boolean checkPropertiesConfig(int element)
       ELEM_IS_PLAYER(element) ||
       HAS_CONTENT(element) ||
       COULD_MOVE_INTO_ACID(element) ||
-      element == EL_SPRING)
+      MAYBE_DONT_COLLIDE_WITH(element))
     return TRUE;
   else
     for (i = 0; elements_with_counter[i].element != -1; i++)
@@ -6808,6 +6998,7 @@ static void DrawPropertiesConfig()
 
       counterbutton_info[counter_id].y =
        ED_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) +
+                        (MAYBE_DONT_COLLIDE_WITH(properties_element) ? 1 : 0)+
                         (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0));
 
       counterbutton_info[counter_id].value = elements_with_counter[i].value;
@@ -6831,17 +7022,23 @@ static void DrawPropertiesConfig()
   }
 
   if (ELEM_IS_PLAYER(properties_element))
+  {
+    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_INSTANT_RELOCATION);
+  }
 
   if (IS_GEM(properties_element))
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
 
   if (COULD_MOVE_INTO_ACID(properties_element) &&
+      !ELEM_IS_PLAYER(properties_element) &&
       (!IS_CUSTOM_ELEMENT(properties_element) ||
        edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2))
   {
+    /* set position for special checkbutton for "can move into acid" */
     checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
       ED_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
                       HAS_CONTENT(properties_element) ? 1 : 0);
@@ -6849,6 +7046,9 @@ static void DrawPropertiesConfig()
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
   }
 
+  if (MAYBE_DONT_COLLIDE_WITH(properties_element))
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH);
+
   if (properties_element == EL_SPRING)
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_SPRING_BUG);
 
@@ -6903,8 +7103,6 @@ static void DrawPropertiesConfig()
     }
     else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)
     {
-      /* set position for special checkbutton for "can move into acid" */
-
       /* draw checkbutton gadgets */
       for (i =  ED_CHECKBUTTON_ID_CUSTOM2_FIRST;
           i <= ED_CHECKBUTTON_ID_CUSTOM2_LAST; i++)
@@ -7955,7 +8153,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
        }
        else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
        {
-         custom_element_change.content[sx][sy] = new_element;
+         custom_element_change.target_content[sx][sy] = new_element;
 
          CopyCustomElementPropertiesToGame(properties_element);
        }
@@ -8088,7 +8286,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
       else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
        PickDrawingElement(button, custom_element_change.target_element);
       else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-       PickDrawingElement(button, custom_element_change.content[sx][sy]);
+       PickDrawingElement(button, custom_element_change.target_content[sx][sy]);
       else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
        PickDrawingElement(button, custom_element_change.trigger_element);
       else if (id == GADGET_ID_GROUP_CONTENT)
@@ -8298,6 +8496,21 @@ static void HandleGraphicbuttonGadgets(struct GadgetInfo *gi)
 
     DrawPropertiesWindow();
   }
+  else if (type_id == ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE ||
+          type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE)
+  {
+    struct ElementInfo *ei = &element_info[properties_element];
+    int current_change_page = ei->current_change_page;
+
+    if (type_id == ED_GRAPHICBUTTON_ID_COPY_CHANGE_PAGE)
+      element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0] =
+       ei->change_page[current_change_page];
+    else if (type_id == ED_GRAPHICBUTTON_ID_PASTE_CHANGE_PAGE)
+      ei->change_page[current_change_page] =
+       element_info[EL_INTERNAL_CLIPBOARD_CHANGE].change_page[0];
+
+    DrawPropertiesWindow();
+  }
 }
 
 static void HandleRadiobuttons(struct GadgetInfo *gi)
@@ -8312,7 +8525,9 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
 
   *checkbutton_info[type_id].value ^= TRUE;
 
-  if (type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID ||
+  if (type_id == ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID ||
+      type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID ||
+      type_id == ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH ||
       (((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST &&
         type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) ||
        (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&
@@ -8552,6 +8767,14 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       last_drawing_function = drawing_function;
       break;
 
+    case GADGET_ID_CUSTOM_COPY:
+      CopyCustomElement(properties_element, -1, id);
+      break;
+
+    case GADGET_ID_CUSTOM_PASTE:
+      CopyCustomElement(-1, properties_element, id);
+      break;
+
     case GADGET_ID_UNDO:
       if (undo_buffer_steps == 0)
       {
@@ -9022,7 +9245,7 @@ static void HandleDrawingAreaInfo(struct GadgetInfo *gi)
     else if (id == GADGET_ID_CUSTOM_CHANGE_TARGET)
       element = custom_element_change.target_element;
     else if (id == GADGET_ID_CUSTOM_CHANGE_CONTENT)
-      element = custom_element_change.content[sx][sy];
+      element = custom_element_change.target_content[sx][sy];
     else if (id == GADGET_ID_CUSTOM_CHANGE_TRIGGER)
       element = custom_element_change.trigger_element;
     else if (id == GADGET_ID_GROUP_CONTENT)