updated contact info in source file headers
[rocksndiamonds.git] / src / editor.c
index bf5640441d666ebba79d3877e9b5c47654808780..9ce3bd5b1369f4b622be84da24beb02da8af7865 100644 (file)
@@ -1,15 +1,13 @@
-/***********************************************************
-* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
-*----------------------------------------------------------*
-* (c) 1995-2006 Artsoft Entertainment                      *
-*               Holger Schemel                             *
-*               Detmolder Strasse 189                      *
-*               33604 Bielefeld                            *
-*               Germany                                    *
-*               e-mail: info@artsoft.org                   *
-*----------------------------------------------------------*
-* editor.c                                                 *
-***********************************************************/
+// ============================================================================
+// Rocks'n'Diamonds - McDuffin Strikes Back!
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+//                         Holger Schemel
+//                 info@artsoft.org
+//                 http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// editor.c
+// ============================================================================
 
 #include <math.h>
 
 */
 
 /* positions in the level editor */
+#if 1
+#define ED_WIN_MB_LEFT_XPOS            (editor.palette.element_left.x)
+#define ED_WIN_MB_LEFT_YPOS            (editor.palette.element_left.y)
+#define ED_WIN_MB_MIDDLE_XPOS          (editor.palette.element_middle.x)
+#define ED_WIN_MB_MIDDLE_YPOS          (editor.palette.element_middle.y)
+#define ED_WIN_MB_RIGHT_XPOS           (editor.palette.element_right.x)
+#define ED_WIN_MB_RIGHT_YPOS           (editor.palette.element_right.y)
+#else
 #define ED_WIN_MB_LEFT_XPOS            6
 #define ED_WIN_MB_LEFT_YPOS            258
 #define ED_WIN_MB_MIDDLE_XPOS          42
 #define ED_WIN_MB_MIDDLE_YPOS          ED_WIN_MB_LEFT_YPOS
 #define ED_WIN_MB_RIGHT_XPOS           78
 #define ED_WIN_MB_RIGHT_YPOS           ED_WIN_MB_LEFT_YPOS
+#endif
 
 /* values for the control window */
 #define ED_CTRL_NO_BUTTONS_GFX_XPOS    6
                                ED_NUM_CTRL4_BUTTONS)
 
 /* values for the element list */
+#if 1
+#define ED_ELEMENTLIST_XPOS            (editor.palette.x)
+#define ED_ELEMENTLIST_YPOS            (editor.palette.y)
+#define ED_ELEMENTLIST_XSIZE           20
+#define ED_ELEMENTLIST_YSIZE           20
+#else
 #define ED_ELEMENTLIST_XPOS            5
 #define ED_ELEMENTLIST_YPOS            30
 #define ED_ELEMENTLIST_XSIZE           20
 #define ED_ELEMENTLIST_YSIZE           20
+#endif
+#if 1
+// #define ED_ELEMENTLIST_BUTTONS_HORIZ        4
+// #define ED_ELEMENTLIST_BUTTONS_VERT 9
+#define ED_ELEMENTLIST_BUTTONS_HORIZ   (editor.palette.cols)
+#define ED_ELEMENTLIST_BUTTONS_VERT    (editor.palette.rows)
+#else
 #define ED_ELEMENTLIST_BUTTONS_HORIZ   4
 #define ED_ELEMENTLIST_BUTTONS_VERT    11
+#endif
 #define ED_NUM_ELEMENTLIST_BUTTONS     (ED_ELEMENTLIST_BUTTONS_HORIZ * \
                                         ED_ELEMENTLIST_BUTTONS_VERT)
 
 
 /* values for the settings windows */
 #define ED_LEVEL_SETTINGS_XSTART       (3 * MINI_TILEX / 2)
-#define ED_LEVEL_SETTINGS_YSTART       (5 * MINI_TILEY)
+#define ED_LEVEL_SETTINGS_YSTART       (7 * MINI_TILEY)
 
 #define ED_ELEMENT_SETTINGS_XSTART     (3 * MINI_TILEX / 2)
 #define ED_ELEMENT_SETTINGS_YSTART     (10 * MINI_TILEY)
 
 #define ED_SETTINGS_XOFFSET            ED_XOFFSET_CHECKBOX
 #define ED_SETTINGS_YOFFSET            (3 * MINI_TILEY / 2)
+#define ED_SETTINGS_TAB_XOFFSET                124
 
 #define ED_LEVEL_SETTINGS_XPOS(n)      (ED_LEVEL_SETTINGS_XSTART +     \
                                         (n) * ED_SETTINGS_XOFFSET)
 #define ED_ELEMENT_SETTINGS_YPOS(n)    (ED_ELEMENT_SETTINGS_YSTART +   \
                                         (n) * ED_SETTINGS_YOFFSET)
 
+#define ED_LEVEL_SETTINGS_TABS_XPOS(n) (ED_LEVEL_SETTINGS_XPOS(0) +    \
+                                       (n) * ED_SETTINGS_TAB_XOFFSET)
+#define ED_LEVEL_SETTINGS_TABS_YPOS(n) (ED_LEVEL_SETTINGS_YSTART -     \
+                                        3 * MINI_TILEY)
+
+#define ED_ELEMENT_SETTINGS_TABS_XPOS(n) (ED_ELEMENT_SETTINGS_XPOS(0) +        \
+                                        (n) * ED_SETTINGS_TAB_XOFFSET)
+#define ED_ELEMENT_SETTINGS_TABS_YPOS(n) (ED_ELEMENT_SETTINGS_YSTART - \
+                                        2 * MINI_TILEY)
+
 #define ED_SETTINGS1_YPOS              MINI_TILEY
 #define ED_SETTINGS2_XPOS              MINI_TILEX
 #define ED_SETTINGS2_YPOS              (ED_SETTINGS1_YPOS + 12 * TILEY - 2)
 #define ED_SCROLLBUTTON2_XSIZE         10
 #define ED_SCROLLBUTTON2_YSIZE         10
 
+#if 1
+#define ED_SCROLL2_UP_XPOS             (ED_ELEMENTLIST_XPOS +          \
+                                        ED_ELEMENTLIST_BUTTONS_HORIZ * \
+                                        ED_ELEMENTLIST_XSIZE)
+#define ED_SCROLL2_UP_YPOS             ED_ELEMENTLIST_YPOS
+#define ED_SCROLL2_DOWN_XPOS           ED_SCROLL2_UP_XPOS
+#define ED_SCROLL2_DOWN_YPOS           (ED_SCROLL2_UP_YPOS +           \
+                                        ED_ELEMENTLIST_BUTTONS_VERT *  \
+                                        ED_ELEMENTLIST_YSIZE -         \
+                                        ED_SCROLLBUTTON2_YSIZE)
+#define ED_SCROLL2_VERTICAL_XPOS       ED_SCROLL2_UP_XPOS
+#define ED_SCROLL2_VERTICAL_YPOS       (ED_SCROLL2_UP_YPOS +           \
+                                        ED_SCROLLBUTTON2_YSIZE)
+#define ED_SCROLL2_VERTICAL_XSIZE      ED_SCROLLBUTTON2_XSIZE
+#define ED_SCROLL2_VERTICAL_YSIZE      (ED_ELEMENTLIST_BUTTONS_VERT *  \
+                                        ED_ELEMENTLIST_YSIZE -         \
+                                        2 * ED_SCROLLBUTTON2_YSIZE)
+#else
 #define ED_SCROLL2_UP_XPOS             85
 #define ED_SCROLL2_UP_YPOS             30
 #define ED_SCROLL2_DOWN_XPOS           ED_SCROLL2_UP_XPOS
 #define ED_SCROLL2_VERTICAL_YSIZE      (ED_ELEMENTLIST_BUTTONS_VERT *  \
                                         ED_ELEMENTLIST_YSIZE -         \
                                         2 * ED_SCROLLBUTTON2_YSIZE)
+#endif
 
 /* values for checkbutton gadgets */
 #define ED_CHECKBUTTON_XSIZE           ED_BUTTON_COUNT_XSIZE
 #define GADGET_ID_LEVEL_TIMESCORE_DOWN (GADGET_ID_COUNTER_FIRST + 18)
 #define GADGET_ID_LEVEL_TIMESCORE_TEXT (GADGET_ID_COUNTER_FIRST + 19)
 #define GADGET_ID_LEVEL_TIMESCORE_UP   (GADGET_ID_COUNTER_FIRST + 20)
-#define GADGET_ID_ELEMENT_VALUE1_DOWN  (GADGET_ID_COUNTER_FIRST + 21)
-#define GADGET_ID_ELEMENT_VALUE1_TEXT  (GADGET_ID_COUNTER_FIRST + 22)
-#define GADGET_ID_ELEMENT_VALUE1_UP    (GADGET_ID_COUNTER_FIRST + 23)
-#define GADGET_ID_ELEMENT_VALUE2_DOWN  (GADGET_ID_COUNTER_FIRST + 24)
-#define GADGET_ID_ELEMENT_VALUE2_TEXT  (GADGET_ID_COUNTER_FIRST + 25)
-#define GADGET_ID_ELEMENT_VALUE2_UP    (GADGET_ID_COUNTER_FIRST + 26)
-#define GADGET_ID_ELEMENT_VALUE3_DOWN  (GADGET_ID_COUNTER_FIRST + 27)
-#define GADGET_ID_ELEMENT_VALUE3_TEXT  (GADGET_ID_COUNTER_FIRST + 28)
-#define GADGET_ID_ELEMENT_VALUE3_UP    (GADGET_ID_COUNTER_FIRST + 29)
-#define GADGET_ID_ELEMENT_VALUE4_DOWN  (GADGET_ID_COUNTER_FIRST + 30)
-#define GADGET_ID_ELEMENT_VALUE4_TEXT  (GADGET_ID_COUNTER_FIRST + 31)
-#define GADGET_ID_ELEMENT_VALUE4_UP    (GADGET_ID_COUNTER_FIRST + 32)
-#define GADGET_ID_YAMYAM_CONTENT_DOWN  (GADGET_ID_COUNTER_FIRST + 33)
-#define GADGET_ID_YAMYAM_CONTENT_TEXT  (GADGET_ID_COUNTER_FIRST + 34)
-#define GADGET_ID_YAMYAM_CONTENT_UP    (GADGET_ID_COUNTER_FIRST + 35)
-#define GADGET_ID_BALL_CONTENT_DOWN    (GADGET_ID_COUNTER_FIRST + 36)
-#define GADGET_ID_BALL_CONTENT_TEXT    (GADGET_ID_COUNTER_FIRST + 37)
-#define GADGET_ID_BALL_CONTENT_UP      (GADGET_ID_COUNTER_FIRST + 38)
-#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 39)
-#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 40)
-#define GADGET_ID_ANDROID_CONTENT_UP   (GADGET_ID_COUNTER_FIRST + 41)
-#define GADGET_ID_ENVELOPE_XSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 42)
-#define GADGET_ID_ENVELOPE_XSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 43)
-#define GADGET_ID_ENVELOPE_XSIZE_UP    (GADGET_ID_COUNTER_FIRST + 44)
-#define GADGET_ID_ENVELOPE_YSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 45)
-#define GADGET_ID_ENVELOPE_YSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 46)
-#define GADGET_ID_ENVELOPE_YSIZE_UP    (GADGET_ID_COUNTER_FIRST + 47)
-#define GADGET_ID_CUSTOM_SCORE_DOWN    (GADGET_ID_COUNTER_FIRST + 48)
-#define GADGET_ID_CUSTOM_SCORE_TEXT    (GADGET_ID_COUNTER_FIRST + 49)
-#define GADGET_ID_CUSTOM_SCORE_UP      (GADGET_ID_COUNTER_FIRST + 50)
-#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 51)
-#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 52)
-#define GADGET_ID_CUSTOM_GEMCOUNT_UP   (GADGET_ID_COUNTER_FIRST + 53)
-#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 54)
-#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 55)
-#define GADGET_ID_CUSTOM_VALUE_FIX_UP  (GADGET_ID_COUNTER_FIRST + 56)
-#define GADGET_ID_CUSTOM_VALUE_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 57)
-#define GADGET_ID_CUSTOM_VALUE_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 58)
-#define GADGET_ID_CUSTOM_VALUE_RND_UP  (GADGET_ID_COUNTER_FIRST + 59)
-#define GADGET_ID_PUSH_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 60)
-#define GADGET_ID_PUSH_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 61)
-#define GADGET_ID_PUSH_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 62)
-#define GADGET_ID_PUSH_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 63)
-#define GADGET_ID_PUSH_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 64)
-#define GADGET_ID_PUSH_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 65)
-#define GADGET_ID_DROP_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 66)
-#define GADGET_ID_DROP_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 67)
-#define GADGET_ID_DROP_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 68)
-#define GADGET_ID_DROP_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 69)
-#define GADGET_ID_DROP_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 70)
-#define GADGET_ID_DROP_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 71)
-#define GADGET_ID_MOVE_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 72)
-#define GADGET_ID_MOVE_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 73)
-#define GADGET_ID_MOVE_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 74)
-#define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 75)
-#define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 76)
-#define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 77)
-#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 78)
-#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 79)
-#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 80)
-#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 81)
-#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 82)
-#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 83)
-#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 84)
-#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 85)
-#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 86)
-#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 87)
-#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 88)
-#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 89)
-#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 90)
-#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 91)
-#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 92)
-#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 93)
-#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 94)
-#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 95)
+#define GADGET_ID_LEVEL_RANDOM_SEED_DOWN (GADGET_ID_COUNTER_FIRST + 21)
+#define GADGET_ID_LEVEL_RANDOM_SEED_TEXT (GADGET_ID_COUNTER_FIRST + 22)
+#define GADGET_ID_LEVEL_RANDOM_SEED_UP (GADGET_ID_COUNTER_FIRST + 23)
+#define GADGET_ID_ELEMENT_VALUE1_DOWN  (GADGET_ID_COUNTER_FIRST + 24)
+#define GADGET_ID_ELEMENT_VALUE1_TEXT  (GADGET_ID_COUNTER_FIRST + 25)
+#define GADGET_ID_ELEMENT_VALUE1_UP    (GADGET_ID_COUNTER_FIRST + 26)
+#define GADGET_ID_ELEMENT_VALUE2_DOWN  (GADGET_ID_COUNTER_FIRST + 27)
+#define GADGET_ID_ELEMENT_VALUE2_TEXT  (GADGET_ID_COUNTER_FIRST + 28)
+#define GADGET_ID_ELEMENT_VALUE2_UP    (GADGET_ID_COUNTER_FIRST + 29)
+#define GADGET_ID_ELEMENT_VALUE3_DOWN  (GADGET_ID_COUNTER_FIRST + 30)
+#define GADGET_ID_ELEMENT_VALUE3_TEXT  (GADGET_ID_COUNTER_FIRST + 31)
+#define GADGET_ID_ELEMENT_VALUE3_UP    (GADGET_ID_COUNTER_FIRST + 32)
+#define GADGET_ID_ELEMENT_VALUE4_DOWN  (GADGET_ID_COUNTER_FIRST + 33)
+#define GADGET_ID_ELEMENT_VALUE4_TEXT  (GADGET_ID_COUNTER_FIRST + 34)
+#define GADGET_ID_ELEMENT_VALUE4_UP    (GADGET_ID_COUNTER_FIRST + 35)
+#define GADGET_ID_YAMYAM_CONTENT_DOWN  (GADGET_ID_COUNTER_FIRST + 36)
+#define GADGET_ID_YAMYAM_CONTENT_TEXT  (GADGET_ID_COUNTER_FIRST + 37)
+#define GADGET_ID_YAMYAM_CONTENT_UP    (GADGET_ID_COUNTER_FIRST + 38)
+#define GADGET_ID_BALL_CONTENT_DOWN    (GADGET_ID_COUNTER_FIRST + 39)
+#define GADGET_ID_BALL_CONTENT_TEXT    (GADGET_ID_COUNTER_FIRST + 40)
+#define GADGET_ID_BALL_CONTENT_UP      (GADGET_ID_COUNTER_FIRST + 41)
+#define GADGET_ID_ANDROID_CONTENT_DOWN (GADGET_ID_COUNTER_FIRST + 42)
+#define GADGET_ID_ANDROID_CONTENT_TEXT (GADGET_ID_COUNTER_FIRST + 43)
+#define GADGET_ID_ANDROID_CONTENT_UP   (GADGET_ID_COUNTER_FIRST + 44)
+#define GADGET_ID_ENVELOPE_XSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 45)
+#define GADGET_ID_ENVELOPE_XSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 46)
+#define GADGET_ID_ENVELOPE_XSIZE_UP    (GADGET_ID_COUNTER_FIRST + 47)
+#define GADGET_ID_ENVELOPE_YSIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 48)
+#define GADGET_ID_ENVELOPE_YSIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 49)
+#define GADGET_ID_ENVELOPE_YSIZE_UP    (GADGET_ID_COUNTER_FIRST + 50)
+#define GADGET_ID_INVENTORY_SIZE_DOWN  (GADGET_ID_COUNTER_FIRST + 51)
+#define GADGET_ID_INVENTORY_SIZE_TEXT  (GADGET_ID_COUNTER_FIRST + 52)
+#define GADGET_ID_INVENTORY_SIZE_UP    (GADGET_ID_COUNTER_FIRST + 53)
+#define GADGET_ID_CUSTOM_SCORE_DOWN    (GADGET_ID_COUNTER_FIRST + 54)
+#define GADGET_ID_CUSTOM_SCORE_TEXT    (GADGET_ID_COUNTER_FIRST + 55)
+#define GADGET_ID_CUSTOM_SCORE_UP      (GADGET_ID_COUNTER_FIRST + 56)
+#define GADGET_ID_CUSTOM_GEMCOUNT_DOWN (GADGET_ID_COUNTER_FIRST + 57)
+#define GADGET_ID_CUSTOM_GEMCOUNT_TEXT (GADGET_ID_COUNTER_FIRST + 58)
+#define GADGET_ID_CUSTOM_GEMCOUNT_UP   (GADGET_ID_COUNTER_FIRST + 59)
+#define GADGET_ID_CUSTOM_VALUE_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 60)
+#define GADGET_ID_CUSTOM_VALUE_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 61)
+#define GADGET_ID_CUSTOM_VALUE_FIX_UP  (GADGET_ID_COUNTER_FIRST + 62)
+#define GADGET_ID_CUSTOM_VALUE_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 63)
+#define GADGET_ID_CUSTOM_VALUE_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 64)
+#define GADGET_ID_CUSTOM_VALUE_RND_UP  (GADGET_ID_COUNTER_FIRST + 65)
+#define GADGET_ID_PUSH_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 66)
+#define GADGET_ID_PUSH_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 67)
+#define GADGET_ID_PUSH_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 68)
+#define GADGET_ID_PUSH_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 69)
+#define GADGET_ID_PUSH_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 70)
+#define GADGET_ID_PUSH_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 71)
+#define GADGET_ID_DROP_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 72)
+#define GADGET_ID_DROP_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 73)
+#define GADGET_ID_DROP_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 74)
+#define GADGET_ID_DROP_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 75)
+#define GADGET_ID_DROP_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 76)
+#define GADGET_ID_DROP_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 77)
+#define GADGET_ID_MOVE_DELAY_FIX_DOWN  (GADGET_ID_COUNTER_FIRST + 78)
+#define GADGET_ID_MOVE_DELAY_FIX_TEXT  (GADGET_ID_COUNTER_FIRST + 79)
+#define GADGET_ID_MOVE_DELAY_FIX_UP    (GADGET_ID_COUNTER_FIRST + 80)
+#define GADGET_ID_MOVE_DELAY_RND_DOWN  (GADGET_ID_COUNTER_FIRST + 81)
+#define GADGET_ID_MOVE_DELAY_RND_TEXT  (GADGET_ID_COUNTER_FIRST + 82)
+#define GADGET_ID_MOVE_DELAY_RND_UP    (GADGET_ID_COUNTER_FIRST + 83)
+#define GADGET_ID_EXPLOSION_DELAY_DOWN (GADGET_ID_COUNTER_FIRST + 84)
+#define GADGET_ID_EXPLOSION_DELAY_TEXT (GADGET_ID_COUNTER_FIRST + 85)
+#define GADGET_ID_EXPLOSION_DELAY_UP   (GADGET_ID_COUNTER_FIRST + 86)
+#define GADGET_ID_IGNITION_DELAY_DOWN  (GADGET_ID_COUNTER_FIRST + 87)
+#define GADGET_ID_IGNITION_DELAY_TEXT  (GADGET_ID_COUNTER_FIRST + 88)
+#define GADGET_ID_IGNITION_DELAY_UP    (GADGET_ID_COUNTER_FIRST + 89)
+#define GADGET_ID_CHANGE_DELAY_FIX_DOWN        (GADGET_ID_COUNTER_FIRST + 90)
+#define GADGET_ID_CHANGE_DELAY_FIX_TEXT        (GADGET_ID_COUNTER_FIRST + 91)
+#define GADGET_ID_CHANGE_DELAY_FIX_UP  (GADGET_ID_COUNTER_FIRST + 92)
+#define GADGET_ID_CHANGE_DELAY_RND_DOWN        (GADGET_ID_COUNTER_FIRST + 93)
+#define GADGET_ID_CHANGE_DELAY_RND_TEXT        (GADGET_ID_COUNTER_FIRST + 94)
+#define GADGET_ID_CHANGE_DELAY_RND_UP  (GADGET_ID_COUNTER_FIRST + 95)
+#define GADGET_ID_CHANGE_CONT_RND_DOWN (GADGET_ID_COUNTER_FIRST + 96)
+#define GADGET_ID_CHANGE_CONT_RND_TEXT (GADGET_ID_COUNTER_FIRST + 97)
+#define GADGET_ID_CHANGE_CONT_RND_UP   (GADGET_ID_COUNTER_FIRST + 98)
+#define GADGET_ID_GROUP_CONTENT_DOWN   (GADGET_ID_COUNTER_FIRST + 99)
+#define GADGET_ID_GROUP_CONTENT_TEXT   (GADGET_ID_COUNTER_FIRST + 100)
+#define GADGET_ID_GROUP_CONTENT_UP     (GADGET_ID_COUNTER_FIRST + 101)
 
 /* drawing area identifiers */
-#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 96)
+#define GADGET_ID_DRAWING_AREA_FIRST   (GADGET_ID_COUNTER_FIRST + 102)
 
 #define GADGET_ID_DRAWING_LEVEL                (GADGET_ID_DRAWING_AREA_FIRST + 0)
 #define GADGET_ID_YAMYAM_CONTENT_0     (GADGET_ID_DRAWING_AREA_FIRST + 1)
 #define GADGET_ID_START_ELEMENT                (GADGET_ID_DRAWING_AREA_FIRST + 19)
 #define GADGET_ID_ARTWORK_ELEMENT      (GADGET_ID_DRAWING_AREA_FIRST + 20)
 #define GADGET_ID_EXPLOSION_ELEMENT    (GADGET_ID_DRAWING_AREA_FIRST + 21)
-#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 22)
-#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 23)
-#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 24)
-#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 25)
-#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 26)
-#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 27)
-#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 28)
-#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 29)
-#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 30)
+#define GADGET_ID_INVENTORY_CONTENT    (GADGET_ID_DRAWING_AREA_FIRST + 22)
+#define GADGET_ID_CUSTOM_GRAPHIC       (GADGET_ID_DRAWING_AREA_FIRST + 23)
+#define GADGET_ID_CUSTOM_CONTENT       (GADGET_ID_DRAWING_AREA_FIRST + 24)
+#define GADGET_ID_CUSTOM_MOVE_ENTER    (GADGET_ID_DRAWING_AREA_FIRST + 25)
+#define GADGET_ID_CUSTOM_MOVE_LEAVE    (GADGET_ID_DRAWING_AREA_FIRST + 26)
+#define GADGET_ID_CUSTOM_CHANGE_TARGET (GADGET_ID_DRAWING_AREA_FIRST + 27)
+#define GADGET_ID_CUSTOM_CHANGE_CONTENT        (GADGET_ID_DRAWING_AREA_FIRST + 28)
+#define GADGET_ID_CUSTOM_CHANGE_TRIGGER        (GADGET_ID_DRAWING_AREA_FIRST + 29)
+#define GADGET_ID_CUSTOM_CHANGE_ACTION (GADGET_ID_DRAWING_AREA_FIRST + 30)
+#define GADGET_ID_GROUP_CONTENT                (GADGET_ID_DRAWING_AREA_FIRST + 31)
+#define GADGET_ID_RANDOM_BACKGROUND    (GADGET_ID_DRAWING_AREA_FIRST + 32)
 
 /* text input identifiers */
-#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 31)
+#define GADGET_ID_TEXT_INPUT_FIRST     (GADGET_ID_DRAWING_AREA_FIRST + 33)
 
 #define GADGET_ID_LEVEL_NAME           (GADGET_ID_TEXT_INPUT_FIRST + 0)
 #define GADGET_ID_LEVEL_AUTHOR         (GADGET_ID_TEXT_INPUT_FIRST + 1)
 /* textbutton identifiers */
 #define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 29)
 
-#define GADGET_ID_PROPERTIES_INFO      (GADGET_ID_TEXTBUTTON_FIRST + 0)
-#define GADGET_ID_PROPERTIES_CONFIG    (GADGET_ID_TEXTBUTTON_FIRST + 1)
-#define GADGET_ID_PROPERTIES_CONFIG_1  (GADGET_ID_TEXTBUTTON_FIRST + 2)
-#define GADGET_ID_PROPERTIES_CONFIG_2  (GADGET_ID_TEXTBUTTON_FIRST + 3)
-#define GADGET_ID_PROPERTIES_CHANGE    (GADGET_ID_TEXTBUTTON_FIRST + 4)
-#define GADGET_ID_SAVE_AS_TEMPLATE     (GADGET_ID_TEXTBUTTON_FIRST + 5)
-#define GADGET_ID_ADD_CHANGE_PAGE      (GADGET_ID_TEXTBUTTON_FIRST + 6)
-#define GADGET_ID_DEL_CHANGE_PAGE      (GADGET_ID_TEXTBUTTON_FIRST + 7)
+#define GADGET_ID_LEVELINFO_LEVEL      (GADGET_ID_TEXTBUTTON_FIRST + 0)
+#define GADGET_ID_LEVELINFO_EDITOR     (GADGET_ID_TEXTBUTTON_FIRST + 1)
+#define GADGET_ID_PROPERTIES_INFO      (GADGET_ID_TEXTBUTTON_FIRST + 2)
+#define GADGET_ID_PROPERTIES_CONFIG    (GADGET_ID_TEXTBUTTON_FIRST + 3)
+#define GADGET_ID_PROPERTIES_CONFIG_1  (GADGET_ID_TEXTBUTTON_FIRST + 4)
+#define GADGET_ID_PROPERTIES_CONFIG_2  (GADGET_ID_TEXTBUTTON_FIRST + 5)
+#define GADGET_ID_PROPERTIES_CHANGE    (GADGET_ID_TEXTBUTTON_FIRST + 6)
+#define GADGET_ID_SAVE_AS_TEMPLATE     (GADGET_ID_TEXTBUTTON_FIRST + 7)
+#define GADGET_ID_ADD_CHANGE_PAGE      (GADGET_ID_TEXTBUTTON_FIRST + 8)
+#define GADGET_ID_DEL_CHANGE_PAGE      (GADGET_ID_TEXTBUTTON_FIRST + 9)
 
 /* graphicbutton identifiers */
-#define GADGET_ID_GRAPHICBUTTON_FIRST  (GADGET_ID_TEXTBUTTON_FIRST + 8)
+#define GADGET_ID_GRAPHICBUTTON_FIRST  (GADGET_ID_TEXTBUTTON_FIRST + 10)
 
 #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_RANDOM_RESTRICTED    (GADGET_ID_CHECKBUTTON_FIRST + 2)
 #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_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 29)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 30)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 31)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 32)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 33)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 34)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 38)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 39)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 40)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 41)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 42)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 43)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 44)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 45)
-#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 46)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 47)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 48)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 49)
+#define GADGET_ID_EM_EXPLODES_BY_FIRE  (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_AUTO_EXIT_SOKOBAN    (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_CONTINUOUS_SNAPPING  (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_BLOCK_SNAP_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_INSTANT_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_SHIFTED_RELOCATION   (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_USE_START_ELEMENT    (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_USE_ARTWORK_ELEMENT  (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_USE_EXPLOSION_ELEMENT        (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_INITIAL_GRAVITY      (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_USE_INITIAL_INVENTORY        (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CAN_PASS_TO_WALKABLE (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CAN_FALL_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_DONT_COLLIDE_WITH    (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_ENVELOPE_AUTOWRAP    (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_ENVELOPE_CENTERED    (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CUSTOM_INDESTRUCTIBLE        (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CUSTOM_CAN_EXPLODE   (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 31)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 32)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 33)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 34)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 35)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 40)
+#define GADGET_ID_CUSTOM_GRAV_REACHABLE        (GADGET_ID_CHECKBUTTON_FIRST + 41)
+#define GADGET_ID_CUSTOM_USE_LAST_VALUE        (GADGET_ID_CHECKBUTTON_FIRST + 42)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 43)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 44)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 45)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 46)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 47)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 48)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 49)
+#define GADGET_ID_CHANGE_HAS_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 50)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 51)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 52)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 53)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 50)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 54)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_COUNTER_ID_LEVEL_GEMSLIMIT  3
 #define ED_COUNTER_ID_LEVEL_TIMELIMIT  4
 #define ED_COUNTER_ID_LEVEL_TIMESCORE  5
-#define ED_COUNTER_ID_LEVEL_RANDOM     6
-#define ED_COUNTER_ID_ELEMENT_VALUE1   7
-#define ED_COUNTER_ID_ELEMENT_VALUE2   8
-#define ED_COUNTER_ID_ELEMENT_VALUE3   9
-#define ED_COUNTER_ID_ELEMENT_VALUE4   10
-#define ED_COUNTER_ID_YAMYAM_CONTENT   11
-#define ED_COUNTER_ID_BALL_CONTENT     12
-#define ED_COUNTER_ID_ANDROID_CONTENT  13
-#define ED_COUNTER_ID_ENVELOPE_XSIZE   14
-#define ED_COUNTER_ID_ENVELOPE_YSIZE   15
-#define ED_COUNTER_ID_CUSTOM_SCORE     16
-#define ED_COUNTER_ID_CUSTOM_GEMCOUNT  17
-#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 18
-#define ED_COUNTER_ID_CUSTOM_VALUE_RND 19
-#define ED_COUNTER_ID_PUSH_DELAY_FIX   20
-#define ED_COUNTER_ID_PUSH_DELAY_RND   21
-#define ED_COUNTER_ID_DROP_DELAY_FIX   22
-#define ED_COUNTER_ID_DROP_DELAY_RND   23
-#define ED_COUNTER_ID_MOVE_DELAY_FIX   24
-#define ED_COUNTER_ID_MOVE_DELAY_RND   25
-#define ED_COUNTER_ID_EXPLOSION_DELAY  26
-#define ED_COUNTER_ID_IGNITION_DELAY   27
-#define ED_COUNTER_ID_GROUP_CONTENT    28
-#define ED_COUNTER_ID_CHANGE_DELAY_FIX 29
-#define ED_COUNTER_ID_CHANGE_DELAY_RND 30
-#define ED_COUNTER_ID_CHANGE_CONT_RND  31
-
-#define ED_NUM_COUNTERBUTTONS          32
+#define ED_COUNTER_ID_LEVEL_RANDOM_SEED        6
+#define ED_COUNTER_ID_LEVEL_RANDOM     7
+#define ED_COUNTER_ID_ELEMENT_VALUE1   8
+#define ED_COUNTER_ID_ELEMENT_VALUE2   9
+#define ED_COUNTER_ID_ELEMENT_VALUE3   10
+#define ED_COUNTER_ID_ELEMENT_VALUE4   11
+#define ED_COUNTER_ID_YAMYAM_CONTENT   12
+#define ED_COUNTER_ID_BALL_CONTENT     13
+#define ED_COUNTER_ID_ANDROID_CONTENT  14
+#define ED_COUNTER_ID_ENVELOPE_XSIZE   15
+#define ED_COUNTER_ID_ENVELOPE_YSIZE   16
+#define ED_COUNTER_ID_INVENTORY_SIZE   17
+#define ED_COUNTER_ID_CUSTOM_SCORE     18
+#define ED_COUNTER_ID_CUSTOM_GEMCOUNT  19
+#define ED_COUNTER_ID_CUSTOM_VALUE_FIX 20
+#define ED_COUNTER_ID_CUSTOM_VALUE_RND 21
+#define ED_COUNTER_ID_PUSH_DELAY_FIX   22
+#define ED_COUNTER_ID_PUSH_DELAY_RND   23
+#define ED_COUNTER_ID_DROP_DELAY_FIX   24
+#define ED_COUNTER_ID_DROP_DELAY_RND   25
+#define ED_COUNTER_ID_MOVE_DELAY_FIX   26
+#define ED_COUNTER_ID_MOVE_DELAY_RND   27
+#define ED_COUNTER_ID_EXPLOSION_DELAY  28
+#define ED_COUNTER_ID_IGNITION_DELAY   29
+#define ED_COUNTER_ID_GROUP_CONTENT    30
+#define ED_COUNTER_ID_CHANGE_DELAY_FIX 31
+#define ED_COUNTER_ID_CHANGE_DELAY_RND 32
+#define ED_COUNTER_ID_CHANGE_CONT_RND  33
+
+#define ED_NUM_COUNTERBUTTONS          34
 
 #define ED_COUNTER_ID_LEVEL_FIRST      ED_COUNTER_ID_LEVEL_XSIZE
-#define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM
+#define ED_COUNTER_ID_LEVEL_LAST       ED_COUNTER_ID_LEVEL_RANDOM_SEED
+#define ED_COUNTER_ID_EDITOR_FIRST     ED_COUNTER_ID_LEVEL_RANDOM
+#define ED_COUNTER_ID_EDITOR_LAST      ED_COUNTER_ID_LEVEL_RANDOM
 
 #define ED_COUNTER_ID_CUSTOM1_FIRST    ED_COUNTER_ID_CUSTOM_SCORE
 #define ED_COUNTER_ID_CUSTOM1_LAST     ED_COUNTER_ID_DROP_DELAY_RND
 #define ED_SELECTBOX_ID_CHANGE_LAST    ED_SELECTBOX_ID_SELECT_CHANGE_PAGE
 
 /* values for textbutton gadgets */
-#define ED_TEXTBUTTON_ID_PROPERTIES_INFO       0
-#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG     1
-#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1   2
-#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2   3
-#define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE     4
-#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE      5
-#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE       6
-#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE       7
-
-#define ED_NUM_TEXTBUTTONS                     8
+#define ED_TEXTBUTTON_ID_LEVELINFO_LEVEL       0
+#define ED_TEXTBUTTON_ID_LEVELINFO_EDITOR      1
+#define ED_TEXTBUTTON_ID_PROPERTIES_INFO       2
+#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG     3
+#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_1   4
+#define ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2   5
+#define ED_TEXTBUTTON_ID_PROPERTIES_CHANGE     6
+#define ED_TEXTBUTTON_ID_SAVE_AS_TEMPLATE      7
+#define ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE       8
+#define ED_TEXTBUTTON_ID_DEL_CHANGE_PAGE       9
+
+#define ED_NUM_TEXTBUTTONS                     10
+
+#define ED_TEXTBUTTON_ID_LEVELINFO_FIRST ED_TEXTBUTTON_ID_LEVELINFO_LEVEL
+#define ED_TEXTBUTTON_ID_LEVELINFO_LAST  ED_TEXTBUTTON_ID_LEVELINFO_EDITOR
 
 #define ED_TEXTBUTTON_ID_PROPERTIES_FIRST ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_TEXTBUTTON_ID_PROPERTIES_LAST  ED_TEXTBUTTON_ID_PROPERTIES_CHANGE
 #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_INITIAL_GRAVITY      16
-#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 17
-#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   18
-#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   19
-#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    20
-#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    21
-#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    22
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   23
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  24
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    25
-#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        26
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        27
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        28
-#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        29
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      30
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      31
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     32
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      33
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                34
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   35
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  36
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 37
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        38
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    39
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         40
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 41
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  42
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 43
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   44
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 45
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    46
-#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    47
-
-#define ED_NUM_CHECKBUTTONS                    48
-
-#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_EM_EXPLODES_BY_FIRE  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_AUTO_EXIT_SOKOBAN    9
+#define ED_CHECKBUTTON_ID_CONTINUOUS_SNAPPING  10
+#define ED_CHECKBUTTON_ID_BLOCK_SNAP_FIELD     11
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     12
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  13
+#define ED_CHECKBUTTON_ID_INSTANT_RELOCATION   14
+#define ED_CHECKBUTTON_ID_SHIFTED_RELOCATION   15
+#define ED_CHECKBUTTON_ID_USE_START_ELEMENT    16
+#define ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT  17
+#define ED_CHECKBUTTON_ID_USE_EXPLOSION_ELEMENT        18
+#define ED_CHECKBUTTON_ID_INITIAL_GRAVITY      19
+#define ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY        20
+#define ED_CHECKBUTTON_ID_CAN_PASS_TO_WALKABLE 21
+#define ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID   22
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   23
+#define ED_CHECKBUTTON_ID_DONT_COLLIDE_WITH    24
+#define ED_CHECKBUTTON_ID_ENVELOPE_AUTOWRAP    25
+#define ED_CHECKBUTTON_ID_ENVELOPE_CENTERED    26
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   27
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  28
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    29
+#define ED_CHECKBUTTON_ID_CUSTOM_GRAV_REACHABLE        30
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_LAST_VALUE        31
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        32
+#define ED_CHECKBUTTON_ID_CUSTOM_INDESTRUCTIBLE        33
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      34
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      35
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     36
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      37
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                38
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_EXPLODE   39
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  40
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 41
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        42
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    43
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         44
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 45
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  46
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 47
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   48
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 49
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    50
+#define ED_CHECKBUTTON_ID_CHANGE_HAS_ACTION    51
+
+#define ED_NUM_CHECKBUTTONS                    52
+
+#define ED_CHECKBUTTON_ID_EDITOR_FIRST ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
+#define ED_CHECKBUTTON_ID_EDITOR_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_INDESTRUCTIBLE
 
 #define ED_NUM_RADIOBUTTONS            2
 
-#define ED_RADIOBUTTON_ID_LEVEL_FIRST  ED_RADIOBUTTON_ID_PERCENTAGE
-#define ED_RADIOBUTTON_ID_LEVEL_LAST   ED_RADIOBUTTON_ID_QUANTITY
+#define ED_RADIOBUTTON_ID_EDITOR_FIRST ED_RADIOBUTTON_ID_PERCENTAGE
+#define ED_RADIOBUTTON_ID_EDITOR_LAST  ED_RADIOBUTTON_ID_QUANTITY
 
 /* values for drawing area gadgets */
 #define ED_DRAWING_ID_DRAWING_LEVEL            0
 #define ED_DRAWING_ID_START_ELEMENT            19
 #define ED_DRAWING_ID_ARTWORK_ELEMENT          20
 #define ED_DRAWING_ID_EXPLOSION_ELEMENT                21
-#define ED_DRAWING_ID_CUSTOM_GRAPHIC           22
-#define ED_DRAWING_ID_CUSTOM_CONTENT           23
-#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                24
-#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                25
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     26
-#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    27
-#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    28
-#define ED_DRAWING_ID_GROUP_CONTENT            29
-#define ED_DRAWING_ID_RANDOM_BACKGROUND                30
+#define ED_DRAWING_ID_INVENTORY_CONTENT                22
+#define ED_DRAWING_ID_CUSTOM_GRAPHIC           23
+#define ED_DRAWING_ID_CUSTOM_CONTENT           24
+#define ED_DRAWING_ID_CUSTOM_MOVE_ENTER                25
+#define ED_DRAWING_ID_CUSTOM_MOVE_LEAVE                26
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TARGET     27
+#define ED_DRAWING_ID_CUSTOM_CHANGE_CONTENT    28
+#define ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER    29
+#define ED_DRAWING_ID_CUSTOM_CHANGE_ACTION     30
+#define ED_DRAWING_ID_GROUP_CONTENT            31
+#define ED_DRAWING_ID_RANDOM_BACKGROUND                32
 
-#define ED_NUM_DRAWING_AREAS                   31
+#define ED_NUM_DRAWING_AREAS                   33
 
 
 /*
 #define ED_MODE_INFO                   1
 #define ED_MODE_PROPERTIES             2
 
+/* sub-screens in the global settings section */
+#define ED_MODE_LEVELINFO_LEVEL                ED_TEXTBUTTON_ID_LEVELINFO_LEVEL
+#define ED_MODE_LEVELINFO_EDITOR       ED_TEXTBUTTON_ID_LEVELINFO_EDITOR
+
 /* sub-screens in the element properties section */
 #define ED_MODE_PROPERTIES_INFO                ED_TEXTBUTTON_ID_PROPERTIES_INFO
 #define ED_MODE_PROPERTIES_CONFIG      ED_TEXTBUTTON_ID_PROPERTIES_CONFIG
 
 /* 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
 #define RANDOM_USE_QUANTITY            1
 
 /* maximal size of level editor drawing area */
+#if NEW_TILESIZE
+#define MAX_ED_FIELDX          (SCR_FIELDX)
+#define MAX_ED_FIELDY          (SCR_FIELDY - 1)
+#else
 #define MAX_ED_FIELDX          (2 * SCR_FIELDX)
 #define MAX_ED_FIELDY          (2 * SCR_FIELDY - 1)
+#endif
 
 
 /*
@@ -964,7 +1053,7 @@ static struct
   { ',',       "pick drawing element"                  },
 
   { 'U',       "undo last operation"                   },
-  { 'I',       "level properties"                      },
+  { 'I',       "properties of level"                   },
   { 'S',       "save level"                            },
   { 'C',       "clear level"                           },
   { 'T',       "test level"                            },
@@ -1003,7 +1092,11 @@ static struct
   /* ---------- current level number --------------------------------------- */
 
   {
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     DX + 5 - SX,                       DY + 3 - SY,
+#endif
     1,                                 100,
     GADGET_ID_SELECT_LEVEL_DOWN,       GADGET_ID_SELECT_LEVEL_UP,
     GADGET_ID_SELECT_LEVEL_TEXT,       GADGET_ID_NONE,
@@ -1035,7 +1128,7 @@ static struct
     GADGET_ID_LEVEL_GEMSLIMIT_DOWN,    GADGET_ID_LEVEL_GEMSLIMIT_UP,
     GADGET_ID_LEVEL_GEMSLIMIT_TEXT,    GADGET_ID_NONE,
     &level.gems_needed,
-    NULL, "number of gems to collect:",        NULL
+    NULL,                              "number of gems to collect:", NULL
   },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
@@ -1047,14 +1140,22 @@ static struct
   },
   {
     ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
-    0,                                 255,
+    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],
     "score for each second/step left:",        NULL, NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_COUNTER2_YPOS(8),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
+    0,                                 9999,
+    GADGET_ID_LEVEL_RANDOM_SEED_DOWN,  GADGET_ID_LEVEL_RANDOM_SEED_UP,
+    GADGET_ID_LEVEL_RANDOM_SEED_TEXT,  GADGET_ID_NONE,
+    &level.random_seed,
+    NULL,                              "random seed:", "(0 => random)"
+  },
+  {
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(0),
     1,                                 100,
     GADGET_ID_LEVEL_RANDOM_DOWN,       GADGET_ID_LEVEL_RANDOM_UP,
     GADGET_ID_LEVEL_RANDOM_TEXT,       GADGET_ID_NONE,
@@ -1136,6 +1237,14 @@ static struct
     NULL,                              /* will be set when used */
     NULL,                              " ", "height",
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
+    MIN_INITIAL_INVENTORY_SIZE,                MAX_INITIAL_INVENTORY_SIZE,
+    GADGET_ID_INVENTORY_SIZE_DOWN,     GADGET_ID_INVENTORY_SIZE_UP,
+    GADGET_ID_INVENTORY_SIZE_TEXT,     GADGET_ID_NONE,
+    &level.initial_inventory_size[0],
+    NULL,                              NULL, "number of inventory elements"
+  },
 
   /* ---------- element settings: configure 1 (custom elements) ------------ */
 
@@ -1173,7 +1282,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,
@@ -1181,7 +1290,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,
@@ -1189,7 +1298,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,
@@ -1197,7 +1306,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,
@@ -1224,7 +1333,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,
@@ -1232,7 +1341,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,
@@ -1340,6 +1449,7 @@ static struct ValueTextInfo options_game_engine_type[] =
 {
   { GAME_ENGINE_TYPE_RND,      "Rocks'n'Diamonds"              },
   { GAME_ENGINE_TYPE_EM,       "Emerald Mine"                  },
+  { GAME_ENGINE_TYPE_SP,       "Supaplex"                      },
 
   { -1,                                NULL                            }
 };
@@ -1513,6 +1623,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                            }
@@ -1671,15 +1782,16 @@ static struct ValueTextInfo options_action_type[] =
 {
   { CA_NO_ACTION,              "no action"                     },
   { CA_UNDEFINED,              " "                             },
-  { CA_HEADLINE_LEVEL_ACTIONS, "[level actions]"               },
+  { CA_HEADLINE_LEVEL_ACTIONS, "[level]"                       },
   { CA_RESTART_LEVEL,          "restart level"                 },
   { CA_SHOW_ENVELOPE,          "show envelope"                 },
   { CA_SET_LEVEL_TIME,         "set time"                      },
   { CA_SET_LEVEL_SCORE,                "set score"                     },
-  { CA_SET_LEVEL_GEMS,         "set needed gems"               },
+  { CA_SET_LEVEL_GEMS,         "set gems"                      },
   { CA_SET_LEVEL_WIND,         "set wind dir."                 },
+  { CA_SET_LEVEL_RANDOM_SEED,  "set rand. seed"                },
   { CA_UNDEFINED,              " "                             },
-  { CA_HEADLINE_PLAYER_ACTIONS,        "[player actions]"              },
+  { CA_HEADLINE_PLAYER_ACTIONS,        "[player]"                      },
   { CA_MOVE_PLAYER,            "move player"                   },
   { CA_EXIT_PLAYER,            "exit player"                   },
   { CA_KILL_PLAYER,            "kill player"                   },
@@ -1688,12 +1800,14 @@ static struct ValueTextInfo options_action_type[] =
   { CA_SET_PLAYER_SHIELD,      "set shield"                    },
   { CA_SET_PLAYER_GRAVITY,     "set gravity"                   },
   { CA_SET_PLAYER_ARTWORK,     "set artwork"                   },
+  { CA_SET_PLAYER_INVENTORY,   "set inventory"                 },
   { CA_UNDEFINED,              " "                             },
-  { CA_HEADLINE_CE_ACTIONS,    "[CE actions]"                  },
+  { CA_HEADLINE_CE_ACTIONS,    "[CE]"                          },
   { CA_SET_CE_VALUE,           "set CE value"                  },
   { CA_SET_CE_SCORE,           "set CE score"                  },
+  { CA_SET_CE_ARTWORK,         "set CE artwork"                },
   { CA_UNDEFINED,              " "                             },
-  { CA_HEADLINE_ENGINE_ACTIONS,        "[engine actions]"              },
+  { CA_HEADLINE_ENGINE_ACTIONS,        "[engine]"                      },
   { CA_SET_ENGINE_SCAN_MODE,   "set scan mode"                 },
 
   { -1,                                NULL                            }
@@ -1749,6 +1863,7 @@ static struct ValueTextInfo options_action_arg_player[] =
   { CA_ARG_PLAYER_4,           "4"                             },
   { CA_ARG_PLAYER_ANY,         "any"                           },
   { CA_ARG_PLAYER_TRIGGER,     "trigger"                       },
+  { CA_ARG_PLAYER_ACTION,      "action ->"                     },
 
   { -1,                                NULL                            }
 };
@@ -1782,10 +1897,12 @@ static struct ValueTextInfo options_action_arg_number[] =
   { CA_ARG_ELEMENT_CV_HEADLINE,        "[CE value]"                    },
   { CA_ARG_ELEMENT_CV_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_CV_TRIGGER, "trigger"                       },
+  { CA_ARG_ELEMENT_CV_ACTION,  "action ->"                     },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_CS_HEADLINE,        "[CE score]"                    },
   { CA_ARG_ELEMENT_CS_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_CS_TRIGGER, "trigger"                       },
+  { CA_ARG_ELEMENT_CS_ACTION,  "action ->"                     },
 
   { -1,                                NULL                            }
 };
@@ -1819,14 +1936,17 @@ static struct ValueTextInfo options_action_arg_value[] =
   { CA_ARG_ELEMENT_CV_HEADLINE,        "[CE value]"                    },
   { CA_ARG_ELEMENT_CV_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_CV_TRIGGER, "trigger"                       },
+  { CA_ARG_ELEMENT_CV_ACTION,  "action ->"                     },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_CS_HEADLINE,        "[CE score]"                    },
   { CA_ARG_ELEMENT_CS_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_CS_TRIGGER, "trigger"                       },
+  { CA_ARG_ELEMENT_CS_ACTION,  "action ->"                     },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_NR_HEADLINE,        "[element]"                     },
   { CA_ARG_ELEMENT_NR_TARGET,  "target"                        },
   { CA_ARG_ELEMENT_NR_TRIGGER, "trigger"                       },
+  { CA_ARG_ELEMENT_NR_ACTION,  "action ->"                     },
 
   { -1,                                NULL                            }
 };
@@ -1842,6 +1962,7 @@ static struct ValueTextInfo options_action_arg_envelope[] =
   { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
   { CA_ARG_ELEMENT_TARGET,     "target"                        },
   { CA_ARG_ELEMENT_TRIGGER,    "trigger"                       },
+  { CA_ARG_ELEMENT_ACTION,     "action ->"                     },
 
   { -1,                                NULL                            }
 };
@@ -1861,6 +1982,7 @@ static struct ValueTextInfo options_action_arg_key[] =
   { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
   { CA_ARG_ELEMENT_TARGET,     "target"                        },
   { CA_ARG_ELEMENT_TRIGGER,    "trigger"                       },
+  { CA_ARG_ELEMENT_ACTION,     "action ->"                     },
 
   { -1,                                NULL                            }
 };
@@ -1899,6 +2021,7 @@ static struct ValueTextInfo options_action_arg_artwork[] =
   { CA_ARG_ELEMENT_HEADLINE,   "[element]"                     },
   { CA_ARG_ELEMENT_TARGET,     "target"                        },
   { CA_ARG_ELEMENT_TRIGGER,    "trigger"                       },
+  { CA_ARG_ELEMENT_ACTION,     "action ->"                     },
   { CA_ARG_UNDEFINED,          " "                             },
   { CA_ARG_ELEMENT_RESET,      "reset"                         },
 
@@ -1938,6 +2061,26 @@ static struct ValueTextInfo options_action_arg_scan_mode[] =
   { -1,                                NULL                            }
 };
 
+static struct ValueTextInfo options_action_arg_inventory[] =
+{
+  { CA_ARG_INVENTORY_HEADLINE, "[add]"                         },
+  { CA_ARG_ELEMENT_TARGET,     "+ target"                      },
+  { CA_ARG_ELEMENT_TRIGGER,    "+ trigger"                     },
+  { CA_ARG_ELEMENT_ACTION,     "+ action"                      },
+  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_INVENTORY_RM_HEADLINE,"[remove]"                    },
+  { CA_ARG_INVENTORY_RM_TARGET,        "- target"                      },
+  { CA_ARG_INVENTORY_RM_TRIGGER,"- trigger"                    },
+  { CA_ARG_INVENTORY_RM_ACTION,        "- action"                      },
+  { CA_ARG_INVENTORY_RM_FIRST, "- first"                       },
+  { CA_ARG_INVENTORY_RM_LAST,  "- last"                        },
+  { CA_ARG_INVENTORY_RM_ALL,   "- all"                         },
+  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_INVENTORY_RESET,    "reset"                         },
+
+  { -1,                                NULL                            }
+};
+
 static char options_change_page_strings[MAX_CHANGE_PAGES][10];
 static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] =
 {
@@ -1981,13 +2124,16 @@ action_arg_options[] =
   { CA_SET_LEVEL_GEMS,         3,      options_action_arg_number,      },
   { CA_SET_LEVEL_SCORE,                3,      options_action_arg_number,      },
   { CA_SET_LEVEL_WIND,         1,      options_action_arg_direction,   },
+  { CA_SET_LEVEL_RANDOM_SEED,  1,      options_action_arg_number,      },
   { 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_PLAYER_INVENTORY,   0,      options_action_arg_inventory,   },
   { CA_SET_CE_VALUE,           3,      options_action_arg_value,       },
   { CA_SET_CE_SCORE,           3,      options_action_arg_value,       },
+  { CA_SET_CE_ARTWORK,         1,      options_action_arg_artwork,     },
   { CA_SET_ENGINE_SCAN_MODE,   1,      options_action_arg_scan_mode,   },
 
   { -1,                                FALSE,  NULL                            }
@@ -2034,7 +2180,7 @@ 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,
@@ -2266,34 +2412,46 @@ static struct
 } textbutton_info[ED_NUM_TEXTBUTTONS] =
 {
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_COUNTER_YPOS(1),
+    ED_LEVEL_SETTINGS_TABS_XPOS(0),    ED_LEVEL_SETTINGS_TABS_YPOS(0),
+    GADGET_ID_LEVELINFO_LEVEL,         GADGET_ID_NONE,
+    8,                                 "Level",                        
+    NULL, NULL,                                "Configure level properties"
+  },
+  {
+    ED_LEVEL_SETTINGS_TABS_XPOS(1),    ED_LEVEL_SETTINGS_TABS_YPOS(0),
+    GADGET_ID_LEVELINFO_EDITOR,                GADGET_ID_NONE,
+    8,                                 "Editor",                       
+    NULL, NULL,                                "Configure editor properties"
+  },
+  {
+    ED_ELEMENT_SETTINGS_TABS_XPOS(0),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
     GADGET_ID_PROPERTIES_INFO,         GADGET_ID_NONE,
     8,                                 "Info",                 
     NULL, NULL,                                "Show information about element"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0) + 124, ED_COUNTER_YPOS(1),
+    ED_ELEMENT_SETTINGS_TABS_XPOS(1),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
     GADGET_ID_PROPERTIES_CONFIG,       GADGET_ID_NONE,
     8,                                 "Config",
     NULL, NULL,                                "Configure element properties"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0) + 124, ED_COUNTER_YPOS(1),
+    ED_ELEMENT_SETTINGS_TABS_XPOS(1),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
     GADGET_ID_PROPERTIES_CONFIG_1,     GADGET_ID_NONE,
     8,                                 "Config 1",
-    NULL, NULL,                                "Configure custom element properties"
+    NULL, NULL,                                "Configure element properties, part 1"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0) + 248, ED_COUNTER_YPOS(1),
+    ED_ELEMENT_SETTINGS_TABS_XPOS(2),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
     GADGET_ID_PROPERTIES_CONFIG_2,     GADGET_ID_NONE,
     8,                                 "Config 2",
-    NULL, NULL,                                "Configure custom element properties"
+    NULL, NULL,                                "Configure element properties, part 2"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0) + 372, ED_COUNTER_YPOS(1),
+    ED_ELEMENT_SETTINGS_TABS_XPOS(3),  ED_ELEMENT_SETTINGS_TABS_YPOS(0),
     GADGET_ID_PROPERTIES_CHANGE,       GADGET_ID_NONE,
     8,                                 "Change",
-    NULL, NULL,                                "Custom element change configuration"
+    NULL, NULL,                                "Configure custom element change pages"
   },
   {
     -1,                                        ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2355,6 +2513,90 @@ static struct
   },
 };
 
+#if 1
+
+static struct
+{
+  int x, y;
+} scrollbutton_pos[ED_NUM_SCROLLBUTTONS];
+
+static struct
+{
+  int graphic;
+  int gadget_id;
+  char *infotext;
+} scrollbutton_info[ED_NUM_SCROLLBUTTONS] =
+{
+  {
+    IMG_EDITOR_PLAYFIELD_SCROLL_UP,
+    GADGET_ID_SCROLL_UP,
+    "scroll level editing area up"
+  },
+  {
+    IMG_EDITOR_PLAYFIELD_SCROLL_DOWN,
+    GADGET_ID_SCROLL_DOWN,
+    "scroll level editing area down"
+  },
+  {
+    IMG_EDITOR_PLAYFIELD_SCROLL_LEFT,
+    GADGET_ID_SCROLL_LEFT,
+    "scroll level editing area left"
+  },
+  {
+    IMG_EDITOR_PLAYFIELD_SCROLL_RIGHT,
+    GADGET_ID_SCROLL_RIGHT,
+    "scroll level editing area right"
+  },
+  {
+    IMG_EDITOR_PALETTE_SCROLL_UP,
+    GADGET_ID_SCROLL_LIST_UP,
+    "scroll element list up ('Page Up')"
+  },
+  {
+    IMG_EDITOR_PALETTE_SCROLL_DOWN,
+    GADGET_ID_SCROLL_LIST_DOWN,
+    "scroll element list down ('Page Down')"
+  },
+};
+
+static struct
+{
+  int x, y;
+  int width, height;
+  int wheel_x, wheel_y;
+  int wheel_width, wheel_height;
+} scrollbar_pos[ED_NUM_SCROLLBARS];
+
+static struct
+{
+  int graphic;
+  int type;
+  int gadget_id;
+  char *infotext;
+} scrollbar_info[ED_NUM_SCROLLBARS] =
+{
+  {
+    IMG_EDITOR_PLAYFIELD_SCROLLBAR,
+    GD_TYPE_SCROLLBAR_HORIZONTAL,
+    GADGET_ID_SCROLL_HORIZONTAL,
+    "scroll level editing area horizontally"
+  },
+  {
+    IMG_EDITOR_PLAYFIELD_SCROLLBAR,
+    GD_TYPE_SCROLLBAR_VERTICAL,
+    GADGET_ID_SCROLL_VERTICAL,
+    "scroll level editing area vertically"
+  },
+  {
+    IMG_EDITOR_PALETTE_SCROLLBAR,
+    GD_TYPE_SCROLLBAR_VERTICAL,
+    GADGET_ID_SCROLL_LIST_VERTICAL,
+    "scroll element list vertically"
+  }
+};
+
+#else
+
 static struct
 {
   int gd_x, gd_y;
@@ -2365,25 +2607,41 @@ static struct
 {
   {
     ED_SCROLLBUTTON_XPOS,   ED_SCROLLBUTTON_YPOS + 0 * ED_SCROLLBUTTON_YSIZE,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     ED_SCROLL_UP_XPOS,      ED_SCROLL_UP_YPOS,
+#endif
     GADGET_ID_SCROLL_UP,
     "scroll level editing area up"
   },
   {
     ED_SCROLLBUTTON_XPOS,   ED_SCROLLBUTTON_YPOS + 1 * ED_SCROLLBUTTON_YSIZE,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     ED_SCROLL_DOWN_XPOS,    ED_SCROLL_DOWN_YPOS,
+#endif
     GADGET_ID_SCROLL_DOWN,
     "scroll level editing area down"
   },
   {
     ED_SCROLLBUTTON_XPOS,   ED_SCROLLBUTTON_YPOS + 2 * ED_SCROLLBUTTON_YSIZE,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     ED_SCROLL_LEFT_XPOS,    ED_SCROLL_LEFT_YPOS,
+#endif
     GADGET_ID_SCROLL_LEFT,
     "scroll level editing area left"
   },
   {
     ED_SCROLLBUTTON_XPOS,   ED_SCROLLBUTTON_YPOS + 3 * ED_SCROLLBUTTON_YSIZE,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     ED_SCROLL_RIGHT_XPOS,   ED_SCROLL_RIGHT_YPOS,
+#endif
     GADGET_ID_SCROLL_RIGHT,
     "scroll level editing area right"
   },
@@ -2415,14 +2673,16 @@ static struct
 {
   {
     ED_SCROLLBAR_XPOS,                 ED_SCROLLBAR_YPOS,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     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,
@@ -2430,14 +2690,16 @@ static struct
   },
   {
     ED_SCROLLBAR_XPOS,                 ED_SCROLLBAR_YPOS,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     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,
@@ -2445,14 +2707,16 @@ static struct
   },
   {
     ED_SCROLLBAR2_XPOS,                        ED_SCROLLBAR2_YPOS,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    ED_SCROLL2_VERTICAL_XSIZE,         ED_SCROLL2_VERTICAL_YSIZE,
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     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,
@@ -2460,6 +2724,8 @@ static struct
   }
 };
 
+#endif
+
 static struct
 {
   int x, y;
@@ -2472,14 +2738,14 @@ static struct
 } radiobutton_info[ED_NUM_RADIOBUTTONS] =
 {
   {
-    -1,                                        ED_COUNTER2_YPOS(8),
+    -1,                                        ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_RANDOM_PERCENTAGE,       GADGET_ID_LEVEL_RANDOM_UP,
     RADIO_NR_RANDOM_ELEMENTS,
     &random_placement_method,          RANDOM_USE_PERCENTAGE,
     " ", "percentage",                 "use percentage for random elements"
   },
   {
-    -1,                                        ED_COUNTER2_YPOS(8),
+    -1,                                        ED_LEVEL_SETTINGS_YPOS(0),
     GADGET_ID_RANDOM_QUANTITY,         GADGET_ID_RANDOM_PERCENTAGE,
     RADIO_NR_RANDOM_ELEMENTS,
     &random_placement_method,          RANDOM_USE_QUANTITY,
@@ -2499,7 +2765,7 @@ static struct
   /* ---------- level and editor settings ---------------------------------- */
 
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_COUNTER2_YPOS(9) - MINI_TILEY,
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(1),
     GADGET_ID_RANDOM_RESTRICTED,       GADGET_ID_NONE,
     &random_placement_background_restricted,
     NULL,
@@ -2522,6 +2788,13 @@ static struct
     NULL,
     "slip down from certain flat walls","use EM/DC style slipping behaviour"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_EM_EXPLODES_BY_FIRE,     GADGET_ID_NONE,
+    &level.em_explodes_by_fire,
+    NULL,
+    "explodes with chain reaction",    "use R'n'D style explosion behaviour"
+  },
   {
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(2),
     GADGET_ID_USE_SPRING_BUG,          GADGET_ID_NONE,
@@ -2558,14 +2831,21 @@ static struct
     "can grow into anything diggable", "grow into more than just sand"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(0),
+    GADGET_ID_AUTO_EXIT_SOKOBAN,       GADGET_ID_NONE,
+    &level.auto_exit_sokoban,
+    NULL,
+    "exit level if all fields solved", "automatically finish Sokoban levels"
+  },
+  {
+    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"
+    "continuous snapping",             "use snapping without releasing key"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(6),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(7),
     GADGET_ID_BLOCK_SNAP_FIELD,                GADGET_ID_NONE,
     &level.block_snap_field,
     NULL,
@@ -2593,35 +2873,49 @@ static struct
     "no scrolling when relocating",    "player gets relocated without delay"
   },
   {
-    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(8),
+    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(9),
+    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(10),
+    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(11),
+    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(4),
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
+    GADGET_ID_USE_INITIAL_INVENTORY,   GADGET_ID_NONE,
+    &level.use_initial_inventory[0],
+    NULL,
+    "use initial inventory:",          "use collected elements on level start"
+  },
+  {
+    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,
@@ -2870,7 +3164,12 @@ static struct
   {
     0,                                 0,
     GADGET_ID_DRAWING_LEVEL,           GADGET_ID_NONE,
-    NULL,                              MAX_ED_FIELDX, MAX_ED_FIELDY,
+    NULL,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
+    MAX_ED_FIELDX, MAX_ED_FIELDY,
+#endif
     NULL, NULL, NULL,                  NULL
   },
 
@@ -2997,7 +3296,7 @@ static struct
   /* ---------- level start element ---------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(8),
+    -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"
@@ -3006,7 +3305,7 @@ static struct
   /* ---------- player artwork element ------------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(9),
+    -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"
@@ -3015,12 +3314,21 @@ static struct
   /* ---------- player explosion element ----------------------------------- */
 
   {
-    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(10),
+    -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"
   },
 
+  /* ---------- player initial inventory ----------------------------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
+    GADGET_ID_INVENTORY_CONTENT,       GADGET_ID_USE_INITIAL_INVENTORY,
+    &level.initial_inventory_content[0][0], MAX_INITIAL_INVENTORY_SIZE, 1,
+    NULL, NULL, NULL,                  "content for initial inventory"
+  },
+
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
   /* ---------- custom graphic --------------------------------------------- */
@@ -3028,7 +3336,7 @@ static struct
   {
     -1,                                        ED_AREA_1X1_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_GRAPHIC,          GADGET_ID_CUSTOM_USE_GRAPHIC,
-    &custom_element.gfx_element,       1, 1,
+    &custom_element.gfx_element_initial,1, 1,
     NULL, NULL, NULL,                  "custom graphic element"
   },
 
@@ -3083,10 +3391,19 @@ 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"
   },
 
+  /* ---------- custom change action (element used for action) ------------- */
+
+  {
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(13),
+    GADGET_ID_CUSTOM_CHANGE_ACTION,    GADGET_ID_ACTION_ARG,
+    &custom_element_change.action_element, 1, 1,
+    NULL, NULL, NULL,                  "element used as action parameter"
+  },
+
   /* ---------- group element content -------------------------------------- */
 
   {
@@ -3099,7 +3416,7 @@ static struct
   /* ---------- random background (for random painting) -------------------- */
 
   {
-    -1,                                        ED_ELEMENT_SETTINGS_YPOS(14),
+    -1,                                        ED_AREA_1X1_SETTINGS_YPOS(-1),
     GADGET_ID_RANDOM_BACKGROUND,       GADGET_ID_RANDOM_RESTRICTED,
     &random_placement_background_element, 1, 1,
     NULL, NULL, NULL,                  "random placement background"
@@ -3114,7 +3431,11 @@ static struct
 */
 
 /* actual size of level editor drawing area */
+#if 1
+static int ed_fieldx, ed_fieldy;
+#else
 static int ed_fieldx = MAX_ED_FIELDX - 1, ed_fieldy = MAX_ED_FIELDY - 1;
+#endif
 
 /* actual position of level editor drawing area in level playfield */
 static int level_xpos = -1, level_ypos = -1;
@@ -3164,8 +3485,15 @@ static void HandleControlButtons(struct GadgetInfo *);
 static void HandleDrawingAreaInfo(struct GadgetInfo *);
 static void PrintEditorGadgetInfoText(struct GadgetInfo *);
 
+static int num_editor_gadgets = 0;     /* dynamically determined */
+
+#if 1
+static struct GadgetInfo **level_editor_gadget = NULL;
+static int *right_gadget_border = NULL;
+#else
 static struct GadgetInfo *level_editor_gadget[NUM_EDITOR_GADGETS];
 static int right_gadget_border[NUM_EDITOR_GADGETS];
+#endif
 
 static int drawing_function = GADGET_ID_SINGLE_ITEMS;
 static int last_drawing_function = GADGET_ID_SINGLE_ITEMS;
@@ -3179,6 +3507,7 @@ static int undo_buffer_position = 0;
 static int undo_buffer_steps = 0;
 
 static int edit_mode;
+static int edit_mode_levelinfo;
 static int edit_mode_properties;
 
 static int element_shift = 0;
@@ -3302,6 +3631,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;
@@ -3553,6 +3887,16 @@ static int editor_el_supaplex[] =
   EL_SP_GRAVITY_PORT_UP,
   EL_SP_GRAVITY_PORT_DOWN,
 
+  EL_SP_GRAVITY_ON_PORT_LEFT,
+  EL_SP_GRAVITY_ON_PORT_RIGHT,
+  EL_SP_GRAVITY_ON_PORT_UP,
+  EL_SP_GRAVITY_ON_PORT_DOWN,
+
+  EL_SP_GRAVITY_OFF_PORT_LEFT,
+  EL_SP_GRAVITY_OFF_PORT_RIGHT,
+  EL_SP_GRAVITY_OFF_PORT_UP,
+  EL_SP_GRAVITY_OFF_PORT_DOWN,
+
   EL_SP_HARDWARE_GRAY,
   EL_SP_HARDWARE_GREEN,
   EL_SP_HARDWARE_BLUE,
@@ -3633,25 +3977,25 @@ static int editor_el_diamond_caves[] =
   EL_SWITCHGATE_SWITCH_UP,
   EL_SWITCHGATE_SWITCH_DOWN,
 
-  EL_EMPTY,
-  EL_EMPTY,
-  EL_DC_SWITCHGATE_SWITCH_UP,
-  EL_DC_SWITCHGATE_SWITCH_DOWN,
-
-  EL_SIGN_EXCLAMATION,
-  EL_SIGN_STOP,
   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_EMPTY,
+  EL_DC_MAGIC_WALL,
 
   EL_ENVELOPE_1,
   EL_ENVELOPE_2,
@@ -3668,6 +4012,7 @@ static int editor_el_diamond_caves[] =
   EL_SIGN_EMERGENCY_EXIT,
   EL_SIGN_YIN_YANG,
 
+#if 0
   EL_SIGN_SPERMS,
   EL_SIGN_BULLET,
   EL_SIGN_HEART,
@@ -3687,11 +4032,12 @@ static int editor_el_diamond_caves[] =
   EL_EMPTY,
   EL_EMPTY,
   EL_EMPTY,
+#endif
 
   EL_DC_STEELWALL_2_SINGLE,
   EL_DC_STEELWALL_2_TOP,
-  EL_STEEL_EXIT_CLOSED,
-  EL_STEEL_EXIT_OPEN,
+  EL_SIGN_EXCLAMATION,
+  EL_SIGN_STOP,
 
   EL_DC_STEELWALL_2_LEFT,
   EL_DC_STEELWALL_2_MIDDLE,
@@ -3701,52 +4047,32 @@ static int editor_el_diamond_caves[] =
   EL_DC_STEELWALL_1_TOPLEFT,
   EL_DC_STEELWALL_2_VERTICAL,
   EL_DC_STEELWALL_1_TOPRIGHT,
-  EL_EMPTY,
+  EL_DC_GATE_WHITE,
 
   EL_DC_STEELWALL_1_VERTICAL,
   EL_DC_STEELWALL_2_BOTTOM,
-  EL_EMPTY,
-  EL_EMPTY,
+  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_EMPTY,
+  EL_DC_GATE_FAKE_GRAY,
 
   EL_DC_STEELWALL_1_BOTTOMRIGHT_2,
   EL_DC_STEELWALL_1_BOTTOM,
   EL_DC_STEELWALL_1_BOTTOMLEFT_2,
-  EL_EMPTY,
+  EL_EXPANDABLE_STEELWALL_HORIZONTAL,
 
   EL_DC_STEELWALL_1_RIGHT,
   EL_EMPTY,
   EL_DC_STEELWALL_1_LEFT,
-  EL_EMPTY,
+  EL_EXPANDABLE_STEELWALL_VERTICAL,
 
   EL_DC_STEELWALL_1_TOPRIGHT_2,
   EL_DC_STEELWALL_1_TOP,
   EL_DC_STEELWALL_1_TOPLEFT_2,
-  EL_EMPTY,
-
-  EL_EXPANDABLE_STEELWALL_HORIZONTAL,
-  EL_EXPANDABLE_STEELWALL_VERTICAL,
   EL_EXPANDABLE_STEELWALL_ANY,
-  EL_EMPTY,
-
-  EL_EM_EXIT_CLOSED,
-  EL_EM_EXIT_OPEN,
-  EL_EM_STEEL_EXIT_CLOSED,
-  EL_EM_STEEL_EXIT_OPEN,
-
-  EL_DC_KEY_WHITE,
-  EL_DC_GATE_WHITE,
-  EL_DC_GATE_WHITE_GRAY,
-  EL_DC_GATE_FAKE_GRAY,
-
-  EL_DC_MAGIC_WALL,
-  EL_QUICKSAND_FAST_EMPTY,
-  EL_QUICKSAND_FAST_FULL,
-  EL_EMPTY,
 };
 static int *editor_hl_diamond_caves_ptr = editor_hl_diamond_caves;
 static int *editor_el_diamond_caves_ptr = editor_el_diamond_caves;
@@ -4469,11 +4795,19 @@ static int *editor_el_dynamic_ptr = NULL;
 static int num_editor_hl_dynamic = SIZEOF_ARRAY_INT(editor_hl_dynamic);
 static int num_editor_el_dynamic = 0;
 
-static int editor_hl_empty[] = { };
+static int editor_hl_empty[] = { EL_EMPTY };
+#if 1
+static int *editor_el_empty = NULL;    /* dynamically allocated */
+#else
 static int editor_el_empty[ED_NUM_ELEMENTLIST_BUTTONS];
+#endif
 
 static int *editor_hl_empty_ptr = editor_hl_empty;
+#if 1
+static int *editor_el_empty_ptr = NULL;
+#else
 static int *editor_el_empty_ptr = editor_el_empty;
+#endif
 static int num_editor_hl_empty = 0;
 static int num_editor_el_empty = 0;    /* dynamically determined, if needed */
 
@@ -4950,27 +5284,40 @@ static void DrawElementBorder(int dest_x, int dest_y, int width, int height,
     (input ? IMG_EDITOR_ELEMENT_BORDER_INPUT : IMG_EDITOR_ELEMENT_BORDER);
   Bitmap *src_bitmap;
   int src_x, src_y;
-  int num_mini_tilex = width  / MINI_TILEX + 1;
-  int num_mini_tiley = height / MINI_TILEY + 1;
-  int from_x = dest_x - MINI_TILEX / 2;
-  int from_y = dest_y - MINI_TILEY / 2;
-  int to_x = from_x + num_mini_tilex * MINI_TILEX - 1;
-  int to_y = from_y + num_mini_tiley * MINI_TILEY - 1;
-  int x, y;
+  int bx = (input ? 4 : 8);
+  int by = (input ? 4 : 8);
+  int bx2 = TILEX - bx;
+  int by2 = TILEY - by;
+  int i;
 
-  getMiniGraphicSource(border_graphic, &src_bitmap, &src_x, &src_y);
+  getFixedGraphicSource(border_graphic, 0, &src_bitmap, &src_x, &src_y);
 
-  for (y = 0; y < num_mini_tiley; y++)
-    for (x = 0; x < num_mini_tilex; x++)
-      BlitBitmap(src_bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY,
-                from_x + x * MINI_TILEX, from_y + y * MINI_TILEY);
+  BlitBitmap(src_bitmap, drawto, src_x, src_y,
+            bx, by, dest_x - bx, dest_y - by);
+  BlitBitmap(src_bitmap, drawto, src_x + bx2, src_y,
+            bx, by, dest_x + width, dest_y - by);
+  BlitBitmap(src_bitmap, drawto, src_x, src_y + by2,
+            bx, by, dest_x - bx, dest_y + height);
+  BlitBitmap(src_bitmap, drawto, src_x + bx2, src_y + by2,
+            bx, by, dest_x + width, dest_y + height);
 
-  ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
+  for (i = 0; i < width / MINI_TILEX; i++)
+  {
+    BlitBitmap(src_bitmap, drawto, src_x + bx, src_y, MINI_TILEX, by,
+              dest_x + i * MINI_TILEX, dest_y - by);
+    BlitBitmap(src_bitmap, drawto, src_x + bx, src_y + by2, MINI_TILEX, by,
+              dest_x + i * MINI_TILEX, dest_y + height);
+  }
+
+  for (i = 0; i < height / MINI_TILEY; i++)
+  {
+    BlitBitmap(src_bitmap, drawto, src_x, src_y + by, bx, MINI_TILEY,
+              dest_x - bx, dest_y + i * MINI_TILEY);
+    BlitBitmap(src_bitmap, drawto, src_x + bx2, src_y + by, bx, MINI_TILEY,
+              dest_x + width, dest_y + i * MINI_TILEY);
+  }
 
-  DrawSimpleBlackLine(drawto, from_x, from_y, to_x, from_y);
-  DrawSimpleBlackLine(drawto, to_x, from_y, to_x, to_y);
-  DrawSimpleBlackLine(drawto, to_x, to_y, from_x, to_y);
-  DrawSimpleBlackLine(drawto, from_x, to_y, from_x, from_y);
+  ClearRectangle(drawto, dest_x - 1, dest_y - 1, width + 2, height + 2);
 }
 
 static void DrawDrawingArea(int id)
@@ -4992,7 +5339,7 @@ static void DrawDrawingArea(int id)
 
 static void ScrollMiniLevel(int from_x, int from_y, int scroll)
 {
-  int x,y;
+  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);
 
@@ -5003,6 +5350,7 @@ 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));
+
   if (dx)
   {
     x = (dx == 1 ? 0 : ed_fieldx - 1);
@@ -5024,7 +5372,7 @@ static void CreateControlButtons()
 {
   Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
   struct GadgetInfo *gi;
-  unsigned long event_mask;
+  unsigned int event_mask;
   int i;
 
   /* create toolbox buttons */
@@ -5159,15 +5507,49 @@ static void CreateControlButtons()
     level_editor_gadget[id] = gi;
   }
 
+  /* these values are not constant, but can change at runtime */
+#if 1
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_UP].x    = ED_SCROLL_UP_XPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_UP].y    = ED_SCROLL_UP_YPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_DOWN].x  = ED_SCROLL_DOWN_XPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_DOWN].y  = ED_SCROLL_DOWN_YPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_LEFT].x  = ED_SCROLL_LEFT_XPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_LEFT].y  = ED_SCROLL_LEFT_YPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_RIGHT].x = ED_SCROLL_RIGHT_XPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_RIGHT].y = ED_SCROLL_RIGHT_YPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_LIST_UP].x    = ED_SCROLL2_UP_XPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_LIST_UP].y    = ED_SCROLL2_UP_YPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_LIST_DOWN].x  = ED_SCROLL2_DOWN_XPOS;
+  scrollbutton_pos[ED_SCROLLBUTTON_ID_LIST_DOWN].y  = ED_SCROLL2_DOWN_YPOS;
+#else
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_UP].x    = ED_SCROLL_UP_XPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_UP].y    = ED_SCROLL_UP_YPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_DOWN].x  = ED_SCROLL_DOWN_XPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_DOWN].y  = ED_SCROLL_DOWN_YPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_LEFT].x  = ED_SCROLL_LEFT_XPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_LEFT].y  = ED_SCROLL_LEFT_YPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_RIGHT].x = ED_SCROLL_RIGHT_XPOS;
+  scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_RIGHT].y = ED_SCROLL_RIGHT_YPOS;
+#endif
+
   /* create buttons for scrolling of drawing area and element list */
   for (i = 0; i < ED_NUM_SCROLLBUTTONS; i++)
   {
     int id = scrollbutton_info[i].gadget_id;
+#if 1
+    int graphic = scrollbutton_info[i].graphic;
+    struct GraphicInfo *gd = &graphic_info[graphic];
+#endif
     int x, y, width, height;
     int gd_x1, gd_x2, gd_y1, gd_y2;
 
+#if 1
+    x = scrollbutton_pos[i].x;
+    y = scrollbutton_pos[i].y;
+#else
     x = scrollbutton_info[i].x;
     y = scrollbutton_info[i].y;
+#endif
 
     event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
@@ -5176,23 +5558,41 @@ static void CreateControlButtons()
     {
       x += DX;
       y += DY;
+#if 1
+      width  = gd->width;
+      height = gd->height;
+      gd_x1 = gd->src_x;
+      gd_y1 = gd->src_y;
+      gd_x2 = gd->src_x + gd->pressed_xoffset;
+      gd_y2 = gd->src_y + gd->pressed_yoffset;
+#else
       width = ED_SCROLLBUTTON2_XSIZE;
       height = ED_SCROLLBUTTON2_YSIZE;
       gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[i].gd_x;
       gd_y1 = DOOR_GFX_PAGEY1 + scrollbutton_info[i].gd_y;
       gd_x2 = gd_x1 - ED_SCROLLBUTTON2_XSIZE;
       gd_y2 = gd_y1;
+#endif
     }
     else
     {
       x += SX;
       y += SY;
+#if 1
+      width  = gd->width;
+      height = gd->height;
+      gd_x1 = gd->src_x;
+      gd_y1 = gd->src_y;
+      gd_x2 = gd->src_x + gd->pressed_xoffset;
+      gd_y2 = gd->src_y + gd->pressed_yoffset;
+#else
       width = ED_SCROLLBUTTON_XSIZE;
       height = ED_SCROLLBUTTON_YSIZE;
       gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[i].gd_x;
       gd_y1 = DOOR_GFX_PAGEY1 + scrollbutton_info[i].gd_y;
       gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE;
       gd_y2 = gd_y1;
+#endif
     }
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
@@ -5220,10 +5620,15 @@ static void CreateControlButtons()
   /* create buttons for element list */
   for (i = 0; i < ED_NUM_ELEMENTLIST_BUTTONS; i++)
   {
+    struct GraphicInfo *gd = &graphic_info[IMG_EDITOR_PALETTE_BUTTON];
     Bitmap *deco_bitmap;
     int deco_x, deco_y, deco_xpos, deco_ypos;
     int gd_xoffset, gd_yoffset;
+#if 1
+    int gd_x1, gd_y1, gd_x2, gd_y2;
+#else
     int gd_x1, gd_x2, gd_y;
+#endif
     int x = i % ED_ELEMENTLIST_BUTTONS_HORIZ;
     int y = i / ED_ELEMENTLIST_BUTTONS_HORIZ;
     int id = GADGET_ID_ELEMENTLIST_FIRST + i;
@@ -5231,6 +5636,19 @@ static void CreateControlButtons()
 
     event_mask = GD_EVENT_RELEASED;
 
+#if 1
+    gd_xoffset = ED_ELEMENTLIST_XPOS + x * gd->width;
+    gd_yoffset = ED_ELEMENTLIST_YPOS + y * gd->height;
+
+    gd_x1 = gd->src_x;
+    gd_y1 = gd->src_y;
+    gd_x2 = gd->src_x + gd->pressed_xoffset;
+    gd_y2 = gd->src_y + gd->pressed_yoffset;
+
+    getMiniGraphicSource(el2edimg(element), &deco_bitmap, &deco_x, &deco_y);
+    deco_xpos = (gd->width  - MINI_TILEX) / 2;
+    deco_ypos = (gd->height - MINI_TILEY) / 2;
+#else
     gd_xoffset = ED_ELEMENTLIST_XPOS + x * ED_ELEMENTLIST_XSIZE;
     gd_yoffset = ED_ELEMENTLIST_YPOS + y * ED_ELEMENTLIST_YSIZE;
 
@@ -5241,18 +5659,29 @@ static void CreateControlButtons()
     getMiniGraphicSource(el2edimg(element), &deco_bitmap, &deco_x, &deco_y);
     deco_xpos = (ED_ELEMENTLIST_XSIZE - MINI_TILEX) / 2;
     deco_ypos = (ED_ELEMENTLIST_YSIZE - MINI_TILEY) / 2;
+#endif
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
                      GDI_INFO_TEXT, getElementInfoText(element),
                      GDI_X, DX + gd_xoffset,
                      GDI_Y, DY + gd_yoffset,
+#if 1
+                     GDI_WIDTH, gd->width,
+                     GDI_HEIGHT, gd->height,
+#else
                      GDI_WIDTH, ED_ELEMENTLIST_XSIZE,
                      GDI_HEIGHT, ED_ELEMENTLIST_YSIZE,
+#endif
                      GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
                      GDI_STATE, GD_BUTTON_UNPRESSED,
-                     GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y,
-                     GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y,
+#if 1
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y1,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y2,
+#else
+                     GDI_DESIGN_UNPRESSED, gd->bitmap, gd_x1, gd_y,
+                     GDI_DESIGN_PRESSED, gd->bitmap, gd_x2, gd_y,
+#endif
                      GDI_DECORATION_DESIGN, deco_bitmap, deco_x, deco_y,
                      GDI_DECORATION_POSITION, deco_xpos, deco_ypos,
                      GDI_DECORATION_SIZE, MINI_TILEX, MINI_TILEY,
@@ -5274,6 +5703,10 @@ static void CreateCounterButtons()
   int max_infotext_len = getMaxInfoTextLength();
   int i;
 
+  /* these values are not constant, but can change at runtime */
+  counterbutton_info[ED_COUNTER_ID_SELECT_LEVEL].x = DX + 5 - SX;
+  counterbutton_info[ED_COUNTER_ID_SELECT_LEVEL].y = DY + 3 - SY;
+
   for (i = 0; i < ED_NUM_COUNTERBUTTONS; i++)
   {
     int j;
@@ -5297,15 +5730,36 @@ static void CreateCounterButtons()
                counterbutton_info[i].gadget_id_down :
                counterbutton_info[i].gadget_id_up);
       int gd_xoffset;
-      int gd_x, gd_x1, gd_x2, gd_y;
+      int gd_x, gd_y, gd_x1, gd_x2, gd_y1, gd_y2;
       int x_size, y_size;
-      unsigned long event_mask;
+      unsigned int event_mask;
       char infotext[max_infotext_len + 1];
 
       event_mask = GD_EVENT_PRESSED | GD_EVENT_REPEATED;
 
       if (i == ED_COUNTER_ID_SELECT_LEVEL)
       {
+#if 1
+       int graphic = (j == 0 ?
+                      IMG_EDITOR_BUTTON_GFX_PREV_LEVEL :
+                      IMG_EDITOR_BUTTON_GFX_NEXT_LEVEL);
+       struct GraphicInfo *gd = &graphic_info[graphic];
+
+       gd_bitmap = gd->bitmap;
+
+       event_mask |= GD_EVENT_RELEASED;
+
+       if (j == 1)
+         x += 2 * ED_GADGET_DISTANCE;
+       y += ED_GADGET_DISTANCE;
+
+       gd_x1 = gd->src_x;
+       gd_y1 = gd->src_y;
+       gd_x2 = gd->src_x + gd->pressed_xoffset;
+       gd_y2 = gd->src_y + gd->pressed_yoffset;
+       x_size = gd->width;
+       y_size = gd->height;
+#else
        int sid = (j == 0 ?
                   ED_SCROLLBUTTON_ID_AREA_LEFT :
                   ED_SCROLLBUTTON_ID_AREA_RIGHT);
@@ -5318,16 +5772,19 @@ static void CreateCounterButtons()
 
        gd_x1 = DOOR_GFX_PAGEX8 + scrollbutton_info[sid].gd_x;
        gd_x2 = gd_x1 - ED_SCROLLBUTTON_XSIZE;
-       gd_y  = DOOR_GFX_PAGEY1 + scrollbutton_info[sid].gd_y;
+       gd_y1 = DOOR_GFX_PAGEY1 + scrollbutton_info[sid].gd_y;
+       gd_y2 = gd_y1;
        x_size = ED_SCROLLBUTTON_XSIZE;
        y_size = ED_SCROLLBUTTON_YSIZE;
+#endif
       }
       else
       {
        gd_xoffset = (j == 0 ? ED_BUTTON_MINUS_XPOS : ED_BUTTON_PLUS_XPOS);
        gd_x1 = DOOR_GFX_PAGEX4 + gd_xoffset;
        gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset;
-       gd_y  = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS;
+       gd_y1 = DOOR_GFX_PAGEY1 + ED_BUTTON_COUNT_YPOS;
+       gd_y2 = gd_y1;
        x_size = ED_BUTTON_COUNT_XSIZE;
        y_size = ED_BUTTON_COUNT_YSIZE;
       }
@@ -5344,8 +5801,8 @@ static void CreateCounterButtons()
                        GDI_HEIGHT, y_size,
                        GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
                        GDI_STATE, GD_BUTTON_UNPRESSED,
-                       GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y,
-                       GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y,
+                       GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
+                       GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
                        GDI_EVENT_MASK, event_mask,
                        GDI_CALLBACK_INFO, HandleEditorGadgetInfoText,
                        GDI_CALLBACK_ACTION, HandleCounterButtons,
@@ -5428,10 +5885,14 @@ static void CreateDrawingAreas()
 {
   int i;
 
+  /* these values are not constant, but can change at runtime */
+  drawingarea_info[ED_DRAWING_ID_DRAWING_LEVEL].area_xsize = MAX_ED_FIELDX;
+  drawingarea_info[ED_DRAWING_ID_DRAWING_LEVEL].area_ysize = MAX_ED_FIELDY;
+
   for (i = 0; i < ED_NUM_DRAWING_AREAS; i++)
   {
     struct GadgetInfo *gi;
-    unsigned long event_mask;
+    unsigned int event_mask;
     int id = drawingarea_info[i].gadget_id;
     int x = SX + drawingarea_info[i].x;
     int y = SY + drawingarea_info[i].y;
@@ -5482,7 +5943,7 @@ static void CreateTextInputGadgets()
     Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
     int gd_x, gd_y;
     struct GadgetInfo *gi;
-    unsigned long event_mask;
+    unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = textinput_info[i].gadget_id;
 
@@ -5530,7 +5991,7 @@ static void CreateTextAreaGadgets()
     Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
     int gd_x, gd_y;
     struct GadgetInfo *gi;
-    unsigned long event_mask;
+    unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = textarea_info[i].gadget_id;
     int area_xsize = textarea_info[i].xsize;
@@ -5579,7 +6040,7 @@ static void CreateSelectboxGadgets()
     Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
     int gd_x, gd_y;
     struct GadgetInfo *gi;
-    unsigned long event_mask;
+    unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = selectbox_info[i].gadget_id;
     int x = SX + selectbox_info[i].x;
@@ -5656,7 +6117,7 @@ static void CreateTextbuttonGadgets()
     Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
     int gd_x1, gd_x2, gd_y1, gd_y2;
     struct GadgetInfo *gi;
-    unsigned long event_mask;
+    unsigned int event_mask;
     char infotext[MAX_OUTPUT_LINESIZE + 1];
     int id = textbutton_info[i].gadget_id;
     int x = SX + textbutton_info[i].x;
@@ -5667,7 +6128,8 @@ static void CreateTextbuttonGadgets()
 
     event_mask = GD_EVENT_RELEASED;
 
-    if (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE)
+    if ((id >= GADGET_ID_LEVELINFO_LEVEL && id <= GADGET_ID_LEVELINFO_EDITOR) ||
+       (id >= GADGET_ID_PROPERTIES_INFO && id <= GADGET_ID_PROPERTIES_CHANGE))
     {
       gd_x1 = DOOR_GFX_PAGEX4 + ED_TEXTBUTTON_TAB_XPOS;
       gd_x2 = DOOR_GFX_PAGEX3 + ED_TEXTBUTTON_TAB_XPOS;
@@ -5728,7 +6190,7 @@ static void CreateGraphicbuttonGadgets()
 {
   Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
   struct GadgetInfo *gi;
-  unsigned long event_mask;
+  unsigned int event_mask;
   int i;
 
   /* create buttons for scrolling of drawing area and element list */
@@ -5794,14 +6256,101 @@ static void CreateScrollbarGadgets()
 {
   int i;
 
+  /* these values are not constant, but can change at runtime */
+#if 1
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].x =
+    SX + ED_SCROLL_HORIZONTAL_XPOS;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].y =
+    SY + ED_SCROLL_HORIZONTAL_YPOS;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].width =
+    ED_SCROLL_HORIZONTAL_XSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].height =
+    ED_SCROLL_HORIZONTAL_YSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_x      = SX;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_y      = SY;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_width  = SXSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_height = SYSIZE;
+
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].x =
+    SX + ED_SCROLL_VERTICAL_XPOS;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].y =
+    SY + ED_SCROLL_VERTICAL_YPOS;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].width =
+    ED_SCROLL_VERTICAL_XSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].height =
+    ED_SCROLL_VERTICAL_YSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_x      = SX;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_y      = SY;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_width  = SXSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_height = SYSIZE;
+
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].x =
+    DX + ED_SCROLL2_VERTICAL_XPOS;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].y =
+    DY + ED_SCROLL2_VERTICAL_YPOS;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].width =
+    ED_SCROLL2_VERTICAL_XSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].height =
+    ED_SCROLL2_VERTICAL_YSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_x = DX;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_y = DY;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_width  = DXSIZE;
+  scrollbar_pos[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_height = DYSIZE;
+#else
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].x =
+    SX + ED_SCROLL_HORIZONTAL_XPOS;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].y =
+    SY + ED_SCROLL_HORIZONTAL_YPOS;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].width =
+    ED_SCROLL_HORIZONTAL_XSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].height =
+    ED_SCROLL_HORIZONTAL_YSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_x      = SX;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_y      = SY;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_width  = SXSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].wheel_height = SYSIZE;
+
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].x =
+    SX + ED_SCROLL_VERTICAL_XPOS;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].y =
+    SY + ED_SCROLL_VERTICAL_YPOS;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].width =
+    ED_SCROLL_VERTICAL_XSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].height =
+    ED_SCROLL_VERTICAL_YSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_x      = SX;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_y      = SY;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_width  = SXSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].wheel_height = SYSIZE;
+
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].x =
+    DX + ED_SCROLL2_VERTICAL_XPOS;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].y =
+    DY + ED_SCROLL2_VERTICAL_YPOS;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].width =
+    ED_SCROLL2_VERTICAL_XSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].height =
+    ED_SCROLL2_VERTICAL_YSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_x = DX;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_y = DY;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_width  = DXSIZE;
+  scrollbar_info[ED_SCROLLBAR_ID_LIST_VERTICAL].wheel_height = DYSIZE;
+#endif
+
   for (i = 0; i < ED_NUM_SCROLLBARS; i++)
   {
     int id = scrollbar_info[i].gadget_id;
+#if 1
+    int graphic = scrollbar_info[i].graphic;
+    struct GraphicInfo *gd = &graphic_info[graphic];
+    Bitmap *gd_bitmap = gd->bitmap;
+#else
     Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
+#endif
     int gd_x1, gd_x2, gd_y1, gd_y2;
     struct GadgetInfo *gi;
     int items_max, items_visible, item_position;
-    unsigned long event_mask;
+    unsigned int event_mask;
 
     if (i == ED_SCROLLBAR_ID_LIST_VERTICAL)
     {
@@ -5827,27 +6376,48 @@ static void CreateScrollbarGadgets()
 
     event_mask = GD_EVENT_MOVING | GD_EVENT_OFF_BORDERS;
 
+#if 1
+    gd_x1 = gd->src_x;
+    gd_y1 = gd->src_y;
+    gd_x2 = gd->src_x + gd->pressed_xoffset;
+    gd_y2 = gd->src_y + gd->pressed_yoffset;
+#else
     gd_x1 = DOOR_GFX_PAGEX8 + scrollbar_info[i].gd_x;
     gd_x2 = (gd_x1 - (scrollbar_info[i].type == GD_TYPE_SCROLLBAR_HORIZONTAL ?
                      scrollbar_info[i].height : scrollbar_info[i].width));
     gd_y1 = DOOR_GFX_PAGEY1 + scrollbar_info[i].gd_y;
     gd_y2 = DOOR_GFX_PAGEY1 + scrollbar_info[i].gd_y;
+#endif
 
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
                      GDI_INFO_TEXT, scrollbar_info[i].infotext,
+#if 1
+                     GDI_X, scrollbar_pos[i].x,
+                     GDI_Y, scrollbar_pos[i].y,
+                     GDI_WIDTH, scrollbar_pos[i].width,
+                     GDI_HEIGHT, scrollbar_pos[i].height,
+#else
                      GDI_X, scrollbar_info[i].x,
                      GDI_Y, scrollbar_info[i].y,
                      GDI_WIDTH, scrollbar_info[i].width,
                      GDI_HEIGHT, scrollbar_info[i].height,
+#endif
                      GDI_TYPE, scrollbar_info[i].type,
                      GDI_SCROLLBAR_ITEMS_MAX, items_max,
                      GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
                      GDI_SCROLLBAR_ITEM_POSITION, item_position,
+#if 1
+                     GDI_WHEEL_AREA_X, scrollbar_pos[i].wheel_x,
+                     GDI_WHEEL_AREA_Y, scrollbar_pos[i].wheel_y,
+                     GDI_WHEEL_AREA_WIDTH, scrollbar_pos[i].wheel_width,
+                     GDI_WHEEL_AREA_HEIGHT, scrollbar_pos[i].wheel_height,
+#else
                      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,
+#endif
                      GDI_STATE, GD_BUTTON_UNPRESSED,
                      GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
                      GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
@@ -5868,7 +6438,7 @@ static void CreateCheckbuttonGadgets()
 {
   Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
   struct GadgetInfo *gi;
-  unsigned long event_mask;
+  unsigned int event_mask;
   int gd_x1, gd_x2, gd_x3, gd_x4, gd_y;
   int i;
 
@@ -5931,7 +6501,7 @@ static void CreateRadiobuttonGadgets()
 {
   Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
   struct GadgetInfo *gi;
-  unsigned long event_mask;
+  unsigned int event_mask;
   int gd_x1, gd_x2, gd_x3, gd_x4, gd_y;
   int i;
 
@@ -5996,6 +6566,22 @@ void CreateLevelEditorGadgets()
   /* setting 'game_status' is needed to get the right fonts for the editor */
   game_status = GAME_MODE_EDITOR;
 
+  /* these values are not constant, but can change at runtime */
+  ed_fieldx = MAX_ED_FIELDX - 1;
+  ed_fieldy = MAX_ED_FIELDY - 1;
+
+  num_editor_gadgets = NUM_EDITOR_GADGETS;
+
+  // printf("::: allocating %d gadgets ...\n", num_editor_gadgets);
+
+  level_editor_gadget =
+    checked_calloc(num_editor_gadgets * sizeof(struct GadgetInfo *));
+  right_gadget_border =
+    checked_calloc(num_editor_gadgets * sizeof(int));
+
+  editor_el_empty = checked_calloc(ED_NUM_ELEMENTLIST_BUTTONS * sizeof(int));
+  editor_el_empty_ptr = editor_el_empty;
+
   ReinitializeElementList();
 
   CreateControlButtons();
@@ -6019,12 +6605,19 @@ void FreeLevelEditorGadgets()
 {
   int i;
 
-  for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+  // printf("::: freeing %d gadgets ...\n", num_editor_gadgets);
+
+  for (i = 0; i < num_editor_gadgets; i++)
   {
     FreeGadget(level_editor_gadget[i]);
 
     level_editor_gadget[i] = NULL;
   }
+
+  checked_free(level_editor_gadget);
+  checked_free(right_gadget_border);
+
+  checked_free(editor_el_empty);
 }
 
 static void MapCounterButtons(int id)
@@ -6389,20 +6982,27 @@ static void UnmapDrawingArea(int id)
   UnmapGadget(level_editor_gadget[drawingarea_info[id].gadget_id]);
 }
 
-static void UnmapLevelEditorWindowGadgets()
+static void UnmapLevelEditorFieldGadgets()
 {
   int i;
 
+#if 1
+  for (i = 0; i < num_editor_gadgets; i++)
+    if (IN_GFX_FIELD_FULL(level_editor_gadget[i]->x,
+                         level_editor_gadget[i]->y))
+      UnmapGadget(level_editor_gadget[i]);
+#else
   for (i = 0; i < NUM_EDITOR_GADGETS; i++)
     if (level_editor_gadget[i]->x < SX + SXSIZE)
       UnmapGadget(level_editor_gadget[i]);
+#endif
 }
 
 void UnmapLevelEditorGadgets()
 {
   int i;
 
-  for (i = 0; i < NUM_EDITOR_GADGETS; i++)
+  for (i = 0; i < num_editor_gadgets; i++)
     UnmapGadget(level_editor_gadget[i]);
 }
 
@@ -6433,8 +7033,12 @@ static boolean LevelChanged()
   boolean field_changed = FALSE;
   int x, y;
 
+#if 1
+  /* changed read-only levels can now be saved in personal level set */
+#else
   if (leveldir_current->readonly)
     return FALSE;
+#endif
 
   for (y = 0; y < lev_fieldy; y++) 
     for (x = 0; x < lev_fieldx; x++)
@@ -6444,21 +7048,151 @@ static boolean LevelChanged()
   return (level.changed || field_changed);
 }
 
-static boolean LevelContainsPlayer()
+static boolean PrepareSavingIntoPersonalLevelSet()
 {
-  boolean player_found = FALSE;
-  int x, y;
+  static LevelDirTree *last_copied_leveldir = NULL;
+  static LevelDirTree *last_written_leveldir = NULL;
+  static int last_copied_level_nr = -1;
+  static int last_written_level_nr = -1;
+  LevelDirTree *leveldir_former = leveldir_current;
+  int level_nr_former = level_nr;
+  int new_level_nr;
+
+  // remember last mod/save so that for current session, we write
+  // back to the same personal copy, asking only about overwrite.
+  if (leveldir_current == last_copied_leveldir &&
+      level_nr == last_copied_level_nr)
+  {
+    // "cd" to personal level set dir (as used when writing last copy)
+    leveldir_current = last_written_leveldir;
+    level_nr = last_written_level_nr;
+
+    return TRUE;
+  }
+
+  if (!Request("This level is read only! "
+              "Save into personal level set?", REQ_ASK))
+    return FALSE;
+
+  // "cd" to personal level set dir (for writing copy the first time)
+  leveldir_current =
+    getTreeInfoFromIdentifier(leveldir_first, getLoginName());
+
+  // find unused level number
+  for (new_level_nr = leveldir_current->first_level; ; new_level_nr++)
+  {
+    static char *level_filename = NULL;
 
-  return TRUE;         /* !!! CURRENTLY DEACTIVATED !!! */
+    setString(&level_filename, getDefaultLevelFilename(new_level_nr));
 
-  for (y = 0; y < lev_fieldy; y++) for (x = 0; x < lev_fieldx; x++)
+    if (!fileExists(level_filename))
+      break;
+  }
+
+  last_copied_leveldir = leveldir_former;
+  last_copied_level_nr = level_nr_former;
+
+  last_written_leveldir = leveldir_current;
+  last_written_level_nr = level_nr = new_level_nr;
+
+  return TRUE;
+}
+
+static void ModifyLevelInfoForSavingIntoPersonalLevelSet(char *former_name)
+{
+  static char *filename_levelinfo = NULL, *mod_name = NULL;
+  FILE *file;
+
+  // annotate this copy-and-mod in personal levelinfo.conf
+  setString(&filename_levelinfo,
+           getPath2(getCurrentLevelDir(), LEVELINFO_FILENAME));
+
+  if ((file = fopen(filename_levelinfo, MODE_APPEND)))
+  {
+    fprintf(file, "\n");
+    fprintf(file, "# level %d was modified from:\n", level_nr);
+    fprintf(file, "# - previous level set name:    %s\n",
+           former_name);
+    fprintf(file, "# - level within previous set:  %d \"%s\"\n",
+           level.file_info.nr, level.name);
+    fprintf(file, "# - previous author:            %s\n",
+           level.author);
+    fprintf(file, "# - previous save date:         ");
+
+    if (level.creation_date.src == DATE_SRC_LEVELFILE)
+    {
+      fprintf(file, "%04d-%02d-%02d\n",
+             level.creation_date.year,
+             level.creation_date.month,
+             level.creation_date.day);
+    }
+    else
+    {
+      fprintf(file, "not recorded\n");
+    }
+
+    fclose(file);
+  }
+
+  if (level_nr > leveldir_current->last_level)
   {
-    if (Feld[x][y] == EL_PLAYER_1 ||
-       Feld[x][y] == EL_SP_MURPHY) 
-      player_found = TRUE;
+    static char *temp_levelinfo = NULL;
+    FILE *temp_file = NULL;
+    char line[MAX_LINE_LEN];
+
+    setString(&temp_levelinfo,
+             getPath2(getCurrentLevelDir(),
+                      getStringCat2(LEVELINFO_FILENAME, ".new")));
+
+    if ((file = fopen(filename_levelinfo, MODE_READ)) &&
+       (temp_file = fopen(temp_levelinfo, MODE_WRITE)))
+    {
+      while (fgets(line, MAX_LINE_LEN, file))
+      {
+       if (!strPrefix(line, "levels:"))
+         fputs(line, temp_file);
+       else
+         fprintf(temp_file, "%-32s%d\n", "levels:", level_nr + 9);
+      }
+    }
+
+    if (temp_file)
+      fclose(temp_file);
+
+    if (file)
+      fclose(file);
+
+    // needs error handling; also, ok on dos/win?
+    unlink(filename_levelinfo);
+    rename(temp_levelinfo, filename_levelinfo);
   }
 
-  return player_found;
+  // else: allow the save even if annotation failed
+
+  // now... spray graffiti on the old level vital statistics
+  // user can change these; just trying to set a good baseline
+
+  // don't truncate names for fear of making offensive or silly:
+  // long-named original author only recorded in levelinfo.conf.
+  // try to fit "Joe after Bob", "Joe (ed.)", then just "Joe"
+  if (!strEqual(level.author, leveldir_current->author))
+  {
+    setString(&mod_name, getStringCat3(leveldir_current->author,
+                                      " after ", level.author));
+
+    if (strlen(mod_name) > MAX_LEVEL_AUTHOR_LEN)
+      setString(&mod_name,
+               getStringCat2(leveldir_current->author, " (ed.)"));
+
+    if (strlen(mod_name) > MAX_LEVEL_AUTHOR_LEN)
+      setString(&mod_name, leveldir_current->author);
+
+    strncpy(level.author, mod_name, MAX_LEVEL_AUTHOR_LEN);
+
+    // less worried about truncation here
+    setString(&mod_name, getStringCat2("Mod: ", level.name));
+    strncpy(level.name, mod_name, MAX_LEVEL_NAME_LEN);
+  }
 }
 
 static void CopyPlayfield(short src[MAX_LEV_FIELDX][MAX_LEV_FIELDY],
@@ -6566,8 +7300,11 @@ 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;
+
+      if (change->action_element == element_from)
+       change->action_element = element_to;
 
       for (y = 0; y < 3; y++)
        for (x = 0; x < 3; x++)
@@ -6612,13 +7349,13 @@ static boolean CopyCustomElement(int element_old, int element_new,
   }
   else if (IS_CUSTOM_ELEMENT(element_old) && !IS_CUSTOM_ELEMENT(element_new))
   {
-    Request("Please choose custom element !", REQ_CONFIRM);
+    Request("Please choose custom element!", REQ_CONFIRM);
 
     return FALSE;
   }
   else if (IS_GROUP_ELEMENT(element_old) && !IS_GROUP_ELEMENT(element_new))
   {
-    Request("Please choose group element !", REQ_CONFIRM);
+    Request("Please choose group element!", REQ_CONFIRM);
 
     return FALSE;
   }
@@ -6743,11 +7480,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));
 
@@ -6841,7 +7580,7 @@ static void CopyCustomElementPropertiesToGame(int element)
 
   if (level.use_custom_template)
   {
-    if (Request("Copy and modify level template ?", REQ_ASK))
+    if (Request("Copy and modify level template?", REQ_ASK))
     {
       level.use_custom_template = FALSE;
       ModifyGadget(level_editor_gadget[GADGET_ID_CUSTOM_USE_TEMPLATE],
@@ -6895,6 +7634,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];
@@ -7001,10 +7741,55 @@ void CheckElementDescriptions()
       Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i));
 }
 
+static boolean playfield_area_changed = FALSE;
+
 void DrawLevelEd()
 {
+  int old_sx = SX;
+  int old_sy = SY;
+  int old_sxsize = SXSIZE;
+  int old_sysize = SYSIZE;
+
+  StopAnimation();
+
   CloseDoor(DOOR_CLOSE_ALL);
+
+#if 1
+  FadeOut(REDRAW_FIELD);
+  // FadeOut(REDRAW_ALL);
+#endif
+
+#if 1
+  /* needed after playing if editor playfield area has different size */
+  ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+#endif
+
+#if 1
+  /* needed if different viewport properties defined for editor */
+  ChangeViewportPropertiesIfNeeded();
+#endif
+
+  if (old_sx != SX ||
+      old_sy != SY ||
+      old_sxsize != SXSIZE ||
+      old_sysize != SYSIZE)
+  {
+    playfield_area_changed = TRUE;
+
+#if 0
+    printf("::: %d, %d, %d, %d != %d, %d, %d, %d\n",
+          old_sx, old_sy, old_sxsize, old_sysize,
+          SX, SY, SXSIZE, SYSIZE);
+#endif
+  }
+  else
+    playfield_area_changed = FALSE;
+
+#if 1
+  OpenDoor(DOOR_OPEN_1 | DOOR_OPEN_2 | DOOR_NO_DELAY);
+#else
   OpenDoor(DOOR_OPEN_2 | DOOR_NO_DELAY);
+#endif
 
 #if DEBUG
   CheckElementDescriptions();
@@ -7020,6 +7805,7 @@ void DrawLevelEd()
   else
   {
     edit_mode = ED_MODE_DRAWING;
+    edit_mode_levelinfo = ED_MODE_LEVELINFO_LEVEL;
     edit_mode_properties = ED_MODE_PROPERTIES_INFO;
 
     ResetUndoBuffer();
@@ -7029,8 +7815,19 @@ void DrawLevelEd()
   }
 
   /* copy default editor door content to main double buffer */
+#if 1
+  BlitBitmap(graphic_info[IMG_BACKGROUND_PALETTE].bitmap, drawto,
+            graphic_info[IMG_BACKGROUND_PALETTE].src_x,
+            graphic_info[IMG_BACKGROUND_PALETTE].src_y,
+            DXSIZE, DYSIZE, DX, DY);
+#else
   BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
             DOOR_GFX_PAGEX6, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE, DX, DY);
+#endif
+
+#if 0
+  printf("::: %d, %d  /  %d, %d\n", VX, VY, EX, EY);
+#endif
 
   /* draw bigger door */
   DrawSpecialEditorDoor();
@@ -7041,9 +7838,16 @@ void DrawLevelEd()
 
   redraw_mask |= REDRAW_ALL;
 
+#if 1
+  FreeLevelEditorGadgets();
+  CreateLevelEditorGadgets();
+#endif
+
   ReinitializeElementList();           /* update dynamic level element list */
   ReinitializeElementListButtons();    /* custom element may look different */
 
+  InitElementPropertiesGfxElement();
+
 #if 1
   UnmapAllGadgets();
 #else
@@ -7051,13 +7855,36 @@ void DrawLevelEd()
 #endif
   MapControlButtons();
 
+#if 0
+  FadeOut(REDRAW_FIELD);
+#endif
+
   DrawEditModeWindow();
 
+#if 1
+  FadeIn(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+#else
+  FadeIn(REDRAW_FIELD);
+  // FadeIn(REDRAW_ALL);
+#endif
+
   /* copy actual editor door content to door double buffer for OpenDoor() */
+#if 1
+  BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+#else
   BlitBitmap(drawto, bitmap_db_door,
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
+#endif
+
+#if 0
+  /* draw new control window (with border) to window */
+  redraw_mask |= REDRAW_ALL;
+  BackToFront();
+#endif
 
+#if 0
   OpenDoor(DOOR_OPEN_1);
+#endif
 }
 
 static void AdjustDrawingAreaGadgets()
@@ -7103,14 +7930,24 @@ static void AdjustDrawingAreaGadgets()
   xoffset = (ed_fieldx == MAX_ED_FIELDX ? ED_SCROLLBUTTON_XSIZE : 0);
   yoffset = (ed_fieldy == MAX_ED_FIELDY ? ED_SCROLLBUTTON_YSIZE : 0);
 
+#if 1
+  x = SX + scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_RIGHT].x + xoffset;
+  y = SX + scrollbutton_pos[ED_SCROLLBUTTON_ID_AREA_DOWN].y + yoffset;
+#else
   x = SX + scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_RIGHT].x + xoffset;
   y = SX + scrollbutton_info[ED_SCROLLBUTTON_ID_AREA_DOWN].y + yoffset;
+#endif
 
   ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_RIGHT], GDI_X, x, GDI_END);
   ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_DOWN], GDI_Y, y, GDI_END);
 
-  width = scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].width + xoffset;
+#if 1
+  width  = scrollbar_pos[ED_SCROLLBAR_ID_AREA_HORIZONTAL].width + xoffset;
+  height = scrollbar_pos[ED_SCROLLBAR_ID_AREA_VERTICAL].height + yoffset;
+#else
+  width  = scrollbar_info[ED_SCROLLBAR_ID_AREA_HORIZONTAL].width + xoffset;
   height = scrollbar_info[ED_SCROLLBAR_ID_AREA_VERTICAL].height + yoffset;
+#endif
 
   ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_HORIZONTAL],
               GDI_WIDTH, width,
@@ -7309,9 +8146,9 @@ static void DrawDrawingWindow()
   stick_element_properties_window = FALSE;
 
   SetMainBackgroundImage(IMG_UNDEFINED);
-  ClearWindow();
+  ClearField();
 
-  UnmapLevelEditorWindowGadgets();
+  UnmapLevelEditorFieldGadgets();
   UnmapLevelEditorToolboxCustomGadgets();
 
   AdjustDrawingAreaGadgets();
@@ -7325,50 +8162,190 @@ static void DrawDrawingWindow()
   MapLevelEditorToolboxDrawingGadgets();
 }
 
-static void DrawLevelInfoWindow()
+static int getTabulatorBarWidth()
 {
-  int i;
-
-  stick_element_properties_window = FALSE;
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
+  struct GadgetInfo *gd_gi4 = level_editor_gadget[GADGET_ID_PROPERTIES_CHANGE];
 
-  SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
-  ClearWindow();
-  UnmapLevelEditorWindowGadgets();
+  return gd_gi4->x - gd_gi1->x + gd_gi4->width;
+}
 
-#if 0
-  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings");
-  DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings");
+static void DrawLevelInfoTabulatorGadgets()
+{
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_LEVELINFO_LEVEL];
+  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_LEVELINFO_LEVEL;
+  int id_last  = ED_TEXTBUTTON_ID_LEVELINFO_EDITOR;
+#if 1
 #else
-  DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
-          "Level Settings", FONT_TITLE_1);
-  DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS,
-          "Editor Settings", FONT_TITLE_1);
+  int max_tabs = 2;
 #endif
+  int i;
 
-  /* draw counter gadgets */
-  for (i = ED_COUNTER_ID_LEVEL_FIRST; i <= ED_COUNTER_ID_LEVEL_LAST; i++)
-    MapCounterButtons(i);
+  for (i = id_first; i <= id_last; i++)
+  {
+    int gadget_id = textbutton_info[i].gadget_id;
+    struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+    boolean active = (i != edit_mode_levelinfo);
 
-  /* draw selectbox gadgets */
+    /* draw background line below tabulator button */
+    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);
+
+    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_gi1->x, gd_gi1->y + gd_gi1->height + 1,
+                 getTabulatorBarWidth(), 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 DrawPropertiesTabulatorGadgets()
+{
+  struct GadgetInfo *gd_gi1 = level_editor_gadget[GADGET_ID_PROPERTIES_INFO];
+  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 two config tabulators for player elements */
+  if (ELEM_IS_PLAYER(properties_element))
+    id_last = ED_TEXTBUTTON_ID_PROPERTIES_CONFIG_2;
+
+  /* draw two config and one "change" tabulator for custom elements */
+  if (IS_CUSTOM_ELEMENT(properties_element))
+    id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE;
+
+  for (i = id_first; i <= id_last; i++)
+  {
+    int gadget_id = textbutton_info[i].gadget_id;
+    struct GadgetInfo *gi = level_editor_gadget[gadget_id];
+    boolean active = (i != edit_mode_properties);
+
+    /* use "config 1" and "config 2" instead of "config" for players and CEs */
+    if (i == ED_TEXTBUTTON_ID_PROPERTIES_CONFIG &&
+       (ELEM_IS_PLAYER(properties_element) ||
+        IS_CUSTOM_ELEMENT(properties_element)))
+      continue;
+
+    /* draw background line below tabulator button */
+    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);
+
+    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_gi1->x, gd_gi1->y + gd_gi1->height + 1,
+                 getTabulatorBarWidth(), 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 DrawLevelInfoLevel()
+{
+  int i;
+
+  /* draw counter gadgets */
+  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 text input gadgets */
+  for (i = ED_TEXTINPUT_ID_LEVEL_FIRST; i <= ED_TEXTINPUT_ID_LEVEL_LAST; i++)
+    MapTextInputGadget(i);
+}
+
+static void DrawLevelInfoEditor()
+{
+  int i;
+
+  /* draw counter gadgets */
+  for (i = ED_COUNTER_ID_EDITOR_FIRST; i <= ED_COUNTER_ID_EDITOR_LAST; i++)
+    MapCounterButtons(i);
+
   /* draw checkbutton gadgets */
-  for (i=ED_CHECKBUTTON_ID_LEVEL_FIRST; i <= ED_CHECKBUTTON_ID_LEVEL_LAST; i++)
+  for (i=ED_CHECKBUTTON_ID_EDITOR_FIRST; i<= ED_CHECKBUTTON_ID_EDITOR_LAST; i++)
     MapCheckbuttonGadget(i);
 
   /* draw radiobutton gadgets */
-  for (i=ED_RADIOBUTTON_ID_LEVEL_FIRST; i <= ED_RADIOBUTTON_ID_LEVEL_LAST; i++)
+  for (i=ED_RADIOBUTTON_ID_EDITOR_FIRST; i<= ED_RADIOBUTTON_ID_EDITOR_LAST; i++)
     MapRadiobuttonGadget(i);
 
-  /* draw text input gadgets */
-  for (i = ED_TEXTINPUT_ID_LEVEL_FIRST; i <= ED_TEXTINPUT_ID_LEVEL_LAST; i++)
-    MapTextInputGadget(i);
-
   /* draw drawing area */
   MapDrawingArea(ED_DRAWING_ID_RANDOM_BACKGROUND);
 }
 
+static void DrawLevelInfoWindow()
+{
+  stick_element_properties_window = FALSE;
+
+  UnmapLevelEditorFieldGadgets();
+
+  SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
+  ClearField();
+
+#if 1
+#if 1
+  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Global Settings");
+#else
+  DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Level Settings");
+  DrawTextSCentered(ED_SETTINGS2_YPOS, FONT_TITLE_1, "Editor Settings");
+#endif
+#else
+  DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
+          "Level Settings", FONT_TITLE_1);
+  DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS2_YPOS,
+          "Editor Settings", FONT_TITLE_1);
+#endif
+
+  DrawLevelInfoTabulatorGadgets();
+
+  if (edit_mode_levelinfo == ED_MODE_LEVELINFO_LEVEL)
+    DrawLevelInfoLevel();
+  else /* (edit_mode_levelinfo == ED_MODE_LEVELINFO_EDITOR) */
+    DrawLevelInfoEditor();
+}
+
 static void DrawCustomContentArea()
 {
   int id = ED_DRAWING_ID_CUSTOM_CONTENT;
@@ -7519,6 +8496,35 @@ static void DrawGroupElementArea(int element)
   MapDrawingArea(id);
 }
 
+static void DrawPlayerInitialInventoryArea(int element)
+{
+  int player_nr = GET_PLAYER_NR(element);
+  int num_elements = level.initial_inventory_size[player_nr];
+  int id = ED_DRAWING_ID_INVENTORY_CONTENT;
+  int sx = SX + drawingarea_info[id].x - MINI_TILEX / 2;
+  int sy = SY + drawingarea_info[id].y - MINI_TILEY / 2;
+  int xsize = MAX_INITIAL_INVENTORY_SIZE;
+  int ysize = 1;
+
+  /* determine horizontal position to the right of specified gadget */
+  if (drawingarea_info[id].gadget_id_align != GADGET_ID_NONE)
+    sx += (right_gadget_border[drawingarea_info[id].gadget_id_align] +
+          ED_DRAWINGAREA_TEXT_DISTANCE);
+
+  /* determine horizontal offset for leading text */
+  if (drawingarea_info[id].text_left != NULL)
+    sx += getTextWidthForDrawingArea(drawingarea_info[id].text_left);
+
+  UnmapDrawingArea(id);
+
+  ModifyEditorDrawingArea(id, num_elements, 1);
+
+  /* delete content areas in case of reducing number of them */
+  DrawBackground(sx, sy, (xsize + 1) * MINI_TILEX, (ysize + 1) * MINI_TILEY);
+
+  MapDrawingArea(id);
+}
+
 static void DrawEnvelopeTextArea(int envelope_nr)
 {
   int id = ED_TEXTAREA_ID_ENVELOPE_INFO;
@@ -7566,65 +8572,22 @@ static int PrintElementDescriptionFromFile(char *filename, int start_line)
   int sy = SY + pad_y + start_line * font_height;
   int max_chars_per_line = (SXSIZE - 2 * pad_x) / font_width;
   int max_lines_per_screen = (SYSIZE - pad_y) / font_height - 1;
+  int max_lines_drawable = max_lines_per_screen - start_line;
 
-  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_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;
+#if 0
+  printf("::: SYSIZE == %d [%d / %d / %d]\n", SYSIZE,
+        max_chars_per_line, max_lines_per_screen, max_lines_drawable);
 #endif
-  int i;
-
-  /* draw additional "change" tabulator for custom elements */
-  if (IS_CUSTOM_ELEMENT(properties_element))
-    id_last = ED_TEXTBUTTON_ID_PROPERTIES_CHANGE;
-
-  for (i = id_first; i <= id_last; i++)
-  {
-    int gadget_id = textbutton_info[i].gadget_id;
-    struct GadgetInfo *gi = level_editor_gadget[gadget_id];
-    boolean active = (i != edit_mode_properties);
-
-    /* use "config 1" and "config 2" instead of "config" */
-    if (i == ED_TEXTBUTTON_ID_PROPERTIES_CONFIG &&
-       IS_CUSTOM_ELEMENT(properties_element))
-      continue;
-
-    /* draw background line below tabulator button */
-    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);
-
-    ModifyGadget(gi, GDI_ACTIVE, active, GDI_END);
-    MapTextbuttonGadget(i);
-  }
+  if (start_line >= max_lines_per_screen)
+    return FALSE;
 
 #if 1
-  /* 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,
-                 gd_gi4->x - gd_gi1->x + gd_gi4->width, ED_GADGET_DISTANCE,
-                 tab_color);
+  return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+                     max_lines_drawable, 0, -1, TRUE, FALSE, FALSE);
 #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);
+  return DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
+                     max_lines_per_screen, 0, -1, TRUE, FALSE, FALSE);
 #endif
 }
 
@@ -7667,6 +8630,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"                      },
@@ -7688,8 +8652,8 @@ static void DrawPropertiesInfo()
     { -1,                      NULL                                    }
   };
   char *filename = getElementDescriptionFilename(properties_element);
-  char *percentage_text = "In this level:";
-  char *properties_text = "Standard properties:";
+  char *percentage_text = "In this level: ";
+  char *properties_text = "Standard properties: ";
   float percentage;
   int num_elements_in_level;
   int num_standard_properties = 0;
@@ -7840,6 +8804,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 },
@@ -7891,7 +8856,10 @@ static boolean checkPropertiesConfig(int element)
       HAS_EDITOR_CONTENT(element) ||
       CAN_GROW(element) ||
       COULD_MOVE_INTO_ACID(element) ||
-      MAYBE_DONT_COLLIDE_WITH(element))
+      MAYBE_DONT_COLLIDE_WITH(element) ||
+      element == EL_SOKOBAN_OBJECT ||
+      element == EL_SOKOBAN_FIELD_EMPTY ||
+      element == EL_SOKOBAN_FIELD_FULL)
     return TRUE;
   else
     for (i = 0; elements_with_counter[i].element != -1; i++)
@@ -7984,48 +8952,75 @@ static void DrawPropertiesConfig()
 
     /* these properties can be set for every player individually */
 
-    drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
-      &level.start_element[player_nr];
-    drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
-      &level.artwork_element[player_nr];
-    drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
-      &level.explosion_element[player_nr];
-
-    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_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);
-    MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT);
-    MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT);
-
-    MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED);
+    if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_1)
+    {
+      drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
+       &level.start_element[player_nr];
+      drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
+       &level.artwork_element[player_nr];
+      drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
+       &level.explosion_element[player_nr];
+
+      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);
+      MapDrawingArea(ED_DRAWING_ID_ARTWORK_ELEMENT);
+      MapDrawingArea(ED_DRAWING_ID_EXPLOSION_ELEMENT);
+
+      MapSelectboxGadget(ED_SELECTBOX_ID_PLAYER_SPEED);
+    }
+    else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)
+    {
+      drawingarea_info[ED_DRAWING_ID_INVENTORY_CONTENT].value =
+       &level.initial_inventory_content[player_nr][0];
+
+      counterbutton_info[ED_COUNTER_ID_INVENTORY_SIZE].value =
+       &level.initial_inventory_size[player_nr];
+
+      checkbutton_info[ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY].value =
+       &level.use_initial_inventory[player_nr];
+
+      /* draw checkbutton gadgets */
+      MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_INITIAL_INVENTORY);
+
+      /* draw counter gadgets */
+      MapCounterButtons(ED_COUNTER_ID_INVENTORY_SIZE);
+
+      /* draw drawing area gadgets */
+      DrawPlayerInitialInventoryArea(properties_element);
+    }
   }
 
   if (IS_GEM(properties_element))
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
 
+  if (properties_element == EL_EM_DYNAMITE)
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_EXPLODES_BY_FIRE);
+
   if (COULD_MOVE_INTO_ACID(properties_element) &&
       !ELEM_IS_PLAYER(properties_element) &&
       (!IS_CUSTOM_ELEMENT(properties_element) ||
@@ -8058,6 +9053,11 @@ static void DrawPropertiesConfig()
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_GROW_INTO_DIGGABLE);
   }
 
+  if (properties_element == EL_SOKOBAN_OBJECT ||
+      properties_element == EL_SOKOBAN_FIELD_EMPTY ||
+      properties_element == EL_SOKOBAN_FIELD_FULL)
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_AUTO_EXIT_SOKOBAN);
+
   if (IS_ENVELOPE(properties_element))
   {
     int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
@@ -8172,6 +9172,7 @@ static void DrawPropertiesChangeDrawingAreas()
   {
     MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TARGET);
     MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_TRIGGER);
+    MapDrawingArea(ED_DRAWING_ID_CUSTOM_CHANGE_ACTION);
 
     DrawCustomChangeContentArea();
   }
@@ -8226,7 +9227,7 @@ static void DrawEditorElementAnimation(int x, int y)
               ANIM_MODE(graphic) == ANIM_CE_SCORE ?
               custom_element.collect_score_initial : FrameCounter);
 
-  DrawGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
+  DrawFixedGraphicAnimationExt(drawto, x, y, graphic, frame, NO_MASKING);
 }
 
 static void DrawEditorElementName(int x, int y, int element)
@@ -8282,17 +9283,23 @@ static void DrawPropertiesWindow()
   stick_element_properties_window = FALSE;
 
   /* make sure that previous properties edit mode exists for this element */
+  if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG_2 &&
+      !IS_CUSTOM_ELEMENT(properties_element))
+    edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_2;
+
   if (edit_mode_properties > ED_MODE_PROPERTIES_CONFIG &&
+      !ELEM_IS_PLAYER(properties_element) &&
       !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))
+      (ELEM_IS_PLAYER(properties_element) ||
+       IS_CUSTOM_ELEMENT(properties_element)))
     edit_mode_properties = ED_MODE_PROPERTIES_CONFIG_1;
 
   CopyElementPropertiesToEditor(properties_element);
 
-  UnmapLevelEditorWindowGadgets();
+  UnmapLevelEditorFieldGadgets();
   UnmapLevelEditorToolboxDrawingGadgets();
   UnmapLevelEditorToolboxCustomGadgets();
 
@@ -8301,9 +9308,9 @@ static void DrawPropertiesWindow()
     MapLevelEditorToolboxCustomGadgets();
 
   SetMainBackgroundImage(IMG_BACKGROUND_EDITOR);
-  ClearWindow();
+  ClearField();
 
-#if 0
+#if 1
   DrawTextSCentered(ED_SETTINGS1_YPOS, FONT_TITLE_1, "Element Settings");
 #else
   DrawText(SX + ED_SETTINGS2_XPOS, SY + ED_SETTINGS1_YPOS,
@@ -8335,8 +9342,12 @@ static void DrawPropertiesWindow()
 
 static void UpdateCustomElementGraphicGadgets()
 {
+  struct ElementInfo *ei = &element_info[properties_element];
   int i;
 
+  ei->gfx_element = (ei->use_gfx_element ? ei->gfx_element_initial :
+                    properties_element);
+
   ModifyEditorElementList();
   RedrawDrawingElements();
 
@@ -8418,9 +9429,20 @@ static int getBeltFromNrAndOpenDirection(int nr, int direction)
                  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)
@@ -8451,7 +9473,7 @@ static int getPoolFromOpenDirection(int direction)
   return EL_EMPTY;
 }
 
-static int getPoolFromOpenDirection2(int direction, int help_element)
+static int getPoolFromOpenDirectionExt(int direction, int help_element)
 {
   int element = getPoolFromOpenDirection(direction);
   int help_direction = getOpenDirectionFromPool(help_element);
@@ -8475,7 +9497,114 @@ static int getPoolFromOpenDirection2(int direction, int help_element)
 
 static int getPoolFromOpenDirectionNotEmpty(int direction, int element_old)
 {
-  int element_new = getPoolFromOpenDirection2(direction, 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);
 }
@@ -8490,8 +9619,8 @@ static int getClosedTube(int x, int y)
     { 0, +1 }
   };
   int element_old = IntelliDrawBuffer[x][y];
-  int tube_direction_old = getOpenDirectionFromTube(element_old);
-  int tube_direction_new = MV_NONE;
+  int direction_old = getOpenDirectionFromTube(element_old);
+  int direction_new = MV_NONE;
   int i;
 
   for (i = 0; i < NUM_DIRECTIONS; i++)
@@ -8502,28 +9631,30 @@ static int getClosedTube(int x, int y)
     int dir_opposite = MV_DIR_OPPOSITE(dir);
 
     if (IN_LEV_FIELD(xx, yy) && IS_TUBE(IntelliDrawBuffer[xx][yy]) &&
-       (tube_direction_old & dir) &&
+       (direction_old & dir) &&
        (getOpenDirectionFromTube(IntelliDrawBuffer[xx][yy]) & dir_opposite))
-      tube_direction_new |= dir;
+      direction_new |= dir;
   }
 
-  return getTubeFromOpenDirectionNotEmpty(tube_direction_new, element_old);
+  return getTubeFromOpenDirectionNotEmpty(direction_new, element_old);
 }
 
 static int getClosedBelt(int x, int y)
 {
-  static int xy[2][2] =
+  static int xy[4][2] =
   {
     { -1, 0 },
     { +1, 0 },
+    { 0, -1 },
+    { 0, +1 }
   };
   int element_old = IntelliDrawBuffer[x][y];
-  int belt_nr = getBeltNrFromBeltElement(element_old);
-  int belt_direction_old = getOpenDirectionFromBelt(element_old);
-  int belt_direction_new = MV_NONE;
+  int nr = getBeltNrFromBeltElement(element_old);
+  int direction_old = getOpenDirectionFromBelt(element_old);
+  int direction_new = MV_NONE;
   int i;
 
-  for (i = 0; i < 2; i++)
+  for (i = MV_BIT_LEFT; i <= MV_BIT_RIGHT; i++)
   {
     int xx = x + xy[i][0];
     int yy = y + xy[i][1];
@@ -8531,12 +9662,12 @@ static int getClosedBelt(int x, int y)
     int dir_opposite = MV_DIR_OPPOSITE(dir);
 
     if (IN_LEV_FIELD(xx, yy) && IS_BELT(IntelliDrawBuffer[xx][yy]) &&
-       (belt_direction_old & dir) &&
+       (direction_old & dir) &&
        (getOpenDirectionFromBelt(IntelliDrawBuffer[xx][yy]) & dir_opposite))
-      belt_direction_new |= dir;
+      direction_new |= dir;
   }
 
-  return getBeltFromNrAndOpenDirection(belt_nr, belt_direction_new);
+  return getBeltFromNrAndOpenDirection(nr, direction_new);
 }
 
 static int getClosedPool(int x, int y)
@@ -8549,8 +9680,8 @@ static int getClosedPool(int x, int y)
     { 0, +1 }
   };
   int element_old = IntelliDrawBuffer[x][y];
-  int pool_direction_old = getOpenDirectionFromPool(element_old);
-  int pool_direction_new = MV_NONE;
+  int direction_old = getOpenDirectionFromPool(element_old);
+  int direction_new = MV_NONE;
   int i;
 
   for (i = 0; i < NUM_DIRECTIONS; i++)
@@ -8562,12 +9693,102 @@ static int getClosedPool(int x, int y)
 
     if (IN_LEV_FIELD(xx, yy) &&
        IS_ACID_POOL_OR_ACID(IntelliDrawBuffer[xx][yy]) &&
-       (pool_direction_old & dir) &&
+       (direction_old & dir) &&
        (getOpenDirectionFromPool(IntelliDrawBuffer[xx][yy]) & dir_opposite))
-      pool_direction_new |= dir;
+      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 getPoolFromOpenDirectionNotEmpty(pool_direction_new, element_old);
+  return getChipFromOpenDirectionNotEmpty(direction_new, element_old);
 }
 
 static void SetElementSimple(int x, int y, int element, boolean change_level)
@@ -8584,9 +9805,34 @@ static void SetElementSimple(int x, int y, int element, boolean change_level)
     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)
+                                 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];
@@ -8601,18 +9847,11 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
 
   if (IS_TUBE(new_element))
   {
-    static int xy[4][2] =
-    {
-      { -1, 0 },
-      { +1, 0 },
-      { 0, -1 },
-      { 0, +1 }
-    };
     int last_element_new = EL_UNDEFINED;
     int direction = MV_NONE;
     int i;
 
-    /* if existing element is tube, keep all existing tube directions */
+    /* if old element is of same kind, keep all existing directions */
     if (IS_TUBE(old_element))
       direction |= getOpenDirectionFromTube(old_element);
 
@@ -8638,36 +9877,57 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
 
     new_element = getTubeFromOpenDirectionNotEmpty(direction, new_element);
 
-    /* reduce connections of neighbour tube elements to minimal connections */
     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++)
     {
-      /* set neighbour tube elements to newly determined tube connections */
-      SetElementSimple(x, y, new_element, change_level);
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
 
-      /* remove all open tube connections of neighbour tube elements */
-      new_element = getClosedTube(x, y);
-      last_element_new = getClosedTube(last_x, last_y);
+      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;
 
-      /* set neighbour tube elements to new, minimized tube connections */
-      SetElementSimple(x, y, new_element, change_level);
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
+       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))
   {
-    static int xy[4][2] =
-    {
-      { -1, 0 },
-      { +1, 0 },
-      { 0, -1 },
-      { 0, +1 }
-    };
     int last_element_new = EL_UNDEFINED;
     int direction = MV_NONE;
     int i;
 
-    /* if existing element is pool, keep all existing pool directions */
+    /* if old element is of same kind, keep all existing directions */
     if (IS_ACID_POOL_OR_ACID(old_element))
       direction |= getOpenDirectionFromPool(old_element);
 
@@ -8691,111 +9951,176 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
       }
     }
 
-#if 1
+    /* special corrections needed for intuitively correct acid pool drawing */
     if (last_element_new == EL_EMPTY)
-      last_element_new = EL_ACID;
-#endif
+      last_element_new = new_element;
+    else if (last_element_new != EL_UNDEFINED)
+      new_element = last_element_new;
 
-#if 1
-    if (last_element_new != EL_UNDEFINED)
-      new_element = getPoolFromOpenDirectionNotEmpty(direction,
-                                                    last_element_new);
-    else
-      new_element = getPoolFromOpenDirectionNotEmpty(direction, new_element);
-#else
     new_element = getPoolFromOpenDirectionNotEmpty(direction, new_element);
-#endif
 
-    /* reduce connections of neighbour pool elements to minimal connections */
     if (last_element_new != EL_UNDEFINED)
-    {
-      /* set neighbour pool elements to newly determined pool connections */
-      SetElementSimple(x, y, new_element, change_level);
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
-
-      /* remove all open pool connections of neighbour pool elements */
-      new_element = getClosedPool(x, y);
-      last_element_new = getClosedPool(last_x, last_y);
-
-      /* set neighbour pool elements to new, minimized pool connections */
-      SetElementSimple(x, y, new_element, change_level);
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
-    }
+      MergeAndCloseNeighbourElements(x, y, &new_element,
+                                    last_x, last_y, &last_element_new,
+                                    getClosedPool, change_level);
   }
-  else if (IS_BELT(new_element))
+  else if (IS_EMC_PILLAR(new_element))
   {
     int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
 
-    if (((last_x == x - 1 && last_y == y) ||
-        (last_x == x + 1 && last_y == y)) && IN_LEV_FIELD(last_x, last_y) &&
-       IS_BELT(IntelliDrawBuffer[last_x][last_y]))
+    /* 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 belt_nr = getBeltNrFromBeltElement(new_element);
-      int belt_middle = getBeltElementFromBeltNrAndBeltDir(belt_nr, MV_NONE);
+      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;
 
-      new_element = belt_middle;
-      last_element_new = belt_middle;
+       last_element_new = getPillarFromOpenDirection(last_direction_new);
+
+       direction |= dir;
+      }
     }
 
-    /* reduce connections of neighbour belt elements to minimal connections */
+    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++)
     {
-      /* set neighbour belt elements to newly determined belt connections */
-      SetElementSimple(x, y, new_element, change_level);
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
+      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;
 
-      /* remove all open belt connections of neighbour belt elements */
-      new_element = getClosedBelt(x, y);
-      last_element_new = getClosedBelt(last_x, last_y);
+       last_element_new = getSteel2FromOpenDirection(last_direction_new);
 
-      /* set neighbour belt elements to new, minimized belt connections */
-      SetElementSimple(x, y, new_element, change_level);
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
+       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 (new_element == EL_EMC_WALL_1 ||
-          new_element == EL_EMC_WALL_2 ||
-          new_element == EL_EMC_WALL_3)
+  else if (IS_SP_CHIP(new_element))
   {
     int last_element_new = EL_UNDEFINED;
+    int direction = MV_NONE;
+    int i;
 
-    if (last_x == x && last_y == y - 1 && IN_LEV_FIELD(last_x, last_y) &&
-       (IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_1 ||
-        IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_2 ||
-        IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_3))
+    /* (do not keep existing directions, regardless of kind of old element) */
+
+    for (i = 0; i < NUM_DIRECTIONS; i++)
     {
-      if (IN_LEV_FIELD(last_x, last_y - 1))
+      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]))
       {
-       if (IntelliDrawBuffer[last_x][last_y - 1] != EL_EMC_WALL_1 &&
-           IntelliDrawBuffer[last_x][last_y - 1] != EL_EMC_WALL_2)
-         last_element_new = EL_EMC_WALL_1;
-       else if (IntelliDrawBuffer[last_x][last_y - 1] == EL_EMC_WALL_1 ||
-                IntelliDrawBuffer[last_x][last_y - 1] == EL_EMC_WALL_2)
-         last_element_new = EL_EMC_WALL_2;
-      }
+       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;
 
-      new_element = EL_EMC_WALL_3;
+       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);
+       }
+      }
     }
-    else if (last_x == x && last_y == y + 1 && IN_LEV_FIELD(last_x, last_y) &&
-            (IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_1 ||
-             IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_2 ||
-             IntelliDrawBuffer[last_x][last_y] == EL_EMC_WALL_3))
+
+    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++)
     {
-      if (IN_LEV_FIELD(last_x, last_y + 1))
-      {
-       if (IntelliDrawBuffer[last_x][last_y + 1] != EL_EMC_WALL_2 &&
-           IntelliDrawBuffer[last_x][last_y + 1] != EL_EMC_WALL_3)
-         last_element_new = EL_EMC_WALL_3;
-       else if (IntelliDrawBuffer[last_x][last_y + 1] == EL_EMC_WALL_2 ||
-                IntelliDrawBuffer[last_x][last_y + 1] == EL_EMC_WALL_3)
-         last_element_new = EL_EMC_WALL_2;
-      }
+      int xx = x + xy[i][0];
+      int yy = y + xy[i][1];
 
-      new_element = EL_EMC_WALL_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 (last_element_new != EL_UNDEFINED)
-      SetElementSimple(last_x, last_y, last_element_new, change_level);
+    if (!connected_drawing)
+      ResolveGroupElement(new_element);
+
+    new_element = GetElementFromGroupElement(new_element);
   }
   else if (IS_BELT_SWITCH(old_element))
   {
@@ -8854,7 +10179,107 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
 
       { -1,                            -1                              },
     };
-    int i;
+    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
+      },
+
+      {
+       EL_YAMYAM_UP,
+       EL_YAMYAM_RIGHT,
+       EL_YAMYAM_DOWN,
+       EL_YAMYAM_LEFT
+      },
+
+      {
+       EL_ARROW_UP,
+       EL_ARROW_RIGHT,
+       EL_ARROW_DOWN,
+       EL_ARROW_LEFT
+      },
+
+      {
+       EL_SP_PORT_UP,
+       EL_SP_PORT_RIGHT,
+       EL_SP_PORT_DOWN,
+       EL_SP_PORT_LEFT
+      },
+
+      {
+       EL_SP_GRAVITY_PORT_UP,
+       EL_SP_GRAVITY_PORT_RIGHT,
+       EL_SP_GRAVITY_PORT_DOWN,
+       EL_SP_GRAVITY_PORT_LEFT
+      },
+
+      {
+       EL_SP_GRAVITY_ON_PORT_UP,
+       EL_SP_GRAVITY_ON_PORT_RIGHT,
+       EL_SP_GRAVITY_ON_PORT_DOWN,
+       EL_SP_GRAVITY_ON_PORT_LEFT
+      },
+
+      {
+       EL_SP_GRAVITY_OFF_PORT_UP,
+       EL_SP_GRAVITY_OFF_PORT_RIGHT,
+       EL_SP_GRAVITY_OFF_PORT_DOWN,
+       EL_SP_GRAVITY_OFF_PORT_LEFT
+      },
+
+      {
+       EL_MOLE_UP,
+       EL_MOLE_RIGHT,
+       EL_MOLE_DOWN,
+       EL_MOLE_LEFT
+      },
+
+      {
+       EL_BALLOON_SWITCH_UP,
+       EL_BALLOON_SWITCH_RIGHT,
+       EL_BALLOON_SWITCH_DOWN,
+       EL_BALLOON_SWITCH_LEFT
+      },
+
+      {
+       -1,
+       -1,
+       -1,
+       -1,
+      },
+    };
+    int i, j;
 
     for (i = 0; swappable_elements[i][0] != -1; i++)
     {
@@ -8864,6 +10289,20 @@ static void SetElementIntelliDraw(int x, int y, int new_element,
       if (old_element == element1 || old_element == element2)
        new_element = (old_element == element1 ? element2 : element1);
     }
+
+    for (i = 0; rotatable_elements[i][0] != -1; i++)
+    {
+      for (j = 0; j < 4; j++)
+      {
+       int element = rotatable_elements[i][j];
+
+       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);
+      }
+    }
   }
 
   SetElementSimple(x, y, new_element, change_level);
@@ -8880,22 +10319,28 @@ static void ResetIntelliDraw()
     for (y = 0; y < lev_fieldy; y++)
       IntelliDrawBuffer[x][y] = Feld[x][y];
 
-  SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE);
+  SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
 }
 
-static void SetElementExt(int x, int y, int element, boolean change_level)
+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);
+    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);
+  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)
@@ -8903,7 +10348,7 @@ static void DrawLineElement(int sx, int sy, int element, boolean change_level)
   int lx = sx + level_xpos;
   int ly = sy + level_ypos;
 
-  SetElementExt(lx, ly, element, change_level);
+  SetElementExt(lx, ly, element, change_level, -1);
 }
 
 static void DrawLine(int from_x, int from_y, int to_x, int to_y,
@@ -9094,7 +10539,11 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y,
 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
                         int button, int mode)
 {
+#if 1
+  static short brush_buffer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+#else
   static short brush_buffer[MAX_ED_FIELDX][MAX_ED_FIELDY];
+#endif
   static int brush_width, brush_height;
   static int last_cursor_x = -1, last_cursor_y = -1;
   static boolean delete_old_brush;
@@ -9275,7 +10724,10 @@ static void FloodFill(int from_x, int from_y, int fill_element)
 static int DrawLevelText(int sx, int sy, char letter, int mode)
 {
   static short delete_buffer[MAX_LEV_FIELDX];
-  static int start_sx, start_sy;
+  static int start_sx;
+#if 0
+  static int start_sy;
+#endif
   static int last_sx, last_sy;
   static boolean typing = FALSE;
   int letter_element = EL_CHAR_ASCII0 + letter;
@@ -9317,8 +10769,12 @@ static int DrawLevelText(int sx, int sy, char letter, int mode)
        DrawLevelText(0, 0, 0, TEXT_END);
 
       typing = TRUE;
-      start_sx = last_sx = sx;
-      start_sy = last_sy = sy;
+      start_sx = sx;
+#if 0
+      start_sy = sy;
+#endif
+      last_sx = sx;
+      last_sy = sy;
       DrawLevelText(sx, sy, 0, TEXT_SETCURSOR);
       break;
 
@@ -9448,6 +10904,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++)
   {
@@ -9471,20 +10931,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--;
       }
     }
@@ -9653,7 +11121,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
          }
 
 #if 1
-         SetElement(lx, ly, new_element);
+         SetElementButton(lx, ly, new_element, button);
 #else
          Feld[lx][ly] = new_element;
          DrawMiniElement(sx, sy, new_element);
@@ -9671,10 +11139,10 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
                             gi->y + sy * MINI_TILEY,
                             el2edimg(new_element));
        else
-         DrawGraphicExt(drawto,
-                        gi->x + sx * TILEX,
-                        gi->y + sy * TILEY,
-                        el2img(new_element), 0);
+         DrawFixedGraphicExt(drawto,
+                             gi->x + sx * TILEX,
+                             gi->y + sy * TILEY,
+                             el2img(new_element), 0);
 
        if (id == GADGET_ID_CUSTOM_GRAPHIC)
          new_element = GFX_ELEMENT(new_element);
@@ -9820,7 +11288,7 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
     if ((level_changed && pressed) || (!level_changed && released))
       return;
 
-    if (level_changed && !Request("Level has changed ! Discard changes ?",
+    if (level_changed && !Request("Level has changed! Discard changes?",
                                  REQ_ASK))
     {
       if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
@@ -9838,7 +11306,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
   if (counter_id == ED_COUNTER_ID_SELECT_LEVEL)
   {
       LoadLevel(level_nr);
+      LoadScore(level_nr);
+
       TapeErase();
+
       ResetUndoBuffer();
       DrawEditModeWindow();
 
@@ -9864,6 +11335,10 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
       CopyGroupElementPropertiesToGame(properties_element);
       break;
 
+    case ED_COUNTER_ID_INVENTORY_SIZE:
+      DrawPlayerInitialInventoryArea(properties_element);
+      break;
+
     case ED_COUNTER_ID_ENVELOPE_XSIZE:
     case ED_COUNTER_ID_ENVELOPE_YSIZE:
       DrawEnvelopeTextArea(-1);
@@ -9960,8 +11435,15 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
   int type_id = gi->custom_type_id;
   int i;
 
-  if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST &&
-      type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST)
+  if (type_id >= ED_TEXTBUTTON_ID_LEVELINFO_FIRST &&
+      type_id <= ED_TEXTBUTTON_ID_LEVELINFO_LAST)
+  {
+    edit_mode_levelinfo = gi->custom_type_id;
+
+    DrawLevelInfoWindow();
+  }
+  else if (type_id >= ED_TEXTBUTTON_ID_PROPERTIES_FIRST &&
+          type_id <= ED_TEXTBUTTON_ID_PROPERTIES_LAST)
   {
     edit_mode_properties = gi->custom_type_id;
 
@@ -9972,12 +11454,21 @@ static void HandleTextbuttonGadgets(struct GadgetInfo *gi)
     char *template_filename = getDefaultLevelFilename(-1);
     boolean new_template = !fileExists(template_filename);
 
+    /* backup original "level.field" (needed to track playfield changes) */
+    CopyPlayfield(level.field, FieldBackup);
+
+    /* "SaveLevelTemplate()" uses "level.field", so copy editor playfield */
+    CopyPlayfield(Feld, level.field);
+
     if (new_template ||
-       Request("Save this template and kill the old ?", REQ_ASK))
+       Request("Save this template and kill the old?", REQ_ASK))
       SaveLevelTemplate();
 
     if (new_template)
-      Request("Template saved !", REQ_CONFIRM);
+      Request("Template saved!", REQ_CONFIRM);
+
+    /* restore original "level.field" (needed to track playfield changes) */
+    CopyPlayfield(FieldBackup, level.field);
   }
   else if (type_id == ED_TEXTBUTTON_ID_ADD_CHANGE_PAGE &&
           custom_element.num_change_pages < MAX_CHANGE_PAGES)
@@ -10090,7 +11581,7 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
 
     if (level.use_custom_template && !fileExists(template_filename))
     {
-      Request("No level template found !", REQ_CONFIRM);
+      Request("No level template found!", REQ_CONFIRM);
 
       level.use_custom_template = FALSE;
       ModifyGadget(gi, GDI_CHECKED, FALSE, GDI_END);
@@ -10323,7 +11814,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
     case GADGET_ID_UNDO:
       if (undo_buffer_steps == 0)
       {
-       Request("Undo buffer empty !", REQ_CONFIRM);
+       Request("Undo buffer empty!", REQ_CONFIRM);
        break;
       }
 
@@ -10381,62 +11872,91 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case GADGET_ID_SAVE:
-      if (leveldir_current->readonly)
-      {
-       Request("This level is read only !", REQ_CONFIRM);
+    {
+      /* saving read-only levels into personal level set modifies global vars
+        "leveldir_current" and "level_nr"; restore them after saving level */
+      LevelDirTree *leveldir_former = leveldir_current;
+      int level_nr_former = level_nr;
+      char *level_filename;
+      boolean new_level;
+
+      if (leveldir_current->readonly &&
+         !PrepareSavingIntoPersonalLevelSet())
        break;
-      }
 
-      if (!LevelContainsPlayer())
-       Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
-      else
+      level_filename = getDefaultLevelFilename(level_nr);
+      new_level = !fileExists(level_filename);
+
+      if (new_level ||
+         Request("Save this level and kill the old?", REQ_ASK))
       {
-       char *level_filename = getDefaultLevelFilename(level_nr);
-       boolean new_level = !fileExists(level_filename);
+       if (leveldir_former->readonly)
+         ModifyLevelInfoForSavingIntoPersonalLevelSet(leveldir_former->name);
 
-       if (new_level ||
-           Request("Save this level and kill the old ?", REQ_ASK))
-       {
-         CopyPlayfield(Feld, level.field);
+       CopyPlayfield(Feld, level.field);
+       SaveLevel(level_nr);
 
-         SaveLevel(level_nr);
-       }
+       level.changed = FALSE;
 
        if (new_level)
-         Request("Level saved !", REQ_CONFIRM);
+       {
+         char level_saved_msg[64];
 
-       level.changed = FALSE;
+         if (leveldir_former->readonly)
+           sprintf(level_saved_msg,
+                   "Level saved as level %d into personal level set!",
+                   level_nr);
+         else
+           strcpy(level_saved_msg, "Level saved!");
+
+         Request(level_saved_msg, REQ_CONFIRM);
+       }
       }
+
+      /* "cd" back to copied-from levelset (in case of saved read-only level) */
+      leveldir_current = leveldir_former;
+      level_nr = level_nr_former;
+
       break;
+    }
 
     case GADGET_ID_TEST:
-      if (!LevelContainsPlayer())
-       Request("No Level without Gregor Mc Duffin please !", REQ_CONFIRM);
-      else
-      {
-       if (LevelChanged())
-         level.game_version = GAME_VERSION_ACTUAL;
+      if (LevelChanged())
+       level.game_version = GAME_VERSION_ACTUAL;
 
-       CopyPlayfield(level.field, FieldBackup);
-       CopyPlayfield(Feld, level.field);
+      CopyPlayfield(level.field, FieldBackup);
+      CopyPlayfield(Feld, level.field);
 
-       CopyNativeLevel_RND_to_Native(&level);
+      CopyNativeLevel_RND_to_Native(&level);
 
-       UnmapLevelEditorGadgets();
-       UndrawSpecialEditorDoor();
+      UnmapLevelEditorGadgets();
+      UndrawSpecialEditorDoor();
 
-       CloseDoor(DOOR_CLOSE_ALL);
+      CloseDoor(DOOR_CLOSE_ALL);
 
-       DrawCompleteVideoDisplay();
+#if 0
+      BackToFront();           /* force redraw of undrawn special door */
+#endif
 
-       level_editor_test_game = TRUE;
+#if 1
+      /* needed before playing if editor playfield area has different size */
+      ClearRectangle(drawto, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
+
+      redraw_mask = REDRAW_ALL;
+#endif
+
+#if 0
+      DrawCompleteVideoDisplay();
+#endif
+
+      level_editor_test_game = TRUE;
+
+      StartGameActions(FALSE, setup.autorecord, level.random_seed);
 
-       StartGameActions(FALSE, setup.autorecord, NEW_RANDOMIZE);
-      }
       break;
 
     case GADGET_ID_EXIT:
-      RequestExitLevelEditor(TRUE);    /* if level has changed, ask user */
+      RequestExitLevelEditor(TRUE, FALSE);  /* if level has changed, ask user */
       break;
 
     default:
@@ -10615,7 +12135,7 @@ void HandleLevelEditorKeyInput(Key key)
       case KSYM_Escape:
         if (edit_mode == ED_MODE_DRAWING)
        {
-         RequestExitLevelEditor(setup.ask_on_escape_editor);
+         RequestExitLevelEditor(setup.ask_on_escape_editor, TRUE);
        }
         else if (edit_mode == ED_MODE_INFO)
        {
@@ -10641,7 +12161,9 @@ void HandleLevelEditorKeyInput(Key key)
       ClickOnGadget(level_editor_gadget[id], button);
     else if (letter == '.')
       ClickOnGadget(level_editor_gadget[GADGET_ID_SINGLE_ITEMS], button);
-    else if (key == KSYM_Return || key == setup.shortcut.toggle_pause)
+    else if (key == KSYM_Return ||
+            key == KSYM_space ||
+            key == setup.shortcut.toggle_pause)
       ClickOnGadget(level_editor_gadget[GADGET_ID_TEST], button);
     else
       for (i = 0; i < ED_NUM_CTRL_BUTTONS; i++)
@@ -10653,9 +12175,10 @@ void HandleLevelEditorKeyInput(Key key)
 
 void HandleLevelEditorIdle()
 {
-  static unsigned long action_delay = 0;
-  unsigned long action_delay_value = GameFrameDelay;
+  static unsigned int action_delay = 0;
+  unsigned int action_delay_value = GameFrameDelay;
   int xpos = 1, ypos = 2;
+  int i;
 
   if (edit_mode != ED_MODE_PROPERTIES)
     return;
@@ -10663,6 +12186,14 @@ void HandleLevelEditorIdle()
   if (!DelayReached(&action_delay, action_delay_value))
     return;
 
+  for (i = 0; i < ED_NUM_SELECTBOX; i++)
+  {
+    struct GadgetInfo *gi = level_editor_gadget[selectbox_info[i].gadget_id];
+
+    if (gi->mapped && gi->active && gi->selectbox.open)
+      return;
+  }
+
   DrawEditorElementAnimation(SX + xpos * TILEX,
                             SY + ypos * TILEY + MINI_TILEY / 2);
 
@@ -10886,21 +12417,49 @@ 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 ?",
+      Request("Level has changed! Exit without saving?",
              REQ_ASK | REQ_STAY_OPEN))
   {
+#if 1
+    // CloseDoor(DOOR_CLOSE_1);
+    SetDoorState(DOOR_CLOSE_2);
+#else
     CloseDoor(DOOR_CLOSE_1);
     SetDoorState(DOOR_CLOSE_2);
+#endif
+
+#if 1
+    if (quick_quit)
+      FadeSkipNextFadeIn();
+#else
+    if (quick_quit)
+      fading = fading_none;
+#endif
+
     game_status = GAME_MODE_MAIN;
+#if 1
+    DrawAndFadeInMainMenu(playfield_area_changed ? REDRAW_ALL : REDRAW_FIELD);
+#else
+#if 1
+    DrawAndFadeInMainMenu(REDRAW_FIELD);
+#else
     DrawMainMenu();
+#endif
+#endif
   }
   else
   {
+#if 1
+    // CloseDoor(DOOR_CLOSE_1);
+    OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+#else
     CloseDoor(DOOR_CLOSE_1);
     OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
+#endif
   }
 }