rnd-20040228-1-src
[rocksndiamonds.git] / src / editor.c
index 9740597d7f82649de80d119fec5d637a56d7121f..8f921bc60137ace0fedb008facc034830120926b 100644 (file)
 #define ED_SETTINGS_YOFFSET            (3 * MINI_TILEY / 2)
 
 #define ED_SETTINGS_XPOS(n)            (ED_SETTINGS_XSTART + \
-                                        n * ED_SETTINGS_XOFFSET)
+                                        (n) * ED_SETTINGS_XOFFSET)
 #define ED_SETTINGS_YPOS(n)            (ED_SETTINGS_YSTART + \
-                                        n * ED_SETTINGS_YOFFSET)
+                                        (n) * ED_SETTINGS_YOFFSET)
 
 #define ED_SETTINGS1_YPOS              MINI_TILEY
 #define ED_SETTINGS2_XPOS              MINI_TILEX
 #define ED_COUNTER_YSTART              (ED_SETTINGS1_YPOS + 2 * TILEY)
 #define ED_COUNTER_YDISTANCE           (3 * MINI_TILEY)
 #define ED_COUNTER_YPOS(n)             (ED_COUNTER_YSTART + \
-                                        n * ED_COUNTER_YDISTANCE)
+                                        (n) * ED_COUNTER_YDISTANCE)
 #define ED_COUNTER2_YPOS(n)            (ED_COUNTER_YSTART + \
-                                        n * ED_COUNTER_YDISTANCE - 2)
+                                        (n) * ED_COUNTER_YDISTANCE - 2)
 
 /* values for element content drawing areas */
 /* amoeba content */
-#define ED_AREA_ELEM_CONTENT_XPOS      ( 2 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT_YPOS      (22 * MINI_TILEY)
+#define ED_AREA_AMOEBA_CONTENT_XPOS    ED_SETTINGS_XPOS(0)
+#define ED_AREA_AMOEBA_CONTENT_YPOS    (ED_SETTINGS_YPOS(2) + \
+                                        ED_GADGET_DISTANCE)
 
 /* yamyam content */
-#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (ED_AREA_ELEM_CONTENT_XPOS + \
-                                        5 * (n % 4) * MINI_TILEX)
-#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (ED_AREA_ELEM_CONTENT_YPOS + \
-                                        6 * (n / 4) * MINI_TILEY)
+#define ED_AREA_YAMYAM_CONTENT_XPOS(n) (2 * MINI_TILEX + \
+                                        5 * ((n) % 4) * MINI_TILEX)
+#define ED_AREA_YAMYAM_CONTENT_YPOS(n) (17 * MINI_TILEY + \
+                                        6 * ((n) / 4) * MINI_TILEY)
 
 /* custom change target */
 #define ED_AREA_ELEM_CONTENT2_YPOS     (ED_SETTINGS_YPOS(1) + \
                                         ED_GADGET_DISTANCE - MINI_TILEY)
 /* movement enter/leave element */
 #define ED_AREA_ELEM_CONTENT4a_XPOS    (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4a_YPOS    (ED_SETTINGS_YPOS(9) + \
+#define ED_AREA_ELEM_CONTENT4a_YPOS    (ED_SETTINGS_YPOS(10) + \
                                         ED_GADGET_DISTANCE)
 #define ED_AREA_ELEM_CONTENT4b_XPOS    (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT4b_YPOS    (ED_SETTINGS_YPOS(9) + \
+#define ED_AREA_ELEM_CONTENT4b_YPOS    (ED_SETTINGS_YPOS(10) + \
                                         ED_GADGET_DISTANCE)
 /* custom change trigger element */
 #define ED_AREA_ELEM_CONTENT5_YPOS     (ED_SETTINGS_YPOS(5) + \
                                         ED_GADGET_DISTANCE)
 /* extended custom change target */
 #define ED_AREA_ELEM_CONTENT6_XPOS     (29 * MINI_TILEX)
-#define ED_AREA_ELEM_CONTENT6_YPOS     (ED_SETTINGS_YPOS(9) + \
+#define ED_AREA_ELEM_CONTENT6_YPOS     (ED_SETTINGS_YPOS(10) + \
                                         ED_GADGET_DISTANCE - MINI_TILEY)
 /* group element content */
 #define ED_AREA_GROUP_CONTENT_XPOS     ED_SETTINGS_XPOS(0)
 #define GADGET_ID_CUSTOM_ACCESS_TYPE   (GADGET_ID_SELECTBOX_FIRST + 9)
 #define GADGET_ID_CUSTOM_ACCESS_LAYER  (GADGET_ID_SELECTBOX_FIRST + 10)
 #define GADGET_ID_CUSTOM_ACCESS_PROTECTED (GADGET_ID_SELECTBOX_FIRST + 11)
-#define GADGET_ID_CHANGE_TIME_UNITS    (GADGET_ID_SELECTBOX_FIRST + 12)
-#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 13)
-#define GADGET_ID_CHANGE_OTHER_ACTION  (GADGET_ID_SELECTBOX_FIRST + 14)
-#define GADGET_ID_CHANGE_SIDES         (GADGET_ID_SELECTBOX_FIRST + 15)
-#define GADGET_ID_CHANGE_POWER         (GADGET_ID_SELECTBOX_FIRST + 16)
-#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 17)
-#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 18)
+#define GADGET_ID_CUSTOM_ACCESS_DIRECTION (GADGET_ID_SELECTBOX_FIRST + 12)
+#define GADGET_ID_CHANGE_TIME_UNITS    (GADGET_ID_SELECTBOX_FIRST + 13)
+#define GADGET_ID_CHANGE_DIRECT_ACTION (GADGET_ID_SELECTBOX_FIRST + 14)
+#define GADGET_ID_CHANGE_OTHER_ACTION  (GADGET_ID_SELECTBOX_FIRST + 15)
+#define GADGET_ID_CHANGE_SIDE          (GADGET_ID_SELECTBOX_FIRST + 16)
+#define GADGET_ID_CHANGE_PLAYER                (GADGET_ID_SELECTBOX_FIRST + 17)
+#define GADGET_ID_CHANGE_PAGE          (GADGET_ID_SELECTBOX_FIRST + 18)
+#define GADGET_ID_CHANGE_POWER         (GADGET_ID_SELECTBOX_FIRST + 19)
+#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 20)
+#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 21)
 
 /* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 19)
+#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 22)
 
 #define GADGET_ID_PROPERTIES_INFO      (GADGET_ID_TEXTBUTTON_FIRST + 0)
 #define GADGET_ID_PROPERTIES_CONFIG    (GADGET_ID_TEXTBUTTON_FIRST + 1)
 #define GADGET_ID_GRAVITY              (GADGET_ID_CHECKBUTTON_FIRST + 4)
 #define GADGET_ID_STICK_ELEMENT                (GADGET_ID_CHECKBUTTON_FIRST + 5)
 #define GADGET_ID_EM_SLIPPERY_GEMS     (GADGET_ID_CHECKBUTTON_FIRST + 6)
-#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 7)
-#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 8)
-#define GADGET_ID_CUSTOM_EXPLODE_RESULT        (GADGET_ID_CHECKBUTTON_FIRST + 9)
-#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 10)
-#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 11)
-#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 12)
-#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 13)
-#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 14)
-#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 15)
-#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 16)
-#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 17)
-#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 18)
-#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 19)
-#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 20)
-#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 21)
-#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 22)
-#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 23)
-#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 24)
-#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 25)
-#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 26)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 27)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 28)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_USE_SPRING_BUG       (GADGET_ID_CHECKBUTTON_FIRST + 7)
+#define GADGET_ID_BLOCK_LAST_FIELD     (GADGET_ID_CHECKBUTTON_FIRST + 8)
+#define GADGET_ID_SP_BLOCK_LAST_FIELD  (GADGET_ID_CHECKBUTTON_FIRST + 9)
+#define GADGET_ID_CAN_MOVE_INTO_ACID   (GADGET_ID_CHECKBUTTON_FIRST + 10)
+#define GADGET_ID_CUSTOM_EXPLODE_RESULT        (GADGET_ID_CHECKBUTTON_FIRST + 11)
+#define GADGET_ID_CUSTOM_EXPLODE_FIRE  (GADGET_ID_CHECKBUTTON_FIRST + 12)
+#define GADGET_ID_CUSTOM_EXPLODE_SMASH (GADGET_ID_CHECKBUTTON_FIRST + 13)
+#define GADGET_ID_CUSTOM_EXPLODE_IMPACT        (GADGET_ID_CHECKBUTTON_FIRST + 14)
+#define GADGET_ID_CUSTOM_WALK_TO_OBJECT        (GADGET_ID_CHECKBUTTON_FIRST + 15)
+#define GADGET_ID_CUSTOM_DEADLY                (GADGET_ID_CHECKBUTTON_FIRST + 16)
+#define GADGET_ID_CUSTOM_CAN_MOVE      (GADGET_ID_CHECKBUTTON_FIRST + 17)
+#define GADGET_ID_CUSTOM_CAN_FALL      (GADGET_ID_CHECKBUTTON_FIRST + 18)
+#define GADGET_ID_CUSTOM_CAN_SMASH     (GADGET_ID_CHECKBUTTON_FIRST + 19)
+#define GADGET_ID_CUSTOM_SLIPPERY      (GADGET_ID_CHECKBUTTON_FIRST + 20)
+#define GADGET_ID_CUSTOM_ACCESSIBLE    (GADGET_ID_CHECKBUTTON_FIRST + 21)
+#define GADGET_ID_CUSTOM_USE_GRAPHIC   (GADGET_ID_CHECKBUTTON_FIRST + 22)
+#define GADGET_ID_CUSTOM_USE_TEMPLATE  (GADGET_ID_CHECKBUTTON_FIRST + 23)
+#define GADGET_ID_CUSTOM_CAN_CHANGE    (GADGET_ID_CHECKBUTTON_FIRST + 24)
+#define GADGET_ID_CHANGE_USE_CONTENT   (GADGET_ID_CHECKBUTTON_FIRST + 25)
+#define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 26)
+#define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 27)
+#define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 28)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 29)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 31)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 30)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 32)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE     0
 #define ED_SELECTBOX_ID_CUSTOM_ACCESS_LAYER    1
 #define ED_SELECTBOX_ID_CUSTOM_ACCESS_PROTECTED        2
-#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION  3
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN    4
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION  5
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE   6
-#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 7
-#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS   8
-#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE   9
-#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS      10
-#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY     11
-#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS      12
-#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION   13
-#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION    14
-#define ED_SELECTBOX_ID_CHANGE_SIDES           15
-#define ED_SELECTBOX_ID_CHANGE_POWER           16
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     17
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      18
-
-#define ED_NUM_SELECTBOX                       19
+#define ED_SELECTBOX_ID_CUSTOM_ACCESS_DIRECTION        3
+#define ED_SELECTBOX_ID_CUSTOM_WALK_TO_ACTION  4
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_PATTERN    5
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_DIRECTION  6
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_STEPSIZE   7
+#define ED_SELECTBOX_ID_CUSTOM_MOVE_LEAVE_TYPE 8
+#define ED_SELECTBOX_ID_CUSTOM_SMASH_TARGETS   9
+#define ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE   10
+#define ED_SELECTBOX_ID_CUSTOM_DEADLINESS      11
+#define ED_SELECTBOX_ID_CUSTOM_CONSISTENCY     12
+#define ED_SELECTBOX_ID_CHANGE_TIME_UNITS      13
+#define ED_SELECTBOX_ID_CHANGE_DIRECT_ACTION   14
+#define ED_SELECTBOX_ID_CHANGE_OTHER_ACTION    15
+#define ED_SELECTBOX_ID_CHANGE_SIDE            16
+#define ED_SELECTBOX_ID_CHANGE_PLAYER          17
+#define ED_SELECTBOX_ID_CHANGE_PAGE            18
+#define ED_SELECTBOX_ID_CHANGE_POWER           19
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     20
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      21
+
+#define ED_NUM_SELECTBOX                       22
 
 #define ED_SELECTBOX_ID_CUSTOM1_FIRST  ED_SELECTBOX_ID_CUSTOM_ACCESS_TYPE
 #define ED_SELECTBOX_ID_CUSTOM1_LAST   ED_SELECTBOX_ID_CUSTOM_SLIPPERY_TYPE
 #define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    2
 #define ED_CHECKBUTTON_ID_STICK_ELEMENT                3
 #define ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS     4
-#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     5
-#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  6
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   7
-#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  8
-#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    9
-#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        10
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      11
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      12
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     13
-#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      14
-#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                15
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT        16
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  17
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 18
-#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        19
-#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    20
-#define ED_CHECKBUTTON_ID_CHANGE_DELAY         21
-#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 22
-#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  23
-#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 24
-#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   25
-#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 26
-#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    27
-
-#define ED_NUM_CHECKBUTTONS                    28
+#define ED_CHECKBUTTON_ID_USE_SPRING_BUG       5
+#define ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD     6
+#define ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD  7
+#define ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID   8
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC   9
+#define ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE  10
+#define ED_CHECKBUTTON_ID_CUSTOM_ACCESSIBLE    11
+#define ED_CHECKBUTTON_ID_CUSTOM_WALK_TO_OBJECT        12
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_MOVE      13
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_FALL      14
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_SMASH     15
+#define ED_CHECKBUTTON_ID_CUSTOM_SLIPPERY      16
+#define ED_CHECKBUTTON_ID_CUSTOM_DEADLY                17
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_RESULT        18
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_FIRE  19
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_SMASH 20
+#define ED_CHECKBUTTON_ID_CUSTOM_EXPLODE_IMPACT        21
+#define ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE    22
+#define ED_CHECKBUTTON_ID_CHANGE_DELAY         23
+#define ED_CHECKBUTTON_ID_CHANGE_BY_DIRECT_ACT 24
+#define ED_CHECKBUTTON_ID_CHANGE_BY_OTHER_ACT  25
+#define ED_CHECKBUTTON_ID_CHANGE_USE_EXPLOSION 26
+#define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   27
+#define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 28
+#define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    29
+
+#define ED_NUM_CHECKBUTTONS                    30
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_DOUBLE_SPEED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
@@ -906,7 +917,7 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(0),               ED_COUNTER_YPOS(4),
-    0,                                 999,
+    0,                                 9999,
     GADGET_ID_LEVEL_TIMELIMIT_DOWN,    GADGET_ID_LEVEL_TIMELIMIT_UP,
     GADGET_ID_LEVEL_TIMELIMIT_TEXT,    GADGET_ID_NONE,
     &level.time,
@@ -940,7 +951,7 @@ static struct
     NULL,                              NULL, NULL
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(6),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(3),
     MIN_ELEMENT_CONTENTS,              MAX_ELEMENT_CONTENTS,
     GADGET_ID_ELEMENT_CONTENT_DOWN,    GADGET_ID_ELEMENT_CONTENT_UP,
     GADGET_ID_ELEMENT_CONTENT_TEXT,    GADGET_ID_NONE,
@@ -967,7 +978,7 @@ static struct
   /* ---------- element settings: configure 1 (custom elements) ------------ */
 
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(5),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(6),
     MIN_SCORE,                         MAX_SCORE,
     GADGET_ID_CUSTOM_SCORE_DOWN,       GADGET_ID_CUSTOM_SCORE_UP,
     GADGET_ID_CUSTOM_SCORE_TEXT,       GADGET_ID_NONE,
@@ -975,7 +986,7 @@ static struct
     NULL,                              "score", " "
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(5),
+    -1,                                        ED_SETTINGS_YPOS(6),
     MIN_COLLECT_COUNT,                 MAX_COLLECT_COUNT,
     GADGET_ID_CUSTOM_GEMCOUNT_DOWN,    GADGET_ID_CUSTOM_GEMCOUNT_UP,
     GADGET_ID_CUSTOM_GEMCOUNT_TEXT,    GADGET_ID_CUSTOM_SCORE_UP,
@@ -983,7 +994,7 @@ static struct
     NULL,                              "count", NULL
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(6),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(7),
     0,                                 999,
     GADGET_ID_PUSH_DELAY_FIX_DOWN,     GADGET_ID_PUSH_DELAY_FIX_UP,
     GADGET_ID_PUSH_DELAY_FIX_TEXT,     GADGET_ID_NONE,
@@ -991,7 +1002,7 @@ static struct
     NULL,                              "push delay", NULL
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(6),
+    -1,                                        ED_SETTINGS_YPOS(7),
     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,
@@ -999,7 +1010,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(11),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(12),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_FIX_DOWN,     GADGET_ID_MOVE_DELAY_FIX_UP,
     GADGET_ID_MOVE_DELAY_FIX_TEXT,     GADGET_ID_NONE,
@@ -1007,7 +1018,7 @@ static struct
     NULL,                              "move delay", NULL
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(11),
+    -1,                                        ED_SETTINGS_YPOS(12),
     0,                                 999,
     GADGET_ID_MOVE_DELAY_RND_DOWN,     GADGET_ID_MOVE_DELAY_RND_UP,
     GADGET_ID_MOVE_DELAY_RND_TEXT,     GADGET_ID_MOVE_DELAY_FIX_UP,
@@ -1031,7 +1042,7 @@ static struct
     GADGET_ID_IGNITION_DELAY_DOWN,     GADGET_ID_IGNITION_DELAY_UP,
     GADGET_ID_IGNITION_DELAY_TEXT,     GADGET_ID_NONE,
     &custom_element.ignition_delay,
-    NULL,                              "ignition delay", NULL
+    NULL,                              "ignition delay", "(by fire)"
   },
 
   /* ---------- element settings: configure (group elements) --------------- */
@@ -1064,7 +1075,7 @@ static struct
     NULL,                              "+random", NULL
   },
   {
-    ED_SETTINGS_XPOS(3),               ED_SETTINGS_YPOS(11),
+    ED_SETTINGS_XPOS(3),               ED_SETTINGS_YPOS(12),
     0,                                 100,
     GADGET_ID_CHANGE_CONT_RND_DOWN,    GADGET_ID_CHANGE_CONT_RND_UP,
     GADGET_ID_CHANGE_CONT_RND_TEXT,    GADGET_ID_NONE,
@@ -1127,6 +1138,7 @@ static struct ValueTextInfo options_access_type[] =
 {
   { EP_WALKABLE,               "walkable"                      },
   { EP_PASSABLE,               "passable"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1135,6 +1147,7 @@ static struct ValueTextInfo options_access_layer[] =
   { EP_ACCESSIBLE_OVER,                "over"                          },
   { EP_ACCESSIBLE_INSIDE,      "inside"                        },
   { EP_ACCESSIBLE_UNDER,       "under"                         },
+
   { -1,                                NULL                            }
 };
 
@@ -1142,6 +1155,28 @@ static struct ValueTextInfo options_access_protected[] =
 {
   { 0,                         "unprotected"                   },
   { 1,                         "protected"                     },
+
+  { -1,                                NULL                            }
+};
+
+static struct ValueTextInfo options_access_direction[] =
+{
+  { MV_LEFT,                   "left"                          },
+  { MV_RIGHT,                  "right"                         },
+  { MV_UP,                     "up"                            },
+  { MV_DOWN,                   "down"                          },
+  { MV_LEFT  | MV_UP,          "left + up"                     },
+  { MV_LEFT  | MV_DOWN,                "left + down"                   },
+  { MV_RIGHT | MV_UP,          "right + up"                    },
+  { MV_RIGHT | MV_DOWN,                "right + down"                  },
+  { MV_HORIZONTAL,             "horizontal"                    },
+  { MV_VERTICAL,               "vertical"                      },
+  { MV_HORIZONTAL | MV_UP,     "horizontal + up"               },
+  { MV_HORIZONTAL | MV_DOWN,   "horizontal + down"             },
+  { MV_VERTICAL   | MV_LEFT,   "vertical + left"               },
+  { MV_VERTICAL   | MV_RIGHT,  "vertical + right"              },
+  { MV_ALL_DIRECTIONS,         "all directions"                },
+
   { -1,                                NULL                            }
 };
 
@@ -1151,6 +1186,7 @@ static struct ValueTextInfo options_walk_to_action[] =
   { EP_COLLECTIBLE_ONLY,       "collectible"                   },
   { EP_DROPPABLE,              "collectible & droppable"       },
   { EP_PUSHABLE,               "pushable"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1176,6 +1212,7 @@ static struct ValueTextInfo options_move_pattern[] =
   { MV_WHEN_DROPPED,           "when dropped"                  },
   { MV_MAZE_RUNNER,            "maze runner style"             },
   { MV_MAZE_HUNTER,            "maze hunter style"             },
+
   { -1,                                NULL                            }
 };
 
@@ -1188,6 +1225,7 @@ static struct ValueTextInfo options_move_direction[] =
   { MV_START_DOWN,             "down"                          },
   { MV_START_RANDOM,           "random"                        },
   { MV_START_PREVIOUS,         "previous"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1198,6 +1236,7 @@ static struct ValueTextInfo options_move_stepsize[] =
   { 4,                         "normal"                        },
   { 8,                         "fast"                          },
   { 16,                                "very fast"                     },
+
   { -1,                                NULL                            }
 };
 
@@ -1205,6 +1244,7 @@ static struct ValueTextInfo options_move_leave_type[] =
 {
   { LEAVE_TYPE_UNLIMITED,      "leave behind"                  },
   { LEAVE_TYPE_LIMITED,                "change it to"                  },
+
   { -1,                                NULL                            }
 };
 
@@ -1215,6 +1255,7 @@ static struct ValueTextInfo options_smash_targets[] =
   { EP_CAN_SMASH_ENEMIES,      "enemies"                       },
 #endif
   { EP_CAN_SMASH_EVERYTHING,   "everything"                    },
+
   { -1,                                NULL                            }
 };
 
@@ -1225,6 +1266,7 @@ static struct ValueTextInfo options_slippery_type[] =
   { SLIPPERY_ANY_RIGHT_LEFT,   "right, left"                   },
   { SLIPPERY_ONLY_LEFT,                "only left"                     },
   { SLIPPERY_ONLY_RIGHT,       "only right"                    },
+
   { -1,                                NULL                            }
 };
 
@@ -1233,6 +1275,7 @@ static struct ValueTextInfo options_deadliness[] =
   { EP_DONT_RUN_INTO,          "running into"                  },
   { EP_DONT_COLLIDE_WITH,      "colliding with"                },
   { EP_DONT_TOUCH,             "touching"                      },
+
   { -1,                                NULL                            }
 };
 
@@ -1242,6 +1285,7 @@ static struct ValueTextInfo options_consistency[] =
   { EP_CAN_EXPLODE_DYNA,       "can explode 3+3"               },
   { EP_CAN_EXPLODE_1X1,                "can explode 1x1"               },
   { EP_INDESTRUCTIBLE,         "indestructible"                },
+
   { -1,                                NULL                            }
 };
 
@@ -1249,6 +1293,7 @@ static struct ValueTextInfo options_time_units[] =
 {
   { 1,                         "frames"                        },
   { FRAMES_PER_SECOND,         "seconds"                       },
+
   { -1,                                NULL                            }
 };
 
@@ -1269,6 +1314,7 @@ static struct ValueTextInfo options_change_direct_action[] =
 #endif
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
+
   { -1,                                NULL                            }
 };
 
@@ -1288,20 +1334,72 @@ static struct ValueTextInfo options_change_other_action[] =
   { CE_OTHER_GETS_HIT,         "hit by ..."                    },
 #endif
   { CE_OTHER_IS_SWITCHING,     "switch of ..."                 },
-  { CE_OTHER_IS_CHANGING,      "change of"                     },
+  { CE_OTHER_IS_CHANGING,      "change by page of"             },
   { CE_OTHER_IS_EXPLODING,     "explosion of"                  },
+
+  { -1,                                NULL                            }
+};
+
+static struct ValueTextInfo options_change_trigger_side[] =
+{
+  { CH_SIDE_LEFT,              "left"                          },
+  { CH_SIDE_RIGHT,             "right"                         },
+  { CH_SIDE_TOP,               "top"                           },
+  { CH_SIDE_BOTTOM,            "bottom"                        },
+  { CH_SIDE_LEFT_RIGHT,                "left/right"                    },
+  { CH_SIDE_TOP_BOTTOM,                "top/bottom"                    },
+  { CH_SIDE_ANY,               "any"                           },
+
   { -1,                                NULL                            }
 };
 
-static struct ValueTextInfo options_change_sides[] =
+static struct ValueTextInfo options_change_trigger_player[] =
 {
-  { CH_SIDE_LEFT,              "left side"                     },
-  { CH_SIDE_RIGHT,             "right side"                    },
-  { CH_SIDE_TOP,               "top side"                      },
-  { CH_SIDE_BOTTOM,            "bottom side"                   },
-  { CH_SIDE_LEFT_RIGHT,                "left/right side"               },
-  { CH_SIDE_TOP_BOTTOM,                "top/bottom side"               },
-  { CH_SIDE_ANY,               "any side"                      },
+  { CH_PLAYER_1,               "1"                             },
+  { CH_PLAYER_2,               "2"                             },
+  { CH_PLAYER_3,               "3"                             },
+  { CH_PLAYER_4,               "4"                             },
+  { CH_PLAYER_ANY,             "any"                           },
+
+  { -1,                                NULL                            }
+};
+
+static struct ValueTextInfo options_change_trigger_page[] =
+{
+  { (1 << 0),                  "1"                             },
+  { (1 << 1),                  "2"                             },
+  { (1 << 2),                  "3"                             },
+  { (1 << 3),                  "4"                             },
+  { (1 << 4),                  "5"                             },
+  { (1 << 5),                  "6"                             },
+  { (1 << 6),                  "7"                             },
+  { (1 << 7),                  "8"                             },
+  { (1 << 8),                  "9"                             },
+  { (1 << 9),                  "10"                            },
+  { (1 << 10),                 "11"                            },
+  { (1 << 11),                 "12"                            },
+  { (1 << 12),                 "13"                            },
+  { (1 << 13),                 "14"                            },
+  { (1 << 14),                 "15"                            },
+  { (1 << 15),                 "16"                            },
+  { (1 << 16),                 "17"                            },
+  { (1 << 17),                 "18"                            },
+  { (1 << 18),                 "19"                            },
+  { (1 << 19),                 "20"                            },
+  { (1 << 20),                 "21"                            },
+  { (1 << 21),                 "22"                            },
+  { (1 << 22),                 "23"                            },
+  { (1 << 23),                 "24"                            },
+  { (1 << 24),                 "25"                            },
+  { (1 << 25),                 "26"                            },
+  { (1 << 26),                 "27"                            },
+  { (1 << 27),                 "28"                            },
+  { (1 << 28),                 "29"                            },
+  { (1 << 29),                 "30"                            },
+  { (1 << 30),                 "31"                            },
+  { (1 << 31),                 "32"                            },
+  { CH_PAGE_ANY,               "any"                           },
+
   { -1,                                NULL                            }
 };
 
@@ -1310,6 +1408,7 @@ static struct ValueTextInfo options_change_power[] =
   { CP_NON_DESTRUCTIVE,                "empty"                         },
   { CP_HALF_DESTRUCTIVE,       "diggable"                      },
   { CP_FULL_DESTRUCTIVE,       "destructible"                  },
+
   { -1,                                NULL                            }
 };
 
@@ -1326,6 +1425,7 @@ static struct ValueTextInfo options_group_choice_mode[] =
   { ANIM_LINEAR,               "linear"                        },
   { ANIM_PINGPONG,             "pingpong"                      },
   { ANIM_PINGPONG2,            "pingpong 2"                    },
+
   { -1,                                NULL                            }
 };
 
@@ -1368,6 +1468,14 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(4),
+    GADGET_ID_CUSTOM_ACCESS_DIRECTION, GADGET_ID_NONE,
+    -1,
+    options_access_direction,
+    &custom_element.access_direction,
+    "from", NULL,                      "access direction for this field"
+  },
+  {
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(5),
     GADGET_ID_CUSTOM_WALK_TO_ACTION,   GADGET_ID_NONE,
     -1,
     options_walk_to_action,
@@ -1375,7 +1483,7 @@ static struct
     NULL, NULL,                                "diggable/collectible/pushable"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(7),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_MOVE_PATTERN,     GADGET_ID_NONE,
     -1,
     options_move_pattern,
@@ -1383,7 +1491,7 @@ static struct
     "can move", NULL,                  "element move direction"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(8),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
     GADGET_ID_CUSTOM_MOVE_DIRECTION,   GADGET_ID_NONE,
     -1,
     options_move_direction,
@@ -1391,7 +1499,7 @@ static struct
     "starts moving", NULL,             "initial element move direction"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(10),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(11),
     GADGET_ID_CUSTOM_MOVE_STEPSIZE,    GADGET_ID_NONE,
     -1,
     options_move_stepsize,
@@ -1399,7 +1507,7 @@ static struct
     "move/fall speed", NULL,           "speed of element movement"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(10),
     GADGET_ID_CUSTOM_MOVE_LEAVE_TYPE,  GADGET_ID_NONE,
     -1,
     options_move_leave_type,
@@ -1407,7 +1515,7 @@ static struct
     "can dig:    can", ":",            "leave behind or change element"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(12),
+    -1,                                        ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_SMASH_TARGETS,    GADGET_ID_CUSTOM_CAN_SMASH,
     -1,
     options_smash_targets,
@@ -1415,7 +1523,7 @@ static struct
     "can smash", NULL,                 "elements that can be smashed"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(13),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(14),
     GADGET_ID_CUSTOM_SLIPPERY_TYPE,    GADGET_ID_NONE,
     -1,
     options_slippery_type,
@@ -1470,14 +1578,30 @@ static struct
   },
   {
     ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(6),
-    GADGET_ID_CHANGE_SIDES,            GADGET_ID_NONE,
+    GADGET_ID_CHANGE_SIDE,             GADGET_ID_NONE,
+    -1,
+    options_change_trigger_side,
+    &custom_element_change.trigger_side,
+    "... at", "side",                  "element side that causes change"
+  },
+  {
+    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(7),
+    GADGET_ID_CHANGE_PLAYER,           GADGET_ID_NONE,
     -1,
-    options_change_sides,
-    &custom_element_change.sides,
-    "... at", NULL,                    "element side that causes change"
+    options_change_trigger_player,
+    &custom_element_change.trigger_player,
+    "player:", " ",                    "player that causes change"
   },
   {
-    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(9),
+    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(7),
+    GADGET_ID_CHANGE_PAGE,             GADGET_ID_CHANGE_PLAYER,
+    -1,
+    options_change_trigger_page,
+    &custom_element_change.trigger_page,
+    "page:", NULL,                     "change page that causes change"
+  },
+  {
+    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(10),
     GADGET_ID_CHANGE_POWER,            GADGET_ID_NONE,
     -1,
     options_change_power,
@@ -1485,7 +1609,7 @@ static struct
     "replace when", NULL,              "which elements can be replaced"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(13),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(14),
     GADGET_ID_SELECT_CHANGE_PAGE,      GADGET_ID_NONE,
     3,
     options_change_page,
@@ -1573,13 +1697,13 @@ static struct
     " ", "As Template",                        "Save current settings as new template"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(13),
+    -1,                                        ED_SETTINGS_YPOS(14),
     GADGET_ID_ADD_CHANGE_PAGE,         GADGET_ID_NEXT_CHANGE_PAGE,
     -1,                                        "New",
     " ", NULL,                         "Add new change page"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(13),
+    -1,                                        ED_SETTINGS_YPOS(14),
     GADGET_ID_DEL_CHANGE_PAGE,         GADGET_ID_ADD_CHANGE_PAGE,
     -1,                                        "Delete",
     NULL, NULL,                                "Delete current change page"
@@ -1598,14 +1722,14 @@ static struct
 {
   {
     ED_BUTTON_MINUS_XPOS,              ED_BUTTON_COUNT_YPOS,
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(13),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(14),
     ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
     GADGET_ID_PREV_CHANGE_PAGE,                GADGET_ID_NONE,
     NULL, NULL,                                "select previous change page"
   },
   {
     ED_BUTTON_PLUS_XPOS,               ED_BUTTON_COUNT_YPOS,
-    -1,                                        ED_SETTINGS_YPOS(13),
+    -1,                                        ED_SETTINGS_YPOS(14),
     ED_BUTTON_COUNT_XSIZE,             ED_BUTTON_COUNT_YSIZE,
     GADGET_ID_NEXT_CHANGE_PAGE,                GADGET_ID_SELECT_CHANGE_PAGE,
     NULL, "change page",               "select next change page"
@@ -1755,33 +1879,47 @@ static struct
   /* ---------- element settings: configure (various elements) ------------- */
 
   {
-    ED_SETTINGS_XPOS(0),               0,      /* set at runtime */
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
     GADGET_ID_STICK_ELEMENT,           GADGET_ID_NONE,
     &stick_element_properties_window,
     NULL,
     "stick this screen to edit content","stick this screen to edit content"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_COUNTER_YPOS(4),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(1),
     GADGET_ID_EM_SLIPPERY_GEMS,                GADGET_ID_NONE,
     &level.em_slippery_gems,
     NULL,
     "slip down from certain flat walls","use EM style slipping behaviour"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_COUNTER_YPOS(4),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(1),
+    GADGET_ID_USE_SPRING_BUG,          GADGET_ID_NONE,
+    &level.use_spring_bug,
+    NULL,
+    "use spring pushing bug",          "use odd spring pushing behaviour"
+  },
+  {
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
     GADGET_ID_BLOCK_LAST_FIELD,                GADGET_ID_NONE,
     &level.block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_COUNTER_YPOS(4),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
     GADGET_ID_SP_BLOCK_LAST_FIELD,     GADGET_ID_NONE,
     &level.sp_block_last_field,
     NULL,
     "block last field when moving",    "player blocks last field when moving"
   },
+  {
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(0),
+    GADGET_ID_CAN_MOVE_INTO_ACID,      GADGET_ID_NONE,
+    &custom_element_properties[EP_CAN_MOVE_INTO_ACID],
+    NULL,
+    "can move into acid",              "element can move into acid pool"
+  },
 
   /* ---------- element settings: configure 1 (custom elements) ----------- */
 
@@ -1804,31 +1942,31 @@ static struct
     NULL, NULL,                                "player can walk to or pass this field"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(4),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(5),
     GADGET_ID_CUSTOM_WALK_TO_OBJECT,   GADGET_ID_NONE,
     &custom_element_properties[EP_WALK_TO_OBJECT],
     NULL, NULL,                                "player can dig/collect/push element"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(7),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(8),
     GADGET_ID_CUSTOM_CAN_MOVE,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_MOVE],
     NULL, NULL,                                "element can move in some direction"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(12),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_CAN_FALL,         GADGET_ID_NONE,
     &custom_element_properties[EP_CAN_FALL],
     NULL, "can fall",                  "element can fall down"
   },
   {
-    -1,                                        ED_SETTINGS_YPOS(12),
+    -1,                                        ED_SETTINGS_YPOS(13),
     GADGET_ID_CUSTOM_CAN_SMASH,                GADGET_ID_CUSTOM_CAN_FALL,
     &custom_element_properties[EP_CAN_SMASH],
     " ", NULL,                         "element can smash other elements"
   },
   {
-    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(13),
+    ED_SETTINGS_XPOS(0),               ED_SETTINGS_YPOS(14),
     GADGET_ID_CUSTOM_SLIPPERY,         GADGET_ID_NONE,
     &custom_element_properties[EP_SLIPPERY],
     NULL, NULL,                                "other elements can fall down from it"
@@ -1894,25 +2032,25 @@ static struct
     NULL, NULL,                                "element changes by other element"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(7),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(8),
     GADGET_ID_CHANGE_USE_EXPLOSION,    GADGET_ID_NONE,
     &custom_element_change.explode,
     NULL, "explode instead of change", "element explodes instead of change"
   },
   {
-    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(8),
+    ED_SETTINGS_XPOS(1),               ED_SETTINGS_YPOS(9),
     GADGET_ID_CHANGE_USE_CONTENT,      GADGET_ID_NONE,
     &custom_element_change.use_content,
     NULL, "use extended change target:","element changes to more elements"
   },
   {
-    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(10),
+    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(11),
     GADGET_ID_CHANGE_ONLY_COMPLETE,    GADGET_ID_NONE,
     &custom_element_change.only_complete,
     NULL, "replace all or nothing",    "only replace when all can be changed"
   },
   {
-    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(11),
+    ED_SETTINGS_XPOS(2),               ED_SETTINGS_YPOS(12),
     GADGET_ID_CHANGE_USE_RANDOM,       GADGET_ID_NONE,
     &custom_element_change.use_random_change,
     NULL, NULL,                                "use percentage for random replace"
@@ -1991,10 +2129,10 @@ static struct
   /* ---------- amoeba content --------------------------------------------- */
 
   {
-    ED_AREA_ELEM_CONTENT_XPOS,         ED_AREA_ELEM_CONTENT_YPOS,
+    ED_AREA_AMOEBA_CONTENT_XPOS,       ED_AREA_AMOEBA_CONTENT_YPOS,
     1, 1,
     GADGET_ID_AMOEBA_CONTENT,          GADGET_ID_NONE,
-    NULL, "content of amoeba",         NULL
+    "content:", NULL,                  NULL
   },
 
   /* ---------- custom graphic --------------------------------------------- */
@@ -2112,7 +2250,7 @@ static void DrawDrawingWindow();
 static void DrawLevelInfoWindow();
 static void DrawPropertiesWindow();
 static void UpdateCustomElementGraphicGadgets();
-static boolean checkPropertiesConfig();
+static boolean checkPropertiesConfig(int);
 static void CopyLevelToUndoBuffer(int);
 static void HandleDrawingAreas(struct GadgetInfo *);
 static void HandleCounterButtons(struct GadgetInfo *);
@@ -3329,6 +3467,8 @@ editor_elements_info[] =
   }
 };
 
+#if 0
+
 static struct
 {
   short element;
@@ -3528,6 +3668,8 @@ forum_sketch_element_strings[] =
   { -1,                                NULL }
 };
 
+#endif
+
 
 /*
   -----------------------------------------------------------------------------
@@ -4192,7 +4334,7 @@ static void CreateCounterButtons()
                          GDI_NUMBER_VALUE, 0,
                          GDI_NUMBER_MIN, counterbutton_info[i].min_value,
                          GDI_NUMBER_MAX, counterbutton_info[i].max_value,
-                         GDI_TEXT_SIZE, 3,
+                         GDI_TEXT_SIZE, 3,     /* minimal counter text size */
                          GDI_TEXT_FONT, font_type,
                          GDI_TEXT_FONT_ACTIVE, font_type_active,
                          GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x, gd_y,
@@ -4805,8 +4947,10 @@ void FreeLevelEditorGadgets()
 static void MapCounterButtons(int id)
 {
   int gadget_id_down = counterbutton_info[id].gadget_id_down;
+  int gadget_id_text = counterbutton_info[id].gadget_id_text;
   int gadget_id_up   = counterbutton_info[id].gadget_id_up;
   struct GadgetInfo *gi_down = level_editor_gadget[gadget_id_down];
+  struct GadgetInfo *gi_text = level_editor_gadget[gadget_id_text];
   struct GadgetInfo *gi_up   = level_editor_gadget[gadget_id_up];
 #if 0
   char infotext[MAX_OUTPUT_LINESIZE + 1];
@@ -4824,9 +4968,19 @@ static void MapCounterButtons(int id)
   int x_right = gi_up->x + gi_up->width + xoffset_right;
   int y_above = gi_down->y - yoffset_above;
   int x = gi_down->x;
-  int y = gi_up->y + yoffset;
+  int y;       /* set after gadget position was modified */
 #endif
 
+  /* set position for "score" counter gadget */
+  if (id == ED_COUNTER_ID_ELEMENT_SCORE)
+  {
+    ModifyGadget(gi_down, GDI_Y, SY + counterbutton_info[id].y, GDI_END);
+    ModifyGadget(gi_text, GDI_Y, SY + counterbutton_info[id].y, GDI_END);
+    ModifyGadget(gi_up,   GDI_Y, SY + counterbutton_info[id].y, GDI_END);
+  }
+
+  y = gi_up->y + yoffset;
+
   if (counterbutton_info[id].text_above)
     DrawText(x, y_above, counterbutton_info[id].text_above, FONT_TEXT_1);
 
@@ -4838,9 +4992,9 @@ static void MapCounterButtons(int id)
 
   ModifyEditorCounter(id, *counterbutton_info[id].value);
 
-  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_down]);
-  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_text]);
-  MapGadget(level_editor_gadget[counterbutton_info[id].gadget_id_up]);
+  MapGadget(gi_down);
+  MapGadget(gi_text);
+  MapGadget(gi_up);
 }
 
 static void MapControlButtons()
@@ -5027,11 +5181,13 @@ static void MapCheckbuttonGadget(int id)
   int yoffset = ED_BORDER_SIZE;
   int x_left = gi->x - xoffset_left;
   int x_right = gi->x + gi->width + xoffset_right;
-  int y = gi->y + yoffset;
+  int y;       /* set after gadget position was modified */
+
+  /* set position for "stickybutton" and "can move into acid" gadgets */
+  if (id == ED_CHECKBUTTON_ID_STICK_ELEMENT ||
+      id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID)
+    ModifyGadget(gi, GDI_Y, SY + checkbutton_info[id].y, GDI_END);
 
-  /* special case needed for "sticky" gadget */
-  ModifyGadget(gi, GDI_CHECKED, *checkbutton_info[id].value,
-              GDI_Y, SY + checkbutton_info[id].y, GDI_END);
   y = gi->y + yoffset;
 
   if (checkbutton_info[id].text_left)
@@ -5040,6 +5196,8 @@ static void MapCheckbuttonGadget(int id)
   if (checkbutton_info[id].text_right)
     DrawText(x_right, y, checkbutton_info[id].text_right, FONT_TEXT_1);
 
+  ModifyGadget(gi, GDI_CHECKED, *checkbutton_info[id].value, GDI_END);
+
   MapGadget(gi);
 }
 
@@ -5342,7 +5500,7 @@ static void copy_custom_element_settings(int element_from, int element_to)
 
     change_to->can_change = change_from->can_change;
 
-    change_to->sides = change_from->sides;
+    change_to->trigger_side = change_from->trigger_side;
   }
 #endif
 
@@ -5596,12 +5754,34 @@ static void CopyGroupElementPropertiesToEditor(int element)
   custom_element = element_info[element];      /* needed for description */
 }
 
+static void CopyClassicElementPropertiesToEditor(int element)
+{
+#if 1
+  if (COULD_MOVE_INTO_ACID(element))
+    custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
+      getMoveIntoAcidProperty(&level, element);
+
+#else
+
+  if (COULD_MOVE_INTO_ACID(element))
+  {
+    int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID);
+
+    if (bit_nr > -1)
+      custom_element_properties[EP_CAN_MOVE_INTO_ACID] =
+       ((level.can_move_into_acid & (1 << bit_nr)) != 0);
+  }
+#endif
+}
+
 static void CopyElementPropertiesToEditor(int element)
 {
   if (IS_CUSTOM_ELEMENT(element))
     CopyCustomElementPropertiesToEditor(element);
   else if (IS_GROUP_ELEMENT(element))
     CopyGroupElementPropertiesToEditor(element);
+  else
+    CopyClassicElementPropertiesToEditor(element);
 }
 
 static void CopyCustomElementPropertiesToGame(int element)
@@ -5750,12 +5930,38 @@ static void CopyGroupElementPropertiesToGame(int element)
   element_info[element].modified_settings = TRUE;
 }
 
+static void CopyClassicElementPropertiesToGame(int element)
+{
+#if 1
+  if (COULD_MOVE_INTO_ACID(element))
+    setMoveIntoAcidProperty(&level, element,
+                           custom_element_properties[EP_CAN_MOVE_INTO_ACID]);
+
+#else
+
+  if (COULD_MOVE_INTO_ACID(element))
+  {
+    int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID);
+
+    if (bit_nr > -1)
+    {
+      level.can_move_into_acid &= ~(1 << bit_nr);
+
+      if (custom_element_properties[EP_CAN_MOVE_INTO_ACID])
+       level.can_move_into_acid |= (1 << bit_nr);
+    }
+  }
+#endif
+}
+
 static void CopyElementPropertiesToGame(int element)
 {
   if (IS_CUSTOM_ELEMENT(element))
     CopyCustomElementPropertiesToGame(element);
   else if (IS_GROUP_ELEMENT(element))
     CopyGroupElementPropertiesToGame(element);
+  else
+    CopyClassicElementPropertiesToGame(element);
 }
 
 void DrawLevelEd()
@@ -6520,19 +6726,23 @@ static struct
   { EL_DIAMOND,                &level.score[SC_DIAMOND],       TEXT_COLLECTING },
   { EL_CRYSTAL,                &level.score[SC_CRYSTAL],       TEXT_COLLECTING },
   { EL_PEARL,          &level.score[SC_PEARL],         TEXT_COLLECTING },
+  { EL_BUG,            &level.score[SC_BUG],           TEXT_SMASHING   },
   { EL_BUG_RIGHT,      &level.score[SC_BUG],           TEXT_SMASHING   },
   { EL_BUG_UP,         &level.score[SC_BUG],           TEXT_SMASHING   },
   { EL_BUG_LEFT,       &level.score[SC_BUG],           TEXT_SMASHING   },
   { EL_BUG_DOWN,       &level.score[SC_BUG],           TEXT_SMASHING   },
+  { EL_BD_BUTTERFLY,   &level.score[SC_BUG],           TEXT_SMASHING   },
   { EL_BD_BUTTERFLY_RIGHT,&level.score[SC_BUG],                TEXT_SMASHING   },
   { EL_BD_BUTTERFLY_UP,   &level.score[SC_BUG],                TEXT_SMASHING   },
   { EL_BD_BUTTERFLY_LEFT, &level.score[SC_BUG],                TEXT_SMASHING   },
   { EL_BD_BUTTERFLY_DOWN, &level.score[SC_BUG],                TEXT_SMASHING   },
   { EL_SP_ELECTRON,    &level.score[SC_BUG],           TEXT_SMASHING   },
+  { EL_SPACESHIP,      &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
   { EL_SPACESHIP_RIGHT,        &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
   { EL_SPACESHIP_UP,   &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
   { EL_SPACESHIP_LEFT, &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
   { EL_SPACESHIP_DOWN, &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
+  { EL_BD_FIREFLY,     &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
   { EL_BD_FIREFLY_RIGHT,&level.score[SC_SPACESHIP],    TEXT_SMASHING   },
   { EL_BD_FIREFLY_UP,  &level.score[SC_SPACESHIP],     TEXT_SMASHING   },
   { EL_BD_FIREFLY_LEFT, &level.score[SC_SPACESHIP],    TEXT_SMASHING   },
@@ -6541,6 +6751,7 @@ static struct
   { EL_YAMYAM,         &level.score[SC_YAMYAM],        TEXT_SMASHING   },
   { EL_DARK_YAMYAM,    &level.score[SC_YAMYAM],        TEXT_SMASHING   },
   { EL_ROBOT,          &level.score[SC_ROBOT],         TEXT_SMASHING   },
+  { EL_PACMAN,         &level.score[SC_PACMAN],        TEXT_SMASHING   },
   { EL_PACMAN_RIGHT,   &level.score[SC_PACMAN],        TEXT_SMASHING   },
   { EL_PACMAN_UP,      &level.score[SC_PACMAN],        TEXT_SMASHING   },
   { EL_PACMAN_LEFT,    &level.score[SC_PACMAN],        TEXT_SMASHING   },
@@ -6577,20 +6788,22 @@ static struct
   { -1,                        NULL,                           NULL            }
 };
 
-static boolean checkPropertiesConfig()
+static boolean checkPropertiesConfig(int element)
 {
   int i;
 
-  if (IS_GEM(properties_element) ||
-      IS_CUSTOM_ELEMENT(properties_element) ||
-      IS_GROUP_ELEMENT(properties_element) ||
-      IS_ENVELOPE(properties_element) ||
-      ELEM_IS_PLAYER(properties_element) ||
-      HAS_CONTENT(properties_element))
+  if (IS_GEM(element) ||
+      IS_CUSTOM_ELEMENT(element) ||
+      IS_GROUP_ELEMENT(element) ||
+      IS_ENVELOPE(element) ||
+      ELEM_IS_PLAYER(element) ||
+      HAS_CONTENT(element) ||
+      COULD_MOVE_INTO_ACID(element) ||
+      element == EL_SPRING)
     return TRUE;
   else
     for (i = 0; elements_with_counter[i].element != -1; i++)
-      if (elements_with_counter[i].element == properties_element)
+      if (elements_with_counter[i].element == element)
        return TRUE;
 
   return FALSE;
@@ -6600,7 +6813,7 @@ static void DrawPropertiesConfig()
 {
   int i;
 
-  if (!checkPropertiesConfig())
+  if (!checkPropertiesConfig(properties_element))
   {
     PrintInfoText("No configuration options available.", FONT_TEXT_1, 0);
 
@@ -6614,8 +6827,13 @@ static void DrawPropertiesConfig()
     {
       int counter_id = ED_COUNTER_ID_ELEMENT_SCORE;
 
+      counterbutton_info[counter_id].y =
+       ED_SETTINGS_YPOS((HAS_CONTENT(properties_element) ? 1 : 0) +
+                        (COULD_MOVE_INTO_ACID(properties_element) ? 1 : 0));
+
       counterbutton_info[counter_id].value = elements_with_counter[i].value;
       counterbutton_info[counter_id].text_right= elements_with_counter[i].text;
+
       MapCounterButtons(counter_id);
 
       break;
@@ -6625,9 +6843,7 @@ static void DrawPropertiesConfig()
   if (HAS_CONTENT(properties_element))
   {
     /* draw stickybutton gadget */
-    i = ED_CHECKBUTTON_ID_STICK_ELEMENT;
-    checkbutton_info[i].y = ED_COUNTER_YPOS(4);
-    MapCheckbuttonGadget(i);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
     if (IS_AMOEBOID(properties_element))
       MapDrawingArea(ED_DRAWING_ID_AMOEBA_CONTENT);
@@ -6635,14 +6851,28 @@ static void DrawPropertiesConfig()
       DrawElementContentAreas();
   }
 
-  if (IS_GEM(properties_element))
-    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
-
   if (ELEM_IS_PLAYER(properties_element))
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
                         ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
                         ED_CHECKBUTTON_ID_BLOCK_LAST_FIELD);
 
+  if (IS_GEM(properties_element))
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_EM_SLIPPERY_GEMS);
+
+  if (COULD_MOVE_INTO_ACID(properties_element) &&
+      (!IS_CUSTOM_ELEMENT(properties_element) ||
+       edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2))
+  {
+    checkbutton_info[ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID].y =
+      ED_SETTINGS_YPOS(IS_CUSTOM_ELEMENT(properties_element) ? 6 :
+                      HAS_CONTENT(properties_element) ? 1 : 0);
+
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID);
+  }
+
+  if (properties_element == EL_SPRING)
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_USE_SPRING_BUG);
+
   if (IS_ENVELOPE(properties_element))
   {
     int counter1_id = ED_COUNTER_ID_ENVELOPE_XSIZE;
@@ -6662,9 +6892,7 @@ static void DrawPropertiesConfig()
   if (IS_CUSTOM_ELEMENT(properties_element))
   {
     /* draw stickybutton gadget */
-    i = ED_CHECKBUTTON_ID_STICK_ELEMENT;
-    checkbutton_info[i].y = ED_SETTINGS_YPOS(0);
-    MapCheckbuttonGadget(i);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
     if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_1)
     {
@@ -6696,6 +6924,8 @@ static void DrawPropertiesConfig()
     }
     else if (edit_mode_properties == ED_MODE_PROPERTIES_CONFIG_2)
     {
+      /* set position for special checkbutton for "can move into acid" */
+
       /* draw checkbutton gadgets */
       for (i =  ED_CHECKBUTTON_ID_CUSTOM2_FIRST;
           i <= ED_CHECKBUTTON_ID_CUSTOM2_LAST; i++)
@@ -6718,9 +6948,7 @@ static void DrawPropertiesConfig()
   else if (IS_GROUP_ELEMENT(properties_element))
   {
     /* draw stickybutton gadget */
-    i = ED_CHECKBUTTON_ID_STICK_ELEMENT;
-    checkbutton_info[i].y = ED_SETTINGS_YPOS(0);
-    MapCheckbuttonGadget(i);
+    MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
     /* draw checkbutton gadgets */
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CUSTOM_USE_GRAPHIC);
@@ -6764,9 +6992,7 @@ static void DrawPropertiesChange()
   int i;
 
   /* draw stickybutton gadget */
-  i = ED_CHECKBUTTON_ID_STICK_ELEMENT;
-  checkbutton_info[i].y = ED_SETTINGS_YPOS(0);
-  MapCheckbuttonGadget(i);
+  MapCheckbuttonGadget(ED_CHECKBUTTON_ID_STICK_ELEMENT);
 
   /* draw checkbutton gadgets */
   for (i =  ED_CHECKBUTTON_ID_CHANGE_FIRST;
@@ -7145,6 +7371,8 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
       {
        int element = brush_buffer[x][y];
        int element_mapped = element;
+
+#if 0
        char *element_string = "?";
        int k;
 
@@ -7170,6 +7398,16 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
        }
 
        printf("`%s", element_string);
+
+#else
+
+       if (IS_CUSTOM_ELEMENT(element))
+         element_mapped = EL_CUSTOM_START;
+       else if (element > EL_ENVELOPE_4)
+         element_mapped = EL_CHAR_QUESTION;    /* change to EL_UNKNOWN ... */
+
+       printf("`%03d", element_mapped);
+#endif
       }
 
       printf("\n");
@@ -8095,11 +8333,12 @@ static void HandleCheckbuttons(struct GadgetInfo *gi)
 
   *checkbutton_info[type_id].value ^= TRUE;
 
-  if (((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST &&
-       type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) ||
-       (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&
-       type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) &&
-      type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE)
+  if (type_id == ED_CHECKBUTTON_ID_CAN_MOVE_INTO_ACID ||
+      (((type_id >= ED_CHECKBUTTON_ID_CUSTOM_FIRST &&
+        type_id <= ED_CHECKBUTTON_ID_CUSTOM_LAST) ||
+       (type_id >= ED_CHECKBUTTON_ID_CHANGE_FIRST &&
+        type_id <= ED_CHECKBUTTON_ID_CHANGE_LAST)) &&
+       type_id != ED_CHECKBUTTON_ID_CUSTOM_USE_TEMPLATE))
   {
     CopyElementPropertiesToGame(properties_element);
   }